agentbundle 0.34.0__tar.gz → 0.35.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentbundle-0.34.0/agentbundle.egg-info → agentbundle-0.35.0}/PKG-INFO +77 -15
- {agentbundle-0.34.0 → agentbundle-0.35.0}/README-pypi.md +76 -14
- agentbundle-0.35.0/agentbundle/catalogue.py +380 -0
- agentbundle-0.35.0/agentbundle/system_trust.py +252 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/version.py +1 -1
- {agentbundle-0.34.0 → agentbundle-0.35.0/agentbundle.egg-info}/PKG-INFO +77 -15
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/SOURCES.txt +4 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/pyproject.toml +1 -1
- agentbundle-0.35.0/tests/integration/test_trust_fallback_tls.py +201 -0
- agentbundle-0.35.0/tests/unit/test_catalogue_trust_fallback.py +295 -0
- agentbundle-0.35.0/tests/unit/test_system_trust.py +345 -0
- agentbundle-0.34.0/agentbundle/catalogue.py +0 -176
- {agentbundle-0.34.0 → agentbundle-0.35.0}/MANIFEST.in +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/__main__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/adapter.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/adapter.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/guide.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/install-defaults.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/install-marker.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/marketplace-entry.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/pack.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/profile.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/public-contracts.txt +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/skill-manifest.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/skill.schema.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/target-vocab.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/workspace_status_engine.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/__main__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapter_root_bins.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/claude_code.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/codex.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/copilot.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/cursor.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/gemini.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/kiro.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/kiro_ide.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/contract.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/hook_wiring_rules.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/lint_packs.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/main.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/phase_order.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projection_io.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/codex_agent_toml.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/copilot_agent_md.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/direct_directory.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/hook_id.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/merge_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/plugin_hooks.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/user_merge_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/marketplace.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/self-host.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/scope_rails.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/self_host.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/shared_libs.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/target_resolver.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/user_libs.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/validate.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/archive.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/build.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/contracts_inspector.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/defaults.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/file_safety.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/identity.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/initialise.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/package.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/results.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/self_host.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/verify.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/categories.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/_common.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/_drop_warning.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/adapt.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_build.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_contracts.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_init.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_package.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_self_host.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_verify.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/diff.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/docs.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/init_state.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/install.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_installed.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_packs.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_profiles.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_targets.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/oplog_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/pack_config_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/pack_evals.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/package_catalogue.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/profile.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/reconcile.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/render.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/scaffold.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/show.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/uninstall.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/upgrade.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/validate.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/https_catalogue.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/local_exclude.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/oplog.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/pack_inventory.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/render.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/safety.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/scaffold.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/source_defaults.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/statelock.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/user_config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/workspace_mcp.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/dependency_links.txt +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/entry_points.txt +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/requires.txt +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/top_level.txt +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/conftest.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/setup.cfg +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/templates/install-marker.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/_support.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/claude-code-2.1.228-hook-events.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_codex.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_copilot.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_cursor.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_gemini.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract_v07.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract_v08.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_end_to_end_build.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_hook_wiring_rules.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_lint_packs.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pack_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pack_schema_install.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pipeline.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_plugin_hooks.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_plugin_publication_gates.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_projectable_subset.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_projection_io.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_projections_merge_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_scope_rails.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_security.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_check.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_metadata_policy.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_user_libs_projection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_validate.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/conftest.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/adapt/values.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/catalogue.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield/values.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list-installed/golden_120col.txt +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list-installed/golden_80col.txt +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_dual_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_preflight_detection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_schema_migration.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_apm_install_route.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_blank_catalogue.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_brownfield_round_trip.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_build_check_drift_gates.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_build_derivation_apm.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_catalogue_init.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_claude_plugins_install_route.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_config_cascade.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_credential_brokers_pack_install.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_credentials_wheel.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_editable_source_detection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_fixtures_validate.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_hook_wiring_ingress.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_adapt_chain.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_converters_user_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_copilot_full_parity.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_core_smoke.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_default_source.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_dependencies_gate.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_dual_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_orphan_reshape.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_pack_metadata_shape.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_profile.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_profile_live.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_research_user_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_seed_delivery.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_session_start_wiring.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_upgrade_offer.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_user_hooks.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_list_packs_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_local_scope_install.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_marketplace_entry_validation.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_marketplace_manifest_regression.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_multi_pack_install.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_plugin_route_membership.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_recommends_cross_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_reconcile.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_reserved_path_filter.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_scaffold_projection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_self_host_schema_migration.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_shared_prefix_coexistence.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_show_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_tier_invariants.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_uninstall_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_uninstall_user_hooks.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_upgrade_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_upgrade_user_hooks.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_version_gate_matrix.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_zipapp.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_adapter_permissions_projection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_elicit.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_event_bridge.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_git.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_lifecycle.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_stdin.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_tools.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/__init__.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_adapt_discovery_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_append_layout_section.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_architect_readme_install_command.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_ci_contract.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_curation_deps.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_pack_defaults.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_skill_spec_lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_archive.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_build.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_foundation.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_identity.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_init.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_lint.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_package.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_self_host.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_verify.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave2_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave2_validation.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_contracts_cli.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_contracts_inspector.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_init_nextsteps.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_offline_navigation.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_catalogue_optional.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_help_lists_config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_path_normalisation.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_profile_surface.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_scope_flags.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_codex_agent_toml.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_codex_projection_modes.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_common_classify_seeds.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_config_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_configured_adapter.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_confirm_helper.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_contract_parity.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_contract_v0_3_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_copilot_agent_md.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_copilot_hooks_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_credbroker_lint_hardening.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_dependencies_batch.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_diff_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_footprint_ownership.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_https_catalogue.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_init_state_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_event_dropped_wirings.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_first_value_handoff.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_force_help.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_inband_detection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_messages.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_messages_repo_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_refusal_ordering.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_state_provenance.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_list_installed_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_list_installed_status.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_list_targets_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t12_show.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t2_resolve.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t3_config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t4_state_path.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t8_install.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t9_exclude.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_marker_schema_version_parity.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_merge_into_agent_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_nested_symlink_hardening.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_org_bootstrap.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_pack_config_api.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_pack_inventory.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_package_catalogue.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_packstate_source_provenance.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_pipeline_phase_order.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_plugin_scope_filter.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_profile_reader.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_render.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_render_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_render_table.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_resolve_state_path.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_safety.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_scaffold_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_scope.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_self_host_windows.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_shared_prefix_disclosure.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_source_conflict_guard.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_source_defaults.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_state_v01_refuse_write.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_state_v02.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_state_v0_4_schema.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_statelock.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_target_resolver.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_toml_emitters.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_unresolved_markers.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_upgrade_bulk_all.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_upgrade_recap.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_upgrade_source_inference.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_io.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_isolation.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_path.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_source.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_merge_json.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_attach_to_agent.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_categories.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_cmd.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_values_from_shapes.py +0 -0
- {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentbundle
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.35.0
|
|
4
4
|
Summary: npm for your coding agent. Install packs of skills, subagents, and hooks into any repo, for every major agent.
|
|
5
5
|
Author-email: eugenelim <eugenelim@users.noreply.github.com>
|
|
6
6
|
License-Expression: Apache-2.0 OR MIT
|
|
@@ -34,25 +34,42 @@ python -m pip install agentbundle
|
|
|
34
34
|
|
|
35
35
|
Requires Python 3.11+. Runs on macOS, Linux, and Windows.
|
|
36
36
|
|
|
37
|
-
## What's new in 0.
|
|
37
|
+
## What's new in 0.35.0
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
**Installs now work on corporate networks that inspect TLS.** If your employer
|
|
40
|
+
runs a proxy that re-signs HTTPS traffic, an install used to fail like this and
|
|
41
|
+
leave you nothing to act on:
|
|
41
42
|
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
```
|
|
44
|
+
install: Failed to fetch catalogue archive: … —
|
|
45
|
+
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:
|
|
46
|
+
unable to get local issuer certificate
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The certificate authority your IT team installed is in the operating system's
|
|
50
|
+
trust store, and Python does not read that store on macOS. AgentBundle now
|
|
51
|
+
recovers on its own:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
agentbundle: certificate verification failed for github.com;
|
|
55
|
+
retrying with operating-system trust anchors
|
|
46
56
|
```
|
|
47
57
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
Verification stays strict throughout — the retry *adds* trust anchors and never
|
|
59
|
+
removes one, and no flag or environment variable can disable verification. Only
|
|
60
|
+
the administrator keychain is read; your login keychain never is, because it is
|
|
61
|
+
writable without administrator rights. Set `AGENTBUNDLE_NO_SYSTEM_TRUST=1` to
|
|
62
|
+
opt out and see the underlying error.
|
|
51
63
|
|
|
52
|
-
|
|
53
|
-
`
|
|
54
|
-
|
|
55
|
-
|
|
64
|
+
`AGENTBUNDLE_CA_BUNDLE` also works on `git+https://` sources now — previously
|
|
65
|
+
only the `catalogue+https://` and `archive+https://` forms read it, so following
|
|
66
|
+
the documentation did not help. `SSL_CERT_FILE`, `SSL_CERT_DIR`, and
|
|
67
|
+
`REQUESTS_CA_BUNDLE` are honoured there too. See
|
|
68
|
+
[Corporate networks](#corporate-networks) below.
|
|
69
|
+
|
|
70
|
+
When a fetch still fails, the error names the likely cause and ordered next
|
|
71
|
+
steps, and the request now carries a 30-second timeout so a proxy that accepts
|
|
72
|
+
the connection and never answers fails instead of hanging.
|
|
56
73
|
|
|
57
74
|
**Install into a repo** — so everyone who clones it gets the pack. `core` is the flagship pack, the loop itself:
|
|
58
75
|
|
|
@@ -493,6 +510,51 @@ or `WORKSPACE_MCP_DISPATCHED_ITEM` (`ini_slug/type:slug`) for non-FSM shaping
|
|
|
493
510
|
items. Setting neither gives discovery-only mode (git writes disabled). Setting
|
|
494
511
|
both is unsupported — only one selects the mode.
|
|
495
512
|
|
|
513
|
+
## Corporate networks
|
|
514
|
+
|
|
515
|
+
macOS is the only platform where Python ignores the operating system's trust
|
|
516
|
+
store, which is why the automatic fallback above is macOS-only:
|
|
517
|
+
|
|
518
|
+
| Platform | Trust source | Needs anything from you? |
|
|
519
|
+
| --- | --- | --- |
|
|
520
|
+
| **Windows** | Python loads the Windows `CA` and `ROOT` stores and honours each certificate's trust settings | No — a root pushed by Group Policy or Intune already works |
|
|
521
|
+
| **Linux** | OpenSSL reads `/etc/ssl/certs` | No, once the authority is installed there |
|
|
522
|
+
| **WSL** | Same as Linux — a WSL distribution does **not** inherit the Windows certificate store | **Yes** — see below |
|
|
523
|
+
| **macOS** | OpenSSL reads a PEM file; the keychain is invisible to it | No — this is the case the fallback handles |
|
|
524
|
+
|
|
525
|
+
If your IT team gives you a CA bundle, point AgentBundle at it directly:
|
|
526
|
+
|
|
527
|
+
```bash
|
|
528
|
+
export AGENTBUNDLE_CA_BUNDLE=/path/to/corporate-ca.pem
|
|
529
|
+
agentbundle install --pack core
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
On `git+https://` sources that bundle is **added** to the default trust store, so
|
|
533
|
+
a bundle holding only your private authority still verifies public hosts. On
|
|
534
|
+
`catalogue+https://` and `archive+https://` it **replaces** the store, pinning
|
|
535
|
+
verification to your own authority — useful for an internal Artifactory mirror.
|
|
536
|
+
|
|
537
|
+
**WSL** is the case most likely to catch out a Windows-standardised organisation:
|
|
538
|
+
your IT team pushes the authority to Windows, Windows tools pick it up, and
|
|
539
|
+
nothing inside the WSL distribution does. Export it from Windows (Certificate
|
|
540
|
+
Manager → Trusted Root Certification Authorities → Export as Base-64 X.509), then
|
|
541
|
+
install it in the distribution:
|
|
542
|
+
|
|
543
|
+
```bash
|
|
544
|
+
sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
|
|
545
|
+
sudo update-ca-certificates
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
Two things no certificate configuration can fix: a proxy that requires Kerberos
|
|
549
|
+
or NTLM authentication, and an egress allowlist that permits `github.com` but not
|
|
550
|
+
`codeload.github.com` — a GitHub archive fetch redirects across both hosts.
|
|
551
|
+
|
|
552
|
+
A note on virtualenvs, since it comes up: creating one does **not** change TLS
|
|
553
|
+
trust. A virtualenv inherits its base interpreter's certificate store unchanged.
|
|
554
|
+
If an install works under one `python3` and not another, the interpreters differ,
|
|
555
|
+
not the environment — compare them with
|
|
556
|
+
`python3 -c "import ssl; print(ssl.get_default_verify_paths())"`.
|
|
557
|
+
|
|
496
558
|
## Credentials
|
|
497
559
|
|
|
498
560
|
`agentbundle` doesn't resolve secrets. Credentialed skills use [`credbroker`](https://pypi.org/project/credbroker/), a standalone resolver that keeps cleartext out of the model's reach.
|
|
@@ -14,25 +14,42 @@ python -m pip install agentbundle
|
|
|
14
14
|
|
|
15
15
|
Requires Python 3.11+. Runs on macOS, Linux, and Windows.
|
|
16
16
|
|
|
17
|
-
## What's new in 0.
|
|
17
|
+
## What's new in 0.35.0
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
**Installs now work on corporate networks that inspect TLS.** If your employer
|
|
20
|
+
runs a proxy that re-signs HTTPS traffic, an install used to fail like this and
|
|
21
|
+
leave you nothing to act on:
|
|
21
22
|
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
```
|
|
24
|
+
install: Failed to fetch catalogue archive: … —
|
|
25
|
+
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:
|
|
26
|
+
unable to get local issuer certificate
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The certificate authority your IT team installed is in the operating system's
|
|
30
|
+
trust store, and Python does not read that store on macOS. AgentBundle now
|
|
31
|
+
recovers on its own:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
agentbundle: certificate verification failed for github.com;
|
|
35
|
+
retrying with operating-system trust anchors
|
|
26
36
|
```
|
|
27
37
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
Verification stays strict throughout — the retry *adds* trust anchors and never
|
|
39
|
+
removes one, and no flag or environment variable can disable verification. Only
|
|
40
|
+
the administrator keychain is read; your login keychain never is, because it is
|
|
41
|
+
writable without administrator rights. Set `AGENTBUNDLE_NO_SYSTEM_TRUST=1` to
|
|
42
|
+
opt out and see the underlying error.
|
|
31
43
|
|
|
32
|
-
|
|
33
|
-
`
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
`AGENTBUNDLE_CA_BUNDLE` also works on `git+https://` sources now — previously
|
|
45
|
+
only the `catalogue+https://` and `archive+https://` forms read it, so following
|
|
46
|
+
the documentation did not help. `SSL_CERT_FILE`, `SSL_CERT_DIR`, and
|
|
47
|
+
`REQUESTS_CA_BUNDLE` are honoured there too. See
|
|
48
|
+
[Corporate networks](#corporate-networks) below.
|
|
49
|
+
|
|
50
|
+
When a fetch still fails, the error names the likely cause and ordered next
|
|
51
|
+
steps, and the request now carries a 30-second timeout so a proxy that accepts
|
|
52
|
+
the connection and never answers fails instead of hanging.
|
|
36
53
|
|
|
37
54
|
**Install into a repo** — so everyone who clones it gets the pack. `core` is the flagship pack, the loop itself:
|
|
38
55
|
|
|
@@ -473,6 +490,51 @@ or `WORKSPACE_MCP_DISPATCHED_ITEM` (`ini_slug/type:slug`) for non-FSM shaping
|
|
|
473
490
|
items. Setting neither gives discovery-only mode (git writes disabled). Setting
|
|
474
491
|
both is unsupported — only one selects the mode.
|
|
475
492
|
|
|
493
|
+
## Corporate networks
|
|
494
|
+
|
|
495
|
+
macOS is the only platform where Python ignores the operating system's trust
|
|
496
|
+
store, which is why the automatic fallback above is macOS-only:
|
|
497
|
+
|
|
498
|
+
| Platform | Trust source | Needs anything from you? |
|
|
499
|
+
| --- | --- | --- |
|
|
500
|
+
| **Windows** | Python loads the Windows `CA` and `ROOT` stores and honours each certificate's trust settings | No — a root pushed by Group Policy or Intune already works |
|
|
501
|
+
| **Linux** | OpenSSL reads `/etc/ssl/certs` | No, once the authority is installed there |
|
|
502
|
+
| **WSL** | Same as Linux — a WSL distribution does **not** inherit the Windows certificate store | **Yes** — see below |
|
|
503
|
+
| **macOS** | OpenSSL reads a PEM file; the keychain is invisible to it | No — this is the case the fallback handles |
|
|
504
|
+
|
|
505
|
+
If your IT team gives you a CA bundle, point AgentBundle at it directly:
|
|
506
|
+
|
|
507
|
+
```bash
|
|
508
|
+
export AGENTBUNDLE_CA_BUNDLE=/path/to/corporate-ca.pem
|
|
509
|
+
agentbundle install --pack core
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
On `git+https://` sources that bundle is **added** to the default trust store, so
|
|
513
|
+
a bundle holding only your private authority still verifies public hosts. On
|
|
514
|
+
`catalogue+https://` and `archive+https://` it **replaces** the store, pinning
|
|
515
|
+
verification to your own authority — useful for an internal Artifactory mirror.
|
|
516
|
+
|
|
517
|
+
**WSL** is the case most likely to catch out a Windows-standardised organisation:
|
|
518
|
+
your IT team pushes the authority to Windows, Windows tools pick it up, and
|
|
519
|
+
nothing inside the WSL distribution does. Export it from Windows (Certificate
|
|
520
|
+
Manager → Trusted Root Certification Authorities → Export as Base-64 X.509), then
|
|
521
|
+
install it in the distribution:
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
|
|
525
|
+
sudo update-ca-certificates
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
Two things no certificate configuration can fix: a proxy that requires Kerberos
|
|
529
|
+
or NTLM authentication, and an egress allowlist that permits `github.com` but not
|
|
530
|
+
`codeload.github.com` — a GitHub archive fetch redirects across both hosts.
|
|
531
|
+
|
|
532
|
+
A note on virtualenvs, since it comes up: creating one does **not** change TLS
|
|
533
|
+
trust. A virtualenv inherits its base interpreter's certificate store unchanged.
|
|
534
|
+
If an install works under one `python3` and not another, the interpreters differ,
|
|
535
|
+
not the environment — compare them with
|
|
536
|
+
`python3 -c "import ssl; print(ssl.get_default_verify_paths())"`.
|
|
537
|
+
|
|
476
538
|
## Credentials
|
|
477
539
|
|
|
478
540
|
`agentbundle` doesn't resolve secrets. Credentialed skills use [`credbroker`](https://pypi.org/project/credbroker/), a standalone resolver that keeps cleartext out of the model's reach.
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"""Catalogue URI resolver — T5 deliverable, reused by T6/T8/T11/T12.
|
|
2
|
+
|
|
3
|
+
Accepts:
|
|
4
|
+
- Local relative or absolute paths.
|
|
5
|
+
- ``git+https://github.com/<owner>/<repo>[@<ref>]``
|
|
6
|
+
|
|
7
|
+
For ``git+https://`` URIs the resolver:
|
|
8
|
+
1. Parses owner, repo, and optional ref.
|
|
9
|
+
2. Constructs a GitHub archive URL (tag, branch, or SHA — tried in
|
|
10
|
+
that order by a light heuristic: tags contain only ``v`` + semver
|
|
11
|
+
chars or no slash; SHAs are exactly 40 hex chars; everything else
|
|
12
|
+
is a branch).
|
|
13
|
+
3. Fetches with ``urllib.request.urlopen`` — no subprocess, no git.
|
|
14
|
+
4. Extracts with ``tarfile`` into a per-call tempdir and returns the
|
|
15
|
+
inner ``<repo>-<ref>/`` directory.
|
|
16
|
+
|
|
17
|
+
``git+ssh://`` URIs raise ``CatalogueError`` immediately — SSH is
|
|
18
|
+
deferred to v1.1.
|
|
19
|
+
|
|
20
|
+
Unreachable URLs raise ``CatalogueError`` with the tarball URL in the
|
|
21
|
+
message so the caller can report exactly what was attempted.
|
|
22
|
+
|
|
23
|
+
TLS trust is delegated to ``system_trust.py``: the fetch honours the
|
|
24
|
+
corporate CA-bundle environment variables, and a certificate-verification
|
|
25
|
+
failure is retried exactly once against operating-system trust anchors,
|
|
26
|
+
announced on stderr. Verification is never weakened on any path.
|
|
27
|
+
|
|
28
|
+
No subprocess calls in this module. The macOS keychain export that the
|
|
29
|
+
trust fallback needs lives in ``system_trust.py``, which this module
|
|
30
|
+
imports lazily and delegates to.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import atexit
|
|
36
|
+
import re
|
|
37
|
+
import shutil
|
|
38
|
+
import ssl
|
|
39
|
+
import sys
|
|
40
|
+
import tarfile
|
|
41
|
+
import tempfile
|
|
42
|
+
import urllib.error
|
|
43
|
+
import urllib.parse
|
|
44
|
+
import urllib.request
|
|
45
|
+
from collections.abc import Callable
|
|
46
|
+
from pathlib import Path
|
|
47
|
+
|
|
48
|
+
# A black-holing corporate proxy accepts the connection and never answers, so an
|
|
49
|
+
# unbounded fetch hangs forever rather than failing. The value matches
|
|
50
|
+
# https_catalogue._HTTP_TIMEOUT deliberately: both fetch archives over the same
|
|
51
|
+
# networks, and one number is easier to reason about than two. urllib applies it
|
|
52
|
+
# per socket operation, not to the whole transfer, so a large archive on a slow
|
|
53
|
+
# link is unaffected — only 30s of silence trips it.
|
|
54
|
+
_FETCH_TIMEOUT_S = 30
|
|
55
|
+
|
|
56
|
+
_SSH_PREFIX = "git+ssh://"
|
|
57
|
+
_HTTPS_PREFIX = "git+https://"
|
|
58
|
+
|
|
59
|
+
# Match git+https://github.com/<owner>/<repo>[@<ref>]
|
|
60
|
+
# Group 1: owner, Group 2: repo (no .git suffix), Group 3: ref (optional)
|
|
61
|
+
_HTTPS_RE = re.compile(
|
|
62
|
+
r"^git\+https://github\.com/([^/]+)/([^/@]+?)(?:\.git)?(?:@([^@]+))?$"
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# A SHA is exactly 40 lowercase hex digits (or 7–40 for abbreviated SHAs;
|
|
66
|
+
# we accept the full pattern only to keep the heuristic simple).
|
|
67
|
+
_SHA_RE = re.compile(r"^[0-9a-f]{7,40}$")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class CatalogueError(ValueError):
|
|
71
|
+
"""Raised when a catalogue URI cannot be resolved."""
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def resolve_catalogue(uri: str) -> Path:
|
|
75
|
+
"""Resolve *uri* to a local directory rooted at the catalogue.
|
|
76
|
+
|
|
77
|
+
Returns a ``Path`` to the local directory. For ``git+https://`` URIs
|
|
78
|
+
the path lives inside a per-call tempdir registered with ``atexit``
|
|
79
|
+
so it's removed at process exit — see ``_resolve_https``. Callers
|
|
80
|
+
must not assume the directory survives past process termination.
|
|
81
|
+
"""
|
|
82
|
+
if uri.startswith(_SSH_PREFIX):
|
|
83
|
+
raise CatalogueError(
|
|
84
|
+
"SSH git URLs deferred to v1.1; use https or local path."
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Explicit reject for http:// variants — layer-1 explicit arg bypasses
|
|
88
|
+
# _is_valid_source, so we must guard here to avoid silent local-path fallback.
|
|
89
|
+
if uri.startswith(("catalogue+http://", "archive+http://")):
|
|
90
|
+
raise CatalogueError(
|
|
91
|
+
"HTTPS-only: catalogue+http:// and archive+http:// are not supported; "
|
|
92
|
+
"use catalogue+https:// or archive+https://"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# Dispatch new HTTPS catalogue schemes
|
|
96
|
+
if uri.startswith(("catalogue+https://", "archive+https://")):
|
|
97
|
+
from agentbundle.https_catalogue import fetch_catalogue_archive
|
|
98
|
+
return fetch_catalogue_archive(uri)
|
|
99
|
+
|
|
100
|
+
if uri.startswith(_HTTPS_PREFIX):
|
|
101
|
+
return _resolve_https(uri)
|
|
102
|
+
|
|
103
|
+
# Local path — relative or absolute.
|
|
104
|
+
return Path(uri)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _resolve_https(uri: str) -> Path:
|
|
108
|
+
m = _HTTPS_RE.match(uri)
|
|
109
|
+
if not m:
|
|
110
|
+
raise CatalogueError(
|
|
111
|
+
f"Cannot parse git+https URI: {uri!r}. "
|
|
112
|
+
"Expected format: git+https://github.com/<owner>/<repo>[@<ref>]"
|
|
113
|
+
)
|
|
114
|
+
owner, repo, ref = m.group(1), m.group(2), m.group(3)
|
|
115
|
+
if not ref:
|
|
116
|
+
ref = "main"
|
|
117
|
+
|
|
118
|
+
tarball_url = _github_archive_url(owner, repo, ref)
|
|
119
|
+
tmpdir = Path(tempfile.mkdtemp(prefix="agentbundle-catalogue-"))
|
|
120
|
+
# Best-effort cleanup at process exit — atexit handlers run on normal
|
|
121
|
+
# interpreter shutdown; for crash paths the OS reaps /tmp eventually.
|
|
122
|
+
atexit.register(shutil.rmtree, str(tmpdir), True)
|
|
123
|
+
_fetch_and_extract(tarball_url, tmpdir)
|
|
124
|
+
# The GitHub archive extracts to <repo>-<ref>/ (with '/' → '-' in SHAs).
|
|
125
|
+
return _find_inner_dir(tmpdir)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _ref_type(ref: str) -> str:
|
|
129
|
+
"""Heuristically classify a ref as 'tag', 'sha', or 'branch'.
|
|
130
|
+
|
|
131
|
+
The plan specifies: try tag, then branch, then SHA order — but we
|
|
132
|
+
need to pick exactly one URL at construction time because the caller
|
|
133
|
+
doesn't retry across URL forms (the tarball fetch either succeeds or
|
|
134
|
+
raises ``CatalogueError``).
|
|
135
|
+
|
|
136
|
+
Heuristic:
|
|
137
|
+
- Exactly 40 lowercase hex chars → SHA.
|
|
138
|
+
- Looks like a version tag (optional 'v' + digits/dots, e.g. v1.0
|
|
139
|
+
or 1.0.0) → tag.
|
|
140
|
+
- Anything else → branch.
|
|
141
|
+
|
|
142
|
+
This matches the plan's examples: ``v1.0`` → tag, ``main`` → branch,
|
|
143
|
+
``deadbeef`` (7 chars) or a full 40-char SHA → sha.
|
|
144
|
+
|
|
145
|
+
Abbreviated SHAs (7–39 chars, all hex) are treated as SHA because
|
|
146
|
+
that's the most likely intent and ``archive/<sha>`` accepts prefixes.
|
|
147
|
+
"""
|
|
148
|
+
if _SHA_RE.match(ref):
|
|
149
|
+
return "sha"
|
|
150
|
+
# Version tag pattern: optional 'v', one or more numeric segments
|
|
151
|
+
if re.match(r"^v?\d+(\.\d+)*$", ref):
|
|
152
|
+
return "tag"
|
|
153
|
+
return "branch"
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _github_archive_url(owner: str, repo: str, ref: str) -> str:
|
|
157
|
+
rtype = _ref_type(ref)
|
|
158
|
+
if rtype == "tag":
|
|
159
|
+
return f"https://github.com/{owner}/{repo}/archive/refs/tags/{ref}.tar.gz"
|
|
160
|
+
if rtype == "branch":
|
|
161
|
+
return f"https://github.com/{owner}/{repo}/archive/refs/heads/{ref}.tar.gz"
|
|
162
|
+
# SHA
|
|
163
|
+
return f"https://github.com/{owner}/{repo}/archive/{ref}.tar.gz"
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def _is_cert_verification_failure(exc: BaseException) -> bool:
|
|
167
|
+
"""True when *exc* is a certificate-verification failure.
|
|
168
|
+
|
|
169
|
+
``urlopen`` never lets ``ssl.SSLCertVerificationError`` escape directly — it
|
|
170
|
+
wraps it in ``URLError.reason`` — so matching the bare exception type would
|
|
171
|
+
silently never fire the fallback. Both shapes are accepted.
|
|
172
|
+
"""
|
|
173
|
+
if isinstance(exc, ssl.SSLCertVerificationError):
|
|
174
|
+
return True
|
|
175
|
+
reason = getattr(exc, "reason", None)
|
|
176
|
+
return isinstance(reason, ssl.SSLCertVerificationError)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def _verification_failure_message(
|
|
180
|
+
url: str,
|
|
181
|
+
detail: object,
|
|
182
|
+
*,
|
|
183
|
+
fallback_note: str,
|
|
184
|
+
offer_opt_out: bool = True,
|
|
185
|
+
) -> str:
|
|
186
|
+
"""Explain a verification failure in terms of the adopter's next action.
|
|
187
|
+
|
|
188
|
+
A raw OpenSSL string tells an adopter behind a TLS-inspecting proxy nothing
|
|
189
|
+
they can act on, which is how this failure reaches a maintainer instead of
|
|
190
|
+
being self-served.
|
|
191
|
+
|
|
192
|
+
*fallback_note* keeps the diagnosis honest — the caller states what actually
|
|
193
|
+
happened to the operating-system fallback, because claiming the anchors were
|
|
194
|
+
exhausted when they were never consulted sends the adopter after the wrong
|
|
195
|
+
cause. *offer_opt_out* is false once the adopter has already opted out, so
|
|
196
|
+
the message never advises setting a variable that is already set.
|
|
197
|
+
"""
|
|
198
|
+
host = urllib.parse.urlsplit(url).netloc
|
|
199
|
+
steps = [
|
|
200
|
+
" 1. Install from a local clone — needs no HTTPS at all:\n"
|
|
201
|
+
" git clone <catalogue-repo> && agentbundle install --pack "
|
|
202
|
+
"<pack> ./<clone>",
|
|
203
|
+
" 2. Ask your IT team for the corporate CA bundle, then:\n"
|
|
204
|
+
" export AGENTBUNDLE_CA_BUNDLE=/path/to/corporate-ca.pem",
|
|
205
|
+
" 3. Check whether a different Python already trusts this network. "
|
|
206
|
+
"Interpreters\n"
|
|
207
|
+
" do not share a certificate store, so one may work where another "
|
|
208
|
+
"fails:\n"
|
|
209
|
+
' python3 -c "import ssl; print(ssl.get_default_verify_paths())"\n'
|
|
210
|
+
" Run that under each python3 on your PATH. If one differs and "
|
|
211
|
+
"works, point\n"
|
|
212
|
+
" SSL_CERT_FILE at its cafile. Creating a virtualenv does NOT "
|
|
213
|
+
"change trust —\n"
|
|
214
|
+
" a venv inherits its base interpreter's store unchanged.",
|
|
215
|
+
" 4. Confirm your proxy allows every host in the redirect chain. A "
|
|
216
|
+
"GitHub\n"
|
|
217
|
+
" archive fetch redirects github.com to codeload.github.com; an "
|
|
218
|
+
"allowlist\n"
|
|
219
|
+
" permitting only the first host fails here even once "
|
|
220
|
+
"certificates work.",
|
|
221
|
+
]
|
|
222
|
+
if offer_opt_out:
|
|
223
|
+
steps.append(
|
|
224
|
+
" 5. Set AGENTBUNDLE_NO_SYSTEM_TRUST=1 to see the raw "
|
|
225
|
+
"verification error."
|
|
226
|
+
)
|
|
227
|
+
body = "\n\n".join(steps)
|
|
228
|
+
return (
|
|
229
|
+
f"Failed to fetch catalogue archive: {url} — {detail}\n"
|
|
230
|
+
"\n"
|
|
231
|
+
f"The certificate for {host} could not be verified. {fallback_note} On a "
|
|
232
|
+
"corporate network this usually means a TLS-inspecting proxy re-signs "
|
|
233
|
+
"traffic with a private root CA that Python does not read.\n"
|
|
234
|
+
"\n"
|
|
235
|
+
"Troubleshooting, cheapest first:\n"
|
|
236
|
+
"\n"
|
|
237
|
+
f"{body}"
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _system_trust_module():
|
|
242
|
+
"""Import ``system_trust`` lazily.
|
|
243
|
+
|
|
244
|
+
Deferred so this module keeps making no subprocess call of its own, and to
|
|
245
|
+
avoid a circular import — ``system_trust`` raises ``CatalogueError``.
|
|
246
|
+
"""
|
|
247
|
+
from agentbundle import system_trust
|
|
248
|
+
|
|
249
|
+
return system_trust
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _fetch_and_extract(url: str, dest: Path) -> None:
|
|
253
|
+
system_trust = _system_trust_module()
|
|
254
|
+
|
|
255
|
+
def attempt(context: ssl.SSLContext) -> None:
|
|
256
|
+
# B310: constant github.com archive base assembled from parsed owner/repo/ref.
|
|
257
|
+
with urllib.request.urlopen( # nosec B310
|
|
258
|
+
url, timeout=_FETCH_TIMEOUT_S, context=context
|
|
259
|
+
) as resp, tarfile.open(fileobj=resp, mode="r|gz") as tf:
|
|
260
|
+
# filter="data" rejects unsafe members (absolute paths, ..
|
|
261
|
+
# links, devices, setuid bits) — Python 3.12+ default but
|
|
262
|
+
# explicit for 3.11 compatibility and to silence the 3.14
|
|
263
|
+
# DeprecationWarning. Path-jail is belt; this is braces.
|
|
264
|
+
tf.extractall(path=dest, filter="data")
|
|
265
|
+
|
|
266
|
+
try:
|
|
267
|
+
attempt(system_trust.build_context())
|
|
268
|
+
except (urllib.error.URLError, ssl.SSLError, TimeoutError) as exc:
|
|
269
|
+
# ssl.SSLError and TimeoutError are caught alongside URLError because
|
|
270
|
+
# urlopen only wraps failures raised during connect. A stall or TLS
|
|
271
|
+
# error while the tarball body is still streaming escapes unwrapped,
|
|
272
|
+
# which would break this module's documented promise that an
|
|
273
|
+
# unreachable URL raises CatalogueError.
|
|
274
|
+
detail = getattr(exc, "reason", None) or exc
|
|
275
|
+
if not _is_cert_verification_failure(exc):
|
|
276
|
+
raise CatalogueError(
|
|
277
|
+
f"Failed to fetch catalogue archive: {url} — {detail}"
|
|
278
|
+
) from exc
|
|
279
|
+
if system_trust.system_trust_disabled():
|
|
280
|
+
raise CatalogueError(
|
|
281
|
+
_verification_failure_message(
|
|
282
|
+
url,
|
|
283
|
+
detail,
|
|
284
|
+
fallback_note=(
|
|
285
|
+
"The operating-system trust fallback was not attempted, "
|
|
286
|
+
"because AGENTBUNDLE_NO_SYSTEM_TRUST is set."
|
|
287
|
+
),
|
|
288
|
+
offer_opt_out=False,
|
|
289
|
+
)
|
|
290
|
+
) from exc
|
|
291
|
+
# Resolve the anchors BEFORE announcing anything. On a platform with no
|
|
292
|
+
# administrator trust store to read, a second connection against an
|
|
293
|
+
# identical context would be pure noise, and claiming the anchors "did
|
|
294
|
+
# not complete the chain" would send the adopter after the wrong cause.
|
|
295
|
+
anchors = system_trust.system_anchor_pem()
|
|
296
|
+
if not anchors:
|
|
297
|
+
# Two different causes, and conflating them misdirects the adopter.
|
|
298
|
+
# Off macOS the fallback does not apply at all. *On* macOS it applied
|
|
299
|
+
# and found an empty administrator keychain, which means the
|
|
300
|
+
# authority is installed somewhere this deliberately does not read.
|
|
301
|
+
if sys.platform == "darwin":
|
|
302
|
+
note = (
|
|
303
|
+
"The administrator keychain holds no certificates to retry "
|
|
304
|
+
"with, so the authority is likely installed somewhere else — "
|
|
305
|
+
"a login keychain, or an application's own store. Only "
|
|
306
|
+
"/Library/Keychains/System.keychain is read, because it is "
|
|
307
|
+
"the one store that requires administrator rights to write."
|
|
308
|
+
)
|
|
309
|
+
else:
|
|
310
|
+
note = (
|
|
311
|
+
f"No operating-system trust anchors were consulted on "
|
|
312
|
+
f"{sys.platform}: the automatic fallback is macOS-only, "
|
|
313
|
+
"because macOS is the only platform where Python ignores "
|
|
314
|
+
"the operating system's trust store."
|
|
315
|
+
)
|
|
316
|
+
raise CatalogueError(
|
|
317
|
+
_verification_failure_message(url, detail, fallback_note=note)
|
|
318
|
+
) from exc
|
|
319
|
+
_retry_with_system_trust(url, dest, attempt, anchors)
|
|
320
|
+
except tarfile.TarError as exc:
|
|
321
|
+
raise CatalogueError(
|
|
322
|
+
f"Failed to extract tarball from {url}: {exc}"
|
|
323
|
+
) from exc
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def _retry_with_system_trust(
|
|
327
|
+
url: str,
|
|
328
|
+
dest: Path,
|
|
329
|
+
attempt: Callable[[ssl.SSLContext], None],
|
|
330
|
+
anchors: str,
|
|
331
|
+
) -> None:
|
|
332
|
+
"""Retry *attempt* once against operating-system trust *anchors*.
|
|
333
|
+
|
|
334
|
+
Announced on stderr unconditionally: a trust decision the adopter cannot see
|
|
335
|
+
is a trust decision they cannot audit. Bounded at one extra attempt, reached
|
|
336
|
+
only for a certificate-verification failure — never a timeout, DNS failure,
|
|
337
|
+
or HTTP error — and only when *anchors* actually exist, so the notice never
|
|
338
|
+
describes work that did not happen.
|
|
339
|
+
"""
|
|
340
|
+
system_trust = _system_trust_module()
|
|
341
|
+
host = urllib.parse.urlsplit(url).netloc
|
|
342
|
+
print(
|
|
343
|
+
f"agentbundle: certificate verification failed for {host}; "
|
|
344
|
+
"retrying with operating-system trust anchors",
|
|
345
|
+
file=sys.stderr,
|
|
346
|
+
)
|
|
347
|
+
exhausted = (
|
|
348
|
+
"The operating-system trust anchors did not complete the chain either."
|
|
349
|
+
)
|
|
350
|
+
# Attempt 1 may have extracted part of the archive before failing mid-stream.
|
|
351
|
+
# Clearing the destination keeps the retry from layering a second download
|
|
352
|
+
# over the first and producing a catalogue that is a mix of both.
|
|
353
|
+
shutil.rmtree(dest, ignore_errors=True)
|
|
354
|
+
dest.mkdir(parents=True, exist_ok=True)
|
|
355
|
+
try:
|
|
356
|
+
attempt(system_trust.build_context(system_anchors=anchors))
|
|
357
|
+
except (urllib.error.URLError, ssl.SSLError, TimeoutError) as exc:
|
|
358
|
+
# Same tuple as the first attempt: a read-phase stall or TLS error is not
|
|
359
|
+
# wrapped by urlopen and would otherwise escape as a bare exception.
|
|
360
|
+
detail = getattr(exc, "reason", None) or exc
|
|
361
|
+
raise CatalogueError(
|
|
362
|
+
_verification_failure_message(url, detail, fallback_note=exhausted)
|
|
363
|
+
) from exc
|
|
364
|
+
except tarfile.TarError as exc:
|
|
365
|
+
raise CatalogueError(
|
|
366
|
+
f"Failed to extract tarball from {url}: {exc}"
|
|
367
|
+
) from exc
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def _find_inner_dir(tmpdir: Path) -> Path:
|
|
371
|
+
"""Return the single top-level directory inside *tmpdir*.
|
|
372
|
+
|
|
373
|
+
GitHub archives always produce exactly one top-level directory
|
|
374
|
+
(``<repo>-<ref>/``). If the extraction produced something else,
|
|
375
|
+
return *tmpdir* itself so callers still have something to work with.
|
|
376
|
+
"""
|
|
377
|
+
children = [p for p in tmpdir.iterdir() if p.is_dir()]
|
|
378
|
+
if len(children) == 1:
|
|
379
|
+
return children[0]
|
|
380
|
+
return tmpdir
|