agentbundle 0.31.0__tar.gz → 0.32.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.
Files changed (536) hide show
  1. agentbundle-0.32.0/MANIFEST.in +16 -0
  2. {agentbundle-0.31.0 → agentbundle-0.32.0}/PKG-INFO +44 -11
  3. {agentbundle-0.31.0 → agentbundle-0.32.0}/README-pypi.md +42 -7
  4. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/adapter.schema.json +19 -0
  5. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/adapter.toml +6 -1
  6. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/manifest.json +4 -1
  7. agentbundle-0.32.0/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +27 -0
  8. agentbundle-0.32.0/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +42 -0
  9. agentbundle-0.32.0/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +14 -0
  10. agentbundle-0.32.0/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +67 -0
  11. agentbundle-0.32.0/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +116 -0
  12. agentbundle-0.32.0/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +40 -0
  13. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/plugin-manifest.derived.schema.json +33 -30
  14. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/__init__.py +17 -15
  15. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/__init__.py +12 -3
  16. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/claude_code.py +5 -6
  17. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/codex.py +8 -7
  18. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/copilot.py +5 -3
  19. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/kiro.py +18 -18
  20. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/kiro_ide.py +5 -13
  21. agentbundle-0.32.0/agentbundle/build/hook_wiring_rules.py +402 -0
  22. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/lint_packs.py +57 -18
  23. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/main.py +199 -37
  24. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/phase_order.py +0 -1
  25. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/codex_agent_toml.py +1 -2
  26. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/copilot_agent_md.py +0 -1
  27. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -1
  28. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/kiro_ide_hook.py +2 -2
  29. agentbundle-0.32.0/agentbundle/build/projections/plugin_hooks.py +49 -0
  30. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/scope_rails.py +1 -2
  31. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/self_host.py +25 -21
  32. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/target_resolver.py +0 -1
  33. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/validate.py +36 -29
  34. agentbundle-0.32.0/agentbundle/catalogue_tooling/file_safety.py +63 -0
  35. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/initialise_self_hosted.py +86 -23
  36. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/package.py +51 -20
  37. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/skill_spec_lint.py +7 -4
  38. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/upgrade.py +1 -1
  39. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/validate.py +14 -3
  40. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/render.py +5 -2
  41. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/version.py +1 -1
  42. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle.egg-info/PKG-INFO +44 -11
  43. agentbundle-0.32.0/agentbundle.egg-info/SOURCES.txt +532 -0
  44. agentbundle-0.32.0/conftest.py +25 -0
  45. {agentbundle-0.31.0 → agentbundle-0.32.0}/pyproject.toml +10 -6
  46. agentbundle-0.32.0/templates/install-marker.py +1166 -0
  47. agentbundle-0.32.0/tests/__init__.py +1 -0
  48. agentbundle-0.32.0/tests/_support.py +192 -0
  49. agentbundle-0.32.0/tests/build_pipeline/__init__.py +0 -0
  50. agentbundle-0.32.0/tests/build_pipeline/fixtures/README.md +40 -0
  51. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +6 -0
  52. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +3 -0
  53. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +5 -0
  54. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +4 -0
  55. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +2 -0
  56. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +3 -0
  57. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +7 -0
  58. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +5 -0
  59. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/core/pack.toml +13 -0
  60. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +7 -0
  61. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +5 -0
  62. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +16 -0
  63. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +7 -0
  64. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +5 -0
  65. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +11 -0
  66. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +7 -0
  67. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +5 -0
  68. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +11 -0
  69. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +7 -0
  70. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +5 -0
  71. agentbundle-0.32.0/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +4 -0
  72. agentbundle-0.32.0/tests/build_pipeline/fixtures/recipes/bogus-target.toml +9 -0
  73. agentbundle-0.32.0/tests/build_pipeline/test_adapter_claude_code.py +281 -0
  74. agentbundle-0.32.0/tests/build_pipeline/test_adapter_codex.py +719 -0
  75. agentbundle-0.32.0/tests/build_pipeline/test_adapter_copilot.py +120 -0
  76. agentbundle-0.32.0/tests/build_pipeline/test_adapter_cursor.py +421 -0
  77. agentbundle-0.32.0/tests/build_pipeline/test_adapter_gemini.py +559 -0
  78. agentbundle-0.32.0/tests/build_pipeline/test_adapter_kiro.py +464 -0
  79. agentbundle-0.32.0/tests/build_pipeline/test_adapter_kiro_alias.py +105 -0
  80. agentbundle-0.32.0/tests/build_pipeline/test_adapter_kiro_cli.py +143 -0
  81. agentbundle-0.32.0/tests/build_pipeline/test_adapter_kiro_ide.py +214 -0
  82. agentbundle-0.32.0/tests/build_pipeline/test_adapter_root_bins_projection.py +700 -0
  83. agentbundle-0.32.0/tests/build_pipeline/test_build_ships_seeds.py +82 -0
  84. agentbundle-0.32.0/tests/build_pipeline/test_contract.py +606 -0
  85. agentbundle-0.32.0/tests/build_pipeline/test_contract_scope.py +224 -0
  86. agentbundle-0.32.0/tests/build_pipeline/test_contract_v07.py +176 -0
  87. agentbundle-0.32.0/tests/build_pipeline/test_contract_v08.py +249 -0
  88. agentbundle-0.32.0/tests/build_pipeline/test_direct_directory_cleanup.py +65 -0
  89. agentbundle-0.32.0/tests/build_pipeline/test_end_to_end_build.py +244 -0
  90. agentbundle-0.32.0/tests/build_pipeline/test_hook_wiring_rules.py +250 -0
  91. agentbundle-0.32.0/tests/build_pipeline/test_lint_packs.py +735 -0
  92. agentbundle-0.32.0/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +175 -0
  93. agentbundle-0.32.0/tests/build_pipeline/test_pack_schema.py +494 -0
  94. agentbundle-0.32.0/tests/build_pipeline/test_pack_schema_allowed_adapters.py +255 -0
  95. agentbundle-0.32.0/tests/build_pipeline/test_pack_schema_install.py +305 -0
  96. agentbundle-0.32.0/tests/build_pipeline/test_pipeline.py +298 -0
  97. agentbundle-0.32.0/tests/build_pipeline/test_plugin_hooks.py +82 -0
  98. agentbundle-0.32.0/tests/build_pipeline/test_plugin_manifest_schema.py +430 -0
  99. agentbundle-0.32.0/tests/build_pipeline/test_projectable_subset.py +202 -0
  100. agentbundle-0.32.0/tests/build_pipeline/test_projections_merge_json.py +151 -0
  101. agentbundle-0.32.0/tests/build_pipeline/test_scope_rails.py +399 -0
  102. agentbundle-0.32.0/tests/build_pipeline/test_security.py +101 -0
  103. agentbundle-0.32.0/tests/build_pipeline/test_self_host_check.py +2556 -0
  104. agentbundle-0.32.0/tests/build_pipeline/test_self_host_fixture_guard.py +149 -0
  105. agentbundle-0.32.0/tests/build_pipeline/test_self_host_recipe_config.py +113 -0
  106. agentbundle-0.32.0/tests/build_pipeline/test_shared_libs_projection.py +139 -0
  107. agentbundle-0.32.0/tests/build_pipeline/test_shared_prefix_contract.py +97 -0
  108. agentbundle-0.32.0/tests/build_pipeline/test_user_libs_projection.py +492 -0
  109. agentbundle-0.32.0/tests/build_pipeline/test_validate.py +250 -0
  110. agentbundle-0.32.0/tests/build_pipeline/test_writers_emit_lf.py +172 -0
  111. agentbundle-0.32.0/tests/conftest.py +44 -0
  112. agentbundle-0.32.0/tests/fixtures/adapt/.adapt-discovery.toml +5 -0
  113. agentbundle-0.32.0/tests/fixtures/adapt/values.toml +3 -0
  114. agentbundle-0.32.0/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +8 -0
  115. agentbundle-0.32.0/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
  116. agentbundle-0.32.0/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +27 -0
  117. agentbundle-0.32.0/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +9 -0
  118. agentbundle-0.32.0/tests/fixtures/blank_catalogue/packs/_example/README.md +70 -0
  119. agentbundle-0.32.0/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +42 -0
  120. agentbundle-0.32.0/tests/fixtures/blank_catalogue/packs/_example/pack.toml +20 -0
  121. agentbundle-0.32.0/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
  122. agentbundle-0.32.0/tests/fixtures/blank_catalogue/profiles/_example/README.md +24 -0
  123. agentbundle-0.32.0/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +5 -0
  124. agentbundle-0.32.0/tests/fixtures/brownfield/values.toml +3 -0
  125. agentbundle-0.32.0/tests/fixtures/brownfield-adapt/AGENTS.md +5 -0
  126. agentbundle-0.32.0/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +5 -0
  127. agentbundle-0.32.0/tests/fixtures/brownfield-adapt/DESIGN.md +6 -0
  128. agentbundle-0.32.0/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +53 -0
  129. agentbundle-0.32.0/tests/fixtures/brownfield-adapt/docs/CHARTER.md +5 -0
  130. agentbundle-0.32.0/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +5 -0
  131. agentbundle-0.32.0/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +8 -0
  132. agentbundle-0.32.0/tests/fixtures/brownfield-adapt-expected/AGENTS.md +5 -0
  133. agentbundle-0.32.0/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +5 -0
  134. agentbundle-0.32.0/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +12 -0
  135. agentbundle-0.32.0/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +1 -0
  136. agentbundle-0.32.0/tests/fixtures/creds/skills/argv-flag/SKILL.md +23 -0
  137. agentbundle-0.32.0/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +15 -0
  138. agentbundle-0.32.0/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +22 -0
  139. agentbundle-0.32.0/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +28 -0
  140. agentbundle-0.32.0/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +22 -0
  141. agentbundle-0.32.0/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +23 -0
  142. agentbundle-0.32.0/tests/fixtures/creds/skills/conforming/SKILL.md +23 -0
  143. agentbundle-0.32.0/tests/fixtures/creds/skills/conforming/scripts/cli.py +15 -0
  144. agentbundle-0.32.0/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +22 -0
  145. agentbundle-0.32.0/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +12 -0
  146. agentbundle-0.32.0/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +25 -0
  147. agentbundle-0.32.0/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +13 -0
  148. agentbundle-0.32.0/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +26 -0
  149. agentbundle-0.32.0/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +17 -0
  150. agentbundle-0.32.0/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +10 -0
  151. agentbundle-0.32.0/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +6 -0
  152. agentbundle-0.32.0/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +3 -0
  153. agentbundle-0.32.0/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +2 -0
  154. agentbundle-0.32.0/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +3 -0
  155. agentbundle-0.32.0/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +7 -0
  156. agentbundle-0.32.0/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +5 -0
  157. agentbundle-0.32.0/tests/fixtures/install/catalogue/packs/alpha/pack.toml +13 -0
  158. agentbundle-0.32.0/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +13 -0
  159. agentbundle-0.32.0/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +13 -0
  160. agentbundle-0.32.0/tests/fixtures/lint_packs/clean/pack.toml +11 -0
  161. agentbundle-0.32.0/tests/fixtures/lint_packs/clean/seeds/README.md +3 -0
  162. agentbundle-0.32.0/tests/fixtures/list-installed/golden_120col.txt +5 -0
  163. agentbundle-0.32.0/tests/fixtures/list-installed/golden_80col.txt +5 -0
  164. agentbundle-0.32.0/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +5 -0
  165. agentbundle-0.32.0/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +10 -0
  166. agentbundle-0.32.0/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +3 -0
  167. agentbundle-0.32.0/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +5 -0
  168. agentbundle-0.32.0/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +8 -0
  169. agentbundle-0.32.0/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +2 -0
  170. agentbundle-0.32.0/tests/fixtures/packs/cc-user-hooks/pack.toml +18 -0
  171. agentbundle-0.32.0/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +8 -0
  172. agentbundle-0.32.0/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +5 -0
  173. agentbundle-0.32.0/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +2 -0
  174. agentbundle-0.32.0/tests/fixtures/packs/kiro-repo-hooks/pack.toml +20 -0
  175. agentbundle-0.32.0/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +8 -0
  176. agentbundle-0.32.0/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +5 -0
  177. agentbundle-0.32.0/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +2 -0
  178. agentbundle-0.32.0/tests/fixtures/packs/kiro-user-hooks/pack.toml +21 -0
  179. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +5 -0
  180. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +5 -0
  181. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +2 -0
  182. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +14 -0
  183. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +5 -0
  184. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +7 -0
  185. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +2 -0
  186. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +16 -0
  187. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +5 -0
  188. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +7 -0
  189. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +2 -0
  190. agentbundle-0.32.0/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +13 -0
  191. agentbundle-0.32.0/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +1 -0
  192. agentbundle-0.32.0/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +1 -0
  193. agentbundle-0.32.0/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +1 -0
  194. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +6 -0
  195. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +3 -0
  196. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +9 -0
  197. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +3 -0
  198. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +3 -0
  199. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
  200. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +5 -0
  201. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +13 -0
  202. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +6 -0
  203. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +3 -0
  204. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +9 -0
  205. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +3 -0
  206. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +3 -0
  207. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
  208. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +5 -0
  209. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +13 -0
  210. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +6 -0
  211. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +3 -0
  212. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +9 -0
  213. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +3 -0
  214. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +3 -0
  215. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
  216. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +5 -0
  217. agentbundle-0.32.0/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +13 -0
  218. agentbundle-0.32.0/tests/fixtures/validate/bad_recipe_pack/pack.toml +5 -0
  219. agentbundle-0.32.0/tests/fixtures/validate/malformed_pack/pack.toml +1 -0
  220. agentbundle-0.32.0/tests/fixtures/validate/valid_pack/pack.toml +4 -0
  221. agentbundle-0.32.0/tests/fixtures/validate/version_mismatch_pack/pack.toml +7 -0
  222. agentbundle-0.32.0/tests/integration/__init__.py +0 -0
  223. agentbundle-0.32.0/tests/integration/test_adapt_cmd.py +317 -0
  224. agentbundle-0.32.0/tests/integration/test_adapt_dual_scope.py +247 -0
  225. agentbundle-0.32.0/tests/integration/test_adapt_preflight_detection.py +217 -0
  226. agentbundle-0.32.0/tests/integration/test_adapt_schema_migration.py +125 -0
  227. agentbundle-0.32.0/tests/integration/test_apm_install_route.py +788 -0
  228. agentbundle-0.32.0/tests/integration/test_blank_catalogue.py +58 -0
  229. agentbundle-0.32.0/tests/integration/test_brownfield_adapt_end_to_end.py +205 -0
  230. agentbundle-0.32.0/tests/integration/test_brownfield_round_trip.py +133 -0
  231. agentbundle-0.32.0/tests/integration/test_brownfield_user_home_fixture.py +44 -0
  232. agentbundle-0.32.0/tests/integration/test_build_check_drift_gates.py +523 -0
  233. agentbundle-0.32.0/tests/integration/test_build_derivation_apm.py +181 -0
  234. agentbundle-0.32.0/tests/integration/test_build_derivation_claude_plugins.py +683 -0
  235. agentbundle-0.32.0/tests/integration/test_catalogue_init.py +465 -0
  236. agentbundle-0.32.0/tests/integration/test_cc_user_hooks_fixture.py +107 -0
  237. agentbundle-0.32.0/tests/integration/test_claude_plugins_install_route.py +1791 -0
  238. agentbundle-0.32.0/tests/integration/test_config_cascade.py +174 -0
  239. agentbundle-0.32.0/tests/integration/test_credential_brokers_pack_install.py +205 -0
  240. agentbundle-0.32.0/tests/integration/test_credentials_wheel.py +75 -0
  241. agentbundle-0.32.0/tests/integration/test_discovery_schema_cross_consumer.py +116 -0
  242. agentbundle-0.32.0/tests/integration/test_editable_source_detection.py +113 -0
  243. agentbundle-0.32.0/tests/integration/test_fixtures_validate.py +226 -0
  244. agentbundle-0.32.0/tests/integration/test_hook_wiring_ingress.py +220 -0
  245. agentbundle-0.32.0/tests/integration/test_install_adapt_chain.py +442 -0
  246. agentbundle-0.32.0/tests/integration/test_install_cmd.py +691 -0
  247. agentbundle-0.32.0/tests/integration/test_install_converters_user_scope.py +190 -0
  248. agentbundle-0.32.0/tests/integration/test_install_copilot_full_parity.py +278 -0
  249. agentbundle-0.32.0/tests/integration/test_install_core_smoke.py +88 -0
  250. agentbundle-0.32.0/tests/integration/test_install_default_source.py +187 -0
  251. agentbundle-0.32.0/tests/integration/test_install_dependencies_gate.py +321 -0
  252. agentbundle-0.32.0/tests/integration/test_install_dropped_primitives_warning.py +550 -0
  253. agentbundle-0.32.0/tests/integration/test_install_dual_scope.py +440 -0
  254. agentbundle-0.32.0/tests/integration/test_install_orphan_reshape.py +135 -0
  255. agentbundle-0.32.0/tests/integration/test_install_pack_metadata_shape.py +278 -0
  256. agentbundle-0.32.0/tests/integration/test_install_profile.py +408 -0
  257. agentbundle-0.32.0/tests/integration/test_install_profile_live.py +103 -0
  258. agentbundle-0.32.0/tests/integration/test_install_repo_scope_per_adapter.py +730 -0
  259. agentbundle-0.32.0/tests/integration/test_install_research_user_scope.py +200 -0
  260. agentbundle-0.32.0/tests/integration/test_install_seed_delivery.py +222 -0
  261. agentbundle-0.32.0/tests/integration/test_install_session_start_wiring.py +141 -0
  262. agentbundle-0.32.0/tests/integration/test_install_upgrade_offer.py +243 -0
  263. agentbundle-0.32.0/tests/integration/test_install_user_hooks.py +411 -0
  264. agentbundle-0.32.0/tests/integration/test_install_user_scope_allowed_adapters.py +225 -0
  265. agentbundle-0.32.0/tests/integration/test_kiro_ide_hook_e2e.py +204 -0
  266. agentbundle-0.32.0/tests/integration/test_kiro_repo_hooks_fixture.py +93 -0
  267. agentbundle-0.32.0/tests/integration/test_kiro_user_hooks_fixture.py +155 -0
  268. agentbundle-0.32.0/tests/integration/test_list_packs_cmd.py +148 -0
  269. agentbundle-0.32.0/tests/integration/test_local_scope_install.py +377 -0
  270. agentbundle-0.32.0/tests/integration/test_marketplace_entry_validation.py +390 -0
  271. agentbundle-0.32.0/tests/integration/test_marketplace_manifest_regression.py +303 -0
  272. agentbundle-0.32.0/tests/integration/test_multi_pack_install.py +805 -0
  273. agentbundle-0.32.0/tests/integration/test_orphan_cleanup_respects_foreign_state.py +273 -0
  274. agentbundle-0.32.0/tests/integration/test_plugin_route_membership.py +613 -0
  275. agentbundle-0.32.0/tests/integration/test_recommends_cross_scope.py +228 -0
  276. agentbundle-0.32.0/tests/integration/test_reconcile.py +230 -0
  277. agentbundle-0.32.0/tests/integration/test_reserved_path_filter.py +236 -0
  278. agentbundle-0.32.0/tests/integration/test_scaffold_projection.py +147 -0
  279. agentbundle-0.32.0/tests/integration/test_self_host_schema_migration.py +138 -0
  280. agentbundle-0.32.0/tests/integration/test_self_host_sweep_respects_state.py +312 -0
  281. agentbundle-0.32.0/tests/integration/test_shared_prefix_coexistence.py +235 -0
  282. agentbundle-0.32.0/tests/integration/test_show_cmd.py +515 -0
  283. agentbundle-0.32.0/tests/integration/test_tier_invariants.py +335 -0
  284. agentbundle-0.32.0/tests/integration/test_uninstall_cmd.py +381 -0
  285. agentbundle-0.32.0/tests/integration/test_uninstall_user_hooks.py +327 -0
  286. agentbundle-0.32.0/tests/integration/test_upgrade_attach_to_agent.py +140 -0
  287. agentbundle-0.32.0/tests/integration/test_upgrade_cmd.py +1087 -0
  288. agentbundle-0.32.0/tests/integration/test_upgrade_user_hooks.py +307 -0
  289. agentbundle-0.32.0/tests/integration/test_version_gate_matrix.py +163 -0
  290. agentbundle-0.32.0/tests/integration/test_workspace_mcp_git_fsm.py +156 -0
  291. agentbundle-0.32.0/tests/integration/test_zipapp.py +92 -0
  292. agentbundle-0.32.0/tests/unit/__init__.py +0 -0
  293. agentbundle-0.32.0/tests/unit/test_adapt_discovery_schema.py +292 -0
  294. agentbundle-0.32.0/tests/unit/test_append_layout_section.py +238 -0
  295. agentbundle-0.32.0/tests/unit/test_architect_readme_install_command.py +26 -0
  296. agentbundle-0.32.0/tests/unit/test_catalogue_ci_contract.py +244 -0
  297. agentbundle-0.32.0/tests/unit/test_catalogue_curation_deps.py +62 -0
  298. agentbundle-0.32.0/tests/unit/test_catalogue_init_cli_self_hosted.py +206 -0
  299. agentbundle-0.32.0/tests/unit/test_catalogue_pack_defaults.py +596 -0
  300. agentbundle-0.32.0/tests/unit/test_catalogue_self_hosted_export_removal.py +27 -0
  301. agentbundle-0.32.0/tests/unit/test_catalogue_skill_spec_lint.py +913 -0
  302. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_archive.py +296 -0
  303. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_build.py +98 -0
  304. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_defaults.py +267 -0
  305. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_foundation.py +584 -0
  306. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_identity.py +151 -0
  307. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_init.py +783 -0
  308. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_lint.py +1146 -0
  309. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_package.py +958 -0
  310. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_self_host.py +314 -0
  311. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_self_hosted_init.py +1069 -0
  312. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_source_package.py +386 -0
  313. agentbundle-0.32.0/tests/unit/test_catalogue_tooling_verify.py +461 -0
  314. agentbundle-0.32.0/tests/unit/test_catalogue_wave2_schema.py +171 -0
  315. agentbundle-0.32.0/tests/unit/test_catalogue_wave2_validation.py +272 -0
  316. agentbundle-0.32.0/tests/unit/test_cli_catalogue_optional.py +38 -0
  317. agentbundle-0.32.0/tests/unit/test_cli_help_lists_config.py +45 -0
  318. agentbundle-0.32.0/tests/unit/test_cli_path_normalisation.py +161 -0
  319. agentbundle-0.32.0/tests/unit/test_cli_profile_surface.py +87 -0
  320. agentbundle-0.32.0/tests/unit/test_cli_scope_flags.py +193 -0
  321. agentbundle-0.32.0/tests/unit/test_codex_agent_toml.py +350 -0
  322. agentbundle-0.32.0/tests/unit/test_codex_projection_modes.py +193 -0
  323. agentbundle-0.32.0/tests/unit/test_common_classify_seeds.py +164 -0
  324. agentbundle-0.32.0/tests/unit/test_config.py +187 -0
  325. agentbundle-0.32.0/tests/unit/test_config_cmd.py +136 -0
  326. agentbundle-0.32.0/tests/unit/test_configured_adapter.py +35 -0
  327. agentbundle-0.32.0/tests/unit/test_confirm_helper.py +67 -0
  328. agentbundle-0.32.0/tests/unit/test_contract_parity.py +30 -0
  329. agentbundle-0.32.0/tests/unit/test_contract_v0_3_schema.py +598 -0
  330. agentbundle-0.32.0/tests/unit/test_copilot_agent_md.py +182 -0
  331. agentbundle-0.32.0/tests/unit/test_copilot_hooks_json.py +147 -0
  332. agentbundle-0.32.0/tests/unit/test_copilot_user_scope_wiring.py +151 -0
  333. agentbundle-0.32.0/tests/unit/test_credbroker_lint_hardening.py +167 -0
  334. agentbundle-0.32.0/tests/unit/test_dependencies_batch.py +117 -0
  335. agentbundle-0.32.0/tests/unit/test_diff_cmd.py +115 -0
  336. agentbundle-0.32.0/tests/unit/test_footprint_ownership.py +114 -0
  337. agentbundle-0.32.0/tests/unit/test_https_catalogue.py +1080 -0
  338. agentbundle-0.32.0/tests/unit/test_init_state_cmd.py +176 -0
  339. agentbundle-0.32.0/tests/unit/test_install_argparse_adapter_flag.py +82 -0
  340. agentbundle-0.32.0/tests/unit/test_install_argparse_emit_install_routes.py +263 -0
  341. agentbundle-0.32.0/tests/unit/test_install_defaults_preferred_adapter.py +343 -0
  342. agentbundle-0.32.0/tests/unit/test_install_dropped_primitives_warning.py +782 -0
  343. agentbundle-0.32.0/tests/unit/test_install_event_dropped_wirings.py +467 -0
  344. agentbundle-0.32.0/tests/unit/test_install_first_value_handoff.py +387 -0
  345. agentbundle-0.32.0/tests/unit/test_install_force_help.py +33 -0
  346. agentbundle-0.32.0/tests/unit/test_install_inband_detection.py +580 -0
  347. agentbundle-0.32.0/tests/unit/test_install_messages.py +136 -0
  348. agentbundle-0.32.0/tests/unit/test_install_messages_repo_scope.py +289 -0
  349. agentbundle-0.32.0/tests/unit/test_install_refusal_ordering.py +211 -0
  350. agentbundle-0.32.0/tests/unit/test_install_state_provenance.py +215 -0
  351. agentbundle-0.32.0/tests/unit/test_kiro_ide_hook_projection.py +389 -0
  352. agentbundle-0.32.0/tests/unit/test_kiro_ide_hook_rail.py +335 -0
  353. agentbundle-0.32.0/tests/unit/test_kiro_ide_hook_schema.py +125 -0
  354. agentbundle-0.32.0/tests/unit/test_lint_agent_artifacts_metadata_auth.py +166 -0
  355. agentbundle-0.32.0/tests/unit/test_list_installed_cmd.py +349 -0
  356. agentbundle-0.32.0/tests/unit/test_list_installed_status.py +1197 -0
  357. agentbundle-0.32.0/tests/unit/test_list_targets_cmd.py +120 -0
  358. agentbundle-0.32.0/tests/unit/test_local_scope_schema.py +83 -0
  359. agentbundle-0.32.0/tests/unit/test_local_scope_t10_uninstall.py +353 -0
  360. agentbundle-0.32.0/tests/unit/test_local_scope_t12_show.py +71 -0
  361. agentbundle-0.32.0/tests/unit/test_local_scope_t2_resolve.py +64 -0
  362. agentbundle-0.32.0/tests/unit/test_local_scope_t3_config.py +37 -0
  363. agentbundle-0.32.0/tests/unit/test_local_scope_t4_state_path.py +28 -0
  364. agentbundle-0.32.0/tests/unit/test_local_scope_t5_list_installed.py +131 -0
  365. agentbundle-0.32.0/tests/unit/test_local_scope_t7_install_gates.py +229 -0
  366. agentbundle-0.32.0/tests/unit/test_local_scope_t8_install.py +401 -0
  367. agentbundle-0.32.0/tests/unit/test_local_scope_t9_exclude.py +253 -0
  368. agentbundle-0.32.0/tests/unit/test_marker_schema_version_parity.py +51 -0
  369. agentbundle-0.32.0/tests/unit/test_merge_into_agent_json.py +347 -0
  370. agentbundle-0.32.0/tests/unit/test_multi_adapter_disambiguator.py +83 -0
  371. agentbundle-0.32.0/tests/unit/test_nested_symlink_hardening.py +154 -0
  372. agentbundle-0.32.0/tests/unit/test_org_bootstrap.py +746 -0
  373. agentbundle-0.32.0/tests/unit/test_pack_config_api.py +469 -0
  374. agentbundle-0.32.0/tests/unit/test_pack_inventory.py +122 -0
  375. agentbundle-0.32.0/tests/unit/test_package_catalogue.py +1190 -0
  376. agentbundle-0.32.0/tests/unit/test_packstate_source_provenance.py +245 -0
  377. agentbundle-0.32.0/tests/unit/test_pipeline_phase_order.py +264 -0
  378. agentbundle-0.32.0/tests/unit/test_plugin_scope_filter.py +181 -0
  379. agentbundle-0.32.0/tests/unit/test_profile_reader.py +172 -0
  380. agentbundle-0.32.0/tests/unit/test_render.py +49 -0
  381. agentbundle-0.32.0/tests/unit/test_render_cmd.py +235 -0
  382. agentbundle-0.32.0/tests/unit/test_render_table.py +162 -0
  383. agentbundle-0.32.0/tests/unit/test_resolve_state_path.py +19 -0
  384. agentbundle-0.32.0/tests/unit/test_resolve_target_adapter_user_config.py +279 -0
  385. agentbundle-0.32.0/tests/unit/test_resolve_user_scope_target_adapter.py +690 -0
  386. agentbundle-0.32.0/tests/unit/test_safety.py +287 -0
  387. agentbundle-0.32.0/tests/unit/test_safety_repo_scope_prefixes.py +211 -0
  388. agentbundle-0.32.0/tests/unit/test_safety_scan_per_pack_scoping.py +473 -0
  389. agentbundle-0.32.0/tests/unit/test_scaffold_cmd.py +300 -0
  390. agentbundle-0.32.0/tests/unit/test_scope.py +186 -0
  391. agentbundle-0.32.0/tests/unit/test_self_host_windows.py +189 -0
  392. agentbundle-0.32.0/tests/unit/test_shared_prefix_disclosure.py +62 -0
  393. agentbundle-0.32.0/tests/unit/test_source_conflict_guard.py +585 -0
  394. agentbundle-0.32.0/tests/unit/test_source_defaults.py +572 -0
  395. agentbundle-0.32.0/tests/unit/test_state_v01_refuse_write.py +177 -0
  396. agentbundle-0.32.0/tests/unit/test_state_v02.py +158 -0
  397. agentbundle-0.32.0/tests/unit/test_state_v0_4_schema.py +227 -0
  398. agentbundle-0.32.0/tests/unit/test_statelock.py +111 -0
  399. agentbundle-0.32.0/tests/unit/test_target_resolver.py +181 -0
  400. agentbundle-0.32.0/tests/unit/test_toml_emitters.py +417 -0
  401. agentbundle-0.32.0/tests/unit/test_unresolved_markers.py +40 -0
  402. agentbundle-0.32.0/tests/unit/test_upgrade_bulk_all.py +1137 -0
  403. agentbundle-0.32.0/tests/unit/test_upgrade_recap.py +52 -0
  404. agentbundle-0.32.0/tests/unit/test_upgrade_source_inference.py +165 -0
  405. agentbundle-0.32.0/tests/unit/test_user_config_io.py +202 -0
  406. agentbundle-0.32.0/tests/unit/test_user_config_isolation.py +29 -0
  407. agentbundle-0.32.0/tests/unit/test_user_config_path.py +47 -0
  408. agentbundle-0.32.0/tests/unit/test_user_config_source.py +84 -0
  409. agentbundle-0.32.0/tests/unit/test_user_merge_json.py +420 -0
  410. agentbundle-0.32.0/tests/unit/test_validate_attach_to_agent.py +302 -0
  411. agentbundle-0.32.0/tests/unit/test_validate_categories.py +92 -0
  412. agentbundle-0.32.0/tests/unit/test_validate_cmd.py +329 -0
  413. agentbundle-0.32.0/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +422 -0
  414. agentbundle-0.32.0/tests/unit/test_values_from_shapes.py +68 -0
  415. agentbundle-0.32.0/tests/unit/test_version.py +129 -0
  416. agentbundle-0.31.0/agentbundle.egg-info/SOURCES.txt +0 -152
  417. agentbundle-0.31.0/tests/test_linear_primitive.py +0 -133
  418. {agentbundle-0.31.0 → agentbundle-0.32.0}/README.md +0 -0
  419. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/__init__.py +0 -0
  420. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/__main__.py +0 -0
  421. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
  422. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  423. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
  424. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  425. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  426. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  427. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  428. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  429. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  430. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  431. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/catalogue.schema.json +0 -0
  432. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/guide.schema.json +0 -0
  433. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/install-defaults.toml +0 -0
  434. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/install-marker.py +0 -0
  435. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/marketplace-entry.schema.json +0 -0
  436. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/pack.schema.json +0 -0
  437. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  438. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/profile.schema.json +0 -0
  439. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/skill-manifest.schema.json +0 -0
  440. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/skill.schema.json +0 -0
  441. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/_data/target-vocab.toml +0 -0
  442. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/__main__.py +0 -0
  443. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapter_root_bins.py +0 -0
  444. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/cursor.py +0 -0
  445. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/gemini.py +0 -0
  446. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
  447. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/contract.py +0 -0
  448. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projection_io.py +0 -0
  449. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/__init__.py +0 -0
  450. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/direct_directory.py +0 -0
  451. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  452. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/hook_id.py +0 -0
  453. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  454. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/merge_json.py +0 -0
  455. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/projections/user_merge_json.py +0 -0
  456. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  457. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  458. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/recipes/marketplace.toml +0 -0
  459. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  460. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  461. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  462. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/recipes/self-host.toml +0 -0
  463. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/shared_libs.py +0 -0
  464. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/build/user_libs.py +0 -0
  465. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue.py +0 -0
  466. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/__init__.py +0 -0
  467. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/archive.py +0 -0
  468. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/build.py +0 -0
  469. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/config.py +0 -0
  470. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/defaults.py +0 -0
  471. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  472. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/identity.py +0 -0
  473. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/initialise.py +0 -0
  474. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/lint.py +0 -0
  475. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/results.py +0 -0
  476. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/self_host.py +0 -0
  477. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
  478. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  479. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/catalogue_tooling/verify.py +0 -0
  480. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/categories.py +0 -0
  481. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/cli.py +0 -0
  482. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/__init__.py +0 -0
  483. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/_common.py +0 -0
  484. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/_drop_warning.py +0 -0
  485. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/adapt.py +0 -0
  486. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_build.py +0 -0
  487. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_init.py +0 -0
  488. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_lint.py +0 -0
  489. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_package.py +0 -0
  490. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_self_host.py +0 -0
  491. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  492. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  493. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/catalogue_verify.py +0 -0
  494. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/config.py +0 -0
  495. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/diff.py +0 -0
  496. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/docs.py +0 -0
  497. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/init_state.py +0 -0
  498. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/install.py +0 -0
  499. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/list_installed.py +0 -0
  500. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/list_packs.py +0 -0
  501. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/list_profiles.py +0 -0
  502. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/list_targets.py +0 -0
  503. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/oplog_cmd.py +0 -0
  504. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/pack_config_cmd.py +0 -0
  505. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/pack_evals.py +0 -0
  506. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/package_catalogue.py +0 -0
  507. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/profile.py +0 -0
  508. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/reconcile.py +0 -0
  509. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/render.py +0 -0
  510. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/scaffold.py +0 -0
  511. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/show.py +0 -0
  512. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/commands/uninstall.py +0 -0
  513. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/config.py +0 -0
  514. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/https_catalogue.py +0 -0
  515. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/local_exclude.py +0 -0
  516. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/oplog.py +0 -0
  517. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/pack_inventory.py +0 -0
  518. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/safety.py +0 -0
  519. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/scaffold.py +0 -0
  520. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/scope.py +0 -0
  521. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/source_defaults.py +0 -0
  522. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/statelock.py +0 -0
  523. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/user_config.py +0 -0
  524. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle/workspace_mcp.py +0 -0
  525. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle.egg-info/dependency_links.txt +0 -0
  526. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle.egg-info/entry_points.txt +0 -0
  527. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle.egg-info/requires.txt +0 -0
  528. {agentbundle-0.31.0 → agentbundle-0.32.0}/agentbundle.egg-info/top_level.txt +0 -0
  529. {agentbundle-0.31.0 → agentbundle-0.32.0}/setup.cfg +0 -0
  530. {agentbundle-0.31.0 → agentbundle-0.32.0}/tests/test_adapter_permissions_projection.py +0 -0
  531. {agentbundle-0.31.0 → agentbundle-0.32.0}/tests/test_workspace_mcp_elicit.py +0 -0
  532. {agentbundle-0.31.0 → agentbundle-0.32.0}/tests/test_workspace_mcp_event_bridge.py +0 -0
  533. {agentbundle-0.31.0 → agentbundle-0.32.0}/tests/test_workspace_mcp_git.py +0 -0
  534. {agentbundle-0.31.0 → agentbundle-0.32.0}/tests/test_workspace_mcp_lifecycle.py +0 -0
  535. {agentbundle-0.31.0 → agentbundle-0.32.0}/tests/test_workspace_mcp_stdin.py +0 -0
  536. {agentbundle-0.31.0 → agentbundle-0.32.0}/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.0
