kanon-cli 3.1.0__tar.gz → 3.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/CHANGELOG.md +134 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/PKG-INFO +15 -7
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/README.md +14 -6
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/architecture.md +5 -3
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/catalog-author-guide.md +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli/catalog-audit.md +4 -4
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli/doctor.md +6 -6
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli-reference.md +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/configuration.md +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/doctor.md +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/how-it-works.md +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/installation.md +5 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/integration-testing.md +18 -18
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/lifecycle.md +32 -3
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/migration-to-add.md +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/pipeline-integration.md +4 -4
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/shell-completion.md +3 -3
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/pyproject.toml +5 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/__init__.py +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/cli.py +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/add.py +2 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/clean.py +54 -4
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/marketplace.py +3 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/outdated.py +18 -12
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/remove.py +5 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/why.py +15 -7
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/cache.py +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/constants.py +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/clean.py +85 -4
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/cli_args.py +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/install.py +13 -14
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/kanonenv_writer.py +34 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/update_check.py +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/conftest.py +4 -4
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/expected-bash.sh +3 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/expected-zsh.sh +3 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-clean.txt +15 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-toplevel.txt +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_clean_lifecycle.py +41 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_lifecycle.py +17 -14
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_clean_lifecycle.py +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_clean_paths.py +48 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_concurrency.py +12 -28
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_fs_fault_injection.py +4 -6
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_full_user_journey.py +11 -18
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_gitignore_idempotency.py +17 -14
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_lifecycle.py +57 -50
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_clean_embedded.py +2 -2
- kanon_cli-3.2.0/tests/integration/test_kanon_dir_collision.py +51 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_full_lifecycle.py +26 -24
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_install_embedded.py +9 -9
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_lifecycle_recovery.py +15 -12
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_misc_features.py +5 -3
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_refs_tags_revision_parsing.py +52 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_ambiguous.py +34 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ic.py +6 -7
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_pk.py +9 -10
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_clean.py +9 -14
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_uj.py +3 -3
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cache_layout.py +4 -4
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_clean.py +93 -5
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_clean_command.py +118 -6
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants.py +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_outdated_refs_tags.py +8 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_coverage_gaps.py +2 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_home_flag.py +3 -3
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install.py +4 -2
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_isolation_fixtures.py +3 -3
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv_writer.py +36 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_update_check.py +1 -1
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why_ambiguity.py +33 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.claude/settings.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/.devcontainer.postcreate.sh +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/VERSION +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/catalog-entry.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/devcontainer-functions.sh +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/devcontainer.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/fix-line-endings.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/nix-family-os/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/postcreate-wrapper.sh +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/project-setup.sh +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/wsl-family-os/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/CODEOWNERS +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/actions/setup-kanon/action.yml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/codeql-analysis.yml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/main-validation.yml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/pr-validation.yml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/publish.yml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.gitignore +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.markdownlint.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.pre-commit-config.yaml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.tool-versions +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.yamllint +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/CLAUDE.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/CONTRIBUTING.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/LICENSE +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/Makefile +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/catalog-format-versioning.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/catalogs-explained.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/claude-marketplaces-guide.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli/validate.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/coming-from-pip-npm-cargo.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/contributing.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/creating-manifest-repos.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/creating-packages.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/exit-codes.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/git-auth-setup.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/list-and-add.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/lockfile.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/migrating-existing-kanon-files.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/multi-source-guide.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/outdated-and-why.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/internal-fs-layout.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/manifest-format.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/python-support.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/repo-hooks.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/smart-sync.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/windows.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/security-model.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/setup-guide.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/test-coverage.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/testing/matrix-traceability.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/troubleshooting.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/url-canonicalization.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/version-resolution.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/git-hooks/pre-commit +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/git-hooks/pre-push +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/link +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/requirements-dev.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/requirements.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/scripts/check_archive_no_duplicates.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/__main__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/catalog.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/completion.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/doctor.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/install.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/repo.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/search.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/validate.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/cached_catalogs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/catalog_entries.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/catalog_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/lockfile_names.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/midtoken.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/pep440_filter.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/powershell.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/preamble.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/project_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/sanitize.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/source_names.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/catalog.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/discover.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/git_runner.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/include_walker.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/kanon_hash.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/kanonenv.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/lockfile.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/manifest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/manifest_vars.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/marketplace.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/marketplace_validator.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/metadata.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/remote_url.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/url.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/xml_validator.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/color.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/editor.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/error.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/event_log.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/fetch.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_config.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_refs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_ssh +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_superproject.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/hooks/commit-msg +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/hooks.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/main.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/manifest_xml.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/pager.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/platform_utils.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/progress.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/project.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/repo +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/repo_logging.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/repo_trace.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/requirements.jsonc +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/ssh.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/branches.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/diff.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/download.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/forall.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/gc.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/grep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/help.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/info.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/init.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/list.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/overview.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/prune.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/stage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/start.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/status.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/sync.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/upload.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/version_constraints.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/wrapper.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/concurrency.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/levenshtein.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/lock_file_path.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/spawn.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/version.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/expected-powershell.ps1 +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/conflict-detected.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/entry-not-found.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/source-collision.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-add.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-catalog.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-completion.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-doctor.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-install.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-marketplace.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-outdated.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-remove.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-search.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-why.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/.gitignore +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/linter-test-bad.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/linter-test-bad.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/sample-manifest.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/sample-project-config.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/test.gitconfig +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/version_constraints_data.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/conftest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_add_alias_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_alias_consumer_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_argparse_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_argparse_help.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_cli_entry_point.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_completion_snapshots.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_default_branch_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_env_int_guard_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_error_snapshots.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_exit_code_matrix.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_groups_filter.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_help_snapshots.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_help_text_contract.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_home_flag_unwritable_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_init_default_branch_prerequisite_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_hermetic_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_real_kanon.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_v3_lock_fail_fast_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_home_store_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_repo_cli.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_repo_e2e.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_lifecycle_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_make_operator_path_targets.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_marketplace_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_matrix_traceability_complete.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_provider_agnostic.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_abandon_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_abandon_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_abandon_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_branches_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_branches_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_branches_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_checkout_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_checkout_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_checkout_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diff_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diff_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diff_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_dir_override.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_download_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_download_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_download_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_envsubst_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_envsubst_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_envsubst_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_exit_codes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_forall_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_forall_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_forall_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_gc_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_gc_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_gc_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_grep_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_grep_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_grep_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_help_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_help_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_help_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_info_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_info_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_info_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_mirror.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_list_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_list_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_list_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_overview_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_overview_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_overview_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_passthrough.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_prune_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_prune_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_prune_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_rebase_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_rebase_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_rebase_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_smartsync_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_smartsync_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_smartsync_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_stage_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_stage_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_stage_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_start_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_start_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_start_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_status_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_status_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_status_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_sync_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_sync_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_sync_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_upload_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_upload_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_upload_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_singular_catalog_source_inert.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_stdout_stderr_discipline.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_update_alert_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_lifecycle.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_lockfile.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_marketplace.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_xml_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_xml_repo_root.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_zero_source_clean_error.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/conftest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/conftest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/drift.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/provider_allowlist.txt +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/conftest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_bug_fixes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_envsubst_integration.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_import_functional.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_manifest_parsing.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_module_smoke.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_pipeline.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_version_constraints_integration.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_core.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_dry_run.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_env_var_detection.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_zero_tags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_auto_discovery.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_background_refresh.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cache_clock_skew.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cache_layout.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_constraints.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_ci_validation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_clean_env_override_cleanup.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cli_entry_points.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_project_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_source_names.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_bash.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_powershell_subcommand.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_subcommand.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_zsh.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_concurrency_serialization.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_copyfile_fs_effects.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cross_platform_contract.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doc_validation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_consistency.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_prune_cache.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_remote_check.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_envsubst_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_fs_fault_extended.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_git_fault_injection.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_git_retry_env.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_home_flag_store_relocation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_after_add.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_env_var_resolution.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_include_cycle.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_include_diamond.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_lock_file_derivation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_lockfile_replay.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_marketplace_registration.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_no_kanon_remediation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_optional_vars.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_path_conflict_integration.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_paths.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_per_alias_gitbase.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_reconcile.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_remote_url_policy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_required_vars.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_strict.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_json_output_stream_discipline.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanonenv_parsing.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_linkfile_fs_effects.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_all_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_all_versions_canonical.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_default.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_detail.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_filter.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_format_json.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_tree.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_lockfile_roundtrip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_marketplace_install.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_marketplace_lifecycle.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_marketplace_orphan_prune.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_midtoken_bash.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_midtoken_zsh.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_multi_source_aggregation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_no_bundled_catalog.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_no_default_catalog.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_no_hardcoded_org_values.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_observability.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_branch_drift.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_format_json.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_platform_parity.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_preamble_bash.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_preamble_zsh.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_remove_core.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_remove_dry_run.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_remove_force_integration.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_signal_handling.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_synthetic_drift_fixture.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_unicode_encoding.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_marketplace.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_marketplace_revision_existence.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_metadata.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_xml.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_version_resolution.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_version_widened_bare_pep440.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_wheel_e2e.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_chain_walker.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_format_json.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_live_resolve.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_not_found_suggestion.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_workspace_dir_env.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_install_relative_regression.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/_rp_helpers.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/conftest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ad.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_bs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_cd.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_content_pins.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_cs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_doctor_cache.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_doctor_journey.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ec.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ev.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_hv.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_id.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ks.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_lf.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_mk.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ms.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ns_marketplace_and_global_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_outdated_two_source.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rc.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_abandon.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_branches.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_checkout.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_cherry_pick.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_diff.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_diffmanifests.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_download.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_envsubst.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_forall.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_gc.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_grep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_help.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_info.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_init.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_list.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_manifest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_overview.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_prune.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_rebase.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_smartsync.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_stage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_start.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_status.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_sync.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_upload.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_wrap.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rx.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_search_multi_source.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_bootstrap.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_install.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_validate.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_va.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_va_validate_lockfile.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_why_surface_query.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_why_url_path.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/security/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/security/test_security_hardening.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/test_wheel_layout.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/conftest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/conftest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/.gitignore +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/README.md +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/test.gitconfig +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/functional/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/functional/test_features.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_abandon_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_branches_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug11_race_condition.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_checkout_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_color.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_conftest_fixtures.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_download_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_editor.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_embedded_mode.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_envsubst_basic.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_envsubst_edge.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_envsubst_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_error.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_event_log.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_event_log_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_fetch.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_fixture_files.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_forall_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_config.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_refs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_superproject.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_grep_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_harness_smoke.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_hooks.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_import_verification.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_imports.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_include_path_resolution.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_info_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_init_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_list_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_main.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_main_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_main_init_download_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_makefile_lint_format.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_makefile_structure.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_makefile_test_targets.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_xml.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_medium_files_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_overview_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_package_structure.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pager.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_parselist.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_edge_1.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_edge_2.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_platform_utils.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_progress.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_coverage_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_deep_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_final_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_integration.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_methods.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_sync.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_prune_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_rebase_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_logging.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_run_api.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_sync_api.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_trace.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_revision_inheritance.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_ruff_config.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_selfupdate_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_small_files_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_ssh.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_ssh_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_stage_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_stage_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_start_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_status_coverage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_status_gaps.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_status_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmd_imports.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_abandon.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_branches.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_checkout.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_diff.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_download.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_forall.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_gc.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_grep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_help.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_info.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_init.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_list.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_manifest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_overview.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_prune.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_rebase.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_stage.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_start.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_status.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_sync.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_upload.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_superproject_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_deep_boost.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_massive.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_upload_deep.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_version_consolidation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_version_constraints.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_wheel_contents.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_wrapper.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_default_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_default_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_default_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_fault_structural.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_cycles.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_notice_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_project_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_project_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_project_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remote_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xmlbool.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xmlint.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_yamllint_config.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_accessed_at_coalescing.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_add.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_add_collision.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_add_zero_tags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_background_refresh.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_bare_semver_to_tag.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cache.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cache_ttl.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cached_catalogs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_check_parser.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_source_parsing.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_check_no_comments.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_ci_workflows.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli_args.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli_help_format.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli_json_stream_discipline.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_project_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_source_names.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_completion.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_completion_sanitization.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_completion_subcommand.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_concurrency.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_conftest_scrubber.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_doctor_subcheck.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_env_int.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_install_after_add.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_why_lockfile.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_derive_source_name.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_discover.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_discover_source_names_missing_url.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_docs_embedded_architecture.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_completion_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_completion_staleness.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_consistency.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_coverage_gaps.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_remote_reachability.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_env_isolation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_envsubst_subcommand.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_git_runner.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_include_walker.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_color_default.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_conflict_detection.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_https_enforcement.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_placeholder_validation.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_reconcile_decision.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_state_matrix.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_strict_flags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanon_hash.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv_edge_cases.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_levenshtein.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lock_file_path.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lockfile.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lockfile_schema_migration.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_manifest.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_cmd.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_install.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_validator.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_metadata.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_midtoken_splitter.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated_branch_pinned.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated_format_json.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_pep440_filter.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_powershell.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_pre_push_hook.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_preamble.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_preamble_semver_tags.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_provider_agnosticism.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_pyproject_build_config.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remote_url.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove_dry_run.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove_force.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove_line_endings.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_repo.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_repo_abspath.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_repo_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_resolve_catalog_dir.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_revision_resolve.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_sanitize.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_all_versions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_coverage_gaps.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_detail.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_filter.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_format_json.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_tree.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_spawn.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_url.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_validate.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_validate_command.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_validate_metadata.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_version.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_version_constraint_errors.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why_format_json.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why_suggestions.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_xml_validator.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tools/lint/check_no_comments.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tools/test_tmp_monitor.py +0 -0
- {kanon_cli-3.1.0 → kanon_cli-3.2.0}/uv.lock +0 -0
|
@@ -2,8 +2,136 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
## v3.2.0 (2026-07-13)
|
|
6
|
+
|
|
7
|
+
### Feature
|
|
8
|
+
|
|
9
|
+
* feat(clean): ~/.kanon-home store rename, .kanon-dir guard, --purge/--purge-all (store-only teardown with no .kanon), no unconditional .gitignore (#89)
|
|
10
|
+
|
|
11
|
+
* feat(clean): add --purge/--purge-all; default home store to ~/.kanon-home; clean error when .kanon is a directory
|
|
12
|
+
|
|
13
|
+
Three related changes so kanon works cleanly from any directory (including
|
|
14
|
+
$HOME) and can be fully torn down with the tool:
|
|
15
|
+
|
|
16
|
+
- Rename the default home store directory from ~/.kanon to ~/.kanon-home so it
|
|
17
|
+
no longer collides with the project .kanon config file. Running kanon from
|
|
18
|
+
$HOME previously crashed with a cryptic "Is a directory". Only the default
|
|
19
|
+
changes; the --home/--store-dir flag and KANON_HOME env are unchanged. No
|
|
20
|
+
auto-migration: a leftover ~/.kanon store is an orphaned cache, safe to delete.
|
|
21
|
+
|
|
22
|
+
- When a writer (add / remove / marketplace enable|disable) must read or write
|
|
23
|
+
the .kanon config FILE but finds a .kanon DIRECTORY there, fail fast with a
|
|
24
|
+
clean, actionable error naming the exact rm -rf <path> command and telling the
|
|
25
|
+
user to re-run, instead of the cryptic IsADirectoryError.
|
|
26
|
+
|
|
27
|
+
- Add kanon clean --purge (also delete this project's .kanon and .kanon.lock)
|
|
28
|
+
and kanon clean --purge-all (also remove the shared KANON_HOME store dir).
|
|
29
|
+
--purge-all validates it removes ONLY kanon-owned content: it refuses unsafe
|
|
30
|
+
KANON_HOME paths (filesystem root, your home, or a parent of home/cwd), removes
|
|
31
|
+
only the store/ and cache/ subdirs, and removes the home root only when empty;
|
|
32
|
+
any non-kanon entries are kept with a warning.
|
|
33
|
+
|
|
34
|
+
Tests: unit + integration + functional for all three changes (the
|
|
35
|
+
directory-collision guard for all writers and the --purge-all safety refusals
|
|
36
|
+
included). Docs and the clean/toplevel --help snapshots updated.
|
|
37
|
+
|
|
38
|
+
* test(clean): sync completion goldens and stub signature for --purge flags
|
|
39
|
+
|
|
40
|
+
The new kanon clean --purge / --purge-all flags changed the bash and zsh
|
|
41
|
+
shell-completion output, so regenerate the committed golden fixtures. Also
|
|
42
|
+
extend the clean() side-effect stub in the path-resolution integration test
|
|
43
|
+
to accept the new purge / purge_home keyword arguments, matching the updated
|
|
44
|
+
core clean() signature.
|
|
45
|
+
|
|
46
|
+
* fix(clean): remove the shared home store on --purge-all even when no .kanon is present
|
|
47
|
+
|
|
48
|
+
kanon clean --purge-all is machine-global: it must tear down the shared
|
|
49
|
+
KANON_HOME store even when there is no discoverable project .kanon (for example
|
|
50
|
+
right after kanon clean --purge deleted it). Previously it failed with
|
|
51
|
+
"No .kanon file found ..." and left ~/.kanon-home in place.
|
|
52
|
+
|
|
53
|
+
_run now detects the no-usable-.kanon case (auto-discovery FileNotFoundError, or
|
|
54
|
+
an explicit path that is not a file) and, when --purge-all is set, removes only
|
|
55
|
+
the shared home store via remove_kanon_home_store(), preserving every safety
|
|
56
|
+
refusal (filesystem root, the user home directory, an ancestor of the home or
|
|
57
|
+
current directory). Plain clean and --purge without --purge-all still require a
|
|
58
|
+
discoverable .kanon.
|
|
59
|
+
|
|
60
|
+
Regenerates the clean help snapshot and the zsh completion golden for the
|
|
61
|
+
updated --purge-all help text.
|
|
62
|
+
|
|
63
|
+
* fix(install): stop writing an unconditional .gitignore; keep only the in-git-repo store safety net
|
|
64
|
+
|
|
65
|
+
In the 3.x store model both gitignore writes targeted <KANON_HOME>/store/.gitignore.
|
|
66
|
+
kanon install wrote .packages/ and .kanon-data/ into that file unconditionally,
|
|
67
|
+
littering a .gitignore even for the default ~/.kanon-home (which is not a git
|
|
68
|
+
repo). Remove the unconditional write.
|
|
69
|
+
|
|
70
|
+
The store safety net (write_store_gitignore_if_in_git_repo) is retained: kanon
|
|
71
|
+
still writes <KANON_HOME>/store/.gitignore containing "*" ONLY when the store
|
|
72
|
+
sits inside a git working tree, so a KANON_HOME inside a repo never commits the
|
|
73
|
+
fetched-artifact cache (spec Section 3.5). With the default ~/.kanon-home, kanon
|
|
74
|
+
writes no .gitignore at all.
|
|
75
|
+
|
|
76
|
+
update_gitignore now requires its entries argument (the removed default was the
|
|
77
|
+
only unconditional caller). Tests that asserted the removed unconditional write
|
|
78
|
+
now assert the new behavior (no .gitignore for a non-git store); the append-helper
|
|
79
|
+
mechanics tests pass explicit entries; the safety-net tests are unchanged.
|
|
80
|
+
|
|
81
|
+
Docs (how-it-works, architecture, lifecycle, integration-testing) updated;
|
|
82
|
+
lifecycle also documents clean --purge-all running without a .kanon.
|
|
83
|
+
|
|
84
|
+
---------
|
|
85
|
+
|
|
86
|
+
Co-authored-by: t <t@e.x> ([`d9b0ad1`](https://github.com/caylent-solutions/kanon/commit/d9b0ad1856ab58487b7ed3efdc3ff9d87b60b193))
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
## v3.1.1 (2026-06-27)
|
|
90
|
+
|
|
91
|
+
### Chore
|
|
92
|
+
|
|
93
|
+
* chore(release): 3.1.1 ([`890b026`](https://github.com/caylent-solutions/kanon/commit/890b026b47ca8820b41ca8d218658e50691254a2))
|
|
94
|
+
|
|
95
|
+
### Fix
|
|
96
|
+
|
|
97
|
+
* fix: outdated handles namespaced/bare exact tags; why disambiguates same-URL sources (#87)
|
|
98
|
+
|
|
99
|
+
Two defects found during QA of 3.1.0 against the namespaced/bare catalog.
|
|
100
|
+
|
|
101
|
+
outdated (closes #85): _normalize_tag_revision_to_constraint only normalised a
|
|
102
|
+
bare refs/tags/<pep440> to ==<pep440>; for a namespaced refs/tags/<path>/<pep440>
|
|
103
|
+
it tried to parse the whole remainder as a Version, failed, and left the ref
|
|
104
|
+
unchanged, so _resolve_constraint_from_tags raised "invalid version constraint".
|
|
105
|
+
It now rewrites only the terminal version component while preserving the
|
|
106
|
+
namespace path, so kanon outdated works for the default exact-tag add of both
|
|
107
|
+
namespaced and bare entries.
|
|
108
|
+
|
|
109
|
+
why (closes #86): when several sources resolve from the same repo URL at
|
|
110
|
+
different commits (now a supported config), the ambiguity message printed N
|
|
111
|
+
identical "source URL: <url>" tokens, so the operator could not disambiguate.
|
|
112
|
+
_identity_token now returns the source alias (its derive_source_name identity)
|
|
113
|
+
for a URL match on a source node, labelled "source name" -- the tokens are
|
|
114
|
+
distinct and round-trip through the existing source-name grammar
|
|
115
|
+
(kanon why <alias>). Project URL matches are unchanged.
|
|
116
|
+
|
|
117
|
+
Adds unit + integration coverage for both (namespaced/bare exact-tag outdated;
|
|
118
|
+
distinct alias tokens + alias round-trip for why).
|
|
119
|
+
|
|
120
|
+
Co-authored-by: t <t@e.x> ([`0d45f67`](https://github.com/caylent-solutions/kanon/commit/0d45f673243861b0aaef823f6d95e0a548c447d4))
|
|
121
|
+
|
|
122
|
+
### Unknown
|
|
123
|
+
|
|
124
|
+
* Merge pull request #88 from caylent-solutions/release-3.1.1
|
|
125
|
+
|
|
126
|
+
Release 3.1.1 ([`cec7213`](https://github.com/caylent-solutions/kanon/commit/cec7213109c0e307e80751e728c6a59751e20794))
|
|
127
|
+
|
|
128
|
+
|
|
5
129
|
## v3.1.0 (2026-06-27)
|
|
6
130
|
|
|
131
|
+
### Chore
|
|
132
|
+
|
|
133
|
+
* chore(release): 3.1.0 ([`e62453e`](https://github.com/caylent-solutions/kanon/commit/e62453e4afa86dca403eef43f71b5ceb5e0a115b))
|
|
134
|
+
|
|
7
135
|
### Feature
|
|
8
136
|
|
|
9
137
|
* feat: resolve catalog entries by tag namespace and accept bare project revisions #83
|
|
@@ -58,6 +186,12 @@ PEP 440 tag (refs/tags/<pep440>) for single-purpose repos, for both
|
|
|
58
186
|
CLAUDE_MARKETPLACES_DIR header.
|
|
59
187
|
- Tests, docs, and the kanon-add help snapshot updated. ([`7ed332c`](https://github.com/caylent-solutions/kanon/commit/7ed332c859e69cfd6635035a05c15c03339fdcd1))
|
|
60
188
|
|
|
189
|
+
### Unknown
|
|
190
|
+
|
|
191
|
+
* Merge pull request #84 from caylent-solutions/release-3.1.0
|
|
192
|
+
|
|
193
|
+
Release 3.1.0 ([`fddb0aa`](https://github.com/caylent-solutions/kanon/commit/fddb0aa2ab847ffcf4857384d7e8b40504d1bf91))
|
|
194
|
+
|
|
61
195
|
|
|
62
196
|
## v3.0.0 (2026-06-26)
|
|
63
197
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kanon-cli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.2.0
|
|
4
4
|
Summary: Kanon (Kanon Package Manager) CLI tool
|
|
5
5
|
Project-URL: Homepage, https://github.com/caylent-solutions/kanon
|
|
6
6
|
Project-URL: Issues, https://github.com/caylent-solutions/kanon/issues
|
|
@@ -183,7 +183,7 @@ git commit -m "feat: add my-package 1.2.3"
|
|
|
183
183
|
|
|
184
184
|
Committing both files ensures the entire team installs the same resolved
|
|
185
185
|
package versions. The synced artifacts live in the shared `KANON_HOME`
|
|
186
|
-
store (`~/.kanon` by default), never in your project, so there is nothing
|
|
186
|
+
store (`~/.kanon-home` by default), never in your project, so there is nothing
|
|
187
187
|
package-related to commit beyond `.kanon` and `.kanon.lock`.
|
|
188
188
|
|
|
189
189
|
---
|
|
@@ -216,7 +216,7 @@ persistent installation and advanced options, see
|
|
|
216
216
|
| `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
217
217
|
| `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
218
218
|
| `kanon validate metadata` | Validate catalog entry metadata | [docs/catalog-author-guide.md](docs/catalog-author-guide.md) |
|
|
219
|
-
| `kanon clean` | Remove synced packages and Kanon state (`--orphans`
|
|
219
|
+
| `kanon clean` | Remove synced packages and Kanon state (`--orphans` prunes unreferenced marketplaces; `--purge` also deletes `.kanon`/`.kanon.lock`; `--purge-all` also removes the `KANON_HOME` store) | [docs/lifecycle.md](docs/lifecycle.md) |
|
|
220
220
|
| `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
|
|
221
221
|
| `kanon marketplace` | Manage the per-dependency Claude marketplace install flag in `.kanon` (`enable` / `disable` / `status`) | [docs/configuration.md](docs/configuration.md) |
|
|
222
222
|
| `kanon completion` | Emit a shell completion script for bash, zsh, or powershell | [docs/shell-completion.md](docs/shell-completion.md) |
|
|
@@ -572,6 +572,8 @@ Executes the full teardown lifecycle.
|
|
|
572
572
|
kanon clean # auto-discover .kanon by walking up from cwd
|
|
573
573
|
kanon clean .kanon # explicit path to .kanon file
|
|
574
574
|
kanon clean --orphans # also unregister orphaned marketplaces
|
|
575
|
+
kanon clean --purge # also delete .kanon and .kanon.lock
|
|
576
|
+
kanon clean --purge-all # also remove the KANON_HOME store directory
|
|
575
577
|
```
|
|
576
578
|
|
|
577
579
|
**Behavior:**
|
|
@@ -585,6 +587,12 @@ With `--orphans`, before the normal teardown kanon also unregisters any
|
|
|
585
587
|
kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
|
|
586
588
|
referenced by `.kanon`, pruning them from `~/.claude`.
|
|
587
589
|
|
|
590
|
+
With `--purge`, kanon also deletes this project's `.kanon` and `.kanon.lock`
|
|
591
|
+
files. With `--purge-all`, it additionally removes the shared `KANON_HOME`
|
|
592
|
+
store directory (default `~/.kanon-home`), removing only kanon-owned content
|
|
593
|
+
(`store/`, `cache/`, and the emptied root) and refusing unsafe `KANON_HOME`
|
|
594
|
+
paths such as your home directory or the filesystem root.
|
|
595
|
+
|
|
588
596
|
### kanon outdated
|
|
589
597
|
|
|
590
598
|
Compares each source in `.kanon` against the catalog and emits a table of
|
|
@@ -795,9 +803,9 @@ and `kanon catalog audit`. `kanon install` is hermetic: it reads only
|
|
|
795
803
|
`.kanon` and `.kanon.lock` and does not consult a catalog source.
|
|
796
804
|
|
|
797
805
|
**`KANON_HOME`**
|
|
798
|
-
Root of the shared kanon store and caches (default `~/.kanon`). The
|
|
806
|
+
Root of the shared kanon store and caches (default `~/.kanon-home`). The
|
|
799
807
|
`--home` / `--store-dir <path>` global flag overrides it for a single
|
|
800
|
-
invocation; precedence is flag > `KANON_HOME` > `~/.kanon`. Replaces the
|
|
808
|
+
invocation; precedence is flag > `KANON_HOME` > `~/.kanon-home`. Replaces the
|
|
801
809
|
removed `KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` variables. Synced artifacts
|
|
802
810
|
and the per-`.kanon` workspace lock both live under `${KANON_HOME}/store/`,
|
|
803
811
|
so the project directory holds only `.kanon` (plus `.kanon.lock` after the
|
|
@@ -900,7 +908,7 @@ regardless of which source provided each package.
|
|
|
900
908
|
### Directory Structure After Install
|
|
901
909
|
|
|
902
910
|
Fetched artifacts live in the shared `KANON_HOME` store
|
|
903
|
-
(`$KANON_HOME`, default `~/.kanon`), content-addressed and deduped across
|
|
911
|
+
(`$KANON_HOME`, default `~/.kanon-home`), content-addressed and deduped across
|
|
904
912
|
projects. Only `.kanon` and `.kanon.lock` live in (and are committed to)
|
|
905
913
|
the project itself:
|
|
906
914
|
|
|
@@ -909,7 +917,7 @@ project/
|
|
|
909
917
|
.kanon # Configuration (committed)
|
|
910
918
|
.kanon.lock # Resolved SHAs (committed)
|
|
911
919
|
|
|
912
|
-
$KANON_HOME/ # Shared store (default ~/.kanon; not in the repo)
|
|
920
|
+
$KANON_HOME/ # Shared store (default ~/.kanon-home; not in the repo)
|
|
913
921
|
store/
|
|
914
922
|
.kanon-data/
|
|
915
923
|
sources/
|
|
@@ -161,7 +161,7 @@ git commit -m "feat: add my-package 1.2.3"
|
|
|
161
161
|
|
|
162
162
|
Committing both files ensures the entire team installs the same resolved
|
|
163
163
|
package versions. The synced artifacts live in the shared `KANON_HOME`
|
|
164
|
-
store (`~/.kanon` by default), never in your project, so there is nothing
|
|
164
|
+
store (`~/.kanon-home` by default), never in your project, so there is nothing
|
|
165
165
|
package-related to commit beyond `.kanon` and `.kanon.lock`.
|
|
166
166
|
|
|
167
167
|
---
|
|
@@ -194,7 +194,7 @@ persistent installation and advanced options, see
|
|
|
194
194
|
| `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
195
195
|
| `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
196
196
|
| `kanon validate metadata` | Validate catalog entry metadata | [docs/catalog-author-guide.md](docs/catalog-author-guide.md) |
|
|
197
|
-
| `kanon clean` | Remove synced packages and Kanon state (`--orphans`
|
|
197
|
+
| `kanon clean` | Remove synced packages and Kanon state (`--orphans` prunes unreferenced marketplaces; `--purge` also deletes `.kanon`/`.kanon.lock`; `--purge-all` also removes the `KANON_HOME` store) | [docs/lifecycle.md](docs/lifecycle.md) |
|
|
198
198
|
| `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
|
|
199
199
|
| `kanon marketplace` | Manage the per-dependency Claude marketplace install flag in `.kanon` (`enable` / `disable` / `status`) | [docs/configuration.md](docs/configuration.md) |
|
|
200
200
|
| `kanon completion` | Emit a shell completion script for bash, zsh, or powershell | [docs/shell-completion.md](docs/shell-completion.md) |
|
|
@@ -550,6 +550,8 @@ Executes the full teardown lifecycle.
|
|
|
550
550
|
kanon clean # auto-discover .kanon by walking up from cwd
|
|
551
551
|
kanon clean .kanon # explicit path to .kanon file
|
|
552
552
|
kanon clean --orphans # also unregister orphaned marketplaces
|
|
553
|
+
kanon clean --purge # also delete .kanon and .kanon.lock
|
|
554
|
+
kanon clean --purge-all # also remove the KANON_HOME store directory
|
|
553
555
|
```
|
|
554
556
|
|
|
555
557
|
**Behavior:**
|
|
@@ -563,6 +565,12 @@ With `--orphans`, before the normal teardown kanon also unregisters any
|
|
|
563
565
|
kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
|
|
564
566
|
referenced by `.kanon`, pruning them from `~/.claude`.
|
|
565
567
|
|
|
568
|
+
With `--purge`, kanon also deletes this project's `.kanon` and `.kanon.lock`
|
|
569
|
+
files. With `--purge-all`, it additionally removes the shared `KANON_HOME`
|
|
570
|
+
store directory (default `~/.kanon-home`), removing only kanon-owned content
|
|
571
|
+
(`store/`, `cache/`, and the emptied root) and refusing unsafe `KANON_HOME`
|
|
572
|
+
paths such as your home directory or the filesystem root.
|
|
573
|
+
|
|
566
574
|
### kanon outdated
|
|
567
575
|
|
|
568
576
|
Compares each source in `.kanon` against the catalog and emits a table of
|
|
@@ -773,9 +781,9 @@ and `kanon catalog audit`. `kanon install` is hermetic: it reads only
|
|
|
773
781
|
`.kanon` and `.kanon.lock` and does not consult a catalog source.
|
|
774
782
|
|
|
775
783
|
**`KANON_HOME`**
|
|
776
|
-
Root of the shared kanon store and caches (default `~/.kanon`). The
|
|
784
|
+
Root of the shared kanon store and caches (default `~/.kanon-home`). The
|
|
777
785
|
`--home` / `--store-dir <path>` global flag overrides it for a single
|
|
778
|
-
invocation; precedence is flag > `KANON_HOME` > `~/.kanon`. Replaces the
|
|
786
|
+
invocation; precedence is flag > `KANON_HOME` > `~/.kanon-home`. Replaces the
|
|
779
787
|
removed `KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` variables. Synced artifacts
|
|
780
788
|
and the per-`.kanon` workspace lock both live under `${KANON_HOME}/store/`,
|
|
781
789
|
so the project directory holds only `.kanon` (plus `.kanon.lock` after the
|
|
@@ -878,7 +886,7 @@ regardless of which source provided each package.
|
|
|
878
886
|
### Directory Structure After Install
|
|
879
887
|
|
|
880
888
|
Fetched artifacts live in the shared `KANON_HOME` store
|
|
881
|
-
(`$KANON_HOME`, default `~/.kanon`), content-addressed and deduped across
|
|
889
|
+
(`$KANON_HOME`, default `~/.kanon-home`), content-addressed and deduped across
|
|
882
890
|
projects. Only `.kanon` and `.kanon.lock` live in (and are committed to)
|
|
883
891
|
the project itself:
|
|
884
892
|
|
|
@@ -887,7 +895,7 @@ project/
|
|
|
887
895
|
.kanon # Configuration (committed)
|
|
888
896
|
.kanon.lock # Resolved SHAs (committed)
|
|
889
897
|
|
|
890
|
-
$KANON_HOME/ # Shared store (default ~/.kanon; not in the repo)
|
|
898
|
+
$KANON_HOME/ # Shared store (default ~/.kanon-home; not in the repo)
|
|
891
899
|
store/
|
|
892
900
|
.kanon-data/
|
|
893
901
|
sources/
|
|
@@ -74,7 +74,6 @@ the source of truth for which clones exist.
|
|
|
74
74
|
<project-root>/
|
|
75
75
|
.kanon # operator-authored config file
|
|
76
76
|
.kanon.lock # generated lockfile (commit this)
|
|
77
|
-
.gitignore # auto-updated by kanon install (idempotent)
|
|
78
77
|
.kanon-data/
|
|
79
78
|
.kanon-install.lock # flock-managed concurrency lock
|
|
80
79
|
sources/
|
|
@@ -97,8 +96,11 @@ Key paths:
|
|
|
97
96
|
- **`.packages/`** -- aggregated symlinks pointing into the per-source
|
|
98
97
|
`.packages/*` entries. This is the only directory operators need to
|
|
99
98
|
reference in downstream tooling.
|
|
100
|
-
-
|
|
101
|
-
|
|
99
|
+
- **`<KANON_HOME>/store/.gitignore`** -- `kanon install` writes this
|
|
100
|
+
safety net (containing `*`) ONLY when the shared `KANON_HOME` store sits
|
|
101
|
+
inside a git working tree, so the fetched-artifact cache is never committed.
|
|
102
|
+
With the default `~/.kanon-home` (not a git repo), `kanon install` writes no
|
|
103
|
+
`.gitignore` at all.
|
|
102
104
|
|
|
103
105
|
If the `.kanon-data/` directory layout becomes inconsistent (for example after
|
|
104
106
|
a SIGTERM mid-clone), run `kanon clean` to prune and recover.
|
|
@@ -100,7 +100,7 @@ To audit a remote manifest repo, set `KANON_HOME` and supply the
|
|
|
100
100
|
source in `<git_url>@<ref>` form:
|
|
101
101
|
|
|
102
102
|
```bash
|
|
103
|
-
export KANON_HOME=~/.kanon
|
|
103
|
+
export KANON_HOME=~/.kanon-home
|
|
104
104
|
kanon catalog audit https://example.com/org/manifest-repo.git@main
|
|
105
105
|
```
|
|
106
106
|
|
|
@@ -409,7 +409,7 @@ before publishing a release. The steps assume a scratch clone at
|
|
|
409
409
|
6. **List catalog entries via scratch source:**
|
|
410
410
|
|
|
411
411
|
```bash
|
|
412
|
-
export KANON_HOME=~/.kanon
|
|
412
|
+
export KANON_HOME=~/.kanon-home
|
|
413
413
|
kanon search --catalog-source ./scratch@main
|
|
414
414
|
```
|
|
415
415
|
|
|
@@ -171,7 +171,7 @@ spec Section 3.6 (trust model / credential isolation).
|
|
|
171
171
|
|
|
172
172
|
The cache lives under the shared `KANON_HOME` store root. `KANON_HOME`
|
|
173
173
|
resolves from the `--home` / `--store-dir` flag, then the `KANON_HOME`
|
|
174
|
-
environment variable, then the `~/.kanon` default, so a remote audit target
|
|
174
|
+
environment variable, then the `~/.kanon-home` default, so a remote audit target
|
|
175
175
|
works without setting `KANON_HOME` explicitly.
|
|
176
176
|
|
|
177
177
|
## Source-name-derivation check (`--check source-name-derivation`)
|
|
@@ -436,7 +436,7 @@ operators encounter resolver failures:
|
|
|
436
436
|
# Inventory non-PEP-440 tags in a local manifest repo
|
|
437
437
|
kanon catalog audit --check tag-format /path/to/manifest-repo
|
|
438
438
|
|
|
439
|
-
# Inventory a remote manifest repo (uses the shared KANON_HOME store; ~/.kanon by default)
|
|
439
|
+
# Inventory a remote manifest repo (uses the shared KANON_HOME store; ~/.kanon-home by default)
|
|
440
440
|
kanon catalog audit --check tag-format https://github.com/org/manifest-repo.git@main
|
|
441
441
|
```
|
|
442
442
|
|
|
@@ -601,7 +601,7 @@ kanon catalog audit
|
|
|
601
601
|
# Audit an explicit local path
|
|
602
602
|
kanon catalog audit /path/to/manifest-repo
|
|
603
603
|
|
|
604
|
-
# Audit a remote repo (cached under the shared KANON_HOME store; ~/.kanon by default)
|
|
604
|
+
# Audit a remote repo (cached under the shared KANON_HOME store; ~/.kanon-home by default)
|
|
605
605
|
kanon catalog audit https://github.com/org/manifest-repo.git@main
|
|
606
606
|
|
|
607
607
|
# Run only metadata and tag-format checks
|
|
@@ -624,7 +624,7 @@ kanon catalog audit https://github.com/org/repo.git@v1.0.0 \
|
|
|
624
624
|
|----------|---------|-------------|
|
|
625
625
|
| `KANON_CATALOG_AUDIT_FORMAT` | `text` | Default output format. CLI `--format` takes precedence. |
|
|
626
626
|
| `KANON_CATALOG_AUDIT_CACHE_TTL_SECONDS` | `3600` | Cache TTL in seconds for remote clones. Must be a positive integer. |
|
|
627
|
-
| `KANON_HOME` | `~/.kanon` | Shared kanon home (store + caches); the audit cache lives under `${KANON_HOME}/cache`. Overridden by the `--home` / `--store-dir` flag. |
|
|
627
|
+
| `KANON_HOME` | `~/.kanon-home` | Shared kanon home (store + caches); the audit cache lives under `${KANON_HOME}/cache`. Overridden by the `--home` / `--store-dir` flag. |
|
|
628
628
|
| `KANON_ALLOW_INSECURE_REMOTES` | (unset) | When set to `1`, suppresses R002 findings for non-HTTPS/SSH remote URLs. Any value other than `1` is treated as unset. Intended for local test fixtures only; do not set in production CI pipelines. R001 and R003 findings are never suppressed by this variable. |
|
|
629
629
|
|
|
630
630
|
## Related commands
|
|
@@ -57,7 +57,7 @@ emitted). Exit code is 1 when any error-level finding is detected.
|
|
|
57
57
|
recreating the directory empty with mode `0700`. Reports an info finding
|
|
58
58
|
with the count of files removed. This flag is independent of the health
|
|
59
59
|
checks. `KANON_HOME` resolves from the `--home` / `--store-dir` flag, the
|
|
60
|
-
`KANON_HOME` env var, then the `~/.kanon` default, so the cache directory is
|
|
60
|
+
`KANON_HOME` env var, then the `~/.kanon-home` default, so the cache directory is
|
|
61
61
|
always resolved.
|
|
62
62
|
|
|
63
63
|
`--prune-cache`
|
|
@@ -67,7 +67,7 @@ emitted). Exit code is 1 when any error-level finding is detected.
|
|
|
67
67
|
stale `.kanon-data/.kanon-install.lock` files (mtime older than
|
|
68
68
|
`KANON_DOCTOR_STALE_LOCK_AGE_HOURS` hours) as advisory findings -- doctor
|
|
69
69
|
does NOT delete them. The cache directory is resolved from `KANON_HOME`
|
|
70
|
-
(flag, env var, or `~/.kanon` default); the stale-lock scan always runs from
|
|
70
|
+
(flag, env var, or `~/.kanon-home` default); the stale-lock scan always runs from
|
|
71
71
|
the current working directory.
|
|
72
72
|
|
|
73
73
|
## Subchecks
|
|
@@ -258,7 +258,7 @@ INFO: Completion cache refreshed: 3 file(s) removed from /home/user/.kanon/cache
|
|
|
258
258
|
```
|
|
259
259
|
|
|
260
260
|
`KANON_HOME` resolves from the `--home` / `--store-dir` flag, the `KANON_HOME`
|
|
261
|
-
env var, then the `~/.kanon` default, so the completion-cache directory is
|
|
261
|
+
env var, then the `~/.kanon-home` default, so the completion-cache directory is
|
|
262
262
|
always resolved.
|
|
263
263
|
|
|
264
264
|
### Subcheck 7: Completion errors report
|
|
@@ -268,7 +268,7 @@ from `${KANON_HOME}/cache/completion-errors.log`. This log is written by shell
|
|
|
268
268
|
completion callback failures (see E7 / `docs/shell-completion.md`).
|
|
269
269
|
|
|
270
270
|
`kanon doctor` only reads this log -- it does NOT modify, truncate, or rotate it.
|
|
271
|
-
The cache directory is resolved from `KANON_HOME` (flag, env var, or `~/.kanon`
|
|
271
|
+
The cache directory is resolved from `KANON_HOME` (flag, env var, or `~/.kanon-home`
|
|
272
272
|
default); when the log file does not exist this subcheck reports the info notice
|
|
273
273
|
below.
|
|
274
274
|
|
|
@@ -417,7 +417,7 @@ INFO: Advisory: stale install lock found at /path/to/.kanon-data/.kanon-install.
|
|
|
417
417
|
```
|
|
418
418
|
|
|
419
419
|
`KANON_HOME` resolves from the `--home` / `--store-dir` flag, the `KANON_HOME`
|
|
420
|
-
env var, then the `~/.kanon` default, so the cache prune always runs against
|
|
420
|
+
env var, then the `~/.kanon-home` default, so the cache prune always runs against
|
|
421
421
|
the resolved cache directory; the stale-lock scan runs independently from the
|
|
422
422
|
current working directory.
|
|
423
423
|
|
|
@@ -440,7 +440,7 @@ are emitted. Health checks (subchecks 1-5, 6, 7, 9, 11) always run after.
|
|
|
440
440
|
| `KANON_RESOLVE_TIMEOUT` | `30` | Timeout in seconds for each `git ls-remote` call |
|
|
441
441
|
| `KANON_GIT_RETRY_COUNT` | `3` | Maximum number of `git ls-remote` attempts |
|
|
442
442
|
| `KANON_GIT_RETRY_DELAY` | `1` | Inter-attempt delay in seconds (read by doctor; not applied to the `git ls-remote` retry path, which delegates to `git_runner.run_git_ls_remote` and uses immediate retries with no time-based delay) |
|
|
443
|
-
| `KANON_HOME` | `~/.kanon` | Shared kanon home (store + caches); cache lives under `${KANON_HOME}/cache`. Resolves from the `--home` / `--store-dir` flag, then this env var, then the `~/.kanon` default |
|
|
443
|
+
| `KANON_HOME` | `~/.kanon-home` | Shared kanon home (store + caches); cache lives under `${KANON_HOME}/cache`. Resolves from the `--home` / `--store-dir` flag, then this env var, then the `~/.kanon-home` default |
|
|
444
444
|
| `KANON_COMPLETION_ERRORS_REPORT_LIMIT` | `5` | Maximum number of recent completion-error log lines to display in subcheck 7 |
|
|
445
445
|
| `KANON_CACHE_PRUNE_AGE_DAYS` | `30` | Files older than this many days (by atime) are removed by `--prune-cache` (subcheck 10) |
|
|
446
446
|
| `KANON_DOCTOR_STALE_LOCK_SCAN_MAX_DEPTH` | `4` | Maximum directory depth for the stale install-lock scan in `--prune-cache` (subcheck 10) |
|
|
@@ -14,7 +14,7 @@ are registered once via `kanon_cli.core.cli_args` so every parser exposes them.
|
|
|
14
14
|
| `--quiet` / `--verbose` | -- | normal | Logging verbosity. Mutually exclusive. |
|
|
15
15
|
| `--no-color` | `NO_COLOR` | auto | Disable ANSI color. Any non-empty `NO_COLOR` also disables color. |
|
|
16
16
|
| `--no-update-check` | `KANON_SKIP_UPDATE_CHECK` | off | Skip the best-effort PyPI "update available" check. The flag is equivalent to setting `KANON_SKIP_UPDATE_CHECK=1`. |
|
|
17
|
-
| `--home` / `--store-dir <path>` | `KANON_HOME` | `~/.kanon` | Shared kanon home root (content-addressed store plus caches). `--store-dir` is an accepted alias of `--home`. Precedence: flag > `KANON_HOME` env > `~/.kanon`. |
|
|
17
|
+
| `--home` / `--store-dir <path>` | `KANON_HOME` | `~/.kanon-home` | Shared kanon home root (content-addressed store plus caches). `--store-dir` is an accepted alias of `--home`. Precedence: flag > `KANON_HOME` env > `~/.kanon-home`. |
|
|
18
18
|
|
|
19
19
|
## Shared Argument Factories
|
|
20
20
|
|
|
@@ -66,7 +66,7 @@ completion variables), see [docs/configuration.md](configuration.md).
|
|
|
66
66
|
| Variable | Description | Default |
|
|
67
67
|
|----------|-------------|---------|
|
|
68
68
|
| `KANON_CATALOG_SOURCES` | Remote catalog source(s) as `<git_url>@<ref>`, one entry per line. Sets the default for every command that accepts `--catalog-source`; the resolving commands require exactly one entry unless `--catalog-source` is passed. | (none) |
|
|
69
|
-
| `KANON_HOME` | Shared kanon home root (store plus caches). Overridden by the `--home` / `--store-dir` flag. | `~/.kanon` |
|
|
69
|
+
| `KANON_HOME` | Shared kanon home root (store plus caches). Overridden by the `--home` / `--store-dir` flag. | `~/.kanon-home` |
|
|
70
70
|
| `KANON_SKIP_UPDATE_CHECK` | Set to `1` to skip the PyPI update-available check (same effect as `--no-update-check`). | (unset) |
|
|
71
71
|
| `KANON_OUTDATED_FORMAT` | Default output format for `kanon outdated` (`table` or `json`). Overridden by `--format`. | `table` |
|
|
72
72
|
| `KANON_OUTDATED_JSON_INDENT` | JSON indentation (number of spaces) used by `kanon outdated --format json`. | `2` |
|
|
@@ -380,7 +380,7 @@ chain.
|
|
|
380
380
|
3. Default derived from `--kanon-file`: `./.kanon` becomes
|
|
381
381
|
`./.kanon.lock`; `./alt.kanon` becomes `./alt.kanon.lock`.
|
|
382
382
|
|
|
383
|
-
**`KANON_HOME`** (default: `~/.kanon`) -- Single root directory that
|
|
383
|
+
**`KANON_HOME`** (default: `~/.kanon-home`) -- Single root directory that
|
|
384
384
|
subsumes the former per-user cache-dir override and the former
|
|
385
385
|
per-workspace artifact-dir override. The cache subtree lives at
|
|
386
386
|
`${KANON_HOME}/cache/` and the store subtree at `${KANON_HOME}/store/`.
|
|
@@ -393,7 +393,7 @@ to cache files. See
|
|
|
393
393
|
|
|
394
394
|
1. `--home` / `--store-dir <path>` global CLI flag (when supplied).
|
|
395
395
|
2. `KANON_HOME` environment variable (when non-empty).
|
|
396
|
-
3. `~/.kanon` -- default when the env var is unset and no flag is given.
|
|
396
|
+
3. `~/.kanon-home` -- default when the env var is unset and no flag is given.
|
|
397
397
|
|
|
398
398
|
The `--home` (alias `--store-dir`) flag is a global option accepted on
|
|
399
399
|
every command; when supplied it overrides `KANON_HOME` for that
|
|
@@ -340,7 +340,7 @@ callback failures. These errors are non-blocking at the shell but are surfaced
|
|
|
340
340
|
here so operators can diagnose completion failures.
|
|
341
341
|
|
|
342
342
|
This check always runs. The cache directory resolves from `KANON_HOME` (the
|
|
343
|
-
`--home` / `--store-dir` flag, then the env var, then the `~/.kanon` default).
|
|
343
|
+
`--home` / `--store-dir` flag, then the env var, then the `~/.kanon-home` default).
|
|
344
344
|
This subcheck emits only the stderr finding below; it does not print an `[ok]`
|
|
345
345
|
summary line.
|
|
346
346
|
|
|
@@ -64,7 +64,7 @@ The command performs these steps:
|
|
|
64
64
|
- Calls `kanon_cli.repo.repo_sync(source_dir)` -- aborts immediately on `RepoCommandError`
|
|
65
65
|
5. **Aggregate symlinks** -- For each `.kanon-data/sources/<name>/.packages/*`, creates a symlink in `.packages/`
|
|
66
66
|
6. **Collision detection** -- If two sources produce the same package name, fails fast with error identifying both sources
|
|
67
|
-
7. **
|
|
67
|
+
7. **Conditional store `.gitignore` safety net** -- Only when the shared `KANON_HOME` store sits inside a git working tree, writes `<KANON_HOME>/store/.gitignore` containing `*` so the fetched-artifact cache is never committed. When the store is not inside a git repo (the default `~/.kanon-home`), no `.gitignore` is written
|
|
68
68
|
8. **Post-sync marketplace install** -- If any source sets `KANON_SOURCE_<alias>_MARKETPLACE=true`: locates the `claude` binary, discovers marketplace entries and plugins, registers marketplaces, and installs plugins via the Claude Code CLI
|
|
69
69
|
|
|
70
70
|
## Clean Lifecycle
|
|
@@ -66,13 +66,17 @@ one top-level source while preserving every other lockfile entry, pass
|
|
|
66
66
|
store, content-addressed and deduped across projects:
|
|
67
67
|
|
|
68
68
|
- The store root resolves with precedence `--home` / `--store-dir`
|
|
69
|
-
flag > `KANON_HOME` environment variable > the default `~/.kanon`.
|
|
69
|
+
flag > `KANON_HOME` environment variable > the default `~/.kanon-home`.
|
|
70
70
|
- The store directory is created if absent. If it cannot be created or is
|
|
71
71
|
not writable, `kanon install` exits non-zero with an actionable
|
|
72
72
|
message naming the path and the `KANON_HOME` variable -- there is no
|
|
73
73
|
silent fallback.
|
|
74
74
|
- `kanon clean` resolves the same store root, so it removes exactly what
|
|
75
75
|
`kanon install` wrote.
|
|
76
|
+
- The default store root is `~/.kanon-home`. Earlier versions defaulted to
|
|
77
|
+
`~/.kanon`, which collided with a project `.kanon` file when running kanon
|
|
78
|
+
from your home directory. A leftover `~/.kanon` directory from an older
|
|
79
|
+
install is unused and safe to delete (`rm -rf ~/.kanon`).
|
|
76
80
|
|
|
77
81
|
The legacy per-project `.packages/` / `.kanon-data/` locations and their
|
|
78
82
|
`KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` environment variables were
|
|
@@ -129,9 +129,10 @@ mkdir -p "${KANON_TEST_ROOT}"
|
|
|
129
129
|
In kanon 3.0.0 the install artifacts no longer live next to `.kanon`. All
|
|
130
130
|
fetched data is content-addressed under a **shared store** rooted at
|
|
131
131
|
`KANON_HOME` (precedence: `--home`/`--store-dir` flag > `KANON_HOME` env >
|
|
132
|
-
`~/.kanon` default). A successful `kanon install` writes only `.kanon.lock`
|
|
133
|
-
into the project directory; the `.packages
|
|
134
|
-
|
|
132
|
+
`~/.kanon-home` default). A successful `kanon install` writes only `.kanon.lock`
|
|
133
|
+
into the project directory; the `.packages/` and `.kanon-data/sources/<name>/`
|
|
134
|
+
artifacts are created under `<KANON_HOME>/store/` (a store-level `.gitignore`
|
|
135
|
+
containing `*` is written there only when the store sits inside a git repo).
|
|
135
136
|
The removed per-project location variables (`KANON_WORKSPACE_DIR`,
|
|
136
137
|
`KANON_CACHE_DIR`) are subsumed by this single store.
|
|
137
138
|
|
|
@@ -633,7 +634,7 @@ kanon install .kanon
|
|
|
633
634
|
- Directory `${KANON_HOME}/store/.packages/` exists
|
|
634
635
|
- `${KANON_HOME}/store/.packages/pkg-alpha` is a symlink
|
|
635
636
|
- Symlink target path contains `${KANON_HOME}/store/.kanon-data/sources/primary/.packages/pkg-alpha`
|
|
636
|
-
- `${KANON_HOME}/store/.gitignore`
|
|
637
|
+
- `${KANON_HOME}/store/.gitignore` is NOT created (the throwaway store is not inside a git repo; the safety-net `.gitignore` containing `*` is written only when the store sits inside a git working tree)
|
|
637
638
|
|
|
638
639
|
**Clean:**
|
|
639
640
|
|
|
@@ -3519,16 +3520,16 @@ set -e
|
|
|
3519
3520
|
|
|
3520
3521
|
**Pass criteria:** Exit code non-zero; stderr names the colliding package and both source names.
|
|
3521
3522
|
|
|
3522
|
-
### PK-13: store `.gitignore`
|
|
3523
|
+
### PK-13: no store `.gitignore` for a non-git store
|
|
3523
3524
|
|
|
3524
3525
|
```bash
|
|
3525
3526
|
pk_run pk13 "main"
|
|
3526
|
-
|
|
3527
|
+
test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store"
|
|
3527
3528
|
kanon clean .kanon
|
|
3528
|
-
|
|
3529
|
+
test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: still no .gitignore after clean"
|
|
3529
3530
|
```
|
|
3530
3531
|
|
|
3531
|
-
**Pass criteria:**
|
|
3532
|
+
**Pass criteria:** No `.gitignore` is written under `${KANON_HOME}/store/` (the throwaway store is not inside a git repo); none appears after clean. The safety-net `.gitignore` containing `*` is written only when the store sits inside a git working tree.
|
|
3532
3533
|
|
|
3533
3534
|
### Cleanup
|
|
3534
3535
|
|
|
@@ -5474,12 +5475,12 @@ KANON_SOURCE_a_NAME=a
|
|
|
5474
5475
|
KANON_SOURCE_a_GITBASE=https://example.com
|
|
5475
5476
|
KANONEOF
|
|
5476
5477
|
kanon install
|
|
5477
|
-
|
|
5478
|
+
test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store"
|
|
5478
5479
|
kanon clean
|
|
5479
|
-
|
|
5480
|
+
test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: still no .gitignore after clean"
|
|
5480
5481
|
```
|
|
5481
5482
|
|
|
5482
|
-
**Pass criteria:**
|
|
5483
|
+
**Pass criteria:** No `.gitignore` is written under `${KANON_HOME}/store/` (non-git store); none appears after clean.
|
|
5483
5484
|
|
|
5484
5485
|
### TC-clean-03: `clean --orphans` prunes a removed source's marketplace
|
|
5485
5486
|
|
|
@@ -5649,11 +5650,11 @@ KANON_SOURCE_bravo_GITBASE=https://example.com
|
|
|
5649
5650
|
KANONEOF
|
|
5650
5651
|
kanon install .kanon
|
|
5651
5652
|
test -L ${KANON_HOME}/store/.packages/pkg-alpha && test -L ${KANON_HOME}/store/.packages/pkg-bravo && echo "PASS: both"
|
|
5652
|
-
|
|
5653
|
+
test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store"
|
|
5653
5654
|
kanon clean .kanon
|
|
5654
5655
|
```
|
|
5655
5656
|
|
|
5656
|
-
**Pass criteria:** Both packages aggregated; `.gitignore`
|
|
5657
|
+
**Pass criteria:** Both packages aggregated; no `.gitignore` is written (non-git store).
|
|
5657
5658
|
|
|
5658
5659
|
### UJ-04: `GITBASE` env override (`docs/pipeline-integration.md`)
|
|
5659
5660
|
|
|
@@ -6011,7 +6012,7 @@ kanon --home "${NS05_HOME}" clean .kanon
|
|
|
6011
6012
|
```
|
|
6012
6013
|
|
|
6013
6014
|
**Pass criteria:** Exit code 0. The store is created under the explicit `--home`
|
|
6014
|
-
path (flag precedence: `--home`/`--store-dir` > `KANON_HOME` > `~/.kanon`), not
|
|
6015
|
+
path (flag precedence: `--home`/`--store-dir` > `KANON_HOME` > `~/.kanon-home`), not
|
|
6015
6016
|
under the exported `KANON_HOME`. `--store-dir` is an accepted alias for `--home`.
|
|
6016
6017
|
|
|
6017
6018
|
### NS-06: `--no-update-check` suppresses the PyPI update check
|
|
@@ -6050,11 +6051,10 @@ directory, so the checks below operate from the store base:
|
|
|
6050
6051
|
cd "${KANON_HOME}/store"
|
|
6051
6052
|
```
|
|
6052
6053
|
|
|
6053
|
-
### 16.1 .gitignore
|
|
6054
|
+
### 16.1 no store .gitignore for a non-git store
|
|
6054
6055
|
|
|
6055
6056
|
```bash
|
|
6056
|
-
|
|
6057
|
-
grep -q "^\.kanon-data/$" ${KANON_HOME}/store/.gitignore && echo "PASS: .kanon-data/ in .gitignore" || echo "FAIL"
|
|
6057
|
+
test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store" || echo "FAIL: unexpected .gitignore"
|
|
6058
6058
|
```
|
|
6059
6059
|
|
|
6060
6060
|
### 16.2 .packages/ contains symlinks
|
|
@@ -6338,7 +6338,7 @@ After running every scenario from §2 through §28, populate this spreadsheet-st
|
|
|
6338
6338
|
| 162 | PK-10 | non-marketplace | linkfile + PEP 440 | | | | |
|
|
6339
6339
|
| 163 | PK-11 | non-marketplace | multi-source PEP 440 mix | | | | |
|
|
6340
6340
|
| 164 | PK-12 | non-marketplace | collision PEP 440 | | | | |
|
|
6341
|
-
| 165 | PK-13 | non-marketplace | .gitignore
|
|
6341
|
+
| 165 | PK-13 | non-marketplace | no store .gitignore (non-git store) | | | | |
|
|
6342
6342
|
| 166 | RP-init-01 | repo-init | bare init | | | | |
|
|
6343
6343
|
| 167 | RP-init-02 | repo-init | --manifest-url long form | | | | |
|
|
6344
6344
|
| 168 | RP-init-03 | repo-init | --manifest-name=alt.xml | | | | |
|