kanon-cli 2.0.0__tar.gz → 2.0.1__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-2.0.0 → kanon_cli-2.0.1}/CHANGELOG.md +9 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/PKG-INFO +331 -128
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/README.md +330 -127
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/catalog-author-guide.md +2 -1
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/configuration.md +4 -1
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/creating-manifest-repos.md +2 -2
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/doctor.md +12 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/how-it-works.md +1 -1
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/installation.md +7 -2
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/multi-source-guide.md +4 -4
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/setup-guide.md +7 -16
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/pyproject.toml +1 -1
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/__init__.py +1 -1
- kanon_cli-2.0.1/tests/unit/repo/fixtures/.repo_not.present.gitconfig.json +1 -0
- kanon_cli-2.0.1/tests/unit/repo/fixtures/.repo_test.gitconfig.json +56 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.claude/settings.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/.devcontainer.postcreate.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/VERSION +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/catalog-entry.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/devcontainer-functions.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/devcontainer.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/fix-line-endings.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/nix-family-os/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/postcreate-wrapper.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/project-setup.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/wsl-family-os/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/CODEOWNERS +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/actions/setup-kanon/action.yml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/codeql-analysis.yml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/main-validation.yml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/pr-validation.yml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/publish.yml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.gitignore +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.markdownlint.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.pre-commit-config.yaml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.tool-versions +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.yamllint +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/CLAUDE.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/CONTRIBUTING.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/LICENSE +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/Makefile +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/architecture.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/catalog-format-versioning.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/catalogs-explained.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/claude-marketplaces-guide.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli/catalog-audit.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli/doctor.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli/validate.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli-reference.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/coming-from-pip-npm-cargo.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/contributing.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/creating-packages.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/exit-codes.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/git-auth-setup.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/integration-testing.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/lifecycle.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/list-and-add.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/lockfile.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/migrating-existing-kanon-files.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/migration-bootstrap-to-add.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/outdated-and-why.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/pipeline-integration.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/internal-fs-layout.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/manifest-format.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/python-support.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/repo-hooks.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/smart-sync.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/windows.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/security-model.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/shell-completion.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/test-coverage.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/testing/matrix-traceability.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/troubleshooting.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/url-canonicalization.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/version-resolution.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/git-hooks/pre-commit +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/git-hooks/pre-push +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/link +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/requirements-dev.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/requirements.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/scripts/check_archive_no_duplicates.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/__main__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/cli.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/add.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/bootstrap.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/catalog.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/clean.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/completion.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/doctor.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/install.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/list.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/outdated.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/remove.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/repo.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/validate.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/why.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/cache.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/cached_catalogs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/catalog_entries.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/catalog_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/lockfile_names.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/midtoken.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/pep440_filter.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/preamble.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/project_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/sanitize.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/source_names.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/constants.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/catalog.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/clean.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/cli_args.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/discover.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/include_walker.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/install.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/kanon_hash.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/kanonenv.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/lockfile.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/manifest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/marketplace.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/marketplace_validator.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/metadata.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/remote_url.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/url.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/xml_validator.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/color.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/editor.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/error.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/event_log.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/fetch.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_config.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_refs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_ssh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_superproject.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/hooks/commit-msg +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/hooks.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/main.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/manifest_xml.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/pager.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/platform_utils.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/progress.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/project.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/repo +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/repo_logging.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/repo_trace.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/requirements.jsonc +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/ssh.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/branches.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/diff.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/download.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/forall.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/gc.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/grep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/help.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/info.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/init.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/list.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/overview.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/prune.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/stage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/start.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/status.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/sync.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/upload.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/version_constraints.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/wrapper.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/concurrency.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/levenshtein.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/lock_file_path.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/version.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/conftest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/completion/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/completion/expected-bash.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/completion/expected-zsh.sh +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/conflict-detected.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/entry-not-found.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/source-collision.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-add.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-catalog.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-clean.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-completion.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-doctor.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-install.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-list.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-outdated.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-remove.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-toplevel.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-why.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/.gitignore +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/linter-test-bad.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/linter-test-bad.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/sample-manifest.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/sample-project-config.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/test.gitconfig +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/version_constraints_data.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/conftest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_argparse_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_argparse_help.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_bootstrap_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_bootstrap_list_and_default_target.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_clean_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_cli_entry_point.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_completion_snapshots.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_error_snapshots.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_exit_code_matrix.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_groups_filter.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_help_snapshots.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_help_text_contract.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_install_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_install_real_kanon.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_kanon_repo_cli.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_kanon_repo_e2e.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_make_operator_path_targets.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_matrix_traceability_complete.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_provider_agnostic.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_abandon_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_abandon_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_abandon_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_branches_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_branches_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_branches_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_checkout_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_checkout_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_checkout_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diff_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diff_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diff_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_dir_override.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_download_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_download_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_download_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_envsubst_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_envsubst_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_envsubst_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_exit_codes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_forall_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_forall_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_forall_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_gc_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_gc_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_gc_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_grep_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_grep_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_grep_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_help_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_help_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_help_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_info_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_info_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_info_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_mirror.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_list_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_list_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_list_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_overview_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_overview_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_overview_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_passthrough.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_prune_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_prune_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_prune_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_rebase_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_rebase_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_rebase_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_smartsync_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_smartsync_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_smartsync_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_stage_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_stage_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_stage_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_start_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_start_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_start_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_status_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_status_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_status_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_sync_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_sync_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_sync_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_upload_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_upload_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_upload_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_stdout_stderr_discipline.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_marketplace.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_xml_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_xml_repo_root.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_zero_source_clean_error.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/conftest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/conftest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/drift.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/provider_allowlist.txt +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_bug_fixes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_envsubst_integration.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_import_functional.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_manifest_parsing.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_process_isolation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_module_smoke.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_pipeline.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_version_constraints_integration.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_core.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_dry_run.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_marketplace_flag.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_zero_tags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_auto_discovery.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_background_refresh.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_bootstrap_shim.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_cache_clock_skew.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_cache_layout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_framework.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_strict.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_constraints.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_ci_validation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_clean_env_override_cleanup.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_clean_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_clean_paths.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_cli_entry_points.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_catalog_entries.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_catalog_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_lockfile_names.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_project_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_source_names.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_completion_bash.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_completion_subcommand.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_completion_zsh.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_concurrency.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_concurrency_serialization.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_copyfile_fs_effects.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doc_validation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_cache_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_consistency.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_effective_source.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_prune_cache.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_remote_check.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_envsubst_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_fs_fault_extended.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_fs_fault_injection.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_full_user_journey.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_git_fault_injection.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_git_retry_env.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_gitignore_idempotency.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_after_add.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_conflict_url_normalization.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_include_cycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_include_diamond.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_lock_file_derivation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_lockfile_replay.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_marketplace_registration.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_no_kanon_remediation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_optional_vars.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_paths.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_reconcile.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_refresh_lock.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_remote_url_policy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_required_vars.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_strict.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_json_output_stream_discipline.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_clean_embedded.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_full_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_install_embedded.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanonenv_parsing.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_lifecycle_recovery.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_linkfile_fs_effects.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_all_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_all_versions_canonical.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_default.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_detail.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_filter.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_format_json.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_tree.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_lockfile_roundtrip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_marketplace_install.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_marketplace_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_marketplace_orphan_prune.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_midtoken_bash.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_midtoken_zsh.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_misc_features.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_multi_source_aggregation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_no_bundled_catalog.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_no_default_catalog.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_no_hardcoded_org_values.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_observability.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_branch_drift.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_format_json.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_platform_parity.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_preamble_bash.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_preamble_zsh.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_remove_core.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_remove_dry_run.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_remove_force_integration.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_signal_handling.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_synthetic_drift_fixture.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_unicode_encoding.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_validate_marketplace.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_validate_metadata.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_validate_xml.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_version_resolution.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_version_widened_bare_pep440.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_wheel_e2e.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_ambiguous.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_chain_walker.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_format_json.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_live_resolve.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_not_found_suggestion.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_workspace_dir_env.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_install_relative_regression.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/_rp_helpers.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/conftest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ad.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_bs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_cd.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_cs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_doctor_cache.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ec.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ev.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_hv.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ic.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_id.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ks.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_lf.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_mk.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ms.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_pk.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rc.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_abandon.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_branches.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_checkout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_cherry_pick.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_diff.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_diffmanifests.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_download.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_envsubst.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_forall.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_gc.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_grep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_help.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_info.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_init.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_list.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_manifest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_overview.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_prune.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_rebase.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_smartsync.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_stage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_start.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_status.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_sync.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_upload.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_wrap.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rx.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_bootstrap.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_clean.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_install.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_validate.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_uj.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_va.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_why_surface_query.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_why_url_path.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/security/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/security/test_security_hardening.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/test_wheel_layout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/conftest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/conftest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/.gitignore +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/README.md +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/test.gitconfig +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/functional/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/functional/test_features.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/__init__.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_abandon_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_branches_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug11_race_condition.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_checkout_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_color.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_conftest_fixtures.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_download_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_editor.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_embedded_mode.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_envsubst_basic.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_envsubst_edge.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_envsubst_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_error.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_event_log.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_event_log_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_fetch.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_fixture_files.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_forall_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_config.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_refs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_superproject.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_grep_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_harness_smoke.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_hooks.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_import_verification.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_imports.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_include_path_resolution.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_info_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_init_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_list_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_main.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_main_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_main_init_download_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_makefile_lint_format.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_makefile_structure.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_makefile_test_targets.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_xml.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_medium_files_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_overview_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_package_structure.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pager.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_parselist.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_edge_1.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_edge_2.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_platform_utils.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_process_isolation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_progress.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_coverage_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_deep_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_final_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_integration.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_methods.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_sync.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_prune_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_rebase_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_logging.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_run_api.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_sync_api.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_trace.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_revision_inheritance.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_ruff_config.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_selfupdate_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_small_files_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_ssh.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_ssh_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_stage_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_stage_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_start_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_status_coverage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_status_gaps.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_status_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmd_imports.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_abandon.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_branches.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_checkout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_diff.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_download.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_forall.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_gc.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_grep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_help.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_info.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_init.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_list.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_manifest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_overview.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_prune.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_rebase.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_stage.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_start.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_status.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_sync.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_upload.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_superproject_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_deep_boost.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_massive.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_upload_deep.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_version_consolidation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_version_constraints.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_wheel_contents.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_wrapper.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_default_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_default_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_default_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_fault_structural.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_cycles.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_notice_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_project_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_project_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_project_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remote_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xmlbool.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xmlint.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_yamllint_config.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_accessed_at_coalescing.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_add.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_add_collision.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_add_zero_tags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_background_refresh.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_bare_semver_to_tag.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_bootstrap_deprecation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cache.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cache_layout.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cache_ttl.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_check_parser.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_framework.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_strict.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_source_parsing.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_ci_workflows.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_clean.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_clean_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli_args.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli_help_format.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli_json_stream_discipline.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_catalog_entries.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_catalog_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_lockfile_names.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_project_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_source_names.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_completion.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_completion_sanitization.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_completion_subcommand.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_concurrency.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_conftest_scrubber.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_doctor_subcheck.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_install_after_add.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_outdated_refs_tags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_why_lockfile.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_coverage_gaps.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_derive_source_name.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_discover.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_discover_source_names_missing_url.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_docs_embedded_architecture.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_cache_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_completion_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_completion_staleness.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_consistency.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_coverage_gaps.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_effective_source.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_remote_reachability.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_env_isolation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_envsubst_subcommand.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_include_walker.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_conflict_detection.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_https_enforcement.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_placeholder_validation.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_reconcile_decision.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_refresh_lock.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_state_matrix.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_strict_flags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanon_hash.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanonenv.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanonenv_edge_cases.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_levenshtein.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_all_versions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_coverage_gaps.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_detail.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_filter.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_format_json.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_tree.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lock_file_path.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lockfile.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lockfile_schema_migration.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_manifest.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace_install.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace_validator.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_metadata.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_midtoken_splitter.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated_branch_pinned.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated_format_json.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_pep440_filter.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_pre_push_hook.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_preamble.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_preamble_semver_tags.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_provider_agnosticism.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_pyproject_build_config.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remote_url.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove_dry_run.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove_force.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove_line_endings.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_repo.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_repo_abspath.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_repo_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_resolve_catalog_dir.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_revision_resolve.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_sanitize.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_url.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_validate.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_validate_command.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_validate_metadata.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_version.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_version_constraint_errors.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why_ambiguity.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why_format_json.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why_suggestions.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_xml_validator.py +0 -0
- {kanon_cli-2.0.0 → kanon_cli-2.0.1}/uv.lock +0 -0
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
## v2.0.1 (2026-06-03)
|
|
6
|
+
|
|
7
|
+
### Documentation
|
|
8
|
+
|
|
9
|
+
* docs: present kanon repo as a native subcommand in the CLI reference (#73)
|
|
10
|
+
|
|
11
|
+
* docs: align CLI documentation with the released 2.0.0 surface (#72)
|
|
12
|
+
|
|
13
|
+
|
|
5
14
|
## v2.0.0 (2026-06-03)
|
|
6
15
|
|
|
7
16
|
### Breaking
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kanon-cli
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1
|
|
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
|
|
@@ -49,11 +49,19 @@ via declarative manifests.
|
|
|
49
49
|
- [Standalone Usage (No Task Runner Required)](#standalone-usage-no-task-runner-required)
|
|
50
50
|
- [Integrating with Task Runners (Optional)](#integrating-with-task-runners-optional)
|
|
51
51
|
- [CLI Reference](#cli-reference)
|
|
52
|
-
- [kanon
|
|
52
|
+
- [kanon list](#kanon-list)
|
|
53
|
+
- [kanon add](#kanon-add)
|
|
54
|
+
- [kanon remove](#kanon-remove)
|
|
53
55
|
- [kanon install](#kanon-install)
|
|
54
56
|
- [kanon clean](#kanon-clean)
|
|
55
|
-
- [kanon
|
|
56
|
-
- [kanon
|
|
57
|
+
- [kanon outdated](#kanon-outdated)
|
|
58
|
+
- [kanon why](#kanon-why)
|
|
59
|
+
- [kanon doctor](#kanon-doctor)
|
|
60
|
+
- [kanon validate](#kanon-validate)
|
|
61
|
+
- [kanon catalog audit](#kanon-catalog-audit)
|
|
62
|
+
- [kanon repo](#kanon-repo)
|
|
63
|
+
- [kanon completion](#kanon-completion)
|
|
64
|
+
- [kanon bootstrap (deprecated)](#kanon-bootstrap-deprecated)
|
|
57
65
|
- [.kanon Variable Reference](#kanon-variable-reference)
|
|
58
66
|
- [Core Variables](#core-variables)
|
|
59
67
|
- [Source Variables](#source-variables)
|
|
@@ -66,9 +74,10 @@ via declarative manifests.
|
|
|
66
74
|
- [Environment Variable Portability (envsubst)](#environment-variable-portability-envsubst)
|
|
67
75
|
- [Creating a Manifest Repository](#creating-a-manifest-repository)
|
|
68
76
|
- [Structure](#structure)
|
|
77
|
+
- [Catalog entry (-marketplace.xml)](#catalog-entry--marketplacexml)
|
|
69
78
|
- [remote.xml -- Git Remote Definition](#remotexml----git-remote-definition)
|
|
70
79
|
- [packages.xml -- Package Declarations](#packagesxml----package-declarations)
|
|
71
|
-
- [
|
|
80
|
+
- [Entry-point manifest](#entry-point-manifest)
|
|
72
81
|
- [Include Chains for Hierarchy](#include-chains-for-hierarchy)
|
|
73
82
|
- [Updating Package Versions](#updating-package-versions)
|
|
74
83
|
- [Creating Packages](#creating-packages)
|
|
@@ -187,11 +196,10 @@ system-wide setup, see [docs/shell-completion.md](docs/shell-completion.md).
|
|
|
187
196
|
| `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
188
197
|
| `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
|
|
189
198
|
| `kanon validate metadata` | Validate catalog entry metadata | [docs/catalog-author-guide.md](docs/catalog-author-guide.md) |
|
|
190
|
-
| `kanon clean` | Remove
|
|
199
|
+
| `kanon clean` | Remove synced packages and Kanon state (`--orphans` also prunes unreferenced marketplaces) | [docs/lifecycle.md](docs/lifecycle.md) |
|
|
191
200
|
| `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
|
|
192
201
|
| `kanon completion` | Emit a shell completion script for bash or zsh | [docs/shell-completion.md](docs/shell-completion.md) |
|
|
193
|
-
| `kanon bootstrap` | **deprecated;
|
|
194
|
-
| `kanon bootstrap list` | **deprecated; see `kanon list`** -- list available catalog entries | [docs/migration-bootstrap-to-add.md](docs/migration-bootstrap-to-add.md) |
|
|
202
|
+
| `kanon bootstrap` | **deprecated (removed in 2.0; exits 3)** -- use `kanon list` / `kanon add` instead | [docs/migration-bootstrap-to-add.md](docs/migration-bootstrap-to-add.md) |
|
|
195
203
|
|
|
196
204
|
---
|
|
197
205
|
|
|
@@ -295,77 +303,80 @@ reinstalling. CI uses `pip install kanon-cli` for ephemeral runners; see
|
|
|
295
303
|
|
|
296
304
|
### Standalone Usage (No Task Runner Required)
|
|
297
305
|
|
|
298
|
-
Kanon works directly from the command line. No task runner is needed.
|
|
299
|
-
|
|
300
|
-
|
|
306
|
+
Kanon works directly from the command line. No task runner is needed. The
|
|
307
|
+
workflow is declarative: you discover entries in a remote catalog, add the
|
|
308
|
+
ones you want to `.kanon`, install them, and (optionally) clean up. Every
|
|
309
|
+
command that resolves a catalog needs a catalog source -- either the
|
|
310
|
+
`--catalog-source <url>@<ref>` flag or the `KANON_CATALOG_SOURCE`
|
|
311
|
+
environment variable.
|
|
301
312
|
|
|
302
313
|
```bash
|
|
303
|
-
|
|
304
|
-
|
|
314
|
+
# Set once in your shell rc file -- pin to the current major version
|
|
315
|
+
export KANON_CATALOG_SOURCE='https://github.com/your-org/your-catalog-repo.git@>=2.0.0,<3.0.0'
|
|
305
316
|
```
|
|
306
317
|
|
|
307
|
-
**
|
|
308
|
-
source variables for your organization.
|
|
309
|
-
|
|
310
|
-
**3. Install (sync all packages):**
|
|
318
|
+
**1. Discover entries in the catalog:**
|
|
311
319
|
|
|
312
320
|
```bash
|
|
313
|
-
kanon
|
|
321
|
+
kanon list # all entry names, one per line
|
|
322
|
+
kanon list --detail # human-readable record per entry
|
|
323
|
+
kanon list my-tool --detail # narrow to entries matching a substring
|
|
314
324
|
```
|
|
315
325
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
`.gitignore`.
|
|
326
|
+
`kanon list` reads the `*-marketplace.xml` files under `repo-specs/` in the
|
|
327
|
+
manifest repo and prints one catalog entry name per line.
|
|
319
328
|
|
|
320
|
-
**
|
|
321
|
-
|
|
322
|
-
> **Tip:** Use a remote catalog for pre-configured entries that require no
|
|
323
|
-
> placeholder editing. See
|
|
324
|
-
> [Usage with Remote Catalogs](#usage-with-remote-catalogs-optional) below.
|
|
329
|
+
**2. Add entries to `.kanon`:**
|
|
325
330
|
|
|
326
331
|
```bash
|
|
327
|
-
kanon
|
|
332
|
+
kanon add my-tool # pin to the highest available version
|
|
333
|
+
kanon add 'my-tool@>=1.0.0,<2.0.0' # pin with a PEP 440 constraint
|
|
334
|
+
kanon add my-tool --marketplace-install # also enable the marketplace lifecycle
|
|
328
335
|
```
|
|
329
336
|
|
|
330
|
-
|
|
331
|
-
|
|
337
|
+
`kanon add` resolves each entry against the catalog and writes the
|
|
338
|
+
`KANON_SOURCE_<name>_{URL,REVISION,PATH}` triple into `.kanon`, creating the
|
|
339
|
+
file with a standard header when it does not yet exist.
|
|
332
340
|
|
|
333
|
-
**
|
|
334
|
-
|
|
335
|
-
|
|
341
|
+
**3. Install (sync all packages, write `.kanon.lock`):**
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
kanon install
|
|
345
|
+
```
|
|
336
346
|
|
|
337
|
-
|
|
347
|
+
This reconciles `.kanon` against `.kanon.lock`, runs the repo
|
|
348
|
+
init/envsubst/sync lifecycle for every source, aggregates packages into
|
|
349
|
+
`.packages/` via symlinks, creates source workspaces under
|
|
350
|
+
`.kanon-data/sources/`, writes `.kanon.lock` with the exact resolved SHAs,
|
|
351
|
+
and adds `.packages/` and `.kanon-data/` to `.gitignore`.
|
|
338
352
|
|
|
339
|
-
|
|
340
|
-
placeholder editing. Set `KANON_CATALOG_SOURCE` or pass `--catalog-source`
|
|
341
|
-
to bootstrap from a remote repository:
|
|
353
|
+
**4. Clean (full teardown):**
|
|
342
354
|
|
|
343
355
|
```bash
|
|
344
|
-
#
|
|
345
|
-
|
|
356
|
+
kanon clean # remove .packages/, .kanon-data/, marketplace dir
|
|
357
|
+
kanon clean --orphans # also prune kanon-owned marketplaces no longer referenced
|
|
358
|
+
```
|
|
346
359
|
|
|
347
|
-
|
|
348
|
-
|
|
360
|
+
`kanon clean` removes all synced packages and Kanon state directories, and
|
|
361
|
+
(when `KANON_MARKETPLACE_INSTALL=true`) uninstalls marketplace plugins.
|
|
349
362
|
|
|
350
|
-
|
|
351
|
-
kanon
|
|
352
|
-
|
|
353
|
-
```
|
|
363
|
+
**Important:** All synced files in `.packages/` and `.kanon-data/` are
|
|
364
|
+
ephemeral and should not be committed. Commit only `.kanon` and `.kanon.lock`
|
|
365
|
+
to your repository.
|
|
354
366
|
|
|
355
|
-
The `@<ref>` portion accepts a branch name, a tag, the
|
|
356
|
-
(which resolves to the highest semver tag), or a PEP
|
|
357
|
-
(e.g., `~=2.0.0`, `>=2.0.0,<3.0.0`). Version
|
|
358
|
-
against the repository's git tags via
|
|
359
|
-
|
|
360
|
-
catalog
|
|
367
|
+
The `@<ref>` portion of a catalog source accepts a branch name, a tag, the
|
|
368
|
+
special value `latest` (which resolves to the highest semver tag), or a PEP
|
|
369
|
+
440 version constraint (e.g., `~=2.0.0`, `>=2.0.0,<3.0.0`). Version
|
|
370
|
+
constraints are resolved against the repository's git tags via
|
|
371
|
+
`git ls-remote`. The manifest repo IS the catalog: every `*-marketplace.xml`
|
|
372
|
+
file under `repo-specs/` carrying a `<catalog-metadata>` block is one catalog
|
|
373
|
+
entry. There is no separate `catalog/` directory.
|
|
361
374
|
|
|
362
375
|
Manifest repositories should use [semantic versioning](https://semver.org/)
|
|
363
376
|
for git tags. Pinning to a major version range (e.g., `>=2.0.0,<3.0.0`)
|
|
364
377
|
allows automatic pickup of minor and patch releases while preventing
|
|
365
378
|
unexpected breaking changes.
|
|
366
379
|
|
|
367
|
-
Use `--output-dir DIR` to bootstrap into a different directory.
|
|
368
|
-
|
|
369
380
|
### Integrating with Task Runners (Optional)
|
|
370
381
|
|
|
371
382
|
Kanon works standalone via `kanon install` and `kanon clean`. You can wrap
|
|
@@ -400,101 +411,248 @@ kanon --help # Top-level help
|
|
|
400
411
|
kanon --version # Show version
|
|
401
412
|
```
|
|
402
413
|
|
|
403
|
-
|
|
414
|
+
Run `kanon <command> --help` for the full option list of any command. The
|
|
415
|
+
sections below summarise each 2.0 command. A catalog source (the
|
|
416
|
+
`--catalog-source <url>@<ref>` flag or the `KANON_CATALOG_SOURCE`
|
|
417
|
+
environment variable) is required by `list`, `add`, `outdated`, `why`, and
|
|
418
|
+
`catalog audit`; for `install` and `doctor` the `.kanon.lock` `[catalog]`
|
|
419
|
+
source is used as a fallback when present and consistent.
|
|
420
|
+
|
|
421
|
+
### kanon list
|
|
404
422
|
|
|
405
|
-
|
|
406
|
-
|
|
423
|
+
Discovers catalog entries. Prints one entry name per line to stdout, sorted
|
|
424
|
+
lexicographically, by reading the `*-marketplace.xml` files under
|
|
425
|
+
`repo-specs/` in the catalog source.
|
|
407
426
|
|
|
408
427
|
```bash
|
|
409
|
-
kanon
|
|
410
|
-
kanon
|
|
411
|
-
kanon
|
|
412
|
-
kanon
|
|
413
|
-
|
|
428
|
+
kanon list # all entry names
|
|
429
|
+
kanon list foo # substring filter (name/desc/keywords)
|
|
430
|
+
kanon list --regex '^foo' # regex filter
|
|
431
|
+
kanon list --detail # human-readable record per entry
|
|
432
|
+
kanon list --format json # structured JSON array
|
|
433
|
+
kanon list --tree # three-layer ASCII dependency tree
|
|
434
|
+
kanon list --all-versions # walk historical tagged versions
|
|
414
435
|
```
|
|
415
436
|
|
|
416
|
-
|
|
437
|
+
Key options: `--format {names,json}`, `--detail`, `--tree` (with
|
|
438
|
+
`--max-depth N`, `--no-filter-required`), `--all-versions` (with `--limit N`,
|
|
439
|
+
`--no-limit`, `--since-version <spec>`), `--regex <pattern>`,
|
|
440
|
+
`--match-fields <csv>`. A positional `<substring>` and `--regex` are mutually
|
|
441
|
+
exclusive; `--format json` is incompatible with `--tree`.
|
|
417
442
|
|
|
418
|
-
|
|
419
|
-
Target directory (default: current directory). The parent of `DIR` must
|
|
420
|
-
already exist; bootstrap fails fast if it does not.
|
|
443
|
+
### kanon add
|
|
421
444
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
catalog.
|
|
445
|
+
Resolves catalog entries from the catalog source and appends the
|
|
446
|
+
`KANON_SOURCE_<name>_{URL,REVISION,PATH}` triple to `.kanon`, creating the
|
|
447
|
+
file with a standard header when absent.
|
|
426
448
|
|
|
427
|
-
|
|
449
|
+
```bash
|
|
450
|
+
kanon add my-tool # pin to highest PEP 440 tag
|
|
451
|
+
kanon add 'my-tool@>=1.0.0,<2.0.0' # pin with a PEP 440 constraint
|
|
452
|
+
kanon add my-tool --marketplace-install # enable the marketplace lifecycle
|
|
453
|
+
kanon add my-tool --dry-run # print the diff without writing
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
Each entry is `<name>` or `<name>@<spec>` (PEP 440 constraint). Key options:
|
|
457
|
+
`--kanon-file <path>` (default `./.kanon`, env `KANON_KANON_FILE`), `--force`
|
|
458
|
+
(overwrite an existing block), `--dry-run`, and the mutually-exclusive
|
|
459
|
+
`--marketplace-install` / `--no-marketplace-install` (applied only when the
|
|
460
|
+
file is created).
|
|
461
|
+
|
|
462
|
+
### kanon remove
|
|
428
463
|
|
|
429
|
-
|
|
464
|
+
Removes the three `KANON_SOURCE_<name>_{URL,REVISION,PATH}` lines for one or
|
|
465
|
+
more entries from `.kanon`.
|
|
430
466
|
|
|
431
467
|
```bash
|
|
432
|
-
kanon
|
|
433
|
-
kanon
|
|
468
|
+
kanon remove my-tool # canonical source OR entry name
|
|
469
|
+
kanon remove my-tool --dry-run # preview removed lines
|
|
470
|
+
kanon remove my-tool --force # skip not-fully-present sources
|
|
434
471
|
```
|
|
435
472
|
|
|
436
|
-
|
|
473
|
+
Each `<name>` may be the canonical source name (e.g. `foo_bar`) or the
|
|
474
|
+
original entry name (e.g. `Foo-Bar`); both normalise to the same keys.
|
|
475
|
+
Removal is atomic: if any requested name is not fully present (fewer than
|
|
476
|
+
three matching keys) and `--force` is not set, the command exits non-zero and
|
|
477
|
+
the file is unchanged.
|
|
437
478
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
479
|
+
### kanon install
|
|
480
|
+
|
|
481
|
+
Executes the full install lifecycle and reconciles `.kanon` against
|
|
482
|
+
`.kanon.lock`.
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
kanon install # auto-discover .kanon by walking up from cwd
|
|
486
|
+
kanon install .kanon # explicit path to .kanon file
|
|
487
|
+
kanon install --strict-lock # error when an orphaned lock entry is present
|
|
488
|
+
kanon install --strict-drift # error when a branch source has drifted
|
|
489
|
+
kanon install --refresh-lock # re-resolve every transitive version from scratch
|
|
490
|
+
kanon install --refresh-lock-source NAME # re-resolve one source's chain only
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
**Behavior:**
|
|
494
|
+
|
|
495
|
+
- Parses `.kanon`, then runs the repo init/envsubst/sync lifecycle for each
|
|
496
|
+
source (alphabetical order).
|
|
497
|
+
- Aggregates packages into `.packages/` via symlinks; detects cross-source
|
|
498
|
+
name collisions (fail-fast); updates `.gitignore`.
|
|
499
|
+
- Reconciles against `.kanon.lock`: a plain `install` prunes orphaned lock
|
|
500
|
+
entries (a source removed from `.kanon`) with an info-line; `--strict-lock`
|
|
501
|
+
promotes that to an error. Branch drift (a locked SHA differing from the
|
|
502
|
+
branch's current tip) reuses the locked SHA with an info-line; `--strict-drift`
|
|
503
|
+
promotes that to an error.
|
|
504
|
+
- **Auto-prune:** when a source is removed from `.kanon`, its registered
|
|
505
|
+
marketplace is unregistered on the next install.
|
|
506
|
+
- If `KANON_MARKETPLACE_INSTALL=true`: runs the marketplace install lifecycle.
|
|
507
|
+
|
|
508
|
+
`--refresh-lock` and `--refresh-lock-source NAME` require a CLI-supplied or
|
|
509
|
+
`KANON_CATALOG_SOURCE` catalog source; the lockfile fallback is disabled on
|
|
510
|
+
those paths.
|
|
445
511
|
|
|
446
512
|
### kanon clean
|
|
447
513
|
|
|
448
514
|
Executes the full teardown lifecycle.
|
|
449
515
|
|
|
450
516
|
```bash
|
|
451
|
-
kanon clean #
|
|
452
|
-
kanon clean .kanon #
|
|
517
|
+
kanon clean # auto-discover .kanon by walking up from cwd
|
|
518
|
+
kanon clean .kanon # explicit path to .kanon file
|
|
519
|
+
kanon clean --orphans # also unregister orphaned marketplaces
|
|
453
520
|
```
|
|
454
521
|
|
|
455
|
-
**
|
|
522
|
+
**Behavior:**
|
|
456
523
|
|
|
457
|
-
1.
|
|
458
|
-
|
|
459
|
-
2.
|
|
460
|
-
marketplace directory
|
|
461
|
-
3. Removes `.packages/` directory
|
|
462
|
-
4. Removes `.kanon-data/` directory
|
|
524
|
+
1. If `KANON_MARKETPLACE_INSTALL=true`: uninstalls plugins and removes the
|
|
525
|
+
marketplace directory.
|
|
526
|
+
2. Removes the `.packages/` and `.kanon-data/` directories.
|
|
463
527
|
|
|
464
|
-
|
|
465
|
-
|
|
528
|
+
With `--orphans`, before the normal teardown kanon also unregisters any
|
|
529
|
+
kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
|
|
530
|
+
referenced by `.kanon`, pruning them from `~/.claude`.
|
|
466
531
|
|
|
467
|
-
### kanon
|
|
532
|
+
### kanon outdated
|
|
468
533
|
|
|
469
|
-
|
|
534
|
+
Compares each source in `.kanon` against the catalog and emits a table of
|
|
535
|
+
`name | current | latest-matching-spec | latest-available | upgrade-type`.
|
|
470
536
|
|
|
471
537
|
```bash
|
|
472
|
-
kanon
|
|
473
|
-
kanon
|
|
538
|
+
kanon outdated # table output, always exits 0
|
|
539
|
+
kanon outdated --format json # JSON array, one object per source
|
|
540
|
+
kanon outdated --fail-on-upgrade # exit 1 when any source has an upgrade (CI gate)
|
|
474
541
|
```
|
|
475
542
|
|
|
476
|
-
|
|
543
|
+
The `current` column comes from `.kanon.lock` when present, or is
|
|
544
|
+
live-resolved against the catalog when absent. Key options:
|
|
545
|
+
`--fail-on-upgrade`, `--format {table,json}`, `--kanon-file`, `--lock-file`.
|
|
546
|
+
|
|
547
|
+
### kanon why
|
|
548
|
+
|
|
549
|
+
Explains why a transitive dependency is in the tree. Reads `.kanon`, resolves
|
|
550
|
+
the full dependency tree (from `.kanon.lock` when present, else live-resolves
|
|
551
|
+
against the catalog), and prints every chain reaching the requested node.
|
|
477
552
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
553
|
+
```bash
|
|
554
|
+
kanon why my-project # by source name, repo URL, or XML path
|
|
555
|
+
kanon why https://example.com/org/project.git
|
|
556
|
+
kanon why --format json my-project
|
|
557
|
+
```
|
|
482
558
|
|
|
483
|
-
|
|
559
|
+
The argument is matched three ways: a `<project>` repo URL (canonicalized), a
|
|
560
|
+
transitive XML manifest path (exact-string equality), or a top-level source
|
|
561
|
+
name (normalized via `derive_source_name`). A catalog source is required only
|
|
562
|
+
on the live-resolve path (when `.kanon.lock` is absent).
|
|
484
563
|
|
|
485
|
-
|
|
564
|
+
### kanon doctor
|
|
565
|
+
|
|
566
|
+
Diagnoses `.kanon` / `.kanon.lock` health against the current project
|
|
567
|
+
directory.
|
|
486
568
|
|
|
487
569
|
```bash
|
|
488
|
-
kanon
|
|
489
|
-
kanon
|
|
570
|
+
kanon doctor # run all health checks
|
|
571
|
+
kanon doctor --strict-drift # promote branch-drift findings to errors
|
|
572
|
+
kanon doctor --refresh-completion-cache # invalidate the shell completion cache
|
|
573
|
+
kanon doctor --prune-cache # prune stale cache files (age-based)
|
|
490
574
|
```
|
|
491
575
|
|
|
492
|
-
|
|
576
|
+
Reports findings including `.kanon`/`.kanon.lock` consistency (via
|
|
577
|
+
`kanon_hash`), hand-edit detection, orphaned lock entries, branch drift,
|
|
578
|
+
dangling-SHA detection, a `NO_SOURCES` finding for a zero-source `.kanon`, and
|
|
579
|
+
a remote-reachability sanity check (warning only). See
|
|
580
|
+
[docs/doctor.md](docs/doctor.md) for the full subcheck reference.
|
|
581
|
+
|
|
582
|
+
### kanon validate
|
|
493
583
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
584
|
+
Validates manifest XML files. Subcommands:
|
|
585
|
+
|
|
586
|
+
```bash
|
|
587
|
+
kanon validate xml # well-formedness, attributes, include chains
|
|
588
|
+
kanon validate marketplace # linkfile dest, includes, uniqueness, tag format
|
|
589
|
+
kanon validate metadata # catalog-metadata soft-spots (no network access)
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
- **`validate xml`** -- checks well-formed XML, required attributes on
|
|
593
|
+
`<project>` and `<remote>`, and that `<include>` names point to existing
|
|
594
|
+
files.
|
|
595
|
+
- **`validate marketplace`** -- checks `<linkfile dest>` attributes, include
|
|
596
|
+
chain integrity, project path uniqueness, and revision tag format.
|
|
597
|
+
- **`validate metadata`** -- checks the `<catalog-metadata>` blocks for
|
|
598
|
+
required/recommended fields, source-name derivation, and entry-name
|
|
599
|
+
uniqueness, without cloning or calling git. Supports `--format {text,json}`.
|
|
600
|
+
|
|
601
|
+
All three accept `--repo-root REPO_ROOT` (default: auto-detect via
|
|
602
|
+
`git rev-parse`).
|
|
603
|
+
|
|
604
|
+
### kanon catalog audit
|
|
605
|
+
|
|
606
|
+
Audits a manifest repo against the catalog standards contract (the five
|
|
607
|
+
soft-spot rules).
|
|
608
|
+
|
|
609
|
+
```bash
|
|
610
|
+
kanon catalog audit # audit the current directory
|
|
611
|
+
kanon catalog audit ./scratch --strict # promote warnings to errors
|
|
612
|
+
kanon catalog audit https://example.com/org/repo.git@main # audit a remote source
|
|
613
|
+
kanon catalog audit --check metadata,tag-format # run a subset of checks
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
`<dir-or-source>` is a local directory (must contain `repo-specs/`) or a
|
|
617
|
+
remote `<git_url>@<ref>` source; defaults to `.`. Options: `--check <subset>`
|
|
618
|
+
(valid values: `all`, `entry-name-uniqueness`, `metadata`, `remote-url`,
|
|
619
|
+
`source-name-derivation`, `tag-format`), `--format {text,json}`, `--strict`.
|
|
620
|
+
See [docs/catalog-author-guide.md](docs/catalog-author-guide.md).
|
|
621
|
+
|
|
622
|
+
### kanon repo
|
|
623
|
+
|
|
624
|
+
Catalog-author / low-level subcommand: runs kanon's `repo` dispatcher.
|
|
625
|
+
All trailing arguments after `kanon repo` are forwarded verbatim to it.
|
|
626
|
+
|
|
627
|
+
```bash
|
|
628
|
+
kanon repo init -u <url> -b <branch> -m <manifest>
|
|
629
|
+
kanon repo sync --jobs=4
|
|
630
|
+
kanon repo help
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
`--repo-dir REPO_DIR` sets the `.repo` directory (default: `${KANON_REPO_DIR}`
|
|
634
|
+
or `.repo`). See [docs/repo/README.md](docs/repo/README.md).
|
|
635
|
+
|
|
636
|
+
### kanon completion
|
|
637
|
+
|
|
638
|
+
Emits the shell completion script for kanon to stdout.
|
|
639
|
+
|
|
640
|
+
```bash
|
|
641
|
+
kanon completion bash > /etc/bash_completion.d/kanon
|
|
642
|
+
kanon completion zsh > "${fpath[1]}/_kanon"
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
Target shell choices: `bash`, `zsh`. See
|
|
646
|
+
[docs/shell-completion.md](docs/shell-completion.md).
|
|
647
|
+
|
|
648
|
+
### kanon bootstrap (deprecated)
|
|
649
|
+
|
|
650
|
+
`kanon bootstrap` was removed in 2.0 (a breaking change). It no longer
|
|
651
|
+
performs any work and exits with code `3`, directing you to `kanon add` /
|
|
652
|
+
`kanon list`. The catalog model changed: a manifest repo no longer has a
|
|
653
|
+
separate `catalog/<name>/` location and the kanon wheel no longer bundles a
|
|
654
|
+
catalog. Use `kanon list` to discover entries and `kanon add` to add them.
|
|
655
|
+
See [docs/migration-bootstrap-to-add.md](docs/migration-bootstrap-to-add.md).
|
|
498
656
|
|
|
499
657
|
---
|
|
500
658
|
|
|
@@ -539,9 +697,14 @@ Path to the entry-point manifest XML for the named source.
|
|
|
539
697
|
### Environment Variables
|
|
540
698
|
|
|
541
699
|
**`KANON_CATALOG_SOURCE`**
|
|
542
|
-
Remote catalog source
|
|
543
|
-
|
|
544
|
-
|
|
700
|
+
Remote catalog source as `<git_url>@<ref>` where ref is a branch, tag,
|
|
701
|
+
`latest`, or PEP 440 constraint (e.g., `>=2.0.0,<3.0.0`). One of this env var
|
|
702
|
+
or the `--catalog-source` flag is **required** by `kanon list`, `kanon add`,
|
|
703
|
+
`kanon outdated`, `kanon why`, and `kanon catalog audit`. For `kanon install`
|
|
704
|
+
and `kanon doctor`, the `.kanon.lock` `[catalog].source` is used as a fallback
|
|
705
|
+
when present and consistent. Resolution precedence is:
|
|
706
|
+
`--catalog-source` flag > `KANON_CATALOG_SOURCE` env var > lock `[catalog]`
|
|
707
|
+
source > the `[catalog]` block in `.kanon`.
|
|
545
708
|
|
|
546
709
|
### Example .kanon
|
|
547
710
|
|
|
@@ -571,8 +734,8 @@ KANON_SOURCE_marketplaces_PATH=repo-specs/marketplaces/meta.xml
|
|
|
571
734
|
```text
|
|
572
735
|
┌─────────────────────────┐
|
|
573
736
|
│ Kanon CLI │
|
|
574
|
-
│ (
|
|
575
|
-
│
|
|
737
|
+
│ (list / add / install /│
|
|
738
|
+
│ clean / validate) │
|
|
576
739
|
└───────────┬─────────────┘
|
|
577
740
|
│
|
|
578
741
|
defines │ uses
|
|
@@ -687,9 +850,16 @@ For full documentation, see [docs/how-it-works.md](docs/how-it-works.md).
|
|
|
687
850
|
## Creating a Manifest Repository
|
|
688
851
|
|
|
689
852
|
A manifest repository contains `repo-specs/` with XML manifests that define
|
|
690
|
-
what packages to sync, from which repositories, and at which versions.
|
|
691
|
-
|
|
692
|
-
|
|
853
|
+
what packages to sync, from which repositories, and at which versions. **The
|
|
854
|
+
manifest repo IS the catalog** -- there is no separate `catalog/` directory.
|
|
855
|
+
Each catalog entry is a single `*-marketplace.xml` file under `repo-specs/`
|
|
856
|
+
that carries a nested `<catalog-metadata>` block; the
|
|
857
|
+
`<catalog-metadata><name>` child is the entry name consumers pass to
|
|
858
|
+
`kanon add <name>`. See
|
|
859
|
+
[docs/creating-manifest-repos.md](docs/creating-manifest-repos.md) for the
|
|
860
|
+
full catalog-author guide and
|
|
861
|
+
[docs/repo/manifest-format.md](docs/repo/manifest-format.md) for the
|
|
862
|
+
underlying XML schema.
|
|
693
863
|
|
|
694
864
|
### Structure
|
|
695
865
|
|
|
@@ -699,10 +869,37 @@ my-manifest-repo/
|
|
|
699
869
|
git-connection/
|
|
700
870
|
remote.xml # Git remotes with ${GITBASE} placeholders
|
|
701
871
|
my-archetype/
|
|
702
|
-
|
|
872
|
+
my-archetype-marketplace.xml # Catalog entry (carries <catalog-metadata>)
|
|
703
873
|
packages.xml # Package repos with pinned versions
|
|
704
874
|
```
|
|
705
875
|
|
|
876
|
+
### Catalog entry (-marketplace.xml)
|
|
877
|
+
|
|
878
|
+
Each catalog entry is a `*-marketplace.xml` file containing exactly one
|
|
879
|
+
nested `<catalog-metadata>` block. Required fields are `name`,
|
|
880
|
+
`display-name`, `description`, and `version`; recommended fields are `type`,
|
|
881
|
+
`owner-name`, `owner-email`, and `keywords` (comma-separated). The legacy
|
|
882
|
+
flat-attribute scheme (metadata as XML attributes) is rejected.
|
|
883
|
+
|
|
884
|
+
```xml
|
|
885
|
+
<package>
|
|
886
|
+
<catalog-metadata>
|
|
887
|
+
<name>my-archetype</name>
|
|
888
|
+
<display-name>My Archetype</display-name>
|
|
889
|
+
<description>Build conventions and lint config for service repos.</description>
|
|
890
|
+
<version>1.0.0</version>
|
|
891
|
+
<type>library</type>
|
|
892
|
+
<owner-name>Platform Team</owner-name>
|
|
893
|
+
<owner-email>platform@example.com</owner-email>
|
|
894
|
+
<keywords>build,lint,conventions</keywords>
|
|
895
|
+
</catalog-metadata>
|
|
896
|
+
<include name="repo-specs/my-archetype/packages.xml" />
|
|
897
|
+
</package>
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
`kanon validate metadata` and `kanon catalog audit` enforce the
|
|
901
|
+
`<catalog-metadata>` contract.
|
|
902
|
+
|
|
706
903
|
### remote.xml -- Git Remote Definition
|
|
707
904
|
|
|
708
905
|
Defines where packages are hosted using `${GITBASE}` for portability:
|
|
@@ -734,14 +931,19 @@ Lists each package repository, its local path, and the pinned version:
|
|
|
734
931
|
</manifest>
|
|
735
932
|
```
|
|
736
933
|
|
|
737
|
-
###
|
|
934
|
+
### Entry-point manifest
|
|
738
935
|
|
|
739
|
-
|
|
936
|
+
The `*-marketplace.xml` catalog entry is the entry point referenced by the
|
|
937
|
+
`KANON_SOURCE_<name>_PATH` value that `kanon add` writes into `.kanon`. It
|
|
938
|
+
pulls in the package declarations via `<include>`:
|
|
740
939
|
|
|
741
940
|
```xml
|
|
742
|
-
<
|
|
941
|
+
<package>
|
|
942
|
+
<catalog-metadata>
|
|
943
|
+
<!-- ... required + recommended fields ... -->
|
|
944
|
+
</catalog-metadata>
|
|
743
945
|
<include name="repo-specs/my-archetype/packages.xml" />
|
|
744
|
-
</
|
|
946
|
+
</package>
|
|
745
947
|
```
|
|
746
948
|
|
|
747
949
|
### Include Chains for Hierarchy
|
|
@@ -751,16 +953,16 @@ hierarchy. This enables cascading configurations where common packages are
|
|
|
751
953
|
defined once and specialized packages are layered on top:
|
|
752
954
|
|
|
753
955
|
```text
|
|
754
|
-
|
|
956
|
+
my-archetype-marketplace.xml
|
|
755
957
|
└── packages.xml (leaf -- e.g., specific project type)
|
|
756
958
|
└── packages.xml (framework level)
|
|
757
959
|
└── packages.xml (language level)
|
|
758
960
|
└── packages.xml (common/base)
|
|
759
961
|
```
|
|
760
962
|
|
|
761
|
-
Each level includes its parent and adds its own package entries. The
|
|
762
|
-
|
|
763
|
-
packages.
|
|
963
|
+
Each level includes its parent and adds its own package entries. The
|
|
964
|
+
`kanon repo` subsystem recursively resolves all includes, accumulating a
|
|
965
|
+
unified set of packages.
|
|
764
966
|
|
|
765
967
|
### Updating Package Versions
|
|
766
968
|
|
|
@@ -1081,8 +1283,9 @@ make publish # Clean, build, and check distribution
|
|
|
1081
1283
|
src/kanon_cli/
|
|
1082
1284
|
cli.py # Entry point
|
|
1083
1285
|
commands/ # Subcommand implementations
|
|
1084
|
-
core/ # Core logic (install, clean, kanon parsing)
|
|
1085
|
-
|
|
1286
|
+
core/ # Core logic (install, clean, kanon parsing, lockfile)
|
|
1287
|
+
completions/ # Shell-completion generators
|
|
1288
|
+
utils/ # Shared helpers
|
|
1086
1289
|
repo/ # kanon repo subsystem (manifest sync, PEP 440)
|
|
1087
1290
|
tests/ # Unit and functional tests
|
|
1088
1291
|
docs/ # Configuration, lifecycle, version resolution docs
|