3
+ Version: 0.32.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
- 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
@@ -31,7 +29,7 @@ Requires-Dist: pyyaml>=6.0; extra == "lint"
31
29
  ## Quick start
32
30
 
33
31
  ```bash
34
- pip install agentbundle
32
+ python -m pip install agentbundle
35
33
  ```
36
34
 
37
35
  Requires Python 3.11+. Runs on macOS, Linux, and Windows.
@@ -52,8 +50,36 @@ agentbundle install --pack desk-research --scope user
52
50
 
53
51
  User-scope packs land in your home directory, not the repo — they're yours, not the team's, and they're there in every project you open.
54
52
 
53
+ **Try a pack without committing it** — so the pack is live in this clone while
54
+ `git status` stays clean:
55
+
56
+ ```bash
57
+ agentbundle install --pack core --scope local
58
+ ```
59
+
60
+ Local scope projects the same runtime files as repo scope, then records them in
61
+ `.git/info/exclude`. It requires a Git work tree. Uninstalling removes both the
62
+ projected files and the managed exclude entries; local and repo installs of the
63
+ same pack cannot coexist.
64
+
55
65
  The install auto-detects your agent (`--adapter` overrides). Multi-IDE? Install the same pack for each agent at the same scope — they coexist, and the agents that read `.agents/skills/` (codex, cursor, gemini, copilot) share one skill copy instead of fighting over it. To install from a **different** catalogue, pass it as a trailing argument — a git URL or a local path (`agentbundle install --pack core <catalogue>`); a `config set source <catalogue>` makes that the default, and an editable clone (`pip install -e`) defaults to itself.
