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.
Files changed (530) hide show
  1. agentbundle-0.31.1/MANIFEST.in +16 -0
  2. {agentbundle-0.31.0 → agentbundle-0.31.1}/PKG-INFO +2 -4
  3. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/manifest.json +4 -1
  4. agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +27 -0
  5. agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +42 -0
  6. agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +14 -0
  7. agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +67 -0
  8. agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +116 -0
  9. agentbundle-0.31.1/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +40 -0
  10. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/__init__.py +17 -15
  11. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/__init__.py +12 -3
  12. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/claude_code.py +5 -6
  13. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/codex.py +8 -7
  14. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/copilot.py +5 -3
  15. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/kiro.py +18 -18
  16. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/kiro_ide.py +5 -13
  17. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/lint_packs.py +25 -16
  18. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/main.py +6 -3
  19. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/phase_order.py +0 -1
  20. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/codex_agent_toml.py +1 -2
  21. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/copilot_agent_md.py +0 -1
  22. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -1
  23. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/kiro_ide_hook.py +2 -2
  24. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/scope_rails.py +1 -2
  25. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/self_host.py +25 -21
  26. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/target_resolver.py +0 -1
  27. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/validate.py +36 -29
  28. agentbundle-0.31.1/agentbundle/catalogue_tooling/file_safety.py +63 -0
  29. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/initialise_self_hosted.py +86 -23
  30. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/package.py +51 -20
  31. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +7 -4
  32. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/version.py +1 -1
  33. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/PKG-INFO +2 -4
  34. agentbundle-0.31.1/agentbundle.egg-info/SOURCES.txt +526 -0
  35. agentbundle-0.31.1/conftest.py +25 -0
  36. {agentbundle-0.31.0 → agentbundle-0.31.1}/pyproject.toml +10 -6
  37. agentbundle-0.31.1/templates/install-marker.py +1166 -0
  38. agentbundle-0.31.1/tests/__init__.py +1 -0
  39. agentbundle-0.31.1/tests/_support.py +192 -0
  40. agentbundle-0.31.1/tests/build_pipeline/__init__.py +0 -0
  41. agentbundle-0.31.1/tests/build_pipeline/fixtures/README.md +40 -0
  42. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +6 -0
  43. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +3 -0
  44. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +2 -0
  45. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +2 -0
  46. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +3 -0
  47. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +7 -0
  48. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +5 -0
  49. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/core/pack.toml +13 -0
  50. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +7 -0
  51. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +5 -0
  52. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +16 -0
  53. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +7 -0
  54. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +5 -0
  55. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +11 -0
  56. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +7 -0
  57. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +5 -0
  58. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +11 -0
  59. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +7 -0
  60. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +5 -0
  61. agentbundle-0.31.1/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +4 -0
  62. agentbundle-0.31.1/tests/build_pipeline/fixtures/recipes/bogus-target.toml +9 -0
  63. agentbundle-0.31.1/tests/build_pipeline/test_adapter_claude_code.py +281 -0
  64. agentbundle-0.31.1/tests/build_pipeline/test_adapter_codex.py +719 -0
  65. agentbundle-0.31.1/tests/build_pipeline/test_adapter_copilot.py +120 -0
  66. agentbundle-0.31.1/tests/build_pipeline/test_adapter_cursor.py +421 -0
  67. agentbundle-0.31.1/tests/build_pipeline/test_adapter_gemini.py +560 -0
  68. agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro.py +464 -0
  69. agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro_alias.py +105 -0
  70. agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro_cli.py +143 -0
  71. agentbundle-0.31.1/tests/build_pipeline/test_adapter_kiro_ide.py +214 -0
  72. agentbundle-0.31.1/tests/build_pipeline/test_adapter_root_bins_projection.py +700 -0
  73. agentbundle-0.31.1/tests/build_pipeline/test_build_ships_seeds.py +82 -0
  74. agentbundle-0.31.1/tests/build_pipeline/test_contract.py +598 -0
  75. agentbundle-0.31.1/tests/build_pipeline/test_contract_scope.py +224 -0
  76. agentbundle-0.31.1/tests/build_pipeline/test_contract_v07.py +176 -0
  77. agentbundle-0.31.1/tests/build_pipeline/test_contract_v08.py +249 -0
  78. agentbundle-0.31.1/tests/build_pipeline/test_direct_directory_cleanup.py +65 -0
  79. agentbundle-0.31.1/tests/build_pipeline/test_end_to_end_build.py +246 -0
  80. agentbundle-0.31.1/tests/build_pipeline/test_lint_packs.py +714 -0
  81. agentbundle-0.31.1/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +175 -0
  82. agentbundle-0.31.1/tests/build_pipeline/test_pack_schema.py +494 -0
  83. agentbundle-0.31.1/tests/build_pipeline/test_pack_schema_allowed_adapters.py +255 -0
  84. agentbundle-0.31.1/tests/build_pipeline/test_pack_schema_install.py +305 -0
  85. agentbundle-0.31.1/tests/build_pipeline/test_pipeline.py +298 -0
  86. agentbundle-0.31.1/tests/build_pipeline/test_plugin_manifest_schema.py +356 -0
  87. agentbundle-0.31.1/tests/build_pipeline/test_projectable_subset.py +202 -0
  88. agentbundle-0.31.1/tests/build_pipeline/test_projections_merge_json.py +151 -0
  89. agentbundle-0.31.1/tests/build_pipeline/test_scope_rails.py +399 -0
  90. agentbundle-0.31.1/tests/build_pipeline/test_security.py +101 -0
  91. agentbundle-0.31.1/tests/build_pipeline/test_self_host_check.py +2556 -0
  92. agentbundle-0.31.1/tests/build_pipeline/test_self_host_fixture_guard.py +149 -0
  93. agentbundle-0.31.1/tests/build_pipeline/test_self_host_recipe_config.py +113 -0
  94. agentbundle-0.31.1/tests/build_pipeline/test_shared_libs_projection.py +139 -0
  95. agentbundle-0.31.1/tests/build_pipeline/test_shared_prefix_contract.py +97 -0
  96. agentbundle-0.31.1/tests/build_pipeline/test_user_libs_projection.py +492 -0
  97. agentbundle-0.31.1/tests/build_pipeline/test_validate.py +250 -0
  98. agentbundle-0.31.1/tests/build_pipeline/test_writers_emit_lf.py +172 -0
  99. agentbundle-0.31.1/tests/conftest.py +44 -0
  100. agentbundle-0.31.1/tests/fixtures/adapt/.adapt-discovery.toml +5 -0
  101. agentbundle-0.31.1/tests/fixtures/adapt/values.toml +3 -0
  102. agentbundle-0.31.1/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +8 -0
  103. agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
  104. agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +27 -0
  105. agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +9 -0
  106. agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/README.md +70 -0
  107. agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +42 -0
  108. agentbundle-0.31.1/tests/fixtures/blank_catalogue/packs/_example/pack.toml +20 -0
  109. agentbundle-0.31.1/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
  110. agentbundle-0.31.1/tests/fixtures/blank_catalogue/profiles/_example/README.md +24 -0
  111. agentbundle-0.31.1/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +5 -0
  112. agentbundle-0.31.1/tests/fixtures/brownfield/values.toml +3 -0
  113. agentbundle-0.31.1/tests/fixtures/brownfield-adapt/AGENTS.md +5 -0
  114. agentbundle-0.31.1/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +5 -0
  115. agentbundle-0.31.1/tests/fixtures/brownfield-adapt/DESIGN.md +6 -0
  116. agentbundle-0.31.1/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +53 -0
  117. agentbundle-0.31.1/tests/fixtures/brownfield-adapt/docs/CHARTER.md +5 -0
  118. agentbundle-0.31.1/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +5 -0
  119. agentbundle-0.31.1/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +8 -0
  120. agentbundle-0.31.1/tests/fixtures/brownfield-adapt-expected/AGENTS.md +5 -0
  121. agentbundle-0.31.1/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +5 -0
  122. agentbundle-0.31.1/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +12 -0
  123. agentbundle-0.31.1/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +1 -0
  124. agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag/SKILL.md +23 -0
  125. agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +15 -0
  126. agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +22 -0
  127. agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +28 -0
  128. agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +22 -0
  129. agentbundle-0.31.1/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +23 -0
  130. agentbundle-0.31.1/tests/fixtures/creds/skills/conforming/SKILL.md +23 -0
  131. agentbundle-0.31.1/tests/fixtures/creds/skills/conforming/scripts/cli.py +15 -0
  132. agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +22 -0
  133. agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +12 -0
  134. agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +25 -0
  135. agentbundle-0.31.1/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +13 -0
  136. agentbundle-0.31.1/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +26 -0
  137. agentbundle-0.31.1/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +17 -0
  138. agentbundle-0.31.1/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +10 -0
  139. agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +6 -0
  140. agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +3 -0
  141. agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +2 -0
  142. agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +3 -0
  143. agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +7 -0
  144. agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +5 -0
  145. agentbundle-0.31.1/tests/fixtures/install/catalogue/packs/alpha/pack.toml +13 -0
  146. agentbundle-0.31.1/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +13 -0
  147. agentbundle-0.31.1/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +13 -0
  148. agentbundle-0.31.1/tests/fixtures/lint_packs/clean/pack.toml +11 -0
  149. agentbundle-0.31.1/tests/fixtures/lint_packs/clean/seeds/README.md +3 -0
  150. agentbundle-0.31.1/tests/fixtures/list-installed/golden_120col.txt +5 -0
  151. agentbundle-0.31.1/tests/fixtures/list-installed/golden_80col.txt +5 -0
  152. agentbundle-0.31.1/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +5 -0
  153. agentbundle-0.31.1/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +10 -0
  154. agentbundle-0.31.1/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +3 -0
  155. agentbundle-0.31.1/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +5 -0
  156. agentbundle-0.31.1/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +8 -0
  157. agentbundle-0.31.1/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +2 -0
  158. agentbundle-0.31.1/tests/fixtures/packs/cc-user-hooks/pack.toml +18 -0
  159. agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +8 -0
  160. agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +5 -0
  161. agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +2 -0
  162. agentbundle-0.31.1/tests/fixtures/packs/kiro-repo-hooks/pack.toml +20 -0
  163. agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +8 -0
  164. agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +5 -0
  165. agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +2 -0
  166. agentbundle-0.31.1/tests/fixtures/packs/kiro-user-hooks/pack.toml +21 -0
  167. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +5 -0
  168. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +5 -0
  169. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +2 -0
  170. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +14 -0
  171. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +5 -0
  172. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +7 -0
  173. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +2 -0
  174. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +16 -0
  175. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +5 -0
  176. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +7 -0
  177. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +2 -0
  178. agentbundle-0.31.1/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +13 -0
  179. agentbundle-0.31.1/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +1 -0
  180. agentbundle-0.31.1/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +1 -0
  181. agentbundle-0.31.1/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +1 -0
  182. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +6 -0
  183. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +3 -0
  184. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +10 -0
  185. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +3 -0
  186. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +3 -0
  187. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
  188. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +5 -0
  189. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +13 -0
  190. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +6 -0
  191. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +3 -0
  192. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +10 -0
  193. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +3 -0
  194. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +3 -0
  195. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
  196. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +5 -0
  197. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +13 -0
  198. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +6 -0
  199. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +3 -0
  200. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +10 -0
  201. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +3 -0
  202. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +3 -0
  203. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +3 -0
  204. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +5 -0
  205. agentbundle-0.31.1/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +13 -0
  206. agentbundle-0.31.1/tests/fixtures/validate/bad_recipe_pack/pack.toml +5 -0
  207. agentbundle-0.31.1/tests/fixtures/validate/malformed_pack/pack.toml +1 -0
  208. agentbundle-0.31.1/tests/fixtures/validate/valid_pack/pack.toml +4 -0
  209. agentbundle-0.31.1/tests/fixtures/validate/version_mismatch_pack/pack.toml +7 -0
  210. agentbundle-0.31.1/tests/integration/__init__.py +0 -0
  211. agentbundle-0.31.1/tests/integration/test_adapt_cmd.py +317 -0
  212. agentbundle-0.31.1/tests/integration/test_adapt_dual_scope.py +247 -0
  213. agentbundle-0.31.1/tests/integration/test_adapt_preflight_detection.py +217 -0
  214. agentbundle-0.31.1/tests/integration/test_adapt_schema_migration.py +125 -0
  215. agentbundle-0.31.1/tests/integration/test_apm_install_route.py +788 -0
  216. agentbundle-0.31.1/tests/integration/test_blank_catalogue.py +58 -0
  217. agentbundle-0.31.1/tests/integration/test_brownfield_adapt_end_to_end.py +205 -0
  218. agentbundle-0.31.1/tests/integration/test_brownfield_round_trip.py +133 -0
  219. agentbundle-0.31.1/tests/integration/test_brownfield_user_home_fixture.py +44 -0
  220. agentbundle-0.31.1/tests/integration/test_build_check_drift_gates.py +523 -0
  221. agentbundle-0.31.1/tests/integration/test_build_derivation_apm.py +181 -0
  222. agentbundle-0.31.1/tests/integration/test_build_derivation_claude_plugins.py +576 -0
  223. agentbundle-0.31.1/tests/integration/test_catalogue_init.py +465 -0
  224. agentbundle-0.31.1/tests/integration/test_cc_user_hooks_fixture.py +107 -0
  225. agentbundle-0.31.1/tests/integration/test_claude_plugins_install_route.py +1791 -0
  226. agentbundle-0.31.1/tests/integration/test_config_cascade.py +174 -0
  227. agentbundle-0.31.1/tests/integration/test_credential_brokers_pack_install.py +205 -0
  228. agentbundle-0.31.1/tests/integration/test_credentials_wheel.py +75 -0
  229. agentbundle-0.31.1/tests/integration/test_discovery_schema_cross_consumer.py +116 -0
  230. agentbundle-0.31.1/tests/integration/test_editable_source_detection.py +113 -0
  231. agentbundle-0.31.1/tests/integration/test_fixtures_validate.py +226 -0
  232. agentbundle-0.31.1/tests/integration/test_install_adapt_chain.py +442 -0
  233. agentbundle-0.31.1/tests/integration/test_install_cmd.py +691 -0
  234. agentbundle-0.31.1/tests/integration/test_install_converters_user_scope.py +190 -0
  235. agentbundle-0.31.1/tests/integration/test_install_copilot_full_parity.py +278 -0
  236. agentbundle-0.31.1/tests/integration/test_install_core_smoke.py +89 -0
  237. agentbundle-0.31.1/tests/integration/test_install_default_source.py +187 -0
  238. agentbundle-0.31.1/tests/integration/test_install_dependencies_gate.py +321 -0
  239. agentbundle-0.31.1/tests/integration/test_install_dropped_primitives_warning.py +550 -0
  240. agentbundle-0.31.1/tests/integration/test_install_dual_scope.py +440 -0
  241. agentbundle-0.31.1/tests/integration/test_install_orphan_reshape.py +135 -0
  242. agentbundle-0.31.1/tests/integration/test_install_pack_metadata_shape.py +278 -0
  243. agentbundle-0.31.1/tests/integration/test_install_profile.py +408 -0
  244. agentbundle-0.31.1/tests/integration/test_install_profile_live.py +103 -0
  245. agentbundle-0.31.1/tests/integration/test_install_repo_scope_per_adapter.py +730 -0
  246. agentbundle-0.31.1/tests/integration/test_install_research_user_scope.py +200 -0
  247. agentbundle-0.31.1/tests/integration/test_install_seed_delivery.py +222 -0
  248. agentbundle-0.31.1/tests/integration/test_install_session_start_wiring.py +139 -0
  249. agentbundle-0.31.1/tests/integration/test_install_upgrade_offer.py +243 -0
  250. agentbundle-0.31.1/tests/integration/test_install_user_hooks.py +411 -0
  251. agentbundle-0.31.1/tests/integration/test_install_user_scope_allowed_adapters.py +225 -0
  252. agentbundle-0.31.1/tests/integration/test_kiro_ide_hook_e2e.py +204 -0
  253. agentbundle-0.31.1/tests/integration/test_kiro_repo_hooks_fixture.py +93 -0
  254. agentbundle-0.31.1/tests/integration/test_kiro_user_hooks_fixture.py +155 -0
  255. agentbundle-0.31.1/tests/integration/test_list_packs_cmd.py +148 -0
  256. agentbundle-0.31.1/tests/integration/test_local_scope_install.py +377 -0
  257. agentbundle-0.31.1/tests/integration/test_marketplace_entry_validation.py +390 -0
  258. agentbundle-0.31.1/tests/integration/test_marketplace_manifest_regression.py +303 -0
  259. agentbundle-0.31.1/tests/integration/test_multi_pack_install.py +805 -0
  260. agentbundle-0.31.1/tests/integration/test_orphan_cleanup_respects_foreign_state.py +273 -0
  261. agentbundle-0.31.1/tests/integration/test_plugin_route_membership.py +613 -0
  262. agentbundle-0.31.1/tests/integration/test_recommends_cross_scope.py +228 -0
  263. agentbundle-0.31.1/tests/integration/test_reconcile.py +230 -0
  264. agentbundle-0.31.1/tests/integration/test_reserved_path_filter.py +236 -0
  265. agentbundle-0.31.1/tests/integration/test_scaffold_projection.py +147 -0
  266. agentbundle-0.31.1/tests/integration/test_self_host_schema_migration.py +138 -0
  267. agentbundle-0.31.1/tests/integration/test_self_host_sweep_respects_state.py +312 -0
  268. agentbundle-0.31.1/tests/integration/test_shared_prefix_coexistence.py +235 -0
  269. agentbundle-0.31.1/tests/integration/test_show_cmd.py +515 -0
  270. agentbundle-0.31.1/tests/integration/test_tier_invariants.py +335 -0
  271. agentbundle-0.31.1/tests/integration/test_uninstall_cmd.py +381 -0
  272. agentbundle-0.31.1/tests/integration/test_uninstall_user_hooks.py +327 -0
  273. agentbundle-0.31.1/tests/integration/test_upgrade_attach_to_agent.py +140 -0
  274. agentbundle-0.31.1/tests/integration/test_upgrade_cmd.py +1087 -0
  275. agentbundle-0.31.1/tests/integration/test_upgrade_user_hooks.py +307 -0
  276. agentbundle-0.31.1/tests/integration/test_version_gate_matrix.py +163 -0
  277. agentbundle-0.31.1/tests/integration/test_workspace_mcp_git_fsm.py +156 -0
  278. agentbundle-0.31.1/tests/integration/test_zipapp.py +92 -0
  279. agentbundle-0.31.1/tests/unit/__init__.py +0 -0
  280. agentbundle-0.31.1/tests/unit/test_adapt_discovery_schema.py +292 -0
  281. agentbundle-0.31.1/tests/unit/test_append_layout_section.py +238 -0
  282. agentbundle-0.31.1/tests/unit/test_architect_readme_install_command.py +26 -0
  283. agentbundle-0.31.1/tests/unit/test_catalogue_ci_contract.py +244 -0
  284. agentbundle-0.31.1/tests/unit/test_catalogue_curation_deps.py +62 -0
  285. agentbundle-0.31.1/tests/unit/test_catalogue_init_cli_self_hosted.py +206 -0
  286. agentbundle-0.31.1/tests/unit/test_catalogue_pack_defaults.py +596 -0
  287. agentbundle-0.31.1/tests/unit/test_catalogue_self_hosted_export_removal.py +27 -0
  288. agentbundle-0.31.1/tests/unit/test_catalogue_skill_spec_lint.py +913 -0
  289. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_archive.py +296 -0
  290. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_build.py +98 -0
  291. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_defaults.py +267 -0
  292. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_foundation.py +584 -0
  293. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_identity.py +151 -0
  294. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_init.py +783 -0
  295. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_lint.py +1146 -0
  296. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_package.py +958 -0
  297. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_self_host.py +314 -0
  298. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_self_hosted_init.py +1069 -0
  299. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_source_package.py +386 -0
  300. agentbundle-0.31.1/tests/unit/test_catalogue_tooling_verify.py +461 -0
  301. agentbundle-0.31.1/tests/unit/test_catalogue_wave2_schema.py +171 -0
  302. agentbundle-0.31.1/tests/unit/test_catalogue_wave2_validation.py +272 -0
  303. agentbundle-0.31.1/tests/unit/test_cli_catalogue_optional.py +38 -0
  304. agentbundle-0.31.1/tests/unit/test_cli_help_lists_config.py +45 -0
  305. agentbundle-0.31.1/tests/unit/test_cli_path_normalisation.py +161 -0
  306. agentbundle-0.31.1/tests/unit/test_cli_profile_surface.py +87 -0
  307. agentbundle-0.31.1/tests/unit/test_cli_scope_flags.py +193 -0
  308. agentbundle-0.31.1/tests/unit/test_codex_agent_toml.py +350 -0
  309. agentbundle-0.31.1/tests/unit/test_codex_projection_modes.py +193 -0
  310. agentbundle-0.31.1/tests/unit/test_common_classify_seeds.py +164 -0
  311. agentbundle-0.31.1/tests/unit/test_config.py +187 -0
  312. agentbundle-0.31.1/tests/unit/test_config_cmd.py +136 -0
  313. agentbundle-0.31.1/tests/unit/test_configured_adapter.py +35 -0
  314. agentbundle-0.31.1/tests/unit/test_confirm_helper.py +67 -0
  315. agentbundle-0.31.1/tests/unit/test_contract_parity.py +30 -0
  316. agentbundle-0.31.1/tests/unit/test_contract_v0_3_schema.py +598 -0
  317. agentbundle-0.31.1/tests/unit/test_copilot_agent_md.py +182 -0
  318. agentbundle-0.31.1/tests/unit/test_copilot_hooks_json.py +147 -0
  319. agentbundle-0.31.1/tests/unit/test_copilot_user_scope_wiring.py +151 -0
  320. agentbundle-0.31.1/tests/unit/test_credbroker_lint_hardening.py +167 -0
  321. agentbundle-0.31.1/tests/unit/test_dependencies_batch.py +117 -0
  322. agentbundle-0.31.1/tests/unit/test_diff_cmd.py +115 -0
  323. agentbundle-0.31.1/tests/unit/test_footprint_ownership.py +114 -0
  324. agentbundle-0.31.1/tests/unit/test_https_catalogue.py +1080 -0
  325. agentbundle-0.31.1/tests/unit/test_init_state_cmd.py +176 -0
  326. agentbundle-0.31.1/tests/unit/test_install_argparse_adapter_flag.py +82 -0
  327. agentbundle-0.31.1/tests/unit/test_install_argparse_emit_install_routes.py +263 -0
  328. agentbundle-0.31.1/tests/unit/test_install_defaults_preferred_adapter.py +343 -0
  329. agentbundle-0.31.1/tests/unit/test_install_dropped_primitives_warning.py +782 -0
  330. agentbundle-0.31.1/tests/unit/test_install_event_dropped_wirings.py +467 -0
  331. agentbundle-0.31.1/tests/unit/test_install_first_value_handoff.py +387 -0
  332. agentbundle-0.31.1/tests/unit/test_install_force_help.py +33 -0
  333. agentbundle-0.31.1/tests/unit/test_install_inband_detection.py +580 -0
  334. agentbundle-0.31.1/tests/unit/test_install_messages.py +136 -0
  335. agentbundle-0.31.1/tests/unit/test_install_messages_repo_scope.py +289 -0
  336. agentbundle-0.31.1/tests/unit/test_install_refusal_ordering.py +211 -0
  337. agentbundle-0.31.1/tests/unit/test_install_state_provenance.py +215 -0
  338. agentbundle-0.31.1/tests/unit/test_kiro_ide_hook_projection.py +389 -0
  339. agentbundle-0.31.1/tests/unit/test_kiro_ide_hook_rail.py +335 -0
  340. agentbundle-0.31.1/tests/unit/test_kiro_ide_hook_schema.py +125 -0
  341. agentbundle-0.31.1/tests/unit/test_lint_agent_artifacts_metadata_auth.py +166 -0
  342. agentbundle-0.31.1/tests/unit/test_list_installed_cmd.py +349 -0
  343. agentbundle-0.31.1/tests/unit/test_list_installed_status.py +1197 -0
  344. agentbundle-0.31.1/tests/unit/test_list_targets_cmd.py +120 -0
  345. agentbundle-0.31.1/tests/unit/test_local_scope_schema.py +83 -0
  346. agentbundle-0.31.1/tests/unit/test_local_scope_t10_uninstall.py +353 -0
  347. agentbundle-0.31.1/tests/unit/test_local_scope_t12_show.py +71 -0
  348. agentbundle-0.31.1/tests/unit/test_local_scope_t2_resolve.py +64 -0
  349. agentbundle-0.31.1/tests/unit/test_local_scope_t3_config.py +37 -0
  350. agentbundle-0.31.1/tests/unit/test_local_scope_t4_state_path.py +28 -0
  351. agentbundle-0.31.1/tests/unit/test_local_scope_t5_list_installed.py +131 -0
  352. agentbundle-0.31.1/tests/unit/test_local_scope_t7_install_gates.py +229 -0
  353. agentbundle-0.31.1/tests/unit/test_local_scope_t8_install.py +401 -0
  354. agentbundle-0.31.1/tests/unit/test_local_scope_t9_exclude.py +253 -0
  355. agentbundle-0.31.1/tests/unit/test_marker_schema_version_parity.py +51 -0
  356. agentbundle-0.31.1/tests/unit/test_merge_into_agent_json.py +347 -0
  357. agentbundle-0.31.1/tests/unit/test_multi_adapter_disambiguator.py +83 -0
  358. agentbundle-0.31.1/tests/unit/test_nested_symlink_hardening.py +154 -0
  359. agentbundle-0.31.1/tests/unit/test_org_bootstrap.py +746 -0
  360. agentbundle-0.31.1/tests/unit/test_pack_config_api.py +469 -0
  361. agentbundle-0.31.1/tests/unit/test_pack_inventory.py +122 -0
  362. agentbundle-0.31.1/tests/unit/test_package_catalogue.py +1190 -0
  363. agentbundle-0.31.1/tests/unit/test_packstate_source_provenance.py +245 -0
  364. agentbundle-0.31.1/tests/unit/test_pipeline_phase_order.py +264 -0
  365. agentbundle-0.31.1/tests/unit/test_plugin_scope_filter.py +179 -0
  366. agentbundle-0.31.1/tests/unit/test_profile_reader.py +172 -0
  367. agentbundle-0.31.1/tests/unit/test_render.py +49 -0
  368. agentbundle-0.31.1/tests/unit/test_render_cmd.py +238 -0
  369. agentbundle-0.31.1/tests/unit/test_render_table.py +162 -0
  370. agentbundle-0.31.1/tests/unit/test_resolve_state_path.py +19 -0
  371. agentbundle-0.31.1/tests/unit/test_resolve_target_adapter_user_config.py +279 -0
  372. agentbundle-0.31.1/tests/unit/test_resolve_user_scope_target_adapter.py +690 -0
  373. agentbundle-0.31.1/tests/unit/test_safety.py +287 -0
  374. agentbundle-0.31.1/tests/unit/test_safety_repo_scope_prefixes.py +211 -0
  375. agentbundle-0.31.1/tests/unit/test_safety_scan_per_pack_scoping.py +473 -0
  376. agentbundle-0.31.1/tests/unit/test_scaffold_cmd.py +300 -0
  377. agentbundle-0.31.1/tests/unit/test_scope.py +186 -0
  378. agentbundle-0.31.1/tests/unit/test_self_host_windows.py +189 -0
  379. agentbundle-0.31.1/tests/unit/test_shared_prefix_disclosure.py +62 -0
  380. agentbundle-0.31.1/tests/unit/test_source_conflict_guard.py +585 -0
  381. agentbundle-0.31.1/tests/unit/test_source_defaults.py +572 -0
  382. agentbundle-0.31.1/tests/unit/test_state_v01_refuse_write.py +177 -0
  383. agentbundle-0.31.1/tests/unit/test_state_v02.py +158 -0
  384. agentbundle-0.31.1/tests/unit/test_state_v0_4_schema.py +227 -0
  385. agentbundle-0.31.1/tests/unit/test_statelock.py +111 -0
  386. agentbundle-0.31.1/tests/unit/test_target_resolver.py +181 -0
  387. agentbundle-0.31.1/tests/unit/test_toml_emitters.py +417 -0
  388. agentbundle-0.31.1/tests/unit/test_unresolved_markers.py +40 -0
  389. agentbundle-0.31.1/tests/unit/test_upgrade_bulk_all.py +1137 -0
  390. agentbundle-0.31.1/tests/unit/test_upgrade_recap.py +52 -0
  391. agentbundle-0.31.1/tests/unit/test_upgrade_source_inference.py +165 -0
  392. agentbundle-0.31.1/tests/unit/test_user_config_io.py +202 -0
  393. agentbundle-0.31.1/tests/unit/test_user_config_isolation.py +29 -0
  394. agentbundle-0.31.1/tests/unit/test_user_config_path.py +47 -0
  395. agentbundle-0.31.1/tests/unit/test_user_config_source.py +84 -0
  396. agentbundle-0.31.1/tests/unit/test_user_merge_json.py +420 -0
  397. agentbundle-0.31.1/tests/unit/test_validate_attach_to_agent.py +302 -0
  398. agentbundle-0.31.1/tests/unit/test_validate_categories.py +92 -0
  399. agentbundle-0.31.1/tests/unit/test_validate_cmd.py +329 -0
  400. agentbundle-0.31.1/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +422 -0
  401. agentbundle-0.31.1/tests/unit/test_values_from_shapes.py +68 -0
  402. agentbundle-0.31.1/tests/unit/test_version.py +129 -0
  403. agentbundle-0.31.0/agentbundle.egg-info/SOURCES.txt +0 -152
  404. agentbundle-0.31.0/tests/test_linear_primitive.py +0 -133
  405. {agentbundle-0.31.0 → agentbundle-0.31.1}/README-pypi.md +0 -0
  406. {agentbundle-0.31.0 → agentbundle-0.31.1}/README.md +0 -0
  407. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/__init__.py +0 -0
  408. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/__main__.py +0 -0
  409. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/adapter.schema.json +0 -0
  410. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/adapter.toml +0 -0
  411. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
  412. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  413. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
  414. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  415. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  416. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  417. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  418. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  419. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  420. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  421. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/catalogue.schema.json +0 -0
  422. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/guide.schema.json +0 -0
  423. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/install-defaults.toml +0 -0
  424. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/install-marker.py +0 -0
  425. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/marketplace-entry.schema.json +0 -0
  426. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/pack.schema.json +0 -0
  427. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  428. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  429. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/profile.schema.json +0 -0
  430. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/skill-manifest.schema.json +0 -0
  431. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/skill.schema.json +0 -0
  432. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/_data/target-vocab.toml +0 -0
  433. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/__main__.py +0 -0
  434. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapter_root_bins.py +0 -0
  435. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/cursor.py +0 -0
  436. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/gemini.py +0 -0
  437. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
  438. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/contract.py +0 -0
  439. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projection_io.py +0 -0
  440. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/__init__.py +0 -0
  441. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/direct_directory.py +0 -0
  442. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  443. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/hook_id.py +0 -0
  444. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  445. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/merge_json.py +0 -0
  446. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/projections/user_merge_json.py +0 -0
  447. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  448. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  449. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/marketplace.toml +0 -0
  450. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  451. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  452. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  453. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/recipes/self-host.toml +0 -0
  454. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/shared_libs.py +0 -0
  455. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/build/user_libs.py +0 -0
  456. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue.py +0 -0
  457. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
  458. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/archive.py +0 -0
  459. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/build.py +0 -0
  460. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/config.py +0 -0
  461. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
  462. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  463. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/identity.py +0 -0
  464. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/initialise.py +0 -0
  465. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/lint.py +0 -0
  466. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/results.py +0 -0
  467. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
  468. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
  469. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  470. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/catalogue_tooling/verify.py +0 -0
  471. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/categories.py +0 -0
  472. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/cli.py +0 -0
  473. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/__init__.py +0 -0
  474. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/_common.py +0 -0
  475. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/_drop_warning.py +0 -0
  476. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/adapt.py +0 -0
  477. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_build.py +0 -0
  478. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_init.py +0 -0
  479. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_lint.py +0 -0
  480. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_package.py +0 -0
  481. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_self_host.py +0 -0
  482. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  483. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  484. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/catalogue_verify.py +0 -0
  485. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/config.py +0 -0
  486. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/diff.py +0 -0
  487. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/docs.py +0 -0
  488. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/init_state.py +0 -0
  489. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/install.py +0 -0
  490. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_installed.py +0 -0
  491. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_packs.py +0 -0
  492. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_profiles.py +0 -0
  493. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/list_targets.py +0 -0
  494. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/oplog_cmd.py +0 -0
  495. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/pack_config_cmd.py +0 -0
  496. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/pack_evals.py +0 -0
  497. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/package_catalogue.py +0 -0
  498. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/profile.py +0 -0
  499. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/reconcile.py +0 -0
  500. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/render.py +0 -0
  501. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/scaffold.py +0 -0
  502. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/show.py +0 -0
  503. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/uninstall.py +0 -0
  504. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/upgrade.py +0 -0
  505. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/commands/validate.py +0 -0
  506. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/config.py +0 -0
  507. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/https_catalogue.py +0 -0
  508. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/local_exclude.py +0 -0
  509. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/oplog.py +0 -0
  510. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/pack_inventory.py +0 -0
  511. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/render.py +0 -0
  512. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/safety.py +0 -0
  513. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/scaffold.py +0 -0
  514. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/scope.py +0 -0
  515. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/source_defaults.py +0 -0
  516. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/statelock.py +0 -0
  517. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/user_config.py +0 -0
  518. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle/workspace_mcp.py +0 -0
  519. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/dependency_links.txt +0 -0
  520. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/entry_points.txt +0 -0
  521. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/requires.txt +0 -0
  522. {agentbundle-0.31.0 → agentbundle-0.31.1}/agentbundle.egg-info/top_level.txt +0 -0
  523. {agentbundle-0.31.0 → agentbundle-0.31.1}/setup.cfg +0 -0
  524. {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_adapter_permissions_projection.py +0 -0
  525. {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_elicit.py +0 -0
  526. {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_event_bridge.py +0 -0
  527. {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_git.py +0 -0
  528. {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_lifecycle.py +0 -0
  529. {agentbundle-0.31.0 → agentbundle-0.31.1}/tests/test_workspace_mcp_stdin.py +0 -0
  530. {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.0
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
@@ -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
@@ -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
- schema_path = (
46
- Path(__file__).resolve().parent.parent.parent.parent.parent
47
- / "contracts"
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
- f"validate: adapter.schema.json not found at {schema_path}",
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(schema_path.read_text(encoding="utf-8"))
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; use 'agentbundle catalogue build --root .' instead",
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; use 'agentbundle catalogue self-host --write --root .' instead",
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; use 'agentbundle catalogue self-host --check --root .' instead",
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; use 'agentbundle catalogue lint --root .' instead",
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, Dict, Mapping
8
+ from typing import Callable, Mapping
9
9
 
10
- from agentbundle.build.adapters import claude_code, codex, copilot, cursor, gemini, kiro, kiro_cli, kiro_ide
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: Dict[str, Callable] = {
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 = {entry["primitive"]: entry for entry in adapter_block.get("projection", [])}
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 os.path.isabs(os.readlink(base / name)))
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
- os.replace(tmp_path, agents_md)
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 = {entry["primitive"]: entry for entry in adapter_block.get("projection", [])}
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 os.path.isabs(os.readlink(base / name)))
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 = {entry["primitive"]: entry for entry in adapter_block.get("projection", [])}
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 = adapter_block.get("projections", {}) if isinstance(adapter_block.get("projections"), dict) else {}
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 = adapter_block.get("projections", {}) if isinstance(adapter_block.get("projections"), dict) else {}
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