agentbundle 0.31.0__tar.gz → 0.31.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentbundle-0.31.1/MANIFEST.in +16 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/PKG-INFO +2 -4
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/manifest.json +4 -1
- agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +27 -0
- agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +42 -0
- agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +14 -0
- agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +67 -0
- agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +116 -0
- agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +40 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/__init__.py +17 -15
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/__init__.py +12 -3
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/claude_code.py +5 -6
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/codex.py +8 -7
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/copilot.py +5 -3
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/kiro.py +18 -18
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/kiro_ide.py +5 -13
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/lint_packs.py +25 -16
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/main.py +6 -3
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/phase_order.py +0 -1
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/codex_agent_toml.py +1 -2
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/copilot_agent_md.py +0 -1
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -1
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/kiro_ide_hook.py +2 -2
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/scope_rails.py +1 -2
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/self_host.py +25 -21
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/target_resolver.py +0 -1
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/validate.py +36 -29
- agentbundle-0.31.1/agentbundle/catalogue_tooling/file_safety.py +63 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/initialise_self_hosted.py +86 -23
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/package.py +51 -20
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +7 -4
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/version.py +1 -1
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/PKG-INFO +2 -4
- agentbundle-0.31.1/agentbundle.egg-info/SOURCES.txt +526 -0
- agentbundle-0.31.1/conftest.py +25 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/pyproject.toml +10 -6
- agentbundle-0.31.1/templates/install-marker.py +1166 -0
- agentbundle-0.31.1/tests/__init__.py +1 -0
- agentbundle-0.31.1/tests/_support.py +192 -0
- agentbundle-0.31.1/tests/build_pipeline/__init__.py +0 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/README.md +40 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +6 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +3 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +2 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +2 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +3 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +7 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/pack.toml +13 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +7 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +16 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +7 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +11 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +7 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +11 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +7 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +4 -0
- agentbundle-0.31.1/tests/build_pipeline/fixtures/recipes/bogus-target.toml +9 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_claude_code.py +281 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_codex.py +719 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_copilot.py +120 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_cursor.py +421 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_gemini.py +560 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro.py +464 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro_alias.py +105 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro_cli.py +143 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro_ide.py +214 -0
- agentbundle-0.31.1/tests/build_pipeline/test_adapter_root_bins_projection.py +700 -0
- agentbundle-0.31.1/tests/build_pipeline/test_build_ships_seeds.py +82 -0
- agentbundle-0.31.1/tests/build_pipeline/test_contract.py +598 -0
- agentbundle-0.31.1/tests/build_pipeline/test_contract_scope.py +224 -0
- agentbundle-0.31.1/tests/build_pipeline/test_contract_v07.py +176 -0
- agentbundle-0.31.1/tests/build_pipeline/test_contract_v08.py +249 -0
- agentbundle-0.31.1/tests/build_pipeline/test_direct_directory_cleanup.py +65 -0
- agentbundle-0.31.1/tests/build_pipeline/test_end_to_end_build.py +246 -0
- agentbundle-0.31.1/tests/build_pipeline/test_lint_packs.py +714 -0
- agentbundle-0.31.1/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +175 -0
- agentbundle-0.31.1/tests/build_pipeline/test_pack_schema.py +494 -0
- agentbundle-0.31.1/tests/build_pipeline/test_pack_schema_allowed_adapters.py +255 -0
- agentbundle-0.31.1/tests/build_pipeline/test_pack_schema_install.py +305 -0
- agentbundle-0.31.1/tests/build_pipeline/test_pipeline.py +298 -0
- agentbundle-0.31.1/tests/build_pipeline/test_plugin_manifest_schema.py +356 -0
- agentbundle-0.31.1/tests/build_pipeline/test_projectable_subset.py +202 -0
- agentbundle-0.31.1/tests/build_pipeline/test_projections_merge_json.py +151 -0
- agentbundle-0.31.1/tests/build_pipeline/test_scope_rails.py +399 -0
- agentbundle-0.31.1/tests/build_pipeline/test_security.py +101 -0
- agentbundle-0.31.1/tests/build_pipeline/test_self_host_check.py +2556 -0
- agentbundle-0.31.1/tests/build_pipeline/test_self_host_fixture_guard.py +149 -0
- agentbundle-0.31.1/tests/build_pipeline/test_self_host_recipe_config.py +113 -0
- agentbundle-0.31.1/tests/build_pipeline/test_shared_libs_projection.py +139 -0
- agentbundle-0.31.1/tests/build_pipeline/test_shared_prefix_contract.py +97 -0
- agentbundle-0.31.1/tests/build_pipeline/test_user_libs_projection.py +492 -0
- agentbundle-0.31.1/tests/build_pipeline/test_validate.py +250 -0
- agentbundle-0.31.1/tests/build_pipeline/test_writers_emit_lf.py +172 -0
- agentbundle-0.31.1/tests/conftest.py +44 -0
- agentbundle-0.31.1/tests/fixtures/adapt/.adapt-discovery.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/adapt/values.toml +3 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +8 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +27 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +9 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/README.md +70 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +42 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/pack.toml +20 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/profiles/_example/README.md +24 -0
- agentbundle-0.31.1/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/brownfield/values.toml +3 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt/AGENTS.md +5 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +5 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt/DESIGN.md +6 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +53 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt/docs/CHARTER.md +5 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +5 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +8 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt-expected/AGENTS.md +5 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +5 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +12 -0
- agentbundle-0.31.1/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +1 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag/SKILL.md +23 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +15 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +22 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +28 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +22 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +23 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/conforming/SKILL.md +23 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/conforming/scripts/cli.py +15 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +22 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +12 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +25 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +13 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +26 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +17 -0
- agentbundle-0.31.1/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +10 -0
- agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +6 -0
- agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +3 -0
- agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +2 -0
- agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +3 -0
- agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +7 -0
- agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/pack.toml +13 -0
- agentbundle-0.31.1/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +13 -0
- agentbundle-0.31.1/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +13 -0
- agentbundle-0.31.1/tests/fixtures/lint_packs/clean/pack.toml +11 -0
- agentbundle-0.31.1/tests/fixtures/lint_packs/clean/seeds/README.md +3 -0
- agentbundle-0.31.1/tests/fixtures/list-installed/golden_120col.txt +5 -0
- agentbundle-0.31.1/tests/fixtures/list-installed/golden_80col.txt +5 -0
- agentbundle-0.31.1/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +10 -0
- agentbundle-0.31.1/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +3 -0
- agentbundle-0.31.1/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +8 -0
- agentbundle-0.31.1/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +2 -0
- agentbundle-0.31.1/tests/fixtures/packs/cc-user-hooks/pack.toml +18 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +8 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +2 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/pack.toml +20 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +8 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +2 -0
- agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/pack.toml +21 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +5 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +2 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +14 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +5 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +7 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +2 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +16 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +5 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +7 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +2 -0
- agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +13 -0
- agentbundle-0.31.1/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +1 -0
- agentbundle-0.31.1/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +1 -0
- agentbundle-0.31.1/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +1 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +6 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +10 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +13 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +6 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +10 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +13 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +6 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +10 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +5 -0
- agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +13 -0
- agentbundle-0.31.1/tests/fixtures/validate/bad_recipe_pack/pack.toml +5 -0
- agentbundle-0.31.1/tests/fixtures/validate/malformed_pack/pack.toml +1 -0
- agentbundle-0.31.1/tests/fixtures/validate/valid_pack/pack.toml +4 -0
- agentbundle-0.31.1/tests/fixtures/validate/version_mismatch_pack/pack.toml +7 -0
- agentbundle-0.31.1/tests/integration/__init__.py +0 -0
- agentbundle-0.31.1/tests/integration/test_adapt_cmd.py +317 -0
- agentbundle-0.31.1/tests/integration/test_adapt_dual_scope.py +247 -0
- agentbundle-0.31.1/tests/integration/test_adapt_preflight_detection.py +217 -0
- agentbundle-0.31.1/tests/integration/test_adapt_schema_migration.py +125 -0
- agentbundle-0.31.1/tests/integration/test_apm_install_route.py +788 -0
- agentbundle-0.31.1/tests/integration/test_blank_catalogue.py +58 -0
- agentbundle-0.31.1/tests/integration/test_brownfield_adapt_end_to_end.py +205 -0
- agentbundle-0.31.1/tests/integration/test_brownfield_round_trip.py +133 -0
- agentbundle-0.31.1/tests/integration/test_brownfield_user_home_fixture.py +44 -0
- agentbundle-0.31.1/tests/integration/test_build_check_drift_gates.py +523 -0
- agentbundle-0.31.1/tests/integration/test_build_derivation_apm.py +181 -0
- agentbundle-0.31.1/tests/integration/test_build_derivation_claude_plugins.py +576 -0
- agentbundle-0.31.1/tests/integration/test_catalogue_init.py +465 -0
- agentbundle-0.31.1/tests/integration/test_cc_user_hooks_fixture.py +107 -0
- agentbundle-0.31.1/tests/integration/test_claude_plugins_install_route.py +1791 -0
- agentbundle-0.31.1/tests/integration/test_config_cascade.py +174 -0
- agentbundle-0.31.1/tests/integration/test_credential_brokers_pack_install.py +205 -0
- agentbundle-0.31.1/tests/integration/test_credentials_wheel.py +75 -0
- agentbundle-0.31.1/tests/integration/test_discovery_schema_cross_consumer.py +116 -0
- agentbundle-0.31.1/tests/integration/test_editable_source_detection.py +113 -0
- agentbundle-0.31.1/tests/integration/test_fixtures_validate.py +226 -0
- agentbundle-0.31.1/tests/integration/test_install_adapt_chain.py +442 -0
- agentbundle-0.31.1/tests/integration/test_install_cmd.py +691 -0
- agentbundle-0.31.1/tests/integration/test_install_converters_user_scope.py +190 -0
- agentbundle-0.31.1/tests/integration/test_install_copilot_full_parity.py +278 -0
- agentbundle-0.31.1/tests/integration/test_install_core_smoke.py +89 -0
- agentbundle-0.31.1/tests/integration/test_install_default_source.py +187 -0
- agentbundle-0.31.1/tests/integration/test_install_dependencies_gate.py +321 -0
- agentbundle-0.31.1/tests/integration/test_install_dropped_primitives_warning.py +550 -0
- agentbundle-0.31.1/tests/integration/test_install_dual_scope.py +440 -0
- agentbundle-0.31.1/tests/integration/test_install_orphan_reshape.py +135 -0
- agentbundle-0.31.1/tests/integration/test_install_pack_metadata_shape.py +278 -0
- agentbundle-0.31.1/tests/integration/test_install_profile.py +408 -0
- agentbundle-0.31.1/tests/integration/test_install_profile_live.py +103 -0
- agentbundle-0.31.1/tests/integration/test_install_repo_scope_per_adapter.py +730 -0
- agentbundle-0.31.1/tests/integration/test_install_research_user_scope.py +200 -0
- agentbundle-0.31.1/tests/integration/test_install_seed_delivery.py +222 -0
- agentbundle-0.31.1/tests/integration/test_install_session_start_wiring.py +139 -0
- agentbundle-0.31.1/tests/integration/test_install_upgrade_offer.py +243 -0
- agentbundle-0.31.1/tests/integration/test_install_user_hooks.py +411 -0
- agentbundle-0.31.1/tests/integration/test_install_user_scope_allowed_adapters.py +225 -0
- agentbundle-0.31.1/tests/integration/test_kiro_ide_hook_e2e.py +204 -0
- agentbundle-0.31.1/tests/integration/test_kiro_repo_hooks_fixture.py +93 -0
- agentbundle-0.31.1/tests/integration/test_kiro_user_hooks_fixture.py +155 -0
- agentbundle-0.31.1/tests/integration/test_list_packs_cmd.py +148 -0
- agentbundle-0.31.1/tests/integration/test_local_scope_install.py +377 -0
- agentbundle-0.31.1/tests/integration/test_marketplace_entry_validation.py +390 -0
- agentbundle-0.31.1/tests/integration/test_marketplace_manifest_regression.py +303 -0
- agentbundle-0.31.1/tests/integration/test_multi_pack_install.py +805 -0
- agentbundle-0.31.1/tests/integration/test_orphan_cleanup_respects_foreign_state.py +273 -0
- agentbundle-0.31.1/tests/integration/test_plugin_route_membership.py +613 -0
- agentbundle-0.31.1/tests/integration/test_recommends_cross_scope.py +228 -0
- agentbundle-0.31.1/tests/integration/test_reconcile.py +230 -0
- agentbundle-0.31.1/tests/integration/test_reserved_path_filter.py +236 -0
- agentbundle-0.31.1/tests/integration/test_scaffold_projection.py +147 -0
- agentbundle-0.31.1/tests/integration/test_self_host_schema_migration.py +138 -0
- agentbundle-0.31.1/tests/integration/test_self_host_sweep_respects_state.py +312 -0
- agentbundle-0.31.1/tests/integration/test_shared_prefix_coexistence.py +235 -0
- agentbundle-0.31.1/tests/integration/test_show_cmd.py +515 -0
- agentbundle-0.31.1/tests/integration/test_tier_invariants.py +335 -0
- agentbundle-0.31.1/tests/integration/test_uninstall_cmd.py +381 -0
- agentbundle-0.31.1/tests/integration/test_uninstall_user_hooks.py +327 -0
- agentbundle-0.31.1/tests/integration/test_upgrade_attach_to_agent.py +140 -0
- agentbundle-0.31.1/tests/integration/test_upgrade_cmd.py +1087 -0
- agentbundle-0.31.1/tests/integration/test_upgrade_user_hooks.py +307 -0
- agentbundle-0.31.1/tests/integration/test_version_gate_matrix.py +163 -0
- agentbundle-0.31.1/tests/integration/test_workspace_mcp_git_fsm.py +156 -0
- agentbundle-0.31.1/tests/integration/test_zipapp.py +92 -0
- agentbundle-0.31.1/tests/unit/__init__.py +0 -0
- agentbundle-0.31.1/tests/unit/test_adapt_discovery_schema.py +292 -0
- agentbundle-0.31.1/tests/unit/test_append_layout_section.py +238 -0
- agentbundle-0.31.1/tests/unit/test_architect_readme_install_command.py +26 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_ci_contract.py +244 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_curation_deps.py +62 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_init_cli_self_hosted.py +206 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_pack_defaults.py +596 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_self_hosted_export_removal.py +27 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_skill_spec_lint.py +913 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_archive.py +296 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_build.py +98 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_defaults.py +267 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_foundation.py +584 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_identity.py +151 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_init.py +783 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_lint.py +1146 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_package.py +958 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_self_host.py +314 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_self_hosted_init.py +1069 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_source_package.py +386 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_tooling_verify.py +461 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_wave2_schema.py +171 -0
- agentbundle-0.31.1/tests/unit/test_catalogue_wave2_validation.py +272 -0
- agentbundle-0.31.1/tests/unit/test_cli_catalogue_optional.py +38 -0
- agentbundle-0.31.1/tests/unit/test_cli_help_lists_config.py +45 -0
- agentbundle-0.31.1/tests/unit/test_cli_path_normalisation.py +161 -0
- agentbundle-0.31.1/tests/unit/test_cli_profile_surface.py +87 -0
- agentbundle-0.31.1/tests/unit/test_cli_scope_flags.py +193 -0
- agentbundle-0.31.1/tests/unit/test_codex_agent_toml.py +350 -0
- agentbundle-0.31.1/tests/unit/test_codex_projection_modes.py +193 -0
- agentbundle-0.31.1/tests/unit/test_common_classify_seeds.py +164 -0
- agentbundle-0.31.1/tests/unit/test_config.py +187 -0
- agentbundle-0.31.1/tests/unit/test_config_cmd.py +136 -0
- agentbundle-0.31.1/tests/unit/test_configured_adapter.py +35 -0
- agentbundle-0.31.1/tests/unit/test_confirm_helper.py +67 -0
- agentbundle-0.31.1/tests/unit/test_contract_parity.py +30 -0
- agentbundle-0.31.1/tests/unit/test_contract_v0_3_schema.py +598 -0
- agentbundle-0.31.1/tests/unit/test_copilot_agent_md.py +182 -0
- agentbundle-0.31.1/tests/unit/test_copilot_hooks_json.py +147 -0
- agentbundle-0.31.1/tests/unit/test_copilot_user_scope_wiring.py +151 -0
- agentbundle-0.31.1/tests/unit/test_credbroker_lint_hardening.py +167 -0
- agentbundle-0.31.1/tests/unit/test_dependencies_batch.py +117 -0
- agentbundle-0.31.1/tests/unit/test_diff_cmd.py +115 -0
- agentbundle-0.31.1/tests/unit/test_footprint_ownership.py +114 -0
- agentbundle-0.31.1/tests/unit/test_https_catalogue.py +1080 -0
- agentbundle-0.31.1/tests/unit/test_init_state_cmd.py +176 -0
- agentbundle-0.31.1/tests/unit/test_install_argparse_adapter_flag.py +82 -0
- agentbundle-0.31.1/tests/unit/test_install_argparse_emit_install_routes.py +263 -0
- agentbundle-0.31.1/tests/unit/test_install_defaults_preferred_adapter.py +343 -0
- agentbundle-0.31.1/tests/unit/test_install_dropped_primitives_warning.py +782 -0
- agentbundle-0.31.1/tests/unit/test_install_event_dropped_wirings.py +467 -0
- agentbundle-0.31.1/tests/unit/test_install_first_value_handoff.py +387 -0
- agentbundle-0.31.1/tests/unit/test_install_force_help.py +33 -0
- agentbundle-0.31.1/tests/unit/test_install_inband_detection.py +580 -0
- agentbundle-0.31.1/tests/unit/test_install_messages.py +136 -0
- agentbundle-0.31.1/tests/unit/test_install_messages_repo_scope.py +289 -0
- agentbundle-0.31.1/tests/unit/test_install_refusal_ordering.py +211 -0
- agentbundle-0.31.1/tests/unit/test_install_state_provenance.py +215 -0
- agentbundle-0.31.1/tests/unit/test_kiro_ide_hook_projection.py +389 -0
- agentbundle-0.31.1/tests/unit/test_kiro_ide_hook_rail.py +335 -0
- agentbundle-0.31.1/tests/unit/test_kiro_ide_hook_schema.py +125 -0
- agentbundle-0.31.1/tests/unit/test_lint_agent_artifacts_metadata_auth.py +166 -0
- agentbundle-0.31.1/tests/unit/test_list_installed_cmd.py +349 -0
- agentbundle-0.31.1/tests/unit/test_list_installed_status.py +1197 -0
- agentbundle-0.31.1/tests/unit/test_list_targets_cmd.py +120 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_schema.py +83 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t10_uninstall.py +353 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t12_show.py +71 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t2_resolve.py +64 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t3_config.py +37 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t4_state_path.py +28 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t5_list_installed.py +131 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t7_install_gates.py +229 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t8_install.py +401 -0
- agentbundle-0.31.1/tests/unit/test_local_scope_t9_exclude.py +253 -0
- agentbundle-0.31.1/tests/unit/test_marker_schema_version_parity.py +51 -0
- agentbundle-0.31.1/tests/unit/test_merge_into_agent_json.py +347 -0
- agentbundle-0.31.1/tests/unit/test_multi_adapter_disambiguator.py +83 -0
- agentbundle-0.31.1/tests/unit/test_nested_symlink_hardening.py +154 -0
- agentbundle-0.31.1/tests/unit/test_org_bootstrap.py +746 -0
- agentbundle-0.31.1/tests/unit/test_pack_config_api.py +469 -0
- agentbundle-0.31.1/tests/unit/test_pack_inventory.py +122 -0
- agentbundle-0.31.1/tests/unit/test_package_catalogue.py +1190 -0
- agentbundle-0.31.1/tests/unit/test_packstate_source_provenance.py +245 -0
- agentbundle-0.31.1/tests/unit/test_pipeline_phase_order.py +264 -0
- agentbundle-0.31.1/tests/unit/test_plugin_scope_filter.py +179 -0
- agentbundle-0.31.1/tests/unit/test_profile_reader.py +172 -0
- agentbundle-0.31.1/tests/unit/test_render.py +49 -0
- agentbundle-0.31.1/tests/unit/test_render_cmd.py +238 -0
- agentbundle-0.31.1/tests/unit/test_render_table.py +162 -0
- agentbundle-0.31.1/tests/unit/test_resolve_state_path.py +19 -0
- agentbundle-0.31.1/tests/unit/test_resolve_target_adapter_user_config.py +279 -0
- agentbundle-0.31.1/tests/unit/test_resolve_user_scope_target_adapter.py +690 -0
- agentbundle-0.31.1/tests/unit/test_safety.py +287 -0
- agentbundle-0.31.1/tests/unit/test_safety_repo_scope_prefixes.py +211 -0
- agentbundle-0.31.1/tests/unit/test_safety_scan_per_pack_scoping.py +473 -0
- agentbundle-0.31.1/tests/unit/test_scaffold_cmd.py +300 -0
- agentbundle-0.31.1/tests/unit/test_scope.py +186 -0
- agentbundle-0.31.1/tests/unit/test_self_host_windows.py +189 -0
- agentbundle-0.31.1/tests/unit/test_shared_prefix_disclosure.py +62 -0
- agentbundle-0.31.1/tests/unit/test_source_conflict_guard.py +585 -0
- agentbundle-0.31.1/tests/unit/test_source_defaults.py +572 -0
- agentbundle-0.31.1/tests/unit/test_state_v01_refuse_write.py +177 -0
- agentbundle-0.31.1/tests/unit/test_state_v02.py +158 -0
- agentbundle-0.31.1/tests/unit/test_state_v0_4_schema.py +227 -0
- agentbundle-0.31.1/tests/unit/test_statelock.py +111 -0
- agentbundle-0.31.1/tests/unit/test_target_resolver.py +181 -0
- agentbundle-0.31.1/tests/unit/test_toml_emitters.py +417 -0
- agentbundle-0.31.1/tests/unit/test_unresolved_markers.py +40 -0
- agentbundle-0.31.1/tests/unit/test_upgrade_bulk_all.py +1137 -0
- agentbundle-0.31.1/tests/unit/test_upgrade_recap.py +52 -0
- agentbundle-0.31.1/tests/unit/test_upgrade_source_inference.py +165 -0
- agentbundle-0.31.1/tests/unit/test_user_config_io.py +202 -0
- agentbundle-0.31.1/tests/unit/test_user_config_isolation.py +29 -0
- agentbundle-0.31.1/tests/unit/test_user_config_path.py +47 -0
- agentbundle-0.31.1/tests/unit/test_user_config_source.py +84 -0
- agentbundle-0.31.1/tests/unit/test_user_merge_json.py +420 -0
- agentbundle-0.31.1/tests/unit/test_validate_attach_to_agent.py +302 -0
- agentbundle-0.31.1/tests/unit/test_validate_categories.py +92 -0
- agentbundle-0.31.1/tests/unit/test_validate_cmd.py +329 -0
- agentbundle-0.31.1/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +422 -0
- agentbundle-0.31.1/tests/unit/test_values_from_shapes.py +68 -0
- agentbundle-0.31.1/tests/unit/test_version.py +129 -0
- agentbundle-0.31.0/agentbundle.egg-info/SOURCES.txt +0 -152
- agentbundle-0.31.0/tests/test_linear_primitive.py +0 -133
- {agentbundle-0.31.0 → agentbundle-0.31.1}/README-pypi.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/README.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/__init__.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/__main__.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/adapter.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/adapter.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/guide.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/install-defaults.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/install-marker.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/marketplace-entry.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/pack.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/profile.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/skill-manifest.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/skill.schema.json +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/target-vocab.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/__main__.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapter_root_bins.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/cursor.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/gemini.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/contract.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projection_io.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/__init__.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/direct_directory.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/hook_id.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/merge_json.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/user_merge_json.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/marketplace.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/self-host.toml +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/shared_libs.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/user_libs.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/archive.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/build.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/config.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/identity.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/initialise.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/lint.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/results.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/verify.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/categories.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/cli.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/__init__.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/_common.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/_drop_warning.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/adapt.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_build.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_init.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_lint.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_package.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_self_host.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_verify.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/config.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/diff.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/docs.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/init_state.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/install.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_installed.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_packs.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_profiles.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_targets.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/oplog_cmd.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/pack_config_cmd.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/pack_evals.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/package_catalogue.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/profile.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/reconcile.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/render.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/scaffold.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/show.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/uninstall.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/upgrade.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/validate.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/config.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/https_catalogue.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/local_exclude.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/oplog.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/pack_inventory.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/render.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/safety.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/scaffold.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/scope.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/source_defaults.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/statelock.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/user_config.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/workspace_mcp.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/dependency_links.txt +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/entry_points.txt +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/requires.txt +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/top_level.txt +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/setup.cfg +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_adapter_permissions_projection.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_elicit.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_event_bridge.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_git.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_lifecycle.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_stdin.py +0 -0
- {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_tools.py +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
graft tests
|
|
2
|
+
include conftest.py
|
|
3
|
+
graft templates
|
|
4
|
+
recursive-include agentbundle/_data/catalogue-scaffold/packs/_example/.apm *
|
|
5
|
+
recursive-include agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin *
|
|
6
|
+
prune tests/live-catalogue
|
|
7
|
+
prune tests/.pytest_cache
|
|
8
|
+
prune tests/.mypy_cache
|
|
9
|
+
prune tests/.ruff_cache
|
|
10
|
+
prune tests/.hypothesis
|
|
11
|
+
prune tests/htmlcov
|
|
12
|
+
global-exclude *.py[cod]
|
|
13
|
+
global-exclude .DS_Store
|
|
14
|
+
global-exclude .coverage
|
|
15
|
+
global-exclude .coverage.*
|
|
16
|
+
global-exclude coverage.xml
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentbundle
|
|
3
|
-
Version: 0.31.
|
|
3
|
+
Version: 0.31.1
|
|
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
|
-
License: Apache-2.0 OR MIT
|
|
6
|
+
License-Expression: Apache-2.0 OR MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/eugenelim/agent-ready-repo
|
|
8
8
|
Project-URL: Source, https://github.com/eugenelim/agent-ready-repo
|
|
9
9
|
Project-URL: Documentation, https://eugenelim.github.io/agent-ready-repo/docs/
|
|
10
10
|
Project-URL: Catalogue Format, https://eugenelim.github.io/agent-ready-repo/docs/reference/catalogue-format
|
|
11
11
|
Project-URL: Changelog, https://eugenelim.github.io/agent-ready-repo/docs/changelog
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
15
13
|
Classifier: Operating System :: OS Independent
|
|
16
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
17
15
|
Classifier: Programming Language :: Python :: 3.12
|
{agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/manifest.json
RENAMED
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
"profiles/AGENTS.md": "8950438d9e0f57c13613104c88c90b598b53196c91bfdced6d63e4e01b5e9254",
|
|
13
13
|
"profiles/README.md": "a0b0268edc57fc575f7fea08f3363ba7da9f6e67dc4a0a6f8bd38c9668c97922",
|
|
14
14
|
"profiles/_example/README.md": "164494df049ddce3e57cb44ed604cb3d39be0a6ec2072e609ea3fa4bbfc74c72",
|
|
15
|
-
"profiles/_example/profile.toml": "68af18cf50fa0327a9776b029c92bb1cf82710c649691b3ac889eb8537b8eac7"
|
|
15
|
+
"profiles/_example/profile.toml": "68af18cf50fa0327a9776b029c92bb1cf82710c649691b3ac889eb8537b8eac7",
|
|
16
|
+
"tests/conformance/test_gemini_admissibility.py": "8b337da9272823aed2cb22041b3f9fd27549f075f28b9817efd5be8f8c5bb948",
|
|
17
|
+
"tests/conformance/test_pack_metadata.py": "8ea175b88cc6e10ba10cda87676fc225ee2b968d710c8e6ab05fb20e31ec978a",
|
|
18
|
+
"tests/conformance/test_shared_library_boundaries.py": "5e07783459336e657a355f43aa5a9cf6c138603624daec258ecc0fa3d74239c3"
|
|
16
19
|
},
|
|
17
20
|
"version": 1
|
|
18
21
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: example-skill
|
|
3
|
+
description: "Demonstrate the standard skill layout. Triggers on: run example, show example skill output. Near-miss: requesting a demo or test of any skill (route those to the specific skill)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Example Skill
|
|
7
|
+
|
|
8
|
+
This skill is a minimal demonstration of the standard SKILL.md layout. Replace this content
|
|
9
|
+
with your skill's actual instructions.
|
|
10
|
+
|
|
11
|
+
## What it does
|
|
12
|
+
|
|
13
|
+
Produces a short greeting and lists any files the user has mentioned.
|
|
14
|
+
|
|
15
|
+
## When to use this skill
|
|
16
|
+
|
|
17
|
+
The agent invokes this skill when the user asks to "run example" or "show example skill output".
|
|
18
|
+
|
|
19
|
+
## Steps
|
|
20
|
+
|
|
21
|
+
1. Greet the user.
|
|
22
|
+
2. List any files mentioned in the conversation.
|
|
23
|
+
3. Summarize what the example-skill would do in a real pack.
|
|
24
|
+
|
|
25
|
+
## Output
|
|
26
|
+
|
|
27
|
+
A short greeting and a bullet list.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "run example",
|
|
4
|
+
"skill": "example-skill",
|
|
5
|
+
"should_trigger": true
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"query": "show example skill output",
|
|
9
|
+
"skill": "example-skill",
|
|
10
|
+
"should_trigger": true
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"query": "what does example-skill do",
|
|
14
|
+
"skill": "example-skill",
|
|
15
|
+
"should_trigger": true
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"query": "demonstrate the example",
|
|
19
|
+
"skill": "example-skill",
|
|
20
|
+
"should_trigger": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "run the example skill now",
|
|
24
|
+
"skill": "example-skill",
|
|
25
|
+
"should_trigger": true
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"query": "give me a demo",
|
|
29
|
+
"skill": "example-skill",
|
|
30
|
+
"should_trigger": false
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"query": "show me a test run of architect-design",
|
|
34
|
+
"skill": "example-skill",
|
|
35
|
+
"should_trigger": false
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"query": "how do I install a pack",
|
|
39
|
+
"skill": "example-skill",
|
|
40
|
+
"should_trigger": false
|
|
41
|
+
}
|
|
42
|
+
]
|
agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "example-pack",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The skeleton to copy when you start a new pack.",
|
|
5
|
+
"displayName": "Example Pack",
|
|
6
|
+
"category": "productivity",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"example",
|
|
9
|
+
"template"
|
|
10
|
+
],
|
|
11
|
+
"skills": [
|
|
12
|
+
"example-skill"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Portable Gemini adapter rules over every pack in a catalogue."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import tomllib
|
|
6
|
+
from importlib.resources import files
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
CATALOGUE_ROOT = Path(__file__).resolve().parents[2]
|
|
10
|
+
PACKS_DIR = CATALOGUE_ROOT / "packs"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _adapter_contract() -> dict:
|
|
14
|
+
"""Load the runtime adapter contract from the installed engine data."""
|
|
15
|
+
resource = files("agentbundle").joinpath("_data", "adapter.toml")
|
|
16
|
+
return tomllib.loads(resource.read_text(encoding="utf-8"))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _pack_dirs() -> list[Path]:
|
|
20
|
+
return sorted(
|
|
21
|
+
path
|
|
22
|
+
for path in PACKS_DIR.iterdir()
|
|
23
|
+
if path.is_dir()
|
|
24
|
+
and not path.name.startswith("_")
|
|
25
|
+
and (path / "pack.toml").is_file()
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_every_declared_agent_tool_is_mapped() -> None:
|
|
30
|
+
declared: set[str] = set()
|
|
31
|
+
for agent_path in PACKS_DIR.glob("*/.apm/agents/*.md"):
|
|
32
|
+
for line in agent_path.read_text(encoding="utf-8").splitlines():
|
|
33
|
+
if line.startswith("tools:"):
|
|
34
|
+
declared.update(
|
|
35
|
+
item.strip()
|
|
36
|
+
for item in line.split(":", 1)[1].split(",")
|
|
37
|
+
if item.strip()
|
|
38
|
+
)
|
|
39
|
+
if not declared:
|
|
40
|
+
return
|
|
41
|
+
contract = _adapter_contract()
|
|
42
|
+
values = contract["frontmatter-mapping"]["gemini-agent-frontmatter"]["tools"][
|
|
43
|
+
"values"
|
|
44
|
+
]
|
|
45
|
+
assert declared <= set(values), f"unmapped agent tools: {declared - set(values)}"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_every_compatible_pack_admits_gemini_in_both_scopes() -> None:
|
|
49
|
+
from agentbundle.commands.install import _resolve_target_adapter
|
|
50
|
+
|
|
51
|
+
for pack_dir in _pack_dirs():
|
|
52
|
+
data = tomllib.loads((pack_dir / "pack.toml").read_text(encoding="utf-8"))
|
|
53
|
+
pack = data["pack"]
|
|
54
|
+
allowed = pack.get("install", {}).get("allowed-adapters")
|
|
55
|
+
if allowed is not None and "gemini" not in allowed:
|
|
56
|
+
continue
|
|
57
|
+
contract_version = pack.get("adapter-contract", {}).get("version", "0.13")
|
|
58
|
+
for scope in ("repo", "user"):
|
|
59
|
+
resolved = _resolve_target_adapter(
|
|
60
|
+
pack_dir,
|
|
61
|
+
scope=scope,
|
|
62
|
+
adapter="gemini",
|
|
63
|
+
allowed_adapters=allowed,
|
|
64
|
+
contract_version=contract_version,
|
|
65
|
+
command_name="install",
|
|
66
|
+
)
|
|
67
|
+
assert resolved == "gemini", f"{pack_dir.name} @ {scope}"
|
agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Portable catalogue manifest and marketplace rules."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import tomllib
|
|
7
|
+
from importlib.resources import files
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
CATALOGUE_ROOT = Path(__file__).resolve().parents[2]
|
|
13
|
+
PACKS_DIR = CATALOGUE_ROOT / "packs"
|
|
14
|
+
MARKETPLACE_PATH = CATALOGUE_ROOT / ".claude-plugin" / "marketplace.json"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _bundled_schema(name: str) -> dict:
|
|
18
|
+
"""Load a runtime schema without requiring a source-checkout contract tree."""
|
|
19
|
+
resource = files("agentbundle").joinpath("_data", name)
|
|
20
|
+
return json.loads(resource.read_text(encoding="utf-8"))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _pack_dirs() -> list[Path]:
|
|
24
|
+
return sorted(
|
|
25
|
+
path
|
|
26
|
+
for path in PACKS_DIR.iterdir()
|
|
27
|
+
if path.is_dir()
|
|
28
|
+
and not path.name.startswith("_")
|
|
29
|
+
and (path / "pack.toml").is_file()
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _pack_data(pack_dir: Path) -> dict:
|
|
34
|
+
return tomllib.loads((pack_dir / "pack.toml").read_text(encoding="utf-8"))[
|
|
35
|
+
"pack"
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.mark.parametrize("pack_dir", _pack_dirs(), ids=lambda path: path.name)
|
|
40
|
+
def test_pack_declares_enriched_metadata(pack_dir: Path) -> None:
|
|
41
|
+
pack = _pack_data(pack_dir)
|
|
42
|
+
assert pack.get("readme") == "README.md", f"{pack_dir.name}: readme"
|
|
43
|
+
assert (pack_dir / "README.md").is_file(), f"{pack_dir.name}: README.md"
|
|
44
|
+
assert isinstance(pack.get("license"), str) and pack["license"]
|
|
45
|
+
links = pack.get("links")
|
|
46
|
+
assert isinstance(links, dict)
|
|
47
|
+
assert isinstance(links.get("repository"), str) and links["repository"]
|
|
48
|
+
for field in ("categories", "keywords"):
|
|
49
|
+
values = pack.get(field)
|
|
50
|
+
assert isinstance(values, list) and values, f"{pack_dir.name}: {field}"
|
|
51
|
+
assert len(values) <= 5, f"{pack_dir.name}: {field} capped at 5"
|
|
52
|
+
maintainers = pack.get("maintainers")
|
|
53
|
+
assert isinstance(maintainers, list) and maintainers
|
|
54
|
+
assert isinstance(maintainers[0].get("name"), str) and maintainers[0]["name"]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@pytest.mark.parametrize("pack_dir", _pack_dirs(), ids=lambda path: path.name)
|
|
58
|
+
def test_pack_and_plugin_versions_match(pack_dir: Path) -> None:
|
|
59
|
+
plugin_path = pack_dir / ".claude-plugin" / "plugin.json"
|
|
60
|
+
if not plugin_path.exists():
|
|
61
|
+
return
|
|
62
|
+
plugin = json.loads(plugin_path.read_text(encoding="utf-8"))
|
|
63
|
+
assert plugin.get("version") == _pack_data(pack_dir)["version"]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_source_plugin_manifests_obey_schema() -> None:
|
|
67
|
+
from agentbundle.build.validate import validate
|
|
68
|
+
|
|
69
|
+
manifests = sorted(
|
|
70
|
+
path
|
|
71
|
+
for pack_dir in _pack_dirs()
|
|
72
|
+
if (path := pack_dir / ".claude-plugin" / "plugin.json").is_file()
|
|
73
|
+
)
|
|
74
|
+
if not manifests:
|
|
75
|
+
return
|
|
76
|
+
schema = _bundled_schema("plugin-manifest.schema.json")
|
|
77
|
+
for path in manifests:
|
|
78
|
+
content = json.loads(path.read_text(encoding="utf-8"))
|
|
79
|
+
assert "hooks" not in content, f"{path.relative_to(CATALOGUE_ROOT)}: hooks"
|
|
80
|
+
errors = validate(content, schema)
|
|
81
|
+
assert not errors, f"{path.relative_to(CATALOGUE_ROOT)}: {errors}"
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_root_marketplace_entries_obey_schema() -> None:
|
|
85
|
+
from agentbundle.build.validate import validate
|
|
86
|
+
|
|
87
|
+
if not MARKETPLACE_PATH.is_file():
|
|
88
|
+
return
|
|
89
|
+
marketplace = json.loads(MARKETPLACE_PATH.read_text(encoding="utf-8"))
|
|
90
|
+
entries = marketplace.get("plugins", [])
|
|
91
|
+
if not entries:
|
|
92
|
+
return
|
|
93
|
+
schema = _bundled_schema("marketplace-entry.schema.json")
|
|
94
|
+
for entry in entries:
|
|
95
|
+
assert not validate(entry, schema), entry.get("name", "<unnamed>")
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_root_marketplace_has_portable_metadata_shapes() -> None:
|
|
99
|
+
if not MARKETPLACE_PATH.is_file():
|
|
100
|
+
return
|
|
101
|
+
marketplace = json.loads(MARKETPLACE_PATH.read_text(encoding="utf-8"))
|
|
102
|
+
assert "name" in marketplace
|
|
103
|
+
assert isinstance(marketplace.get("owner"), dict)
|
|
104
|
+
for plugin in marketplace.get("plugins", []):
|
|
105
|
+
assert isinstance(plugin.get("author"), dict), plugin.get("name")
|
|
106
|
+
source = plugin.get("source")
|
|
107
|
+
if source is None:
|
|
108
|
+
continue
|
|
109
|
+
assert isinstance(source, dict), plugin.get("name")
|
|
110
|
+
assert source.get("source") == "git-subdir", plugin.get("name")
|
|
111
|
+
assert isinstance(source.get("url"), str) and source["url"].startswith(
|
|
112
|
+
"https://github.com/"
|
|
113
|
+
)
|
|
114
|
+
assert source.get("path")
|
|
115
|
+
assert source.get("ref") or source.get("sha")
|
|
116
|
+
assert "branch" not in source and "directory" not in source
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Portable rules for retired credential-shim copies in pack scripts."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
CATALOGUE_ROOT = Path(__file__).resolve().parents[2]
|
|
9
|
+
PACKS_DIR = CATALOGUE_ROOT / "packs"
|
|
10
|
+
SHIM_BASENAMES = (
|
|
11
|
+
"credentials_shim.py",
|
|
12
|
+
"_keychain_macos.py",
|
|
13
|
+
"_credman_windows.py",
|
|
14
|
+
)
|
|
15
|
+
SHIM_IMPORT_RE = re.compile(
|
|
16
|
+
r"(?:from\s+\.{0,2}(?:[\w.]+\.)?credentials_shim\s+import"
|
|
17
|
+
r"|import\s+(?:[\w.]+\.)?credentials_shim\b)"
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_no_pack_skill_carries_a_retired_shim_copy() -> None:
|
|
22
|
+
offenders = [
|
|
23
|
+
str(path.relative_to(CATALOGUE_ROOT))
|
|
24
|
+
for scripts_dir in PACKS_DIR.glob("*/.apm/skills/*/scripts")
|
|
25
|
+
for basename in SHIM_BASENAMES
|
|
26
|
+
if (path := scripts_dir / basename).exists()
|
|
27
|
+
]
|
|
28
|
+
assert not offenders, offenders
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_no_pack_skill_imports_the_retired_shim() -> None:
|
|
32
|
+
offenders: list[str] = []
|
|
33
|
+
for path in PACKS_DIR.glob("*/.apm/skills/*/scripts/*.py"):
|
|
34
|
+
try:
|
|
35
|
+
source = path.read_text(encoding="utf-8")
|
|
36
|
+
except OSError:
|
|
37
|
+
continue
|
|
38
|
+
if SHIM_IMPORT_RE.search(source):
|
|
39
|
+
offenders.append(str(path.relative_to(CATALOGUE_ROOT)))
|
|
40
|
+
assert not offenders, offenders
|
|
@@ -25,12 +25,12 @@ import sys
|
|
|
25
25
|
from pathlib import Path
|
|
26
26
|
|
|
27
27
|
from agentbundle.build.contract import load as load_contract
|
|
28
|
-
from agentbundle.build.validate import validate as validate_instance
|
|
29
28
|
from agentbundle.build.lint_packs import cmd_lint_packs
|
|
30
|
-
from agentbundle.build.main import cmd_build
|
|
29
|
+
from agentbundle.build.main import _read_bundled, cmd_build
|
|
31
30
|
from agentbundle.build.self_host import cmd_check, cmd_self
|
|
31
|
+
from agentbundle.build.validate import validate as validate_instance
|
|
32
32
|
|
|
33
|
-
__all__ = ["main"]
|
|
33
|
+
__all__ = ["main", "cmd_lint_packs"]
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def _cmd_validate(args: argparse.Namespace) -> int:
|
|
@@ -42,14 +42,12 @@ def _cmd_validate(args: argparse.Namespace) -> int:
|
|
|
42
42
|
)
|
|
43
43
|
return 1
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
/ "adapter.schema.json"
|
|
49
|
-
)
|
|
50
|
-
if not schema_path.exists():
|
|
45
|
+
try:
|
|
46
|
+
schema_text = _read_bundled("adapter.schema.json")
|
|
47
|
+
except (FileNotFoundError, ModuleNotFoundError):
|
|
51
48
|
print(
|
|
52
|
-
|
|
49
|
+
"validate: adapter.schema.json not found in package data or "
|
|
50
|
+
"repository contracts",
|
|
53
51
|
file=sys.stderr,
|
|
54
52
|
)
|
|
55
53
|
return 1
|
|
@@ -60,7 +58,7 @@ def _cmd_validate(args: argparse.Namespace) -> int:
|
|
|
60
58
|
print(f"validate: failed to load {contract_path}: {exc}", file=sys.stderr)
|
|
61
59
|
return 1
|
|
62
60
|
|
|
63
|
-
schema = json.loads(
|
|
61
|
+
schema = json.loads(schema_text)
|
|
64
62
|
errors = validate_instance(contract, schema)
|
|
65
63
|
if errors:
|
|
66
64
|
print(
|
|
@@ -172,7 +170,8 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
172
170
|
|
|
173
171
|
def _cmd_build_shim(args) -> int:
|
|
174
172
|
print(
|
|
175
|
-
"agentbundle.build build is deprecated;
|
|
173
|
+
"agentbundle.build build is deprecated; "
|
|
174
|
+
"use 'agentbundle catalogue build --root .' instead",
|
|
176
175
|
file=sys.stderr,
|
|
177
176
|
)
|
|
178
177
|
return int(cmd_build(args))
|
|
@@ -180,7 +179,8 @@ def _cmd_build_shim(args) -> int:
|
|
|
180
179
|
|
|
181
180
|
def _cmd_self_shim(args) -> int:
|
|
182
181
|
print(
|
|
183
|
-
"agentbundle.build self is deprecated;
|
|
182
|
+
"agentbundle.build self is deprecated; "
|
|
183
|
+
"use 'agentbundle catalogue self-host --write --root .' instead",
|
|
184
184
|
file=sys.stderr,
|
|
185
185
|
)
|
|
186
186
|
return int(cmd_self(args))
|
|
@@ -188,7 +188,8 @@ def _cmd_self_shim(args) -> int:
|
|
|
188
188
|
|
|
189
189
|
def _cmd_check_shim(args) -> int:
|
|
190
190
|
print(
|
|
191
|
-
"agentbundle.build check is deprecated;
|
|
191
|
+
"agentbundle.build check is deprecated; "
|
|
192
|
+
"use 'agentbundle catalogue self-host --check --root .' instead",
|
|
192
193
|
file=sys.stderr,
|
|
193
194
|
)
|
|
194
195
|
return int(cmd_check(args))
|
|
@@ -196,7 +197,8 @@ def _cmd_check_shim(args) -> int:
|
|
|
196
197
|
|
|
197
198
|
def _cmd_lint_packs_shim(args) -> int:
|
|
198
199
|
print(
|
|
199
|
-
"agentbundle.build lint-packs is deprecated;
|
|
200
|
+
"agentbundle.build lint-packs is deprecated; "
|
|
201
|
+
"use 'agentbundle catalogue lint --root .' instead",
|
|
200
202
|
file=sys.stderr,
|
|
201
203
|
)
|
|
202
204
|
from agentbundle.catalogue_tooling.lint import lint_catalogue, render_table
|
|
@@ -5,9 +5,18 @@ from __future__ import annotations
|
|
|
5
5
|
import warnings
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from types import ModuleType
|
|
8
|
-
from typing import Callable,
|
|
8
|
+
from typing import Callable, Mapping
|
|
9
9
|
|
|
10
|
-
from agentbundle.build.adapters import
|
|
10
|
+
from agentbundle.build.adapters import (
|
|
11
|
+
claude_code,
|
|
12
|
+
codex,
|
|
13
|
+
copilot,
|
|
14
|
+
cursor,
|
|
15
|
+
gemini,
|
|
16
|
+
kiro,
|
|
17
|
+
kiro_cli,
|
|
18
|
+
kiro_ide,
|
|
19
|
+
)
|
|
11
20
|
|
|
12
21
|
|
|
13
22
|
def _kiro_alias_project(pack_path: Path, contract: dict, output_root: Path) -> None:
|
|
@@ -22,7 +31,7 @@ def _kiro_alias_project(pack_path: Path, contract: dict, output_root: Path) -> N
|
|
|
22
31
|
|
|
23
32
|
# Original callable registry (hyphenated contract names) — preserved for
|
|
24
33
|
# F-build's recipe runner which keys recipes by contract names.
|
|
25
|
-
ADAPTERS:
|
|
34
|
+
ADAPTERS: dict[str, Callable] = {
|
|
26
35
|
"claude-code": claude_code.project,
|
|
27
36
|
"kiro-ide": kiro_ide.project,
|
|
28
37
|
"kiro-cli": kiro_cli.project,
|
|
@@ -14,12 +14,10 @@ deep-merging the incoming TOML payload.
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
import os
|
|
18
17
|
import shutil
|
|
19
18
|
from pathlib import Path
|
|
20
19
|
from typing import Iterator
|
|
21
20
|
|
|
22
|
-
|
|
23
21
|
# Phase order from the build-pipeline ordering invariant.
|
|
24
22
|
# Uniform across all reference adapters even though Claude Code's
|
|
25
23
|
# wiring lands in a settings file (not in agents) — the uniformity
|
|
@@ -139,7 +137,10 @@ def _sweep_skill_orphans(pack_paths: list[Path], contract: dict, output_root: Pa
|
|
|
139
137
|
|
|
140
138
|
def _project_single(pack_path: Path, contract: dict, output_root: Path) -> None:
|
|
141
139
|
adapter_block = contract["adapter"]["claude-code"]
|
|
142
|
-
rules_by_primitive = {
|
|
140
|
+
rules_by_primitive = {
|
|
141
|
+
entry["primitive"]: entry
|
|
142
|
+
for entry in adapter_block.get("projection", [])
|
|
143
|
+
}
|
|
143
144
|
|
|
144
145
|
for primitive_name in _iter_primitives(contract):
|
|
145
146
|
rule = rules_by_primitive[primitive_name]
|
|
@@ -175,7 +176,7 @@ def _ignore_absolute_symlinks(directory: str, names: list[str]) -> set[str]:
|
|
|
175
176
|
return {
|
|
176
177
|
name for name in names
|
|
177
178
|
if name == "__pycache__"
|
|
178
|
-
or ((base / name).is_symlink() and
|
|
179
|
+
or ((base / name).is_symlink() and (base / name).readlink().is_absolute())
|
|
179
180
|
}
|
|
180
181
|
|
|
181
182
|
|
|
@@ -213,5 +214,3 @@ def _project_direct_file(source_dir: Path, output_root: Path, target_prefix: str
|
|
|
213
214
|
if entry.is_file():
|
|
214
215
|
destination = target_dir / entry.name
|
|
215
216
|
shutil.copy2(entry, destination, follow_symlinks=False)
|
|
216
|
-
|
|
217
|
-
|
|
@@ -19,15 +19,13 @@ import tempfile
|
|
|
19
19
|
from pathlib import Path
|
|
20
20
|
from typing import Iterator
|
|
21
21
|
|
|
22
|
-
|
|
23
22
|
# Build-pipeline ordering invariant — uniform across adapters.
|
|
24
23
|
from agentbundle.build.phase_order import PHASE_ORDER as _PHASE_ORDER
|
|
25
|
-
from agentbundle.build.projections.direct_directory import sweep_orphans
|
|
26
|
-
from agentbundle.build.projections.merge_json import project_merge_json
|
|
27
24
|
from agentbundle.build.projections.codex_agent_toml import (
|
|
28
25
|
project_codex_agent_toml,
|
|
29
26
|
)
|
|
30
|
-
|
|
27
|
+
from agentbundle.build.projections.direct_directory import sweep_orphans
|
|
28
|
+
from agentbundle.build.projections.merge_json import project_merge_json
|
|
31
29
|
|
|
32
30
|
|
|
33
31
|
def _iter_primitives(contract: dict) -> Iterator[str]:
|
|
@@ -104,13 +102,16 @@ def project_packs(pack_paths: list[Path], contract: dict, output_root: Path) ->
|
|
|
104
102
|
try:
|
|
105
103
|
with os.fdopen(fd, "w", encoding="utf-8", newline="\n") as handle:
|
|
106
104
|
handle.write(stripped)
|
|
107
|
-
|
|
105
|
+
Path(tmp_path).replace(agents_md)
|
|
108
106
|
except BaseException:
|
|
109
107
|
Path(tmp_path).unlink(missing_ok=True)
|
|
110
108
|
raise
|
|
111
109
|
|
|
112
110
|
adapter_block = contract["adapter"]["codex"]
|
|
113
|
-
rules_by_primitive = {
|
|
111
|
+
rules_by_primitive = {
|
|
112
|
+
entry["primitive"]: entry
|
|
113
|
+
for entry in adapter_block.get("projection", [])
|
|
114
|
+
}
|
|
114
115
|
|
|
115
116
|
for primitive_name in _iter_primitives(contract):
|
|
116
117
|
rule = rules_by_primitive[primitive_name]
|
|
@@ -201,7 +202,7 @@ def _ignore_absolute_symlinks(directory: str, names: list[str]) -> set[str]:
|
|
|
201
202
|
return {
|
|
202
203
|
name for name in names
|
|
203
204
|
if name == "__pycache__"
|
|
204
|
-
or ((base / name).is_symlink() and
|
|
205
|
+
or ((base / name).is_symlink() and (base / name).readlink().is_absolute())
|
|
205
206
|
}
|
|
206
207
|
|
|
207
208
|
|
|
@@ -22,16 +22,15 @@ import shutil
|
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
from typing import Iterator
|
|
24
24
|
|
|
25
|
-
|
|
26
25
|
# Build-pipeline ordering invariant — uniform across adapters.
|
|
27
26
|
from agentbundle.build.phase_order import PHASE_ORDER as _PHASE_ORDER
|
|
28
|
-
from agentbundle.build.projections.direct_directory import sweep_orphans
|
|
29
27
|
from agentbundle.build.projections.copilot_agent_md import (
|
|
30
28
|
project_copilot_agent_md,
|
|
31
29
|
)
|
|
32
30
|
from agentbundle.build.projections.copilot_hooks_json import (
|
|
33
31
|
project_copilot_hooks_json,
|
|
34
32
|
)
|
|
33
|
+
from agentbundle.build.projections.direct_directory import sweep_orphans
|
|
35
34
|
|
|
36
35
|
|
|
37
36
|
def _ignore_symlinks(directory: str, names: list[str]) -> set[str]:
|
|
@@ -58,7 +57,10 @@ def _iter_primitives(contract: dict) -> Iterator[str]:
|
|
|
58
57
|
|
|
59
58
|
def project(pack_path: Path, contract: dict, output_root: Path) -> None:
|
|
60
59
|
adapter_block = contract["adapter"]["copilot"]
|
|
61
|
-
rules_by_primitive = {
|
|
60
|
+
rules_by_primitive = {
|
|
61
|
+
entry["primitive"]: entry
|
|
62
|
+
for entry in adapter_block.get("projection", [])
|
|
63
|
+
}
|
|
62
64
|
|
|
63
65
|
for primitive_name in _iter_primitives(contract):
|
|
64
66
|
rule = rules_by_primitive[primitive_name]
|
|
@@ -31,14 +31,6 @@ import tomllib
|
|
|
31
31
|
from pathlib import Path
|
|
32
32
|
from typing import Any, Iterator
|
|
33
33
|
|
|
34
|
-
from agentbundle.build.projections.merge_into_agent_json import (
|
|
35
|
-
project as merge_into_agent_json_project,
|
|
36
|
-
)
|
|
37
|
-
from agentbundle.build.projections.kiro_ide_hook import (
|
|
38
|
-
project as kiro_ide_hook_project,
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
|
|
42
34
|
# Phase order from the build-pipeline ordering invariant.
|
|
43
35
|
# `agent` precedes `hook-wiring` so `merge-into-agent-json` finds the
|
|
44
36
|
# agent JSON in place. `command` and `skill` land last; their position
|
|
@@ -47,6 +39,12 @@ from agentbundle.build.projections.kiro_ide_hook import (
|
|
|
47
39
|
# uniform across adapters.
|
|
48
40
|
from agentbundle.build.phase_order import PHASE_ORDER as _PHASE_ORDER
|
|
49
41
|
from agentbundle.build.projections.direct_directory import sweep_orphans
|
|
42
|
+
from agentbundle.build.projections.kiro_ide_hook import (
|
|
43
|
+
project as kiro_ide_hook_project,
|
|
44
|
+
)
|
|
45
|
+
from agentbundle.build.projections.merge_into_agent_json import (
|
|
46
|
+
project as merge_into_agent_json_project,
|
|
47
|
+
)
|
|
50
48
|
|
|
51
49
|
|
|
52
50
|
def _iter_primitives(contract: dict) -> Iterator[str]:
|
|
@@ -63,7 +61,11 @@ def _iter_primitives(contract: dict) -> Iterator[str]:
|
|
|
63
61
|
"""
|
|
64
62
|
adapter_block = contract["adapter"]["kiro"]
|
|
65
63
|
array_form = {entry["primitive"]: entry for entry in adapter_block.get("projection", [])}
|
|
66
|
-
table_form =
|
|
64
|
+
table_form = (
|
|
65
|
+
adapter_block.get("projections", {})
|
|
66
|
+
if isinstance(adapter_block.get("projections"), dict)
|
|
67
|
+
else {}
|
|
68
|
+
)
|
|
67
69
|
|
|
68
70
|
for primitive_name in _PHASE_ORDER:
|
|
69
71
|
if primitive_name in array_form:
|
|
@@ -172,7 +174,11 @@ def _project_single(pack_path: Path, contract: dict, output_root: Path) -> None:
|
|
|
172
174
|
"""
|
|
173
175
|
adapter_block = contract["adapter"]["kiro"]
|
|
174
176
|
array_form = {entry["primitive"]: entry for entry in adapter_block.get("projection", [])}
|
|
175
|
-
table_form =
|
|
177
|
+
table_form = (
|
|
178
|
+
adapter_block.get("projections", {})
|
|
179
|
+
if isinstance(adapter_block.get("projections"), dict)
|
|
180
|
+
else {}
|
|
181
|
+
)
|
|
176
182
|
|
|
177
183
|
for primitive_name in _iter_primitives(contract):
|
|
178
184
|
primitive = contract["primitive"][primitive_name]
|
|
@@ -231,10 +237,7 @@ def _dispatch_table_form(
|
|
|
231
237
|
# writes the repo-scope shape; user-scope projection is T8b's
|
|
232
238
|
# install-time concern.
|
|
233
239
|
target = rule.get("target")
|
|
234
|
-
if isinstance(target, dict)
|
|
235
|
-
target_template = target.get("repo")
|
|
236
|
-
else:
|
|
237
|
-
target_template = target
|
|
240
|
+
target_template = target.get("repo") if isinstance(target, dict) else target
|
|
238
241
|
if target_template:
|
|
239
242
|
_project_direct_file_template(source_dir, output_root, target_template)
|
|
240
243
|
elif primitive_name == "kiro-ide-hook" and effective_mode == "direct-file":
|
|
@@ -613,10 +616,7 @@ def _project_kiro_ide_hook(
|
|
|
613
616
|
# Target template from the rule (.kiro/hooks/<pack>/<name>.kiro.hook
|
|
614
617
|
# at v0.4 per the RFC's lean).
|
|
615
618
|
target = rule.get("target")
|
|
616
|
-
if isinstance(target, dict)
|
|
617
|
-
target_template = target.get("repo")
|
|
618
|
-
else:
|
|
619
|
-
target_template = target
|
|
619
|
+
target_template = target.get("repo") if isinstance(target, dict) else target
|
|
620
620
|
if not target_template:
|
|
621
621
|
return
|
|
622
622
|
|