56
66
 
67
+ ## Claude Code marketplace
68
+
69
+ Claude Code users can install any pack that permits user scope without first
70
+ installing this CLI:
71
+
72
+ ```bash
73
+ claude plugin marketplace add eugenelim/agent-ready-repo
74
+ claude plugin install architect@agent-ready-repo
75
+ ```
76
+
77
+ The marketplace excludes repo-only packs because Claude plugins live in a
78
+ global cache. Install `core` and other repo-only packs with `agentbundle` so
79
+ their files land in the project. For hook-bearing user-scope packs, the
80
+ generated marketplace description lists the authored hook event, matcher,
81
+ timeout, interpreter, and body path before publication.
82
+
57
83
  ## More commands
58
84
 
59
85
  ```bash
@@ -200,10 +226,10 @@ Artifactory bootstrap and editable-install detection entirely. `agentbundle` fal
200
226
  straight through to the packaged default, so hosts without network access to Artifactory
201
227
  still resolve a source without errors.
202
228
 
203
- See the full enterprise adoption guide at
204
- `docs/guides/_shared/how-to/use-an-artifactory-catalogue.md` for all six flows
205
- (org bootstrap, repo-scope CI upgrade, user-scope MDM, source-conflict remediation,
206
- disconnected hosts, and security controls).
229
+ See [Configure catalogue enterprise
230
+ distribution](https://github.com/eugenelim/agent-ready-repo/blob/main/guides/_shared/how-to/configure-catalogue-enterprise-distribution.md)
231
+ for channel setup, authentication, CI upgrades, disconnected hosts, and the
232
+ security boundary.
207
233
 
208
234
  ## Build your own catalogue
209
235
 
@@ -250,6 +276,7 @@ my-pack/
250
276
  evals/ # activation + output-quality evals, skill-local
251
277
  agents/<name>.md # subagents
252
278
  hooks/<name>.py # lifecycle hooks
279
+ hook-wiring/<name>.toml # adapter event wiring for a shipped hook body
253
280
  tests/ # implementation tests — NEVER projected
254
281
  skills/<name>/
255
282
  hooks/
@@ -278,6 +305,12 @@ on the published distribution branch, and every entry is schema-validated at
278
305
  build time against `marketplace-entry.schema.json`. Extra fields stay in `pack.toml`; the projection
279
306
  is deliberately lossy per tool.
280
307
 
308
+ A hook-bearing pack that permits user scope must explicitly set
309
+ `[pack.install] user-scope-hooks = true`. On the Claude-plugin route,
310
+ `agentbundle` compiles supported Claude-shaped wiring into native plugin hooks
311
+ and rejects unsafe event, matcher, timeout, command, or body-path shapes before
312
+ creating output. Direct CLI installs keep their adapter-native wiring contract.
313
+
281
314
  Point a catalogue URI (a git URL or a local path) at the repo that holds your packs. Then `validate` a pack against the adapter contract, `render` it to preview the projection, and `install` it into a target repo. `scaffold` drops a pack's seeds into a fresh directory to start from. The build pipeline (`agentbundle.build`) is the same engine `make build` runs.
282
315
 
283
316
  **Org adapter default:** If your org ships a private `agentbundle` wheel (or a fork pinned to your internal catalogue), you can set a default adapter for all developers without requiring them to run `agentbundle config set` or pass `--adapter` on every install. Add an `[organization]` table to `_data/install-defaults.toml` in your fork:
@@ -287,7 +320,7 @@ Point a catalogue URI (a git URL or a local path) at the repo that holds your pa
287
320
  preferred_adapter = "cursor"
288
321
  ```
