kanon-cli 3.1.1__tar.gz → 3.3.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.1 → kanon_cli-3.3.0}/CHANGELOG.md +203 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/PKG-INFO +54 -7
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/README.md +53 -6
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/architecture.md +5 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/catalog-author-guide.md +2 -2
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/cli/catalog-audit.md +4 -4
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/cli/doctor.md +6 -6
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/cli-reference.md +81 -2
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/coming-from-pip-npm-cargo.md +1 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/configuration.md +75 -5
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/doctor.md +1 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/how-it-works.md +1 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/installation.md +5 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/integration-testing.md +18 -18
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/lifecycle.md +32 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/migration-to-add.md +2 -2
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/pipeline-integration.md +4 -4
- kanon_cli-3.3.0/docs/privacy.md +90 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/shell-completion.md +3 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/pyproject.toml +3 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/__init__.py +1 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/cli.py +76 -9
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/add.py +2 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/clean.py +54 -4
- kanon_cli-3.3.0/src/kanon_cli/commands/list.py +560 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/marketplace.py +3 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/remove.py +5 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/cache.py +1 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/constants.py +184 -4
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/clean.py +85 -4
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/cli_args.py +23 -2
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/install.py +122 -14
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/kanonenv_writer.py +34 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/lockfile.py +99 -14
- kanon_cli-3.3.0/src/kanon_cli/core/telemetry.py +1109 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/update_check.py +62 -7
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/conftest.py +42 -4
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/completion/expected-bash.sh +14 -4
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/completion/expected-powershell.ps1 +1 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/completion/expected-zsh.sh +20 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-clean.txt +15 -1
- kanon_cli-3.3.0/tests/fixtures/help/kanon-list.txt +35 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-toplevel.txt +4 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/conftest.py +5 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_clean_lifecycle.py +41 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_help_snapshots.py +1 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_install_lifecycle.py +17 -14
- kanon_cli-3.3.0/tests/functional/test_list.py +196 -0
- kanon_cli-3.3.0/tests/functional/test_list_telemetry.py +119 -0
- kanon_cli-3.3.0/tests/functional/test_telemetry_journey.py +309 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_clean_lifecycle.py +2 -2
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_clean_paths.py +48 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_cli_entry_points.py +16 -13
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_completion_bash.py +12 -1
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_concurrency.py +12 -28
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_fs_fault_injection.py +4 -6
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_full_user_journey.py +11 -18
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_gitignore_idempotency.py +17 -14
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_lifecycle.py +57 -50
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_kanon_clean_embedded.py +2 -2
- kanon_cli-3.3.0/tests/integration/test_kanon_dir_collision.py +51 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_kanon_full_lifecycle.py +26 -24
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_kanon_install_embedded.py +9 -9
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_lifecycle_recovery.py +15 -12
- kanon_cli-3.3.0/tests/integration/test_list_command_json.py +141 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_misc_features.py +5 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/conftest.py +4 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ic.py +6 -7
- kanon_cli-3.3.0/tests/scenarios/test_install_graph_capture.py +101 -0
- kanon_cli-3.3.0/tests/scenarios/test_list_journey.py +151 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_pk.py +9 -10
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_tc_clean.py +9 -14
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_uj.py +3 -3
- kanon_cli-3.3.0/tests/unit/test_build_project_entries.py +156 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cache_layout.py +4 -4
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_clean.py +93 -5
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_clean_command.py +118 -6
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cli.py +156 -6
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_constants.py +5 -5
- kanon_cli-3.3.0/tests/unit/test_constants_list.py +106 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_coverage_gaps.py +2 -2
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_home_flag.py +3 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install.py +4 -2
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_isolation_fixtures.py +3 -3
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_kanonenv_writer.py +36 -0
- kanon_cli-3.3.0/tests/unit/test_list.py +466 -0
- kanon_cli-3.3.0/tests/unit/test_lockfile_reconcile.py +132 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_search.py +15 -25
- kanon_cli-3.3.0/tests/unit/test_telemetry.py +1087 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_update_check.py +86 -9
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.claude/settings.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/.devcontainer.postcreate.sh +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/VERSION +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/catalog-entry.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/devcontainer-functions.sh +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/devcontainer.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/fix-line-endings.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/nix-family-os/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/postcreate-wrapper.sh +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/project-setup.sh +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/wsl-family-os/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.github/CODEOWNERS +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.github/actions/setup-kanon/action.yml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.github/workflows/codeql-analysis.yml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.github/workflows/main-validation.yml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.github/workflows/pr-validation.yml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.github/workflows/publish.yml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.gitignore +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.markdownlint.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.pre-commit-config.yaml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.tool-versions +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/.yamllint +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/CLAUDE.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/CONTRIBUTING.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/LICENSE +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/Makefile +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/catalog-format-versioning.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/catalogs-explained.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/claude-marketplaces-guide.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/cli/validate.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/cli.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/contributing.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/creating-manifest-repos.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/creating-packages.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/exit-codes.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/git-auth-setup.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/list-and-add.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/lockfile.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/migrating-existing-kanon-files.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/multi-source-guide.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/outdated-and-why.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/repo/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/repo/internal-fs-layout.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/repo/manifest-format.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/repo/python-support.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/repo/repo-hooks.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/repo/smart-sync.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/repo/windows.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/security-model.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/setup-guide.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/test-coverage.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/testing/matrix-traceability.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/troubleshooting.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/url-canonicalization.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/docs/version-resolution.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/git-hooks/pre-commit +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/git-hooks/pre-push +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/link +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/requirements-dev.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/requirements.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/scripts/check_archive_no_duplicates.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/__main__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/catalog.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/completion.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/doctor.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/install.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/outdated.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/repo.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/search.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/validate.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/commands/why.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/cached_catalogs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/catalog_entries.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/catalog_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/lockfile_names.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/midtoken.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/pep440_filter.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/powershell.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/preamble.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/project_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/sanitize.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/completions/source_names.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/catalog.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/discover.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/git_runner.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/include_walker.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/kanon_hash.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/kanonenv.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/manifest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/manifest_vars.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/marketplace.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/marketplace_validator.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/metadata.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/remote_url.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/url.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/core/xml_validator.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/color.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/editor.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/error.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/event_log.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/fetch.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/git_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/git_config.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/git_refs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/git_ssh +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/git_superproject.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/hooks/commit-msg +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/hooks.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/main.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/manifest_xml.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/pager.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/platform_utils.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/progress.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/project.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/repo +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/repo_logging.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/repo_trace.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/requirements.jsonc +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/ssh.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/branches.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/diff.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/download.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/forall.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/gc.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/grep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/help.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/info.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/init.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/list.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/overview.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/prune.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/stage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/start.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/status.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/sync.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/subcmds/upload.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/version_constraints.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/repo/wrapper.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/utils/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/utils/concurrency.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/utils/levenshtein.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/utils/lock_file_path.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/utils/spawn.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/src/kanon_cli/version.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/completion/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/conflict-detected.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/entry-not-found.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/source-collision.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-add.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-catalog.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-completion.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-doctor.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-install.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-marketplace.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-outdated.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-remove.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-search.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/help/kanon-why.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/.gitignore +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/linter-test-bad.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/linter-test-bad.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/sample-manifest.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/sample-project-config.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/test.gitconfig +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/fixtures/repo/version_constraints_data.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_add_alias_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_alias_consumer_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_argparse_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_argparse_help.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_cli_entry_point.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_completion_snapshots.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_default_branch_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_env_int_guard_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_error_snapshots.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_exit_code_matrix.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_groups_filter.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_help_text_contract.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_home_flag_unwritable_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_init_default_branch_prerequisite_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_install_hermetic_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_install_real_kanon.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_install_v3_lock_fail_fast_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_kanon_home_store_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_kanon_repo_cli.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_kanon_repo_e2e.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_lifecycle_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_make_operator_path_targets.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_marketplace_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_matrix_traceability_complete.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_provider_agnostic.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_abandon_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_abandon_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_abandon_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_branches_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_branches_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_branches_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_checkout_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_checkout_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_checkout_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_diff_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_diff_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_diff_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_dir_override.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_download_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_download_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_download_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_envsubst_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_envsubst_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_envsubst_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_exit_codes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_forall_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_forall_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_forall_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_gc_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_gc_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_gc_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_grep_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_grep_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_grep_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_help_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_help_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_help_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_info_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_info_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_info_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_init_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_init_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_init_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_init_mirror.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_list_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_list_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_list_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_manifest_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_manifest_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_manifest_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_overview_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_overview_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_overview_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_passthrough.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_prune_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_prune_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_prune_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_rebase_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_rebase_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_rebase_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_selfupdate_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_selfupdate_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_selfupdate_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_smartsync_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_smartsync_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_smartsync_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_stage_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_stage_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_stage_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_start_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_start_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_start_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_status_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_status_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_status_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_sync_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_sync_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_sync_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_upload_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_upload_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_repo_upload_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_singular_catalog_source_inert.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_stdout_stderr_discipline.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_update_alert_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_validate_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_validate_lifecycle.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_validate_lockfile.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_validate_marketplace.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_validate_xml_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_validate_xml_repo_root.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/functional/test_zero_source_clean_error.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/conftest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/fixtures/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/fixtures/synthetic/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/fixtures/synthetic/conftest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/fixtures/synthetic/drift.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/provider_allowlist.txt +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/conftest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_bug_fixes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_envsubst_integration.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_import_functional.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_manifest_parsing.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_repo_module_smoke.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_repo_pipeline.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_version_constraints_integration.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_add_core.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_add_dry_run.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_add_env_var_detection.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_add_zero_tags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_auto_discovery.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_background_refresh.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_cache_clock_skew.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_cache_layout.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_catalog_constraints.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_ci_validation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_clean_env_override_cleanup.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_complete_project_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_complete_source_names.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_completion_powershell_subcommand.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_completion_subcommand.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_completion_zsh.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_concurrency_serialization.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_copyfile_fs_effects.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_cross_platform_contract.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doc_validation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doctor_consistency.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doctor_prune_cache.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_doctor_remote_check.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_envsubst_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_fs_fault_extended.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_git_fault_injection.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_git_retry_env.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_home_flag_store_relocation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_after_add.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_env_var_resolution.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_include_cycle.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_include_diamond.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_lock_file_derivation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_lockfile_replay.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_marketplace_registration.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_no_kanon_remediation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_optional_vars.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_path_conflict_integration.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_paths.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_per_alias_gitbase.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_reconcile.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_remote_url_policy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_required_vars.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_install_strict.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_json_output_stream_discipline.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_kanonenv_parsing.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_linkfile_fs_effects.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_all_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_all_versions_canonical.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_default.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_detail.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_filter.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_format_json.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_list_tree.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_lockfile_roundtrip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_marketplace_install.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_marketplace_lifecycle.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_marketplace_orphan_prune.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_midtoken_bash.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_midtoken_zsh.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_multi_source_aggregation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_no_bundled_catalog.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_no_default_catalog.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_no_hardcoded_org_values.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_observability.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_outdated.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_outdated_branch_drift.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_outdated_format_json.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_platform_parity.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_preamble_bash.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_preamble_zsh.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_remove_core.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_remove_dry_run.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_remove_force_integration.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_signal_handling.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_synthetic_drift_fixture.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_unicode_encoding.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_validate_marketplace.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_validate_marketplace_revision_existence.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_validate_metadata.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_validate_xml.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_version_resolution.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_version_widened_bare_pep440.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_wheel_e2e.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_why_ambiguous.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_why_chain_walker.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_why_format_json.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_why_live_resolve.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_why_not_found_suggestion.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/integration/test_workspace_dir_env.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/regression/test_e0_install_relative_regression.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/_rp_helpers.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ad.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_bs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_cd.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_content_pins.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_cs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_doctor_cache.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_doctor_journey.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ec.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ev.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_hv.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_id.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ks.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_lf.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_mk.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ms.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_ns_marketplace_and_global_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_outdated_two_source.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rc.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_abandon.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_branches.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_checkout.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_cherry_pick.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_diff.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_diffmanifests.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_download.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_envsubst.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_forall.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_gc.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_grep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_help.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_info.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_init.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_list.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_manifest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_overview.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_prune.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_rebase.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_smartsync.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_stage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_start.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_status.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_sync.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_upload.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rp_wrap.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_rx.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_search_multi_source.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_tc_bootstrap.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_tc_install.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_tc_validate.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_va.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_va_validate_lockfile.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_why_surface_query.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_why_url_path.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/security/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/security/test_security_hardening.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/test_wheel_layout.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/conftest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/conftest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/fixtures/.gitignore +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/fixtures/README.md +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/fixtures/test.gitconfig +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/functional/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/functional/test_features.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_abandon_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_branches_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug11_race_condition.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_checkout_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_color.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_conftest_fixtures.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_download_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_editor.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_embedded_mode.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_envsubst_basic.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_envsubst_edge.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_envsubst_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_error.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_event_log.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_event_log_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_fetch.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_fixture_files.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_forall_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_git_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_git_config.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_git_refs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_git_superproject.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_grep_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_harness_smoke.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_hooks.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_import_verification.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_imports.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_include_path_resolution.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_info_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_init_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_list_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_main.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_main_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_main_init_download_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_makefile_lint_format.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_makefile_structure.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_makefile_test_targets.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_manifest_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_manifest_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_manifest_xml.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_medium_files_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_overview_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_package_structure.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_pager.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_parselist.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_pep440_edge_1.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_pep440_edge_2.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_platform_utils.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_progress.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_coverage_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_deep_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_final_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_integration.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_methods.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_project_sync.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_prune_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_rebase_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_repo_logging.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_repo_run_api.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_repo_sync_api.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_repo_trace.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_revision_inheritance.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_ruff_config.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_selfupdate_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_small_files_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_ssh.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_ssh_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_stage_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_stage_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_start_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_status_coverage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_status_gaps.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_status_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmd_imports.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_abandon.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_branches.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_checkout.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_diff.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_download.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_forall.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_gc.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_grep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_help.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_info.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_init.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_list.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_manifest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_overview.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_prune.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_rebase.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_stage.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_start.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_status.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_sync.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_subcmds_upload.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_superproject_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_sync_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_sync_deep_boost.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_sync_massive.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_upload_deep.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_version_consolidation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_version_constraints.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_wheel_contents.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_wrapper.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_default_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_default_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_default_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_fault_structural.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_include_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_include_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_include_cycles.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_include_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_notice_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_project_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_project_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_project_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_remote_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xmlbool.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_xmlint.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/repo/test_yamllint_config.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_accessed_at_coalescing.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_add.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_add_collision.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_add_zero_tags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_background_refresh.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_bare_semver_to_tag.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cache.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cache_ttl.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cached_catalogs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_check_parser.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_catalog_source_parsing.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_check_no_comments.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_ci_workflows.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cli_args.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cli_help_format.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_cli_json_stream_discipline.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_complete_project_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_complete_source_names.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_completion.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_completion_sanitization.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_completion_subcommand.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_concurrency.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_conftest_scrubber.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_constants_doctor_subcheck.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_constants_env_int.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_constants_install_after_add.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_constants_outdated_refs_tags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_constants_why_lockfile.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_derive_source_name.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_discover.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_discover_source_names_missing_url.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_docs_embedded_architecture.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor_completion_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor_completion_staleness.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor_consistency.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor_coverage_gaps.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_doctor_remote_reachability.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_env_isolation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_envsubst_subcommand.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_git_runner.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_include_walker.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_color_default.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_conflict_detection.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_https_enforcement.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_placeholder_validation.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_reconcile_decision.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_state_matrix.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_strict_flags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_kanon_hash.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_kanonenv.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_kanonenv_edge_cases.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_levenshtein.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_lock_file_path.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_lockfile.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_lockfile_schema_migration.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_manifest.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_marketplace.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_marketplace_cmd.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_marketplace_install.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_marketplace_validator.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_metadata.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_midtoken_splitter.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_outdated.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_outdated_branch_pinned.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_outdated_format_json.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_pep440_filter.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_powershell.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_pre_push_hook.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_preamble.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_preamble_semver_tags.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_provider_agnosticism.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_pyproject_build_config.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_remote_url.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_remove.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_remove_dry_run.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_remove_force.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_remove_line_endings.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_repo.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_repo_abspath.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_repo_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_resolve_catalog_dir.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_revision_resolve.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_sanitize.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_search_all_versions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_search_coverage_gaps.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_search_detail.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_search_filter.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_search_format_json.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_search_tree.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_spawn.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_url.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_validate.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_validate_command.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_validate_metadata.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_version.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_version_constraint_errors.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_why.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_why_ambiguity.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_why_format_json.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_why_suggestions.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tests/unit/test_xml_validator.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tools/lint/check_no_comments.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/tools/test_tmp_monitor.py +0 -0
- {kanon_cli-3.1.1 → kanon_cli-3.3.0}/uv.lock +0 -0
|
@@ -2,8 +2,205 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
## v3.3.0 (2026-07-17)
|
|
6
|
+
|
|
7
|
+
### Feature
|
|
8
|
+
|
|
9
|
+
* feat: kanon list command + usage telemetry, full install-graph capture, and update-warning enhancement (#91)
|
|
10
|
+
|
|
11
|
+
* feat: add usage telemetry, full install-graph capture, and update-warning enhancement
|
|
12
|
+
|
|
13
|
+
Emit one structured usage-telemetry event per CLI command to the Caylent
|
|
14
|
+
collector, fully capturing what was installed (every direct source plus every
|
|
15
|
+
transitive repo package with URLs and resolved content SHAs), and enhance the
|
|
16
|
+
"update available" warning.
|
|
17
|
+
|
|
18
|
+
Telemetry (new core/telemetry.py):
|
|
19
|
+
- Hooked via try/finally around dispatch in cli.py; captures command, subcommand,
|
|
20
|
+
boolean flag names, allowlisted flag values, outcome (exit code/status/error
|
|
21
|
+
class/duration), runtime environment, and credential-stripped git provenance.
|
|
22
|
+
- OTLP/HTTP logs JSON with one log record whose body is a flat
|
|
23
|
+
{tool,timestamp,event_type,payload} object (payload a JSON string); POSTed via
|
|
24
|
+
stdlib urllib in a detached, non-blocking, silent, never-fail background
|
|
25
|
+
process (utils/spawn.spawn_detached), HTTPS-only guard, timeouts + body cap.
|
|
26
|
+
- Auto opted-in by default; the only opt-out is KANON_TELEMETRY_DISABLED (no
|
|
27
|
+
--no-telemetry flag). KANON_TELEMETRY_ENDPOINT / --telemetry-endpoint and
|
|
28
|
+
KANON_TELEMETRY_DEBUG / --telemetry-debug are supported.
|
|
29
|
+
- Zero-secret allowlist: never raw argv, keys, tokens, credentials, env-var
|
|
30
|
+
values, or file contents; every URL is credential-stripped.
|
|
31
|
+
|
|
32
|
+
Full install-graph capture (core/install.py):
|
|
33
|
+
- Populate SourceEntry.projects on install by resolving project -> remote -> URL
|
|
34
|
+
from the already-synced manifests (walk_includes_collecting_remotes +
|
|
35
|
+
join_project_repo_url + canonicalize_repo_url) joined with the captured content
|
|
36
|
+
pins. This also fixes `kanon why` showing an empty project layer on
|
|
37
|
+
install-written lockfiles. Telemetry emits payload.install_graph and a
|
|
38
|
+
flattened payload.installed_packages[] (direct + transitive), capped under the
|
|
39
|
+
collector body limit with install_graph_truncated on overflow.
|
|
40
|
+
|
|
41
|
+
Update-warning enhancement (core/update_check.py):
|
|
42
|
+
- Yellow banner with the current version in red and the latest in green; a red
|
|
43
|
+
"no internet access -- could not check for updates" notice on a failed fetch,
|
|
44
|
+
shown at most once per window; default KANON_UPDATE_CHECK_TTL lowered to 3h.
|
|
45
|
+
|
|
46
|
+
Docs: new docs/privacy.md (collected fields, encryption, opt-out) linked from
|
|
47
|
+
README; telemetry rows in docs/cli-reference.md and docs/configuration.md;
|
|
48
|
+
regenerated help + completion snapshots.
|
|
49
|
+
|
|
50
|
+
* test: include telemetry global flags in bash completion expectation
|
|
51
|
+
|
|
52
|
+
The new --telemetry-debug / --telemetry-endpoint global flags now appear in the
|
|
53
|
+
top-level bash completion, so the exact-match global_flags row in
|
|
54
|
+
test_completion_bash.py is extended to include them.
|
|
55
|
+
|
|
56
|
+
* test: use provider-neutral remote name in build_project_entries fixture
|
|
57
|
+
|
|
58
|
+
The provider-agnostic host gate forbids the bare token 'gh'; rename the fixture
|
|
59
|
+
manifest remote from 'gh' to 'origin' so the manifest XML fixtures carry no
|
|
60
|
+
provider-specific reference.
|
|
61
|
+
|
|
62
|
+
* fix: record real command outcome in telemetry and emit for --version/--help/bare invocations
|
|
63
|
+
|
|
64
|
+
* feat: add kanon list command (declared vs installed source inventory)
|
|
65
|
+
|
|
66
|
+
Add `kanon list`, the flat inventory command that reconciles the sources
|
|
67
|
+
declared in .kanon against those installed in .kanon.lock and tags each one
|
|
68
|
+
installed / not-installed / orphan -- the kanon analogue of `pip list` /
|
|
69
|
+
`npm ls` / `poetry show`.
|
|
70
|
+
|
|
71
|
+
Flags: --declared, --tree, --status <installed|not-installed|orphan>,
|
|
72
|
+
--format <table|json>, --kanon-file, --lock-file. Every failure path yields a
|
|
73
|
+
clean single-prefixed ERROR (no traceback). The command emits usage telemetry
|
|
74
|
+
like every other command (command=list, --tree flag, --format/--status values
|
|
75
|
+
via the flag-value allowlist).
|
|
76
|
+
|
|
77
|
+
The declared-vs-installed partition reuses a new non-raising
|
|
78
|
+
reconcile_declared_installed() extracted from check_lockfile_consistency (one
|
|
79
|
+
source of truth). Covered by unit/functional/integration/scenario tests plus a
|
|
80
|
+
real-git add->install->edit->list journey; list.py at 100% coverage. Help and
|
|
81
|
+
shell-completion snapshots and docs updated.
|
|
82
|
+
|
|
83
|
+
The 3.0.0 list->search rename left guards asserting `list` is an unknown
|
|
84
|
+
command; those are updated to reflect `list` now being a distinct command.
|
|
85
|
+
|
|
86
|
+
* test: isolate test subprocesses from coverage subprocess measurement
|
|
87
|
+
|
|
88
|
+
Under `pytest --cov` (make test) pytest-cov and coverage export COV_CORE_* /
|
|
89
|
+
COVERAGE_PROCESS_* so spawned subprocesses auto-start coverage. A measured
|
|
90
|
+
`kanon` subprocess then writes a .coverage-data directory into its working
|
|
91
|
+
directory -- resolved relative to the child CWD on some filesystems -- which
|
|
92
|
+
behavioural subprocess tests that inspect the child filesystem
|
|
93
|
+
(`kanon repo status --orphans`) or parse its stderr (`--telemetry-debug` JSON)
|
|
94
|
+
then trip over, non-deterministically across OS / filesystem.
|
|
95
|
+
|
|
96
|
+
Strip the coverage subprocess-trigger variables from the child environment in
|
|
97
|
+
the functional and scenario subprocess runners and the telemetry-journey env
|
|
98
|
+
builder via a shared strip_subprocess_coverage_env helper. Behavioural CLI
|
|
99
|
+
subprocess tests do not need coverage of the child; the 90% coverage gate is
|
|
100
|
+
measured in-process on the unit tier, which uses its own runner and is
|
|
101
|
+
unaffected. ([`57246f8`](https://github.com/caylent-solutions/kanon/commit/57246f8a8a46b99ad2b35a954289d7a9e7d1966c))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
## v3.2.0 (2026-07-13)
|
|
105
|
+
|
|
106
|
+
### Chore
|
|
107
|
+
|
|
108
|
+
* chore(release): 3.2.0 ([`b503e3c`](https://github.com/caylent-solutions/kanon/commit/b503e3cf92479b6192b186ad6b2481563c916074))
|
|
109
|
+
|
|
110
|
+
### Feature
|
|
111
|
+
|
|
112
|
+
* feat(clean): ~/.kanon-home store rename, .kanon-dir guard, --purge/--purge-all (store-only teardown with no .kanon), no unconditional .gitignore (#89)
|
|
113
|
+
|
|
114
|
+
* feat(clean): add --purge/--purge-all; default home store to ~/.kanon-home; clean error when .kanon is a directory
|
|
115
|
+
|
|
116
|
+
Three related changes so kanon works cleanly from any directory (including
|
|
117
|
+
$HOME) and can be fully torn down with the tool:
|
|
118
|
+
|
|
119
|
+
- Rename the default home store directory from ~/.kanon to ~/.kanon-home so it
|
|
120
|
+
no longer collides with the project .kanon config file. Running kanon from
|
|
121
|
+
$HOME previously crashed with a cryptic "Is a directory". Only the default
|
|
122
|
+
changes; the --home/--store-dir flag and KANON_HOME env are unchanged. No
|
|
123
|
+
auto-migration: a leftover ~/.kanon store is an orphaned cache, safe to delete.
|
|
124
|
+
|
|
125
|
+
- When a writer (add / remove / marketplace enable|disable) must read or write
|
|
126
|
+
the .kanon config FILE but finds a .kanon DIRECTORY there, fail fast with a
|
|
127
|
+
clean, actionable error naming the exact rm -rf <path> command and telling the
|
|
128
|
+
user to re-run, instead of the cryptic IsADirectoryError.
|
|
129
|
+
|
|
130
|
+
- Add kanon clean --purge (also delete this project's .kanon and .kanon.lock)
|
|
131
|
+
and kanon clean --purge-all (also remove the shared KANON_HOME store dir).
|
|
132
|
+
--purge-all validates it removes ONLY kanon-owned content: it refuses unsafe
|
|
133
|
+
KANON_HOME paths (filesystem root, your home, or a parent of home/cwd), removes
|
|
134
|
+
only the store/ and cache/ subdirs, and removes the home root only when empty;
|
|
135
|
+
any non-kanon entries are kept with a warning.
|
|
136
|
+
|
|
137
|
+
Tests: unit + integration + functional for all three changes (the
|
|
138
|
+
directory-collision guard for all writers and the --purge-all safety refusals
|
|
139
|
+
included). Docs and the clean/toplevel --help snapshots updated.
|
|
140
|
+
|
|
141
|
+
* test(clean): sync completion goldens and stub signature for --purge flags
|
|
142
|
+
|
|
143
|
+
The new kanon clean --purge / --purge-all flags changed the bash and zsh
|
|
144
|
+
shell-completion output, so regenerate the committed golden fixtures. Also
|
|
145
|
+
extend the clean() side-effect stub in the path-resolution integration test
|
|
146
|
+
to accept the new purge / purge_home keyword arguments, matching the updated
|
|
147
|
+
core clean() signature.
|
|
148
|
+
|
|
149
|
+
* fix(clean): remove the shared home store on --purge-all even when no .kanon is present
|
|
150
|
+
|
|
151
|
+
kanon clean --purge-all is machine-global: it must tear down the shared
|
|
152
|
+
KANON_HOME store even when there is no discoverable project .kanon (for example
|
|
153
|
+
right after kanon clean --purge deleted it). Previously it failed with
|
|
154
|
+
"No .kanon file found ..." and left ~/.kanon-home in place.
|
|
155
|
+
|
|
156
|
+
_run now detects the no-usable-.kanon case (auto-discovery FileNotFoundError, or
|
|
157
|
+
an explicit path that is not a file) and, when --purge-all is set, removes only
|
|
158
|
+
the shared home store via remove_kanon_home_store(), preserving every safety
|
|
159
|
+
refusal (filesystem root, the user home directory, an ancestor of the home or
|
|
160
|
+
current directory). Plain clean and --purge without --purge-all still require a
|
|
161
|
+
discoverable .kanon.
|
|
162
|
+
|
|
163
|
+
Regenerates the clean help snapshot and the zsh completion golden for the
|
|
164
|
+
updated --purge-all help text.
|
|
165
|
+
|
|
166
|
+
* fix(install): stop writing an unconditional .gitignore; keep only the in-git-repo store safety net
|
|
167
|
+
|
|
168
|
+
In the 3.x store model both gitignore writes targeted <KANON_HOME>/store/.gitignore.
|
|
169
|
+
kanon install wrote .packages/ and .kanon-data/ into that file unconditionally,
|
|
170
|
+
littering a .gitignore even for the default ~/.kanon-home (which is not a git
|
|
171
|
+
repo). Remove the unconditional write.
|
|
172
|
+
|
|
173
|
+
The store safety net (write_store_gitignore_if_in_git_repo) is retained: kanon
|
|
174
|
+
still writes <KANON_HOME>/store/.gitignore containing "*" ONLY when the store
|
|
175
|
+
sits inside a git working tree, so a KANON_HOME inside a repo never commits the
|
|
176
|
+
fetched-artifact cache (spec Section 3.5). With the default ~/.kanon-home, kanon
|
|
177
|
+
writes no .gitignore at all.
|
|
178
|
+
|
|
179
|
+
update_gitignore now requires its entries argument (the removed default was the
|
|
180
|
+
only unconditional caller). Tests that asserted the removed unconditional write
|
|
181
|
+
now assert the new behavior (no .gitignore for a non-git store); the append-helper
|
|
182
|
+
mechanics tests pass explicit entries; the safety-net tests are unchanged.
|
|
183
|
+
|
|
184
|
+
Docs (how-it-works, architecture, lifecycle, integration-testing) updated;
|
|
185
|
+
lifecycle also documents clean --purge-all running without a .kanon.
|
|
186
|
+
|
|
187
|
+
---------
|
|
188
|
+
|
|
189
|
+
Co-authored-by: t <t@e.x> ([`d9b0ad1`](https://github.com/caylent-solutions/kanon/commit/d9b0ad1856ab58487b7ed3efdc3ff9d87b60b193))
|
|
190
|
+
|
|
191
|
+
### Unknown
|
|
192
|
+
|
|
193
|
+
* Merge pull request #90 from caylent-solutions/release-3.2.0
|
|
194
|
+
|
|
195
|
+
Release 3.2.0 ([`fb944e2`](https://github.com/caylent-solutions/kanon/commit/fb944e251cf650020070e29cb28a26cbffc886da))
|
|
196
|
+
|
|
197
|
+
|
|
5
198
|
## v3.1.1 (2026-06-27)
|
|
6
199
|
|
|
200
|
+
### Chore
|
|
201
|
+
|
|
202
|
+
* chore(release): 3.1.1 ([`890b026`](https://github.com/caylent-solutions/kanon/commit/890b026b47ca8820b41ca8d218658e50691254a2))
|
|
203
|
+
|
|
7
204
|
### Fix
|
|
8
205
|
|
|
9
206
|
* fix: outdated handles namespaced/bare exact tags; why disambiguates same-URL sources (#87)
|
|
@@ -31,6 +228,12 @@ distinct alias tokens + alias round-trip for why).
|
|
|
31
228
|
|
|
32
229
|
Co-authored-by: t <t@e.x> ([`0d45f67`](https://github.com/caylent-solutions/kanon/commit/0d45f673243861b0aaef823f6d95e0a548c447d4))
|
|
33
230
|
|
|
231
|
+
### Unknown
|
|
232
|
+
|
|
233
|
+
* Merge pull request #88 from caylent-solutions/release-3.1.1
|
|
234
|
+
|
|
235
|
+
Release 3.1.1 ([`cec7213`](https://github.com/caylent-solutions/kanon/commit/cec7213109c0e307e80751e728c6a59751e20794))
|
|
236
|
+
|
|
34
237
|
|
|
35
238
|
## v3.1.0 (2026-06-27)
|
|
36
239
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kanon-cli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.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
|
|
@@ -55,6 +55,7 @@ via declarative manifests.
|
|
|
55
55
|
- [kanon remove](#kanon-remove)
|
|
56
56
|
- [kanon install](#kanon-install)
|
|
57
57
|
- [kanon clean](#kanon-clean)
|
|
58
|
+
- [kanon list](#kanon-list)
|
|
58
59
|
- [kanon outdated](#kanon-outdated)
|
|
59
60
|
- [kanon why](#kanon-why)
|
|
60
61
|
- [kanon doctor](#kanon-doctor)
|
|
@@ -183,7 +184,7 @@ git commit -m "feat: add my-package 1.2.3"
|
|
|
183
184
|
|
|
184
185
|
Committing both files ensures the entire team installs the same resolved
|
|
185
186
|
package versions. The synced artifacts live in the shared `KANON_HOME`
|
|
186
|
-
store (`~/.kanon` by default), never in your project, so there is nothing
|
|
187
|
+
store (`~/.kanon-home` by default), never in your project, so there is nothing
|
|
187
188
|
package-related to commit beyond `.kanon` and `.kanon.lock`.
|
|
188
189
|
|
|
189
190
|
---
|
|
@@ -208,6 +209,7 @@ persistent installation and advanced options, see
|
|
|
208
209
|
| `kanon search` | List packages available in a catalog or show detail for one | [docs/list-and-add.md](docs/list-and-add.md) |
|
|
209
210
|
| `kanon add` | Add a package (with optional version constraint) to `.kanon` | [docs/list-and-add.md](docs/list-and-add.md) |
|
|
210
211
|
| `kanon remove` | Remove a package from `.kanon` | [docs/list-and-add.md](docs/list-and-add.md) |
|
|
212
|
+
| `kanon list` | List sources declared in `.kanon` vs installed in `.kanon.lock` (installed / not-installed / orphan) | [docs/cli-reference.md](docs/cli-reference.md#kanon-list) |
|
|
211
213
|
| `kanon outdated` | Show packages in `.kanon` that have newer versions available | [docs/outdated-and-why.md](docs/outdated-and-why.md) |
|
|
212
214
|
| `kanon why` | Explain why a specific package version was resolved | [docs/outdated-and-why.md](docs/outdated-and-why.md) |
|
|
213
215
|
| `kanon install` | Resolve, clone, and symlink all packages; writes `.kanon.lock` | [docs/lockfile.md](docs/lockfile.md) |
|
|
@@ -216,7 +218,7 @@ persistent installation and advanced options, see
|
|
|
216
218
|
| `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
217
219
|
| `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
218
220
|
| `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`
|
|
221
|
+
| `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
222
|
| `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
|
|
221
223
|
| `kanon marketplace` | Manage the per-dependency Claude marketplace install flag in `.kanon` (`enable` / `disable` / `status`) | [docs/configuration.md](docs/configuration.md) |
|
|
222
224
|
| `kanon completion` | Emit a shell completion script for bash, zsh, or powershell | [docs/shell-completion.md](docs/shell-completion.md) |
|
|
@@ -572,6 +574,8 @@ Executes the full teardown lifecycle.
|
|
|
572
574
|
kanon clean # auto-discover .kanon by walking up from cwd
|
|
573
575
|
kanon clean .kanon # explicit path to .kanon file
|
|
574
576
|
kanon clean --orphans # also unregister orphaned marketplaces
|
|
577
|
+
kanon clean --purge # also delete .kanon and .kanon.lock
|
|
578
|
+
kanon clean --purge-all # also remove the KANON_HOME store directory
|
|
575
579
|
```
|
|
576
580
|
|
|
577
581
|
**Behavior:**
|
|
@@ -585,6 +589,32 @@ With `--orphans`, before the normal teardown kanon also unregisters any
|
|
|
585
589
|
kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
|
|
586
590
|
referenced by `.kanon`, pruning them from `~/.claude`.
|
|
587
591
|
|
|
592
|
+
With `--purge`, kanon also deletes this project's `.kanon` and `.kanon.lock`
|
|
593
|
+
files. With `--purge-all`, it additionally removes the shared `KANON_HOME`
|
|
594
|
+
store directory (default `~/.kanon-home`), removing only kanon-owned content
|
|
595
|
+
(`store/`, `cache/`, and the emptied root) and refusing unsafe `KANON_HOME`
|
|
596
|
+
paths such as your home directory or the filesystem root.
|
|
597
|
+
|
|
598
|
+
### kanon list
|
|
599
|
+
|
|
600
|
+
Lists the sources declared in `.kanon` against those installed in `.kanon.lock`,
|
|
601
|
+
tagging each `installed`, `not-installed`, or `orphan` -- the kanon analogue of
|
|
602
|
+
`pip list` / `npm ls`.
|
|
603
|
+
|
|
604
|
+
```bash
|
|
605
|
+
kanon list # every source, declared vs installed, tagged
|
|
606
|
+
kanon list --declared # only sources declared in .kanon (no orphans)
|
|
607
|
+
kanon list --status orphan # only sources in the lock no longer declared
|
|
608
|
+
kanon list --tree # expand installed sources to transitive packages
|
|
609
|
+
kanon list --format json # machine-readable JSON
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
A source is `installed` when it is in both files, `not-installed` when declared
|
|
613
|
+
but not yet locked (run `kanon install`), and `orphan` when locked but no longer
|
|
614
|
+
declared. Key options: `--declared`, `--tree`, `--status {installed,not-installed,orphan}`,
|
|
615
|
+
`--format {table,json}`, `--kanon-file`, `--lock-file`. See
|
|
616
|
+
[docs/cli-reference.md](docs/cli-reference.md#kanon-list).
|
|
617
|
+
|
|
588
618
|
### kanon outdated
|
|
589
619
|
|
|
590
620
|
Compares each source in `.kanon` against the catalog and emits a table of
|
|
@@ -795,9 +825,9 @@ and `kanon catalog audit`. `kanon install` is hermetic: it reads only
|
|
|
795
825
|
`.kanon` and `.kanon.lock` and does not consult a catalog source.
|
|
796
826
|
|
|
797
827
|
**`KANON_HOME`**
|
|
798
|
-
Root of the shared kanon store and caches (default `~/.kanon`). The
|
|
828
|
+
Root of the shared kanon store and caches (default `~/.kanon-home`). The
|
|
799
829
|
`--home` / `--store-dir <path>` global flag overrides it for a single
|
|
800
|
-
invocation; precedence is flag > `KANON_HOME` > `~/.kanon`. Replaces the
|
|
830
|
+
invocation; precedence is flag > `KANON_HOME` > `~/.kanon-home`. Replaces the
|
|
801
831
|
removed `KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` variables. Synced artifacts
|
|
802
832
|
and the per-`.kanon` workspace lock both live under `${KANON_HOME}/store/`,
|
|
803
833
|
so the project directory holds only `.kanon` (plus `.kanon.lock` after the
|
|
@@ -900,7 +930,7 @@ regardless of which source provided each package.
|
|
|
900
930
|
### Directory Structure After Install
|
|
901
931
|
|
|
902
932
|
Fetched artifacts live in the shared `KANON_HOME` store
|
|
903
|
-
(`$KANON_HOME`, default `~/.kanon`), content-addressed and deduped across
|
|
933
|
+
(`$KANON_HOME`, default `~/.kanon-home`), content-addressed and deduped across
|
|
904
934
|
projects. Only `.kanon` and `.kanon.lock` live in (and are committed to)
|
|
905
935
|
the project itself:
|
|
906
936
|
|
|
@@ -909,7 +939,7 @@ project/
|
|
|
909
939
|
.kanon # Configuration (committed)
|
|
910
940
|
.kanon.lock # Resolved SHAs (committed)
|
|
911
941
|
|
|
912
|
-
$KANON_HOME/ # Shared store (default ~/.kanon; not in the repo)
|
|
942
|
+
$KANON_HOME/ # Shared store (default ~/.kanon-home; not in the repo)
|
|
913
943
|
store/
|
|
914
944
|
.kanon-data/
|
|
915
945
|
sources/
|
|
@@ -1475,6 +1505,23 @@ version bumps.
|
|
|
1475
1505
|
supported; see [Platform support](#platform-support) and use WSL2)
|
|
1476
1506
|
- [Contributing](CONTRIBUTING.md) -- How to create and maintain Kanon
|
|
1477
1507
|
packages and marketplaces
|
|
1508
|
+
- [Privacy & Telemetry](docs/privacy.md) -- What usage telemetry kanon
|
|
1509
|
+
collects, why, how it is encrypted, and how to turn it off
|
|
1510
|
+
|
|
1511
|
+
---
|
|
1512
|
+
|
|
1513
|
+
## Usage telemetry
|
|
1514
|
+
|
|
1515
|
+
kanon emits one anonymised-by-design usage event per command to help the
|
|
1516
|
+
maintainers understand which commands and package sources are used. Telemetry
|
|
1517
|
+
is **on by default**, runs **silently** and **non-blocking**, never blocks or
|
|
1518
|
+
fails your command, and serialises only an explicit allowlist of kanon-computed
|
|
1519
|
+
fields -- never raw argv, credentials, keys, tokens, env-var values, or file
|
|
1520
|
+
contents (every URL is credential-stripped before it is sent).
|
|
1521
|
+
|
|
1522
|
+
Disable it entirely by setting `KANON_TELEMETRY_DISABLED=1`. See
|
|
1523
|
+
[docs/privacy.md](docs/privacy.md) for the full list of collected fields and the
|
|
1524
|
+
transit/at-rest encryption.
|
|
1478
1525
|
|
|
1479
1526
|
---
|
|
1480
1527
|
|
|
@@ -33,6 +33,7 @@ via declarative manifests.
|
|
|
33
33
|
- [kanon remove](#kanon-remove)
|
|
34
34
|
- [kanon install](#kanon-install)
|
|
35
35
|
- [kanon clean](#kanon-clean)
|
|
36
|
+
- [kanon list](#kanon-list)
|
|
36
37
|
- [kanon outdated](#kanon-outdated)
|
|
37
38
|
- [kanon why](#kanon-why)
|
|
38
39
|
- [kanon doctor](#kanon-doctor)
|
|
@@ -161,7 +162,7 @@ git commit -m "feat: add my-package 1.2.3"
|
|
|
161
162
|
|
|
162
163
|
Committing both files ensures the entire team installs the same resolved
|
|
163
164
|
package versions. The synced artifacts live in the shared `KANON_HOME`
|
|
164
|
-
store (`~/.kanon` by default), never in your project, so there is nothing
|
|
165
|
+
store (`~/.kanon-home` by default), never in your project, so there is nothing
|
|
165
166
|
package-related to commit beyond `.kanon` and `.kanon.lock`.
|
|
166
167
|
|
|
167
168
|
---
|
|
@@ -186,6 +187,7 @@ persistent installation and advanced options, see
|
|
|
186
187
|
| `kanon search` | List packages available in a catalog or show detail for one | [docs/list-and-add.md](docs/list-and-add.md) |
|
|
187
188
|
| `kanon add` | Add a package (with optional version constraint) to `.kanon` | [docs/list-and-add.md](docs/list-and-add.md) |
|
|
188
189
|
| `kanon remove` | Remove a package from `.kanon` | [docs/list-and-add.md](docs/list-and-add.md) |
|
|
190
|
+
| `kanon list` | List sources declared in `.kanon` vs installed in `.kanon.lock` (installed / not-installed / orphan) | [docs/cli-reference.md](docs/cli-reference.md#kanon-list) |
|
|
189
191
|
| `kanon outdated` | Show packages in `.kanon` that have newer versions available | [docs/outdated-and-why.md](docs/outdated-and-why.md) |
|
|
190
192
|
| `kanon why` | Explain why a specific package version was resolved | [docs/outdated-and-why.md](docs/outdated-and-why.md) |
|
|
191
193
|
| `kanon install` | Resolve, clone, and symlink all packages; writes `.kanon.lock` | [docs/lockfile.md](docs/lockfile.md) |
|
|
@@ -194,7 +196,7 @@ persistent installation and advanced options, see
|
|
|
194
196
|
| `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
195
197
|
| `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
196
198
|
| `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`
|
|
199
|
+
| `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
200
|
| `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
|
|
199
201
|
| `kanon marketplace` | Manage the per-dependency Claude marketplace install flag in `.kanon` (`enable` / `disable` / `status`) | [docs/configuration.md](docs/configuration.md) |
|
|
200
202
|
| `kanon completion` | Emit a shell completion script for bash, zsh, or powershell | [docs/shell-completion.md](docs/shell-completion.md) |
|
|
@@ -550,6 +552,8 @@ Executes the full teardown lifecycle.
|
|
|
550
552
|
kanon clean # auto-discover .kanon by walking up from cwd
|
|
551
553
|
kanon clean .kanon # explicit path to .kanon file
|
|
552
554
|
kanon clean --orphans # also unregister orphaned marketplaces
|
|
555
|
+
kanon clean --purge # also delete .kanon and .kanon.lock
|
|
556
|
+
kanon clean --purge-all # also remove the KANON_HOME store directory
|
|
553
557
|
```
|
|
554
558
|
|
|
555
559
|
**Behavior:**
|
|
@@ -563,6 +567,32 @@ With `--orphans`, before the normal teardown kanon also unregisters any
|
|
|
563
567
|
kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
|
|
564
568
|
referenced by `.kanon`, pruning them from `~/.claude`.
|
|
565
569
|
|
|
570
|
+
With `--purge`, kanon also deletes this project's `.kanon` and `.kanon.lock`
|
|
571
|
+
files. With `--purge-all`, it additionally removes the shared `KANON_HOME`
|
|
572
|
+
store directory (default `~/.kanon-home`), removing only kanon-owned content
|
|
573
|
+
(`store/`, `cache/`, and the emptied root) and refusing unsafe `KANON_HOME`
|
|
574
|
+
paths such as your home directory or the filesystem root.
|
|
575
|
+
|
|
576
|
+
### kanon list
|
|
577
|
+
|
|
578
|
+
Lists the sources declared in `.kanon` against those installed in `.kanon.lock`,
|
|
579
|
+
tagging each `installed`, `not-installed`, or `orphan` -- the kanon analogue of
|
|
580
|
+
`pip list` / `npm ls`.
|
|
581
|
+
|
|
582
|
+
```bash
|
|
583
|
+
kanon list # every source, declared vs installed, tagged
|
|
584
|
+
kanon list --declared # only sources declared in .kanon (no orphans)
|
|
585
|
+
kanon list --status orphan # only sources in the lock no longer declared
|
|
586
|
+
kanon list --tree # expand installed sources to transitive packages
|
|
587
|
+
kanon list --format json # machine-readable JSON
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
A source is `installed` when it is in both files, `not-installed` when declared
|
|
591
|
+
but not yet locked (run `kanon install`), and `orphan` when locked but no longer
|
|
592
|
+
declared. Key options: `--declared`, `--tree`, `--status {installed,not-installed,orphan}`,
|
|
593
|
+
`--format {table,json}`, `--kanon-file`, `--lock-file`. See
|
|
594
|
+
[docs/cli-reference.md](docs/cli-reference.md#kanon-list).
|
|
595
|
+
|
|
566
596
|
### kanon outdated
|
|
567
597
|
|
|
568
598
|
Compares each source in `.kanon` against the catalog and emits a table of
|
|
@@ -773,9 +803,9 @@ and `kanon catalog audit`. `kanon install` is hermetic: it reads only
|
|
|
773
803
|
`.kanon` and `.kanon.lock` and does not consult a catalog source.
|
|
774
804
|
|
|
775
805
|
**`KANON_HOME`**
|
|
776
|
-
Root of the shared kanon store and caches (default `~/.kanon`). The
|
|
806
|
+
Root of the shared kanon store and caches (default `~/.kanon-home`). The
|
|
777
807
|
`--home` / `--store-dir <path>` global flag overrides it for a single
|
|
778
|
-
invocation; precedence is flag > `KANON_HOME` > `~/.kanon`. Replaces the
|
|
808
|
+
invocation; precedence is flag > `KANON_HOME` > `~/.kanon-home`. Replaces the
|
|
779
809
|
removed `KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` variables. Synced artifacts
|
|
780
810
|
and the per-`.kanon` workspace lock both live under `${KANON_HOME}/store/`,
|
|
781
811
|
so the project directory holds only `.kanon` (plus `.kanon.lock` after the
|
|
@@ -878,7 +908,7 @@ regardless of which source provided each package.
|
|
|
878
908
|
### Directory Structure After Install
|
|
879
909
|
|
|
880
910
|
Fetched artifacts live in the shared `KANON_HOME` store
|
|
881
|
-
(`$KANON_HOME`, default `~/.kanon`), content-addressed and deduped across
|
|
911
|
+
(`$KANON_HOME`, default `~/.kanon-home`), content-addressed and deduped across
|
|
882
912
|
projects. Only `.kanon` and `.kanon.lock` live in (and are committed to)
|
|
883
913
|
the project itself:
|
|
884
914
|
|
|
@@ -887,7 +917,7 @@ project/
|
|
|
887
917
|
.kanon # Configuration (committed)
|
|
888
918
|
.kanon.lock # Resolved SHAs (committed)
|
|
889
919
|
|
|
890
|
-
$KANON_HOME/ # Shared store (default ~/.kanon; not in the repo)
|
|
920
|
+
$KANON_HOME/ # Shared store (default ~/.kanon-home; not in the repo)
|
|
891
921
|
store/
|
|
892
922
|
.kanon-data/
|
|
893
923
|
sources/
|
|
@@ -1453,6 +1483,23 @@ version bumps.
|
|
|
1453
1483
|
supported; see [Platform support](#platform-support) and use WSL2)
|
|
1454
1484
|
- [Contributing](CONTRIBUTING.md) -- How to create and maintain Kanon
|
|
1455
1485
|
packages and marketplaces
|
|
1486
|
+
- [Privacy & Telemetry](docs/privacy.md) -- What usage telemetry kanon
|
|
1487
|
+
collects, why, how it is encrypted, and how to turn it off
|
|
1488
|
+
|
|
1489
|
+
---
|
|
1490
|
+
|
|
1491
|
+
## Usage telemetry
|
|
1492
|
+
|
|
1493
|
+
kanon emits one anonymised-by-design usage event per command to help the
|
|
1494
|
+
maintainers understand which commands and package sources are used. Telemetry
|
|
1495
|
+
is **on by default**, runs **silently** and **non-blocking**, never blocks or
|
|
1496
|
+
fails your command, and serialises only an explicit allowlist of kanon-computed
|
|
1497
|
+
fields -- never raw argv, credentials, keys, tokens, env-var values, or file
|
|
1498
|
+
contents (every URL is credential-stripped before it is sent).
|
|
1499
|
+
|
|
1500
|
+
Disable it entirely by setting `KANON_TELEMETRY_DISABLED=1`. See
|
|
1501
|
+
[docs/privacy.md](docs/privacy.md) for the full list of collected fields and the
|
|
1502
|
+
transit/at-rest encryption.
|
|
1456
1503
|
|
|
1457
1504
|
---
|
|
1458
1505
|
|
|
@@ -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) |
|