kanon-cli 3.4.1__tar.gz → 3.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.github/CODEOWNERS +2 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.github/workflows/main-validation.yml +16 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.github/workflows/pr-validation.yml +16 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.pre-commit-config.yaml +1 -1
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/CHANGELOG.md +246 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/CONTRIBUTING.md +21 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/Makefile +4 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/PKG-INFO +41 -13
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/README.md +40 -12
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/architecture.md +15 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/git-auth-setup.md +27 -11
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/lifecycle.md +2 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/list-and-add.md +32 -16
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/git-hooks/pre-push +16 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/pyproject.toml +1 -1
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/__init__.py +1 -1
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/add.py +70 -19
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/doctor.py +1 -1
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/cache.py +2 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/constants.py +18 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/clean.py +31 -3
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/install.py +101 -26
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/kanonenv.py +5 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/marketplace.py +10 -18
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/project.py +76 -5
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/utils/concurrency.py +141 -17
- kanon_cli-3.4.2/src/kanon_cli/utils/spawn.py +215 -0
- kanon_cli-3.4.2/src/kanon_cli/utils/windows_permissions.py +78 -0
- kanon_cli-3.4.2/src/kanon_cli/utils/worker.py +70 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/conftest.py +32 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/completion/expected-zsh.sh +11 -8
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-add.txt +13 -9
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_add_alias_journey.py +89 -18
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_error_snapshots.py +2 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_home_flag_store_relocation.py +3 -3
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_lifecycle.py +14 -9
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_linkfile_fs_effects.py +188 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_workspace_dir_env.py +28 -2
- kanon_cli-3.4.2/tests/native/windows_contracts.py +310 -0
- kanon_cli-3.4.2/tests/native/worker_callbacks.py +46 -0
- kanon_cli-3.4.2/tests/scenarios/test_add_content_upgrade.py +91 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ns_marketplace_and_global_flags.py +6 -1
- kanon_cli-3.4.2/tests/scenarios/test_project_linkfile_isolation.py +60 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_xml.py +9 -1
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project.py +9 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_add_collision.py +165 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_background_refresh.py +8 -5
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_ci_workflows.py +16 -33
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_complete_project_versions.py +15 -13
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_concurrency.py +34 -2
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install.py +126 -7
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_spawn.py +17 -18
- kanon_cli-3.4.2/tests/unit/test_windows_lock_api.py +52 -0
- kanon_cli-3.4.2/tests/unit/test_worker.py +130 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/uv.lock +4 -4
- kanon_cli-3.4.1/src/kanon_cli/utils/spawn.py +0 -128
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.claude/settings.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/.devcontainer.postcreate.sh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/VERSION +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/catalog-entry.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/devcontainer-functions.sh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/devcontainer.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/fix-line-endings.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/nix-family-os/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/postcreate-wrapper.sh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/project-setup.sh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/wsl-family-os/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.github/actions/setup-kanon/action.yml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.github/workflows/codeql-analysis.yml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.github/workflows/nightly-regression.yml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.github/workflows/publish.yml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.gitignore +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.markdownlint.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.tool-versions +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/.yamllint +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/CLAUDE.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/LICENSE +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/archive/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/archive/migrating-existing-kanon-files.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/archive/upgrading-from-2x.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/catalog-author-guide.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/catalog-format-versioning.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/catalogs-explained.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/claude-marketplaces-guide.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/cli/catalog-audit.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/cli/doctor.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/cli/validate.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/cli-reference.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/cli.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/coming-from-pip-npm-cargo.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/configuration.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/contributing.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/creating-manifest-repos.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/creating-packages.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/doctor.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/exit-codes.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/how-it-works.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/installation.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/integration-testing.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/lockfile.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/multi-source-guide.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/outdated-and-why.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/pipeline-integration.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/privacy.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/repo/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/repo/internal-fs-layout.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/repo/manifest-format.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/repo/python-support.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/repo/repo-hooks.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/repo/smart-sync.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/repo/windows.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/security-model.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/setup-guide.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/shell-completion.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/test-coverage.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/testing/matrix-traceability.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/troubleshooting.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/url-canonicalization.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/docs/version-resolution.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/git-hooks/pre-commit +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/link +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/scripts/check_archive_no_duplicates.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/__main__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/cli.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/catalog.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/clean.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/completion.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/install.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/marketplace.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/outdated.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/remove.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/repo.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/search.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/validate.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/commands/why.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/cached_catalogs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/catalog_entries.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/catalog_versions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/lockfile_names.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/midtoken.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/pep440_filter.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/powershell.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/preamble.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/project_versions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/sanitize.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/completions/source_names.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/catalog.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/cli_args.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/discover.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/git_runner.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/include_walker.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/kanon_hash.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/kanonenv_writer.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/lockfile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/manifest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/manifest_vars.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/marketplace_validator.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/metadata.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/remote_url.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/telemetry.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/update_check.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/url.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/core/xml_validator.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/VENDOR.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/color.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/editor.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/error.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/event_log.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/fetch.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_config.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_refs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_ssh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_superproject.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/hooks/commit-msg +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/hooks.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/main.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/manifest_xml.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/pager.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/platform_utils.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/progress.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/repo +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/repo_logging.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/repo_trace.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/requirements.jsonc +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/ssh.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/branches.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/diff.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/download.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/forall.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/gc.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/grep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/help.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/info.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/init.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/overview.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/prune.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/stage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/start.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/status.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/sync.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/upload.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/version_constraints.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/repo/wrapper.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/utils/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/utils/levenshtein.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/utils/lock_file_path.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/src/kanon_cli/version.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/completion/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/completion/expected-bash.sh +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/completion/expected-powershell.ps1 +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/conflict-detected.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/entry-not-found.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/source-collision.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-catalog.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-clean.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-completion.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-doctor.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-install.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-list.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-marketplace.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-outdated.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-remove.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-search.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-toplevel.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-why.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/.gitignore +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/linter-test-bad.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/linter-test-bad.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/sample-manifest.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/sample-project-config.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/test.gitconfig +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/fixtures/repo/version_constraints_data.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/conftest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_alias_consumer_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_argparse_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_argparse_help.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_clean_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_cli_entry_point.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_completion_snapshots.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_default_branch_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_env_int_guard_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_exit_code_matrix.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_groups_filter.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_help_snapshots.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_help_text_contract.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_home_flag_unwritable_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_init_default_branch_prerequisite_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_install_hermetic_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_install_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_install_real_kanon.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_install_v3_lock_fail_fast_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_kanon_home_store_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_kanon_repo_cli.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_kanon_repo_e2e.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_lifecycle_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_list_telemetry.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_make_operator_path_targets.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_marker_completeness.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_marketplace_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_matrix_traceability_complete.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_provider_agnostic.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_abandon_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_abandon_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_abandon_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_branches_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_branches_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_branches_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_checkout_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_checkout_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_checkout_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_diff_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_diff_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_diff_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_dir_override.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_download_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_download_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_download_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_envsubst_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_envsubst_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_envsubst_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_exit_codes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_forall_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_forall_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_forall_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_gc_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_gc_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_gc_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_grep_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_grep_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_grep_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_help_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_help_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_help_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_info_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_info_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_info_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_init_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_init_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_init_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_init_mirror.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_list_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_list_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_list_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_overview_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_overview_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_overview_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_passthrough.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_prune_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_prune_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_prune_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_rebase_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_rebase_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_rebase_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_smartsync_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_smartsync_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_smartsync_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_stage_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_stage_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_stage_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_start_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_start_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_start_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_status_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_status_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_status_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_sync_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_sync_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_sync_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_upload_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_upload_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_repo_upload_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_singular_catalog_source_inert.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_stdout_stderr_discipline.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_suite_containment.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_telemetry_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_update_alert_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_validate_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_validate_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_validate_lockfile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_validate_marketplace.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_validate_xml_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_validate_xml_repo_root.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/functional/test_zero_source_clean_error.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/conftest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/fixtures/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/conftest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/drift.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/provider_allowlist.txt +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/conftest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_bug_fixes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_envsubst_integration.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_import_functional.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_manifest_parsing.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_module_smoke.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_pipeline.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_version_constraints_integration.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_add_core.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_add_dry_run.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_add_env_var_detection.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_add_zero_tags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_auto_discovery.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_background_refresh.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_cache_clock_skew.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_cache_layout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_catalog_constraints.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_ci_validation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_clean_env_override_cleanup.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_clean_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_clean_paths.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_cli_entry_points.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_complete_project_versions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_complete_source_names.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_completion_bash.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_completion_powershell_subcommand.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_completion_subcommand.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_completion_zsh.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_concurrency.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_concurrency_serialization.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_copyfile_fs_effects.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_cross_platform_contract.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doc_validation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doctor_consistency.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doctor_prune_cache.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_doctor_remote_check.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_envsubst_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_fs_fault_extended.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_fs_fault_injection.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_full_user_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_git_fault_injection.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_git_retry_env.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_gitignore_idempotency.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_after_add.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_env_var_resolution.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_include_cycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_include_diamond.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_lock_file_derivation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_lockfile_replay.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_marketplace_registration.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_no_kanon_remediation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_optional_vars.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_path_conflict_integration.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_paths.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_per_alias_gitbase.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_reconcile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_remote_url_policy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_required_vars.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_install_strict.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_json_output_stream_discipline.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_kanon_clean_embedded.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_kanon_dir_collision.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_kanon_full_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_kanon_install_embedded.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_kanonenv_parsing.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_lifecycle_recovery.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_all_versions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_all_versions_canonical.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_command_json.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_default.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_detail.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_filter.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_format_json.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_list_tree.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_lockfile_roundtrip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_marketplace_install.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_marketplace_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_marketplace_orphan_prune.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_midtoken_bash.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_midtoken_zsh.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_misc_features.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_multi_source_aggregation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_no_bundled_catalog.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_no_default_catalog.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_no_hardcoded_org_values.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_observability.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_outdated.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_outdated_branch_drift.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_outdated_format_json.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_platform_parity.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_preamble_bash.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_preamble_zsh.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_remove_core.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_remove_dry_run.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_remove_force_integration.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_signal_handling.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_synthetic_drift_fixture.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_unicode_encoding.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_validate_marketplace.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_validate_marketplace_revision_existence.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_validate_metadata.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_validate_xml.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_version_resolution.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_version_widened_bare_pep440.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_wheel_e2e.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_why_ambiguous.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_why_chain_walker.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_why_format_json.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_why_live_resolve.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/integration/test_why_not_found_suggestion.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_e0_install_relative_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/regression/test_linkfile_samefile_regression.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/_rp_helpers.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/conftest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ad.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_bs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_cd.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_content_pins.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_cs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_doctor_cache.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_doctor_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ec.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_et.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ev.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_hv.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ic.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_id.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_install_graph_capture.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ks.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_lf.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_list_journey.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_mk.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_mp.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_ms.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_outdated_two_source.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_pk.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rc.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_abandon.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_branches.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_checkout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_cherry_pick.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_diff.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_diffmanifests.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_download.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_envsubst.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_forall.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_gc.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_grep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_help.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_info.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_init.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_manifest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_overview.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_prune.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_rebase.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_smartsync.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_stage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_start.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_status.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_sync.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_upload.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rp_wrap.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_rx.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_search_multi_source.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_tc_bootstrap.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_tc_clean.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_tc_install.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_tc_validate.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_uj.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_va.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_va_validate_lockfile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_why_surface_query.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_why_url_path.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/security/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/security/test_security_hardening.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/test_wheel_layout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/conftest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/conftest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/.gitignore +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/README.md +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/test.gitconfig +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/functional/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/functional/test_features.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_abandon_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_branches_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug11_race_condition.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_checkout_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_color.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_conftest_fixtures.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_download_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_editor.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_embedded_mode.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_envsubst_basic.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_envsubst_edge.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_envsubst_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_error.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_event_log.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_event_log_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_fetch.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_fixture_files.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_forall_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_git_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_git_config.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_git_refs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_git_superproject.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_grep_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_harness_smoke.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_hooks.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_import_verification.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_imports.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_include_path_resolution.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_info_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_init_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_list_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_main.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_main_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_main_init_download_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_makefile_lint_format.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_makefile_structure.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_makefile_test_targets.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_medium_files_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_overview_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_package_structure.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_pager.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_parselist.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_edge_1.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_edge_2.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_platform_utils.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_progress.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_coverage_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_deep_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_final_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_integration.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_methods.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_project_sync.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_prune_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_rebase_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_logging.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_run_api.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_sync_api.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_trace.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_revision_inheritance.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_ruff_config.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_selfupdate_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_small_files_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_ssh.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_ssh_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_stage_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_stage_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_start_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_status_coverage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_status_gaps.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_status_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmd_imports.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_abandon.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_branches.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_checkout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_diff.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_download.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_forall.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_gc.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_grep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_help.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_info.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_init.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_manifest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_overview.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_prune.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_rebase.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_stage.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_start.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_status.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_sync.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_upload.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_superproject_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_deep_boost.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_massive.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_upload_deep.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_version_consolidation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_version_constraints.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_wheel_contents.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_wrapper.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_default_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_default_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_default_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_fault_structural.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_cycles.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_notice_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_project_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_project_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_project_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remote_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xmlbool.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_xmlint.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/repo/test_yamllint_config.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_accessed_at_coalescing.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_add.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_add_zero_tags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_bare_semver_to_tag.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_build_project_entries.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cache.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cache_layout.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cache_ttl.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cached_catalogs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_check_parser.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_catalog_source_parsing.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_check_no_comments.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_clean.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_clean_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cli.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cli_args.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cli_help_format.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_cli_json_stream_discipline.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_complete_source_names.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_completion.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_completion_sanitization.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_completion_subcommand.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_conftest_scrubber.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_constants.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_constants_doctor_subcheck.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_constants_env_int.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_constants_install_after_add.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_constants_list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_constants_outdated_refs_tags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_constants_why_lockfile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_coverage_gaps.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_derive_source_name.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_discover.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_discover_source_names_missing_url.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_docs_embedded_architecture.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor_completion_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor_completion_staleness.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor_consistency.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor_coverage_gaps.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_doctor_remote_reachability.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_env_isolation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_envsubst_subcommand.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_git_runner.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_home_flag.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_include_walker.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_color_default.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_conflict_detection.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_https_enforcement.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_placeholder_validation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_reconcile_decision.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_state_matrix.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_strict_flags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_isolation_fixtures.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_kanon_hash.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_kanonenv.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_kanonenv_edge_cases.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_kanonenv_writer.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_levenshtein.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_list.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_lock_file_path.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_lockfile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_lockfile_reconcile.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_lockfile_schema_migration.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_manifest.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_manifest_vars.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_marketplace.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_marketplace_cmd.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_marketplace_install.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_marketplace_validator.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_metadata.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_midtoken_splitter.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_outdated.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_outdated_branch_pinned.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_outdated_format_json.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_pep440_filter.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_powershell.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_pre_push_hook.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_preamble.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_preamble_semver_tags.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_provider_agnosticism.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_pyproject_build_config.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_remote_url.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_remove.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_remove_dry_run.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_remove_force.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_remove_line_endings.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_repo.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_repo_abspath.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_repo_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_resolve_catalog_dir.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_revision_resolve.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_sanitize.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_search.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_search_all_versions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_search_coverage_gaps.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_search_detail.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_search_filter.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_search_format_json.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_search_tree.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_sync_jobs.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_telemetry.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_toolchain_isolation.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_update_check.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_url.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_validate.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_validate_command.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_validate_metadata.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_version.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_version_constraint_errors.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_why.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_why_ambiguity.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_why_format_json.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_why_suggestions.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tests/unit/test_xml_validator.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tools/lint/check_no_comments.py +0 -0
- {kanon_cli-3.4.1 → kanon_cli-3.4.2}/tools/test_tmp_monitor.py +0 -0
|
@@ -429,3 +429,19 @@ jobs:
|
|
|
429
429
|
run: |
|
|
430
430
|
NEW_VERSION=$(grep '^version = ' pyproject.toml | sed 's/.*version = "\([^"]*\)".*/\1/')
|
|
431
431
|
gh workflow run publish.yml -f tag="$NEW_VERSION"
|
|
432
|
+
|
|
433
|
+
native-windows:
|
|
434
|
+
name: Native Windows contracts
|
|
435
|
+
runs-on: windows-latest
|
|
436
|
+
steps:
|
|
437
|
+
- name: Checkout reviewed commit
|
|
438
|
+
uses: actions/checkout@v6
|
|
439
|
+
with:
|
|
440
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
441
|
+
fetch-depth: 0
|
|
442
|
+
- uses: ./.github/actions/setup-kanon
|
|
443
|
+
- name: Run native Windows acceptance
|
|
444
|
+
env:
|
|
445
|
+
KANON_NATIVE_STORE_ROOT: ${{ runner.temp }}
|
|
446
|
+
shell: bash
|
|
447
|
+
run: make test-windows
|
|
@@ -378,3 +378,19 @@ jobs:
|
|
|
378
378
|
fi
|
|
379
379
|
echo "Final owners: $UNIQUE_OWNERS"
|
|
380
380
|
echo "owners=$UNIQUE_OWNERS" >> $GITHUB_OUTPUT
|
|
381
|
+
|
|
382
|
+
native-windows:
|
|
383
|
+
name: Native Windows contracts
|
|
384
|
+
runs-on: windows-latest
|
|
385
|
+
steps:
|
|
386
|
+
- name: Checkout reviewed commit
|
|
387
|
+
uses: actions/checkout@v6
|
|
388
|
+
with:
|
|
389
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
390
|
+
fetch-depth: 0
|
|
391
|
+
- uses: ./.github/actions/setup-kanon
|
|
392
|
+
- name: Run native Windows acceptance
|
|
393
|
+
env:
|
|
394
|
+
KANON_NATIVE_STORE_ROOT: ${{ runner.temp }}
|
|
395
|
+
shell: bash
|
|
396
|
+
run: make test-windows
|
|
@@ -2,8 +2,248 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
## v3.4.2 (2026-09-28)
|
|
6
|
+
|
|
7
|
+
### Build
|
|
8
|
+
|
|
9
|
+
* build(deps): bump gitpython from 3.1.58 to 3.1.59
|
|
10
|
+
|
|
11
|
+
Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.58 to 3.1.59.
|
|
12
|
+
- [Release notes](https://github.com/gitpython-developers/GitPython/releases)
|
|
13
|
+
- [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES)
|
|
14
|
+
- [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.58...3.1.59)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
updated-dependencies:
|
|
18
|
+
- dependency-name: gitpython
|
|
19
|
+
dependency-version: 3.1.59
|
|
20
|
+
dependency-type: indirect
|
|
21
|
+
...
|
|
22
|
+
|
|
23
|
+
Signed-off-by: dependabot[bot] <support@github.com> ([`aa305fd`](https://github.com/caylent-solutions/kanon/commit/aa305fda781cb18119f20117c60469ce340a3428))
|
|
24
|
+
|
|
25
|
+
### Chore
|
|
26
|
+
|
|
27
|
+
* chore(pre-commit): run the no-comments gate through uv
|
|
28
|
+
|
|
29
|
+
The hook invoked a bare `python`, which does not exist on a machine whose
|
|
30
|
+
only interpreter is the uv-managed one. There it failed with "Executable
|
|
31
|
+
`python` not found" on every commit -- the gate reported Failed without ever
|
|
32
|
+
scanning a file, so a disallowed comment could reach a commit unnoticed.
|
|
33
|
+
|
|
34
|
+
Every other entry point to this check already goes through uv: the Makefile's
|
|
35
|
+
lint-no-comments target, and the sibling completion-snapshots hook by way of
|
|
36
|
+
make.
|
|
37
|
+
|
|
38
|
+
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`b8fa7f0`](https://github.com/caylent-solutions/kanon/commit/b8fa7f0fd7dec7698647b1e0a75e45d80e25ba4f))
|
|
39
|
+
|
|
40
|
+
### Ci
|
|
41
|
+
|
|
42
|
+
* ci(windows): resolve runner temp in execution step context ([`45b6677`](https://github.com/caylent-solutions/kanon/commit/45b66775169af7906eea3e5640969d55a0db4987))
|
|
43
|
+
|
|
44
|
+
* ci(windows): align native store with vendored same-volume requirement ([`184023a`](https://github.com/caylent-solutions/kanon/commit/184023aad380ce0197898a15771a5870f17763e5))
|
|
45
|
+
|
|
46
|
+
### Fix
|
|
47
|
+
|
|
48
|
+
* fix: preserve source-directory permission diagnostics ([`f88d9c0`](https://github.com/caylent-solutions/kanon/commit/f88d9c03c218cfd6663a5233d4a2bbf6f0d394f0))
|
|
49
|
+
|
|
50
|
+
* fix(windows): isolate worker imports and preserve concurrent logs ([`0e39afe`](https://github.com/caylent-solutions/kanon/commit/0e39afe8d606d6eda870853ceead99f9afb4be27))
|
|
51
|
+
|
|
52
|
+
* fix(add): refresh content and ownership after forced replacement ([`9208978`](https://github.com/caylent-solutions/kanon/commit/920897879c730f36fb183bef6adc466e5e08223d))
|
|
53
|
+
|
|
54
|
+
* fix: isolate consumer linkfiles across shared-store projects ([`418cae0`](https://github.com/caylent-solutions/kanon/commit/418cae0095ed6a4ff40fc5e5f3b6285f9f760ed4))
|
|
55
|
+
|
|
56
|
+
* fix(windows): enforce native locking and detached worker contracts ([`8bca79c`](https://github.com/caylent-solutions/kanon/commit/8bca79c1740a6809936cadaaefe13298aa51f90f))
|
|
57
|
+
|
|
58
|
+
* fix(codeowners): assign Kanon release approvers to all files ([`0dc908b`](https://github.com/caylent-solutions/kanon/commit/0dc908b515276f61efce622d637996820f906a96))
|
|
59
|
+
|
|
60
|
+
* fix(hooks): stop the pre-push gate corrupting the repository it gates
|
|
61
|
+
|
|
62
|
+
Git exports GIT_DIR and its siblings to hooks, and pre-push inherits
|
|
63
|
+
them into `make test-unit-cov`. GIT_DIR outranks cwd, so the fixture
|
|
64
|
+
helper in TestResetManifestsWorkingTree -- which passes only a working
|
|
65
|
+
directory to `git init` and `git config` -- wrote into the pushing
|
|
66
|
+
developer's own repository instead of its temp fixture: core.bare=true,
|
|
67
|
+
which breaks every worktree of that repo, and a fixture
|
|
68
|
+
user.name/user.email, which silently reattributed their next commit.
|
|
69
|
+
Both were observed on a real checkout.
|
|
70
|
+
|
|
71
|
+
Fixed at both ends. The helper scrubs GIT_* from the environment it
|
|
72
|
+
hands git, so cwd means what the helper assumes; a regression test
|
|
73
|
+
builds a fixture repo under a deliberately set GIT_DIR and asserts that
|
|
74
|
+
repository's config is untouched. pre-push unsets the same variables
|
|
75
|
+
after resolving the repo root, so no future test acquires the same
|
|
76
|
+
reach.
|
|
77
|
+
|
|
78
|
+
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`065caa2`](https://github.com/caylent-solutions/kanon/commit/065caa20fe5ee1c1d74bea71526fd925e3e544b3))
|
|
79
|
+
|
|
80
|
+
* fix: linkfile symlink target no longer records checkout depth
|
|
81
|
+
|
|
82
|
+
A <linkfile> delivering into the consuming project pointed at content in
|
|
83
|
+
the KANON_HOME store, which sits outside the project, so the target was
|
|
84
|
+
measured across the filesystem and its ".." chain recorded how deeply the
|
|
85
|
+
checkout happened to sit on disk. Installing from a git worktree -- three
|
|
86
|
+
directories deeper than the clone containing it -- wrote a
|
|
87
|
+
three-level-longer target: correct there, dangling in every ordinary
|
|
88
|
+
clone, with nothing to signal the difference. One such target was
|
|
89
|
+
committed and merged before anyone noticed.
|
|
90
|
+
|
|
91
|
+
kanon install now maintains <project-root>/.packages, a gitignored
|
|
92
|
+
symlink into the store's aggregated package directory, and measures the
|
|
93
|
+
target between two project-root-relative paths instead. The result is a
|
|
94
|
+
function of the manifest alone and is byte-identical at every checkout
|
|
95
|
+
depth. kanon clean removes the anchor it created.
|
|
96
|
+
|
|
97
|
+
Marketplace destinations and any source outside a .packages slot keep
|
|
98
|
+
their existing plain relative target; this narrows a target that would
|
|
99
|
+
otherwise escape the project root, and never widens one.
|
|
100
|
+
|
|
101
|
+
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`bbc4aa5`](https://github.com/caylent-solutions/kanon/commit/bbc4aa539e83d5c8c225f8a74408b19a351284c2))
|
|
102
|
+
|
|
103
|
+
* fix(add): resolve a re-add to the block already declaring that manifest name
|
|
104
|
+
|
|
105
|
+
kanon add resolved an entry's alias from the source URL and ref alone, so a
|
|
106
|
+
re-add whose coordinates differed at all -- a newer tag, a differently spelled
|
|
107
|
+
catalog URL -- missed the same-alias duplicate check and auto-suffixed into a
|
|
108
|
+
fresh alias. The .kanon file was left with two live source blocks declaring the
|
|
109
|
+
same KANON_SOURCE_<alias>_NAME, a state install has no rule for.
|
|
110
|
+
|
|
111
|
+
An entry whose manifest name is already declared now resolves to that block's
|
|
112
|
+
alias, whatever source it names and whatever alias the block carries. The
|
|
113
|
+
--force gate is unchanged: a hard error with a diff, or an in-place overwrite
|
|
114
|
+
plus lock re-pin. The auto-suffix candidate sequence still separates distinct
|
|
115
|
+
packages whose names sanitize to one alias.
|
|
116
|
+
|
|
117
|
+
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`3018b8f`](https://github.com/caylent-solutions/kanon/commit/3018b8f65a2a1798dbeb72ec2a844eaaccb5a9df))
|
|
118
|
+
|
|
119
|
+
* fix(lint,format): remove unused import and variable in test_spawn, fix ruff format ([`04ef906`](https://github.com/caylent-solutions/kanon/commit/04ef90619d20fb8363534534a1d0236fbaa2be41))
|
|
120
|
+
|
|
121
|
+
* fix(concurrency,spawn): add Windows backend for issue #75
|
|
122
|
+
|
|
123
|
+
- concurrency.py: dispatch _exclusive_kernel_lock to platform-specific
|
|
124
|
+
backend; add _exclusive_kernel_lock_windows using Win32 LockFileEx +
|
|
125
|
+
WaitForSingleObject — true kernel-level blocking with no poll loop and
|
|
126
|
+
no sleep, matching the POSIX SIGALRM approach
|
|
127
|
+
- spawn.py: dispatch spawn_detached to _spawn_detached_windows on win32;
|
|
128
|
+
Windows backend uses multiprocessing.Process(daemon=False) with the
|
|
129
|
+
spawn context; _windows_child_target redirects stdin/stdout/stderr
|
|
130
|
+
before calling refresh_fn
|
|
131
|
+
- doctor.py: remove 'fcntl.flock' reference from stale-lock diagnostic
|
|
132
|
+
- tests/test_spawn.py: add three Windows backend unit tests
|
|
133
|
+
|
|
134
|
+
Resolves #75 — AttributeError: module 'os' has no attribute 'fork'
|
|
135
|
+
Resolves ModuleNotFoundError: No module named 'fcntl' on Windows ([`7b28799`](https://github.com/caylent-solutions/kanon/commit/7b28799e476504596d6698fba493d494b0ba80cc))
|
|
136
|
+
|
|
137
|
+
* fix(concurrency,spawn): add Windows backend to resolve issue #75
|
|
138
|
+
|
|
139
|
+
concurrency.py: add _exclusive_kernel_lock_windows using Win32 LockFileEx
|
|
140
|
+
+ WaitForSingleObject via ctypes. Dispatches from _exclusive_kernel_lock
|
|
141
|
+
via sys.platform check. True kernel-level blocking with no poll loop and
|
|
142
|
+
no sleep, matching the POSIX SIGALRM approach. import fcntl / import signal
|
|
143
|
+
remain inside _exclusive_kernel_lock_posix; no unconditional POSIX-only
|
|
144
|
+
import on any CLI startup path.
|
|
145
|
+
|
|
146
|
+
spawn.py: add _spawn_detached_windows + _windows_child_target using
|
|
147
|
+
multiprocessing.Process(daemon=False) with the spawn context. The callable
|
|
148
|
+
is already picklable (module-level functools.partial, noted in cache.py).
|
|
149
|
+
Dispatches from spawn_detached via sys.platform check. The POSIX path
|
|
150
|
+
(os.fork / os.setsid / os.dup2) is unchanged.
|
|
151
|
+
|
|
152
|
+
doctor.py: remove platform-specific 'fcntl.flock' reference from the
|
|
153
|
+
STALE_INSTALL_LOCK advisory message.
|
|
154
|
+
|
|
155
|
+
tests/unit/test_spawn.py: add three tests for the Windows backend covering
|
|
156
|
+
non-daemon process creation, correct args, and fail-fast on start() failure.
|
|
157
|
+
All tests use mocking and run on every platform without skipif.
|
|
158
|
+
|
|
159
|
+
Fixes #75. ([`f4bd55b`](https://github.com/caylent-solutions/kanon/commit/f4bd55b00c8bd8fb49e15b81ee6051eef5dcb419))
|
|
160
|
+
|
|
161
|
+
### Refactor
|
|
162
|
+
|
|
163
|
+
* refactor: narrow duplicate-source fix to add and content refresh ([`b78b792`](https://github.com/caylent-solutions/kanon/commit/b78b7927d37acee40f56aff9bf5b6e1d52c9f39b))
|
|
164
|
+
|
|
165
|
+
* refactor: simplify the linkfile target computation
|
|
166
|
+
|
|
167
|
+
Four cleanups, no behaviour change. The depth-independence tests still
|
|
168
|
+
fail without the fix, and the full suite passes with it.
|
|
169
|
+
|
|
170
|
+
_AnchoredTarget returned either a target or None, leaving both call
|
|
171
|
+
sites to repeat the plain-relpath fallback behind an `or`. It is now
|
|
172
|
+
_LinkTarget, always returns a target, and owns that fallback as its own
|
|
173
|
+
named default, so each call site is a single unconditional expression.
|
|
174
|
+
|
|
175
|
+
Containment of the dest was decided by prefix arithmetic against the
|
|
176
|
+
project root and then re-derived, as a relative path, on the way out.
|
|
177
|
+
One os.path.relpath now does both: a first component of ".." is what
|
|
178
|
+
"outside the project" means, which is also how the src side already
|
|
179
|
+
reads.
|
|
180
|
+
|
|
181
|
+
The environment carried <project_root>/.packages, which the vendored
|
|
182
|
+
tool took apart with dirname and basename to recover two facts install
|
|
183
|
+
already had. It now carries KANON_PROJECT_ROOT, and ".packages" is a
|
|
184
|
+
module constant in project.py -- shared with _LINKFILE_EXCLUDE_ALWAYS,
|
|
185
|
+
which had the name as a third literal.
|
|
186
|
+
|
|
187
|
+
ensure_project_packages_anchor guarded against the store resolving to
|
|
188
|
+
the project root, which requires .kanon to live inside the store. The
|
|
189
|
+
full suite passes without it; it was validation for a case that cannot
|
|
190
|
+
arise, and it cost a nesting level.
|
|
191
|
+
|
|
192
|
+
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`4f9e77a`](https://github.com/caylent-solutions/kanon/commit/4f9e77a34120d99d1ee6867074910284d2bd3607))
|
|
193
|
+
|
|
194
|
+
### Test
|
|
195
|
+
|
|
196
|
+
* test: resolve the stub temp root so absolute-dest tests pass on macOS
|
|
197
|
+
|
|
198
|
+
Twenty-one absolute-dest tests failed on every macOS checkout, including
|
|
199
|
+
a clean main, which left `make test-unit` -- and with it the pre-push
|
|
200
|
+
gate -- red regardless of the change under test.
|
|
201
|
+
|
|
202
|
+
An absolute <linkfile>/<copyfile> dest is refused when any component of
|
|
203
|
+
its path is a symlink, and the platform temp root is one on macOS:
|
|
204
|
+
tempfile puts these fixtures under /var/folders/..., and /var is a
|
|
205
|
+
symlink to /private/var. The resolver was right; the fixtures were not.
|
|
206
|
+
install() resolves the consumer project root before publishing it as a
|
|
207
|
+
permitted root, so a stub checkout standing in for one has to be
|
|
208
|
+
resolved too.
|
|
209
|
+
|
|
210
|
+
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`de103e7`](https://github.com/caylent-solutions/kanon/commit/de103e7cfd130b3291be3d972b9305f2734c152a))
|
|
211
|
+
|
|
212
|
+
### Unknown
|
|
213
|
+
|
|
214
|
+
* Merge pull request #129 from caylent-solutions/fix/add-same-name-duplicate-source-block
|
|
215
|
+
|
|
216
|
+
fix(add): resolve a re-add to the block already declaring that manifest name ([`0ac1f1c`](https://github.com/caylent-solutions/kanon/commit/0ac1f1c3ab957529bd9eacbe15fcb11dc9518502))
|
|
217
|
+
|
|
218
|
+
* Merge remote-tracking branch 'refs/remotes/upstream/main' into review/fix-pr129 ([`5d5f562`](https://github.com/caylent-solutions/kanon/commit/5d5f562459556f3c042cf966fafcae2449dba667))
|
|
219
|
+
|
|
220
|
+
* Merge pull request #128 from caylent-solutions/chore/pre-commit-no-comments-uv
|
|
221
|
+
|
|
222
|
+
chore(pre-commit): run the no-comments gate through uv ([`7a0e81f`](https://github.com/caylent-solutions/kanon/commit/7a0e81f2d12616f677be2d94285e9fd5bbd8fd07))
|
|
223
|
+
|
|
224
|
+
* Merge pull request #122 from caylent-solutions/fix/windows-compat-issue-75
|
|
225
|
+
|
|
226
|
+
fix(windows): enforce native workspace locks and detached workers ([`a4b0df2`](https://github.com/caylent-solutions/kanon/commit/a4b0df24656e9d8d5ef8730cafa22ba3f68f0a0f))
|
|
227
|
+
|
|
228
|
+
* Merge pull request #127 from caylent-solutions/fix/linkfile-target-checkout-depth
|
|
229
|
+
|
|
230
|
+
fix: linkfile symlink target no longer records checkout depth ([`9e41cb2`](https://github.com/caylent-solutions/kanon/commit/9e41cb21cc6a70f91049c79dac1d5e3ea9f3724a))
|
|
231
|
+
|
|
232
|
+
* Merge pull request #125 from caylent-solutions/dependabot/uv/gitpython-3.1.59
|
|
233
|
+
|
|
234
|
+
build(deps): bump gitpython from 3.1.58 to 3.1.59 ([`388ba57`](https://github.com/caylent-solutions/kanon/commit/388ba57e075582abc2132c05552a24228d528f74))
|
|
235
|
+
|
|
236
|
+
* Merge pull request #130 from caylent-solutions/chore/builders-codeowners
|
|
237
|
+
|
|
238
|
+
chore(codeowners): assign Kanon release approvers to all files ([`b0787c2`](https://github.com/caylent-solutions/kanon/commit/b0787c297622573b03ab37ee64664edf6103026e))
|
|
239
|
+
|
|
240
|
+
|
|
5
241
|
## v3.4.1 (2026-08-21)
|
|
6
242
|
|
|
243
|
+
### Chore
|
|
244
|
+
|
|
245
|
+
* chore(release): 3.4.1 ([`8a9a35c`](https://github.com/caylent-solutions/kanon/commit/8a9a35cde4985d74f1515f7fa52065809dc21e34))
|
|
246
|
+
|
|
7
247
|
### Fix
|
|
8
248
|
|
|
9
249
|
* fix: kanon clean --purge-all no longer orphans the marketplace it registered (#120)
|
|
@@ -45,6 +285,12 @@ Verified end to end in a container against a 3.4.0 build: the reported sequence
|
|
|
45
285
|
now leaves zero marketplaces, zero plugins and no stale lockfile. Guards proven
|
|
46
286
|
falsifiable by reintroducing the defect in both paths. ([`6edc65a`](https://github.com/caylent-solutions/kanon/commit/6edc65a9c5cbe09fc057c370e867abaaf63136f7))
|
|
47
287
|
|
|
288
|
+
### Unknown
|
|
289
|
+
|
|
290
|
+
* Merge pull request #121 from caylent-solutions/release-3.4.1
|
|
291
|
+
|
|
292
|
+
Release 3.4.1 ([`a7f5c31`](https://github.com/caylent-solutions/kanon/commit/a7f5c3113867f270c25e0a7e74a2c27bd68567fa))
|
|
293
|
+
|
|
48
294
|
|
|
49
295
|
## v3.4.0 (2026-08-21)
|
|
50
296
|
|
|
@@ -209,6 +209,27 @@ make test-scenarios
|
|
|
209
209
|
|
|
210
210
|
A coverage meta test (`tests/scenarios/test_scenario_coverage_meta.py`) fails CI if any in-scope scenario in `docs/integration-testing.md` lacks a matching pytest test. To add a new scenario: add the `### XX-NN: <title>` heading + bash block to `docs/integration-testing.md`, then add a `@pytest.mark.scenario` test under `tests/scenarios/test_<category>.py` that references the scenario ID in its function name or docstring.
|
|
211
211
|
|
|
212
|
+
### Native Windows acceptance
|
|
213
|
+
|
|
214
|
+
Run `make test-windows` on native Windows with Git for Windows and symlink
|
|
215
|
+
privileges. The target uses the locked toolchain and executes the native
|
|
216
|
+
contracts plus portable lock/worker unit tests. The dedicated test root avoids
|
|
217
|
+
the existing POSIX process-group harness; it does not skip failing tests in
|
|
218
|
+
that harness or claim that the full suite runs on Windows. Native tests are
|
|
219
|
+
explicitly selected from `tests/native/windows_contracts.py`, so POSIX test
|
|
220
|
+
collection never substitutes mocks for native acceptance.
|
|
221
|
+
|
|
222
|
+
Worker contracts use a disposable interpreter with the trusted test callbacks
|
|
223
|
+
installed through its site configuration. Workers start in Python isolated
|
|
224
|
+
mode, so neither the current workspace nor `PYTHONPATH` supplies their imports.
|
|
225
|
+
Native regressions cover hostile workspace modules and two workers writing to
|
|
226
|
+
the same append-only log before either worker exits.
|
|
227
|
+
|
|
228
|
+
The lifecycle fixture enables Git long paths for its child processes and uses
|
|
229
|
+
local disposable repositories. Windows 11 validation and the `windows-latest`
|
|
230
|
+
CI job complement the existing Linux tiers and macOS checks. Authentication and
|
|
231
|
+
the complete vendored repo command surface require separate acceptance.
|
|
232
|
+
|
|
212
233
|
### Test Requirements
|
|
213
234
|
|
|
214
235
|
- **Unit Tests**: Must maintain at least `COVERAGE_MIN` (default 93%) coverage
|
|
@@ -132,3 +132,7 @@ check-completion-snapshots: ## Verify the completion fixtures match generated ou
|
|
|
132
132
|
exit 1; \
|
|
133
133
|
fi; \
|
|
134
134
|
echo "completion fixtures match generated output"
|
|
135
|
+
|
|
136
|
+
.PHONY: test-windows
|
|
137
|
+
test-windows: ## Run native Windows contracts and portable utility regressions
|
|
138
|
+
uv run --locked pytest --confcutdir=tests/native tests/native/windows_contracts.py tests/unit/test_concurrency.py tests/unit/test_spawn.py tests/unit/test_worker.py tests/unit/test_windows_lock_api.py -q
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: kanon-cli
|
|
3
|
-
Version: 3.4.
|
|
3
|
+
Version: 3.4.2
|
|
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
|
|
@@ -113,16 +113,29 @@ via declarative manifests.
|
|
|
113
113
|
|
|
114
114
|
## Platform support
|
|
115
115
|
|
|
116
|
-
Kanon runs on macOS and Linux.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
116
|
+
Kanon runs on macOS and Linux. Native Windows support is experimental.
|
|
117
|
+
The native Windows acceptance job exercises workspace exclusion and timeout,
|
|
118
|
+
detached workers, error logs, directory symlinks, configuration ACL checks, and
|
|
119
|
+
an isolated local-catalog CLI lifecycle. It does not certify the entire vendored
|
|
120
|
+
repo command surface, enterprise VDI policies, or Git OAuth authentication.
|
|
121
|
+
WSL2 remains the established Windows option for the Linux workflows.
|
|
122
|
+
|
|
123
|
+
Native Windows requires Git for Windows with `core.longpaths=true`, and either
|
|
124
|
+
Windows Developer Mode or the Create symbolic links privilege. Symlinks are
|
|
125
|
+
required; Kanon does not replace them with copies. The `.kanon` file must allow
|
|
126
|
+
writes only to its owner, SYSTEM, or Administrators; inherited grants to other
|
|
127
|
+
users must be removed in Windows Security settings. Unsupported ACL forms are
|
|
128
|
+
rejected rather than treated as secure.
|
|
129
|
+
|
|
130
|
+
See [Windows setup](docs/git-auth-setup.md#windows-experimental) and
|
|
131
|
+
[PowerShell completion](docs/shell-completion.md). Long paths should also be
|
|
132
|
+
enabled in Windows policy; keep `KANON_HOME` short (for example `C:\kanon`). Git for Windows can still
|
|
133
|
+
reject long `GIT_DIR` paths even with `core.longpaths=true`. The store and Kanon installation must be on the same drive: the vendored repo
|
|
134
|
+
engine creates relative links to its installed hooks and cannot calculate those
|
|
135
|
+
links across drive letters.
|
|
136
|
+
|
|
137
|
+
Network-share workspaces and
|
|
138
|
+
non-NTFS filesystems have not been validated.
|
|
126
139
|
|
|
127
140
|
---
|
|
128
141
|
|
|
@@ -1392,6 +1405,22 @@ permitted root: the consumer project root, the resolved
|
|
|
1392
1405
|
[docs/security-model.md](docs/security-model.md) and
|
|
1393
1406
|
[docs/configuration.md](docs/configuration.md#absolute-manifest-destinations).
|
|
1394
1407
|
|
|
1408
|
+
A `<linkfile>` delivering into the consuming project reaches the store through
|
|
1409
|
+
`<project-root>/.packages` -- a gitignored symlink `kanon install` maintains
|
|
1410
|
+
beside `.kanon` -- so the symlink it writes names a target relative to the
|
|
1411
|
+
project root:
|
|
1412
|
+
|
|
1413
|
+
```text
|
|
1414
|
+
.claude/rules -> ../.packages/my-standards/rules
|
|
1415
|
+
```
|
|
1416
|
+
|
|
1417
|
+
That target is a function of the manifest alone. It is byte-identical whether
|
|
1418
|
+
you install from a plain clone or from a git worktree nested inside one, and it
|
|
1419
|
+
stays valid when the checkout moves. Do not commit the `.packages` anchor
|
|
1420
|
+
itself: it points into your project's private directory in `KANON_HOME`, and
|
|
1421
|
+
every developer's `kanon install` creates their own. Installing or cleaning
|
|
1422
|
+
another project leaves this project's delivered content unchanged.
|
|
1423
|
+
|
|
1395
1424
|
---
|
|
1396
1425
|
|
|
1397
1426
|
## SSH Authentication Setup
|
|
@@ -1536,8 +1565,7 @@ version bumps.
|
|
|
1536
1565
|
- [Integration Testing](docs/integration-testing.md) -- End-to-end CLI test
|
|
1537
1566
|
plan
|
|
1538
1567
|
- [kanon repo reference](docs/repo/README.md) -- Manifest format, `.repo/`
|
|
1539
|
-
layout, hooks, smart sync, Python support (Windows is
|
|
1540
|
-
supported; see [Platform support](#platform-support) and use WSL2)
|
|
1568
|
+
layout, hooks, smart sync, Python support (native Windows is experimental; see [Platform support](#platform-support))
|
|
1541
1569
|
- [Contributing](CONTRIBUTING.md) -- How to create and maintain Kanon
|
|
1542
1570
|
packages and marketplaces
|
|
1543
1571
|
- [Privacy & Telemetry](docs/privacy.md) -- What usage telemetry kanon
|
|
@@ -91,16 +91,29 @@ via declarative manifests.
|
|
|
91
91
|
|
|
92
92
|
## Platform support
|
|
93
93
|
|
|
94
|
-
Kanon runs on macOS and Linux.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
94
|
+
Kanon runs on macOS and Linux. Native Windows support is experimental.
|
|
95
|
+
The native Windows acceptance job exercises workspace exclusion and timeout,
|
|
96
|
+
detached workers, error logs, directory symlinks, configuration ACL checks, and
|
|
97
|
+
an isolated local-catalog CLI lifecycle. It does not certify the entire vendored
|
|
98
|
+
repo command surface, enterprise VDI policies, or Git OAuth authentication.
|
|
99
|
+
WSL2 remains the established Windows option for the Linux workflows.
|
|
100
|
+
|
|
101
|
+
Native Windows requires Git for Windows with `core.longpaths=true`, and either
|
|
102
|
+
Windows Developer Mode or the Create symbolic links privilege. Symlinks are
|
|
103
|
+
required; Kanon does not replace them with copies. The `.kanon` file must allow
|
|
104
|
+
writes only to its owner, SYSTEM, or Administrators; inherited grants to other
|
|
105
|
+
users must be removed in Windows Security settings. Unsupported ACL forms are
|
|
106
|
+
rejected rather than treated as secure.
|
|
107
|
+
|
|
108
|
+
See [Windows setup](docs/git-auth-setup.md#windows-experimental) and
|
|
109
|
+
[PowerShell completion](docs/shell-completion.md). Long paths should also be
|
|
110
|
+
enabled in Windows policy; keep `KANON_HOME` short (for example `C:\kanon`). Git for Windows can still
|
|
111
|
+
reject long `GIT_DIR` paths even with `core.longpaths=true`. The store and Kanon installation must be on the same drive: the vendored repo
|
|
112
|
+
engine creates relative links to its installed hooks and cannot calculate those
|
|
113
|
+
links across drive letters.
|
|
114
|
+
|
|
115
|
+
Network-share workspaces and
|
|
116
|
+
non-NTFS filesystems have not been validated.
|
|
104
117
|
|
|
105
118
|
---
|
|
106
119
|
|
|
@@ -1370,6 +1383,22 @@ permitted root: the consumer project root, the resolved
|
|
|
1370
1383
|
[docs/security-model.md](docs/security-model.md) and
|
|
1371
1384
|
[docs/configuration.md](docs/configuration.md#absolute-manifest-destinations).
|
|
1372
1385
|
|
|
1386
|
+
A `<linkfile>` delivering into the consuming project reaches the store through
|
|
1387
|
+
`<project-root>/.packages` -- a gitignored symlink `kanon install` maintains
|
|
1388
|
+
beside `.kanon` -- so the symlink it writes names a target relative to the
|
|
1389
|
+
project root:
|
|
1390
|
+
|
|
1391
|
+
```text
|
|
1392
|
+
.claude/rules -> ../.packages/my-standards/rules
|
|
1393
|
+
```
|
|
1394
|
+
|
|
1395
|
+
That target is a function of the manifest alone. It is byte-identical whether
|
|
1396
|
+
you install from a plain clone or from a git worktree nested inside one, and it
|
|
1397
|
+
stays valid when the checkout moves. Do not commit the `.packages` anchor
|
|
1398
|
+
itself: it points into your project's private directory in `KANON_HOME`, and
|
|
1399
|
+
every developer's `kanon install` creates their own. Installing or cleaning
|
|
1400
|
+
another project leaves this project's delivered content unchanged.
|
|
1401
|
+
|
|
1373
1402
|
---
|
|
1374
1403
|
|
|
1375
1404
|
## SSH Authentication Setup
|
|
@@ -1514,8 +1543,7 @@ version bumps.
|
|
|
1514
1543
|
- [Integration Testing](docs/integration-testing.md) -- End-to-end CLI test
|
|
1515
1544
|
plan
|
|
1516
1545
|
- [kanon repo reference](docs/repo/README.md) -- Manifest format, `.repo/`
|
|
1517
|
-
layout, hooks, smart sync, Python support (Windows is
|
|
1518
|
-
supported; see [Platform support](#platform-support) and use WSL2)
|
|
1546
|
+
layout, hooks, smart sync, Python support (native Windows is experimental; see [Platform support](#platform-support))
|
|
1519
1547
|
- [Contributing](CONTRIBUTING.md) -- How to create and maintain Kanon
|
|
1520
1548
|
packages and marketplaces
|
|
1521
1549
|
- [Privacy & Telemetry](docs/privacy.md) -- What usage telemetry kanon
|
|
@@ -104,8 +104,21 @@ Key paths:
|
|
|
104
104
|
mutation. A stale lock left by a killed process is harmless; the next
|
|
105
105
|
invocation reopens and re-acquires it.
|
|
106
106
|
- **`.packages/`** -- aggregated symlinks pointing into the per-source
|
|
107
|
-
`.packages/*` entries. This
|
|
108
|
-
|
|
107
|
+
`.packages/*` entries. This legacy index uses last-install-wins semantics
|
|
108
|
+
across projects; use the consumer anchor for project-specific content.
|
|
109
|
+
- **`<project-root>/.packages`** -- the anchor: a symlink beside `.kanon`
|
|
110
|
+
pointing at `.kanon-data/sources/<project_address>/.packages/` in the store.
|
|
111
|
+
It holds no content of its own. Each project has a private aggregation directory, so another project's
|
|
112
|
+
install or clean cannot repoint its delivered content. The legacy shared
|
|
113
|
+
`<store>/.packages/` index remains available to existing downstream tooling.
|
|
114
|
+
`kanon install` adds the anchor to the project's `.gitignore`. A
|
|
115
|
+
`<linkfile>` delivering into the consuming project names a target relative to
|
|
116
|
+
the project root and reaches the store through this anchor, so the target it
|
|
117
|
+
writes is identical whatever the checkout's depth on disk. Computed against
|
|
118
|
+
the store directly, the target would instead record that depth: an install run
|
|
119
|
+
inside a git worktree sits three directories deeper than the clone containing
|
|
120
|
+
it and would write a three-level-longer target -- correct there, dangling in
|
|
121
|
+
every ordinary clone. `kanon clean` removes the anchor it created.
|
|
109
122
|
- **`<KANON_HOME>/store/.gitignore`** -- `kanon install` writes this
|
|
110
123
|
safety net (containing `*`) ONLY when the shared `KANON_HOME` store sits
|
|
111
124
|
inside a git working tree, so the fetched-artifact cache is never committed.
|
|
@@ -235,17 +235,33 @@ To clear a stale credential on Linux:
|
|
|
235
235
|
git ls-remote https://git.example.com/<repo>.git
|
|
236
236
|
```
|
|
237
237
|
|
|
238
|
-
## Windows (
|
|
239
|
-
|
|
240
|
-
Windows
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
238
|
+
## Windows (experimental)
|
|
239
|
+
|
|
240
|
+
Native Windows requires Git for Windows on `PATH`, `core.longpaths=true`, and
|
|
241
|
+
Windows Developer Mode or the Create symbolic links privilege. Enable long
|
|
242
|
+
paths in Windows policy as well. Keep `KANON_HOME` short (for example
|
|
243
|
+
`C:\kanon`): Git for Windows still rejects some long `GIT_DIR` paths even
|
|
244
|
+
with `core.longpaths=true`. Kanon creates directory symlinks and
|
|
245
|
+
fails with an actionable error when Windows denies that privilege.
|
|
246
|
+
|
|
247
|
+
The store and Kanon installation must be on the same drive: the vendored repo
|
|
248
|
+
engine creates relative links to its installed hooks and cannot calculate those
|
|
249
|
+
links across drive letters.
|
|
250
|
+
|
|
251
|
+
Kanon checks the `.kanon` file's Windows DACL. Write grants must be limited to
|
|
252
|
+
the file owner, SYSTEM and Administrators (Owner Rights grants are also
|
|
253
|
+
accepted). An inherited write grant to Everyone or Users is rejected. Use the
|
|
254
|
+
file's Security settings to remove those grants; POSIX `chmod` does not secure
|
|
255
|
+
a Windows ACL. Unknown access-control entry types are rejected conservatively.
|
|
256
|
+
|
|
257
|
+
Git authentication remains Git's responsibility. Configure Git Credential
|
|
258
|
+
Manager for your host, then verify access with `git ls-remote` before running
|
|
259
|
+
Kanon. The native acceptance fixtures use local repositories; they do not
|
|
260
|
+
validate OAuth, corporate credential policies, SSH agents, network shares, or
|
|
261
|
+
the full vendored repo command surface.
|
|
262
|
+
|
|
263
|
+
WSL2 continues to use the [Linux](#linux) instructions. See
|
|
264
|
+
[Platform support](../README.md#platform-support) for the tested scope.
|
|
249
265
|
|
|
250
266
|
## Per-host configuration patterns
|
|
251
267
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
-- direct Python API call, no subprocess
|
|
16
16
|
d. kanon_cli.repo.repo_sync(source_dir)
|
|
17
17
|
-- direct Python API call, fail-fast on RepoCommandError
|
|
18
|
-
5. Aggregate:
|
|
18
|
+
5. Aggregate: publish private links under .kanon-data/sources/<project-address>/.packages/ and the legacy shared .packages/ index. The consumer .packages anchor points only at the private links.
|
|
19
19
|
6. Collision check: fail-fast if duplicate package names
|
|
20
20
|
7. Conditional store .gitignore safety net: only when the shared KANON_HOME
|
|
21
21
|
store sits inside a git working tree, write <KANON_HOME>/store/.gitignore
|
|
@@ -53,7 +53,7 @@ touched. See
|
|
|
53
53
|
else any source's .kanon KANON_SOURCE_<alias>_MARKETPLACE flag):
|
|
54
54
|
a. Uninstall marketplace plugins via claude CLI
|
|
55
55
|
b. rm -rf CLAUDE_MARKETPLACES_DIR
|
|
56
|
-
5. unlink this project's links
|
|
56
|
+
5. unlink this project's shared-index links and consumer .packages anchor (other projects' private links kept)
|
|
57
57
|
6. rm -rf .kanon-data/sources/<project-address>/ (other projects' workspaces kept)
|
|
58
58
|
7. If --purge or --purge-all: delete this project's .kanon and .kanon.lock
|
|
59
59
|
8. If --purge-all: remove the KANON_HOME store dir (store/, cache/, empty root)
|