289
322
 
290
- The org hint fires after the user-config but before the on-disk IDE probe — so `--adapter`, user-config, and upgrade state-hints all take priority. An invalid value exits 1 before writing anything. See the [`agentbundle` reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/reference/agentbundle.md#org-adapter-default) for the full cascade.
323
+ The org hint fires after the user-config but before the on-disk IDE probe — so `--adapter`, user-config, and upgrade state-hints all take priority. An invalid value exits 1 before writing anything. See the [`agentbundle` reference](https://github.com/eugenelim/agent-ready-repo/blob/main/guides/_shared/reference/agentbundle.md#org-adapter-default) for the full cascade.
291
324
 
292
325
  **Bundled contracts** — the wheel ships the machine contracts used for offline validation:
293
326
  `pack.schema.json`, `skill.schema.json`, `guide.schema.json`, `skill-manifest.schema.json`,
@@ -348,7 +381,7 @@ When `preferred-adapter` names an adapter not in the upstream `SELF_HOST_ADAPTER
348
381
  agentbundle pack evals run --pack <pack-name> --catalogue-root .
349
382
  ```
350
383
 
351
- See the [pack layout reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/architecture/pack-layout.md) and [authoring a skill](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/how-to/author-a-skill.md).
384
+ See the [pack layout reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/architecture/pack-layout.md) and [authoring a skill](https://github.com/eugenelim/agent-ready-repo/blob/main/guides/_shared/how-to/author-a-skill.md).
352
385
 
353
386
  ## Catalogue defaults and pack config API
354
387
 
@@ -9,7 +9,7 @@
9
9
  ## Quick start
10
10
 
11
11
  ```bash
12
- pip install agentbundle
12
+ python -m pip install agentbundle
13
13
  ```
14
14
 
15
15
  Requires Python 3.11+. Runs on macOS, Linux, and Windows.
@@ -30,8 +30,36 @@ agentbundle install --pack desk-research --scope user
30
30
 
31
31
  User-scope packs land in your home directory, not the repo — they're yours, not the team's, and they're there in every project you open.
32
32
 
33
+ **Try a pack without committing it** — so the pack is live in this clone while
34
+ `git status` stays clean:
35
+
36
+ ```bash
37
+ agentbundle install --pack core --scope local
38
+ ```
39
+
40
+ Local scope projects the same runtime files as repo scope, then records them in
41
+ `.git/info/exclude`. It requires a Git work tree. Uninstalling removes both the
42
+ projected files and the managed exclude entries; local and repo installs of the
43
+ same pack cannot coexist.
44
+
33
45
  The install auto-detects your agent (`--adapter` overrides). Multi-IDE? Install the same pack for each agent at the same scope — they coexist, and the agents that read `.agents/skills/` (codex, cursor, gemini, copilot) share one skill copy instead of fighting over it. To install from a **different** catalogue, pass it as a trailing argument — a git URL or a local path (`agentbundle install --pack core <catalogue>`); a `config set source <catalogue>` makes that the default, and an editable clone (`pip install -e`) defaults to itself.
34
46
 
47
+ ## Claude Code marketplace
48
+
49
+ Claude Code users can install any pack that permits user scope without first
50
+ installing this CLI:
51
+
52
+ ```bash
53
+ claude plugin marketplace add eugenelim/agent-ready-repo
54
+ claude plugin install architect@agent-ready-repo
55
+ ```
56
+
57
+ The marketplace excludes repo-only packs because Claude plugins live in a
58
+ global cache. Install `core` and other repo-only packs with `agentbundle` so
59
+ their files land in the project. For hook-bearing user-scope packs, the
60
+ generated marketplace description lists the authored hook event, matcher,
61
+ timeout, interpreter, and body path before publication.
62
+
35
63
  ## More commands
36
64
 
37
65
  ```bash
@@ -178,10 +206,10 @@ Artifactory bootstrap and editable-install detection entirely. `agentbundle` fal
178
206
  straight through to the packaged default, so hosts without network access to Artifactory
179
207
  still resolve a source without errors.
180
208
 
181
- See the full enterprise adoption guide at
182
- `docs/guides/_shared/how-to/use-an-artifactory-catalogue.md` for all six flows
183
- (org bootstrap, repo-scope CI upgrade, user-scope MDM, source-conflict remediation,
184
- disconnected hosts, and security controls).
209
+ See [Configure catalogue enterprise
210
+ distribution](https://github.com/eugenelim/agent-ready-repo/blob/main/guides/_shared/how-to/configure-catalogue-enterprise-distribution.md)
211
+ for channel setup, authentication, CI upgrades, disconnected hosts, and the
212
+ security boundary.
185
213
 
186
214
  ## Build your own catalogue
187
215
 
@@ -228,6 +256,7 @@ my-pack/
228
256
  evals/ # activation + output-quality evals, skill-local
229
257
  agents/<name>.md # subagents
230
258
  hooks/<name>.py # lifecycle hooks
259
+ hook-wiring/<name>.toml # adapter event wiring for a shipped hook body
231
260
  tests/ # implementation tests — NEVER projected
232
261
  skills/<name>/
233
262
  hooks/
@@ -256,6 +285,12 @@ on the published distribution branch, and every entry is schema-validated at
256
285
  build time against `marketplace-entry.schema.json`. Extra fields stay in `pack.toml`; the projection
257
286
  is deliberately lossy per tool.
258
287
 
288
+ A hook-bearing pack that permits user scope must explicitly set
289
+ `[pack.install] user-scope-hooks = true`. On the Claude-plugin route,
290
+ `agentbundle` compiles supported Claude-shaped wiring into native plugin hooks
291
+ and rejects unsafe event, matcher, timeout, command, or body-path shapes before
292
+ creating output. Direct CLI installs keep their adapter-native wiring contract.
293
+
259
294
  Point a catalogue URI (a git URL or a local path) at the repo that holds your packs. Then `validate` a pack against the adapter contract, `render` it to preview the projection, and `install` it into a target repo. `scaffold` drops a pack's seeds into a fresh directory to start from. The build pipeline (`agentbundle.build`) is the same engine `make build` runs.
260
295
 
261
296
  **Org adapter default:** If your org ships a private `agentbundle` wheel (or a fork pinned to your internal catalogue), you can set a default adapter for all developers without requiring them to run `agentbundle config set` or pass `--adapter` on every install. Add an `[organization]` table to `_data/install-defaults.toml` in your fork:
@@ -265,7 +300,7 @@ Point a catalogue URI (a git URL or a local path) at the repo that holds your pa
265
300
  preferred_adapter = "cursor"
266
301
  ```
267
302
 
268
- The org hint fires after the user-config but before the on-disk IDE probe — so `--adapter`, user-config, and upgrade state-hints all take priority. An invalid value exits 1 before writing anything. See the [`agentbundle` reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/reference/agentbundle.md#org-adapter-default) for the full cascade.
303
+ The org hint fires after the user-config but before the on-disk IDE probe — so `--adapter`, user-config, and upgrade state-hints all take priority. An invalid value exits 1 before writing anything. See the [`agentbundle` reference](https://github.com/eugenelim/agent-ready-repo/blob/main/guides/_shared/reference/agentbundle.md#org-adapter-default) for the full cascade.
269
304
 
270
305
  **Bundled contracts** — the wheel ships the machine contracts used for offline validation:
271
306
  `pack.schema.json`, `skill.schema.json`, `guide.schema.json`, `skill-manifest.schema.json`,
@@ -326,7 +361,7 @@ When `preferred-adapter` names an adapter not in the upstream `SELF_HOST_ADAPTER
326
361
  agentbundle pack evals run --pack <pack-name> --catalogue-root .
327
362
  ```
328
363
 
329
- See the [pack layout reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/architecture/pack-layout.md) and [authoring a skill](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/how-to/author-a-skill.md).
364
+ See the [pack layout reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/architecture/pack-layout.md) and [authoring a skill](https://github.com/eugenelim/agent-ready-repo/blob/main/guides/_shared/how-to/author-a-skill.md).
330
365
 
331
366
  ## Catalogue defaults and pack config API
332
367
 
@@ -54,6 +54,25 @@
54
54
  ]
55
55
  },
56
56
  "target-path": {"type": "string"},
57
+ "plugin-target-path": {"type": "string"},
58
+ "plugin-mode": {
59
+ "type": "string",
60
+ "enum": [
61
+ "direct-directory",
62
+ "direct-file",
63
+ "merge-json",
64
+ "user-merge-json",
65
+ "merge-into-agent-json",
66
+ "instruction-file",
67
+ "managed-block-inline",
68
+ "degraded-info-log",
69
+ "dropped",
70
+ "codex-agent-toml",
71
+ "copilot-agent-md",
72
+ "copilot-hooks-json",
73
+ "gemini-command-toml"
74
+ ]
75
+ },
57
76
  "on-conflict": {
58
77
  "type": "string",
59
78
  "enum": [
@@ -90,7 +90,10 @@
90
90
  # reader cohort. cursor/gemini/copilot route the `skill` primitive to the shared
91
91
  # `.agents/skills/` home (joining codex) and gain it in `allowed-prefixes` at
92
92
  # both scopes; their agent/hook/command projection stays native.
93
- version = "0.17"
93
+ # v0.18 (Claude-plugin hook parity): `hook-body` gains the plugin-root
94
+ # `hooks/` target and `hook-wiring` is dropped from the ordinary projection on
95
+ # that route after its entries are compiled into plugin.json.
96
+ version = "0.18"
94
97
 
95
98
  # Sibling schemas this contract references — pack metadata and the
96
99
  # per-pack Claude-plugin manifest.
@@ -202,11 +205,13 @@ on-conflict = "prompt-then-preserve"
202
205
  primitive = "hook-body"
203
206
  mode = "direct-file"
204
207
  target-path = "tools/hooks/"
208
+ plugin-target-path = "hooks/"
205
209
  on-conflict = "prompt-then-preserve"
206
210
 
207
211
  [[adapter."claude-code".projection]]
208
212
  primitive = "hook-wiring"
209
213
  mode = "merge-json"
214
+ plugin-mode = "dropped"
210
215
  target-path = ".claude/settings.local.json"
211
216
  managed-key = "hooks"
212
217
  on-conflict = "merge-managed-key-only"
@@ -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
+ ]
@@ -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}"
@@ -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