agentbundle 0.32.0__tar.gz → 0.33.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/agentbundle.egg-info → agentbundle-0.33.0}/PKG-INFO +16 -3
  2. {agentbundle-0.32.0 → agentbundle-0.33.0}/README-pypi.md +15 -2
  3. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/self_host.py +10 -5
  4. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/archive.py +67 -41
  5. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/config.py +2 -2
  6. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/lint.py +104 -31
  7. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/verify.py +76 -33
  8. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/https_catalogue.py +34 -11
  9. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/source_defaults.py +22 -9
  10. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/version.py +1 -1
  11. {agentbundle-0.32.0 → agentbundle-0.33.0/agentbundle.egg-info}/PKG-INFO +16 -3
  12. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle.egg-info/SOURCES.txt +2 -0
  13. {agentbundle-0.32.0 → agentbundle-0.33.0}/pyproject.toml +1 -1
  14. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/README.md +5 -0
  15. agentbundle-0.33.0/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +45 -0
  16. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_hook_wiring_rules.py +8 -13
  17. agentbundle-0.33.0/tests/fixtures/blank_catalogue/catalogue.toml +35 -0
  18. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_editable_source_detection.py +10 -7
  19. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_default_source.py +14 -2
  20. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_show_cmd.py +17 -5
  21. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_archive.py +44 -9
  22. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_foundation.py +13 -0
  23. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_lint.py +163 -10
  24. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_package.py +35 -16
  25. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_self_host.py +25 -6
  26. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_verify.py +35 -14
  27. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_wave2_validation.py +17 -2
  28. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_https_catalogue.py +39 -0
  29. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_package_catalogue.py +32 -6
  30. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_source_defaults.py +33 -2
  31. {agentbundle-0.32.0 → agentbundle-0.33.0}/MANIFEST.in +0 -0
  32. {agentbundle-0.32.0 → agentbundle-0.33.0}/README.md +0 -0
  33. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/__init__.py +0 -0
  34. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/__main__.py +0 -0
  35. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/adapter.schema.json +0 -0
  36. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/adapter.toml +0 -0
  37. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
  38. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  39. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
  40. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
  41. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  42. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  43. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
  44. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
  45. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  46. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  47. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  48. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  49. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  50. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  51. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
  52. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
  53. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
  54. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/catalogue.schema.json +0 -0
  55. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/guide.schema.json +0 -0
  56. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/install-defaults.toml +0 -0
  57. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/install-marker.py +0 -0
  58. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/marketplace-entry.schema.json +0 -0
  59. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/pack.schema.json +0 -0
  60. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  61. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  62. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/profile.schema.json +0 -0
  63. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/skill-manifest.schema.json +0 -0
  64. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/skill.schema.json +0 -0
  65. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/_data/target-vocab.toml +0 -0
  66. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/__init__.py +0 -0
  67. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/__main__.py +0 -0
  68. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapter_root_bins.py +0 -0
  69. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/__init__.py +0 -0
  70. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/claude_code.py +0 -0
  71. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/codex.py +0 -0
  72. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/copilot.py +0 -0
  73. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/cursor.py +0 -0
  74. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/gemini.py +0 -0
  75. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/kiro.py +0 -0
  76. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
  77. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/adapters/kiro_ide.py +0 -0
  78. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/contract.py +0 -0
  79. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/hook_wiring_rules.py +0 -0
  80. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/lint_packs.py +0 -0
  81. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/main.py +0 -0
  82. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/phase_order.py +0 -0
  83. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projection_io.py +0 -0
  84. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/__init__.py +0 -0
  85. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  86. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  87. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  88. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/direct_directory.py +0 -0
  89. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  90. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/hook_id.py +0 -0
  91. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  92. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  93. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/merge_json.py +0 -0
  94. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/plugin_hooks.py +0 -0
  95. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/projections/user_merge_json.py +0 -0
  96. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  97. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  98. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/recipes/marketplace.toml +0 -0
  99. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  100. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  101. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  102. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/recipes/self-host.toml +0 -0
  103. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/scope_rails.py +0 -0
  104. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/shared_libs.py +0 -0
  105. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/target_resolver.py +0 -0
  106. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/user_libs.py +0 -0
  107. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/build/validate.py +0 -0
  108. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue.py +0 -0
  109. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/__init__.py +0 -0
  110. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/build.py +0 -0
  111. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/defaults.py +0 -0
  112. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  113. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/file_safety.py +0 -0
  114. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/identity.py +0 -0
  115. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/initialise.py +0 -0
  116. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
  117. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/package.py +0 -0
  118. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/results.py +0 -0
  119. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/self_host.py +0 -0
  120. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
  121. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  122. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  123. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/categories.py +0 -0
  124. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/cli.py +0 -0
  125. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/__init__.py +0 -0
  126. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/_common.py +0 -0
  127. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/_drop_warning.py +0 -0
  128. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/adapt.py +0 -0
  129. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_build.py +0 -0
  130. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_init.py +0 -0
  131. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_lint.py +0 -0
  132. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_package.py +0 -0
  133. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_self_host.py +0 -0
  134. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  135. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  136. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/catalogue_verify.py +0 -0
  137. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/config.py +0 -0
  138. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/diff.py +0 -0
  139. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/docs.py +0 -0
  140. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/init_state.py +0 -0
  141. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/install.py +0 -0
  142. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/list_installed.py +0 -0
  143. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/list_packs.py +0 -0
  144. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/list_profiles.py +0 -0
  145. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/list_targets.py +0 -0
  146. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/oplog_cmd.py +0 -0
  147. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/pack_config_cmd.py +0 -0
  148. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/pack_evals.py +0 -0
  149. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/package_catalogue.py +0 -0
  150. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/profile.py +0 -0
  151. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/reconcile.py +0 -0
  152. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/render.py +0 -0
  153. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/scaffold.py +0 -0
  154. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/show.py +0 -0
  155. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/uninstall.py +0 -0
  156. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/upgrade.py +0 -0
  157. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/commands/validate.py +0 -0
  158. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/config.py +0 -0
  159. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/local_exclude.py +0 -0
  160. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/oplog.py +0 -0
  161. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/pack_inventory.py +0 -0
  162. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/render.py +0 -0
  163. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/safety.py +0 -0
  164. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/scaffold.py +0 -0
  165. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/scope.py +0 -0
  166. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/statelock.py +0 -0
  167. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/user_config.py +0 -0
  168. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle/workspace_mcp.py +0 -0
  169. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle.egg-info/dependency_links.txt +0 -0
  170. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle.egg-info/entry_points.txt +0 -0
  171. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle.egg-info/requires.txt +0 -0
  172. {agentbundle-0.32.0 → agentbundle-0.33.0}/agentbundle.egg-info/top_level.txt +0 -0
  173. {agentbundle-0.32.0 → agentbundle-0.33.0}/conftest.py +0 -0
  174. {agentbundle-0.32.0 → agentbundle-0.33.0}/setup.cfg +0 -0
  175. {agentbundle-0.32.0 → agentbundle-0.33.0}/templates/install-marker.py +0 -0
  176. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/__init__.py +0 -0
  177. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/_support.py +0 -0
  178. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/__init__.py +0 -0
  179. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
  180. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
  181. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
  182. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
  183. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
  184. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
  185. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
  186. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
  187. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
  188. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
  189. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
  190. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
  191. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
  192. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
  193. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
  194. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
  195. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
  196. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
  197. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
  198. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
  199. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
  200. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
  201. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
  202. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_codex.py +0 -0
  203. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_copilot.py +0 -0
  204. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_cursor.py +0 -0
  205. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_gemini.py +0 -0
  206. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_kiro.py +0 -0
  207. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
  208. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
  209. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
  210. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
  211. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
  212. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_contract.py +0 -0
  213. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_contract_scope.py +0 -0
  214. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_contract_v07.py +0 -0
  215. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_contract_v08.py +0 -0
  216. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
  217. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_end_to_end_build.py +0 -0
  218. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_lint_packs.py +0 -0
  219. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
  220. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_pack_schema.py +0 -0
  221. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
  222. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_pack_schema_install.py +0 -0
  223. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_pipeline.py +0 -0
  224. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_plugin_hooks.py +0 -0
  225. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
  226. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_projectable_subset.py +0 -0
  227. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_projections_merge_json.py +0 -0
  228. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_scope_rails.py +0 -0
  229. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_security.py +0 -0
  230. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_self_host_check.py +0 -0
  231. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
  232. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
  233. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
  234. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
  235. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_user_libs_projection.py +0 -0
  236. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_validate.py +0 -0
  237. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
  238. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/conftest.py +0 -0
  239. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
  240. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/adapt/values.toml +0 -0
  241. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
  242. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
  243. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  244. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
  245. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
  246. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
  247. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
  248. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
  249. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
  250. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
  251. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield/values.toml +0 -0
  252. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
  253. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
  254. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
  255. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
  256. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
  257. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
  258. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
  259. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
  260. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
  261. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
  262. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
  263. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
  264. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
  265. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
  266. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
  267. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
  268. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
  269. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
  270. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
  271. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
  272. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
  273. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
  274. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
  275. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
  276. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
  277. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
  278. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
  279. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
  280. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
  281. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
  282. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
  283. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
  284. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
  285. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
  286. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
  287. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
  288. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
  289. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/list-installed/golden_120col.txt +0 -0
  290. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/list-installed/golden_80col.txt +0 -0
  291. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
  292. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
  293. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +0 -0
  294. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
  295. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
  296. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
  297. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
  298. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
  299. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  300. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
  301. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
  302. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
  303. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  304. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
  305. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
  306. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
  307. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
  308. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
  309. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
  310. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
  311. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
  312. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
  313. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
  314. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
  315. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
  316. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
  317. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
  318. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
  319. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
  320. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
  321. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
  322. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
  323. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  324. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
  325. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
  326. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  327. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
  328. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
  329. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
  330. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
  331. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  332. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
  333. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
  334. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  335. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
  336. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
  337. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
  338. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
  339. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  340. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
  341. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
  342. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  343. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
  344. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
  345. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
  346. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
  347. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
  348. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
  349. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/__init__.py +0 -0
  350. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_adapt_cmd.py +0 -0
  351. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_adapt_dual_scope.py +0 -0
  352. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_adapt_preflight_detection.py +0 -0
  353. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_adapt_schema_migration.py +0 -0
  354. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_apm_install_route.py +0 -0
  355. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_blank_catalogue.py +0 -0
  356. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
  357. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_brownfield_round_trip.py +0 -0
  358. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
  359. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_build_check_drift_gates.py +0 -0
  360. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_build_derivation_apm.py +0 -0
  361. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
  362. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_catalogue_init.py +0 -0
  363. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
  364. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_claude_plugins_install_route.py +0 -0
  365. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_config_cascade.py +0 -0
  366. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_credential_brokers_pack_install.py +0 -0
  367. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_credentials_wheel.py +0 -0
  368. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
  369. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_fixtures_validate.py +0 -0
  370. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_hook_wiring_ingress.py +0 -0
  371. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_adapt_chain.py +0 -0
  372. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_cmd.py +0 -0
  373. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_converters_user_scope.py +0 -0
  374. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_copilot_full_parity.py +0 -0
  375. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_core_smoke.py +0 -0
  376. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_dependencies_gate.py +0 -0
  377. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
  378. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_dual_scope.py +0 -0
  379. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_orphan_reshape.py +0 -0
  380. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_pack_metadata_shape.py +0 -0
  381. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_profile.py +0 -0
  382. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_profile_live.py +0 -0
  383. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
  384. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_research_user_scope.py +0 -0
  385. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_seed_delivery.py +0 -0
  386. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_session_start_wiring.py +0 -0
  387. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_upgrade_offer.py +0 -0
  388. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_user_hooks.py +0 -0
  389. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
  390. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
  391. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
  392. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
  393. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_list_packs_cmd.py +0 -0
  394. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_local_scope_install.py +0 -0
  395. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_marketplace_entry_validation.py +0 -0
  396. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_marketplace_manifest_regression.py +0 -0
  397. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_multi_pack_install.py +0 -0
  398. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
  399. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_plugin_route_membership.py +0 -0
  400. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_recommends_cross_scope.py +0 -0
  401. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_reconcile.py +0 -0
  402. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_reserved_path_filter.py +0 -0
  403. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_scaffold_projection.py +0 -0
  404. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_self_host_schema_migration.py +0 -0
  405. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
  406. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_shared_prefix_coexistence.py +0 -0
  407. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_tier_invariants.py +0 -0
  408. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_uninstall_cmd.py +0 -0
  409. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_uninstall_user_hooks.py +0 -0
  410. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
  411. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_upgrade_cmd.py +0 -0
  412. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_upgrade_user_hooks.py +0 -0
  413. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_version_gate_matrix.py +0 -0
  414. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
  415. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/integration/test_zipapp.py +0 -0
  416. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/test_adapter_permissions_projection.py +0 -0
  417. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/test_workspace_mcp_elicit.py +0 -0
  418. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/test_workspace_mcp_event_bridge.py +0 -0
  419. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/test_workspace_mcp_git.py +0 -0
  420. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/test_workspace_mcp_lifecycle.py +0 -0
  421. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/test_workspace_mcp_stdin.py +0 -0
  422. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/test_workspace_mcp_tools.py +0 -0
  423. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/__init__.py +0 -0
  424. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_adapt_discovery_schema.py +0 -0
  425. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_append_layout_section.py +0 -0
  426. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_architect_readme_install_command.py +0 -0
  427. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_ci_contract.py +0 -0
  428. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_curation_deps.py +0 -0
  429. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
  430. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_pack_defaults.py +0 -0
  431. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
  432. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_skill_spec_lint.py +0 -0
  433. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_build.py +0 -0
  434. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
  435. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_identity.py +0 -0
  436. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_init.py +0 -0
  437. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
  438. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
  439. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_catalogue_wave2_schema.py +0 -0
  440. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_cli_catalogue_optional.py +0 -0
  441. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_cli_help_lists_config.py +0 -0
  442. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_cli_path_normalisation.py +0 -0
  443. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_cli_profile_surface.py +0 -0
  444. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_cli_scope_flags.py +0 -0
  445. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_codex_agent_toml.py +0 -0
  446. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_codex_projection_modes.py +0 -0
  447. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_common_classify_seeds.py +0 -0
  448. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_config.py +0 -0
  449. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_config_cmd.py +0 -0
  450. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_configured_adapter.py +0 -0
  451. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_confirm_helper.py +0 -0
  452. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_contract_parity.py +0 -0
  453. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_contract_v0_3_schema.py +0 -0
  454. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_copilot_agent_md.py +0 -0
  455. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_copilot_hooks_json.py +0 -0
  456. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
  457. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_credbroker_lint_hardening.py +0 -0
  458. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_dependencies_batch.py +0 -0
  459. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_diff_cmd.py +0 -0
  460. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_footprint_ownership.py +0 -0
  461. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_init_state_cmd.py +0 -0
  462. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
  463. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
  464. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
  465. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
  466. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_event_dropped_wirings.py +0 -0
  467. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_first_value_handoff.py +0 -0
  468. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_force_help.py +0 -0
  469. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_inband_detection.py +0 -0
  470. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_messages.py +0 -0
  471. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_messages_repo_scope.py +0 -0
  472. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_refusal_ordering.py +0 -0
  473. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_install_state_provenance.py +0 -0
  474. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
  475. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
  476. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
  477. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
  478. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_list_installed_cmd.py +0 -0
  479. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_list_installed_status.py +0 -0
  480. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_list_targets_cmd.py +0 -0
  481. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_schema.py +0 -0
  482. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
  483. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t12_show.py +0 -0
  484. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t2_resolve.py +0 -0
  485. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t3_config.py +0 -0
  486. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t4_state_path.py +0 -0
  487. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
  488. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
  489. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t8_install.py +0 -0
  490. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_local_scope_t9_exclude.py +0 -0
  491. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_marker_schema_version_parity.py +0 -0
  492. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_merge_into_agent_json.py +0 -0
  493. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
  494. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_nested_symlink_hardening.py +0 -0
  495. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_org_bootstrap.py +0 -0
  496. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_pack_config_api.py +0 -0
  497. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_pack_inventory.py +0 -0
  498. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_packstate_source_provenance.py +0 -0
  499. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_pipeline_phase_order.py +0 -0
  500. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_plugin_scope_filter.py +0 -0
  501. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_profile_reader.py +0 -0
  502. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_render.py +0 -0
  503. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_render_cmd.py +0 -0
  504. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_render_table.py +0 -0
  505. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_resolve_state_path.py +0 -0
  506. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
  507. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
  508. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_safety.py +0 -0
  509. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
  510. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
  511. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_scaffold_cmd.py +0 -0
  512. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_scope.py +0 -0
  513. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_self_host_windows.py +0 -0
  514. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_shared_prefix_disclosure.py +0 -0
  515. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_source_conflict_guard.py +0 -0
  516. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_state_v01_refuse_write.py +0 -0
  517. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_state_v02.py +0 -0
  518. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_state_v0_4_schema.py +0 -0
  519. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_statelock.py +0 -0
  520. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_target_resolver.py +0 -0
  521. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_toml_emitters.py +0 -0
  522. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_unresolved_markers.py +0 -0
  523. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_upgrade_bulk_all.py +0 -0
  524. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_upgrade_recap.py +0 -0
  525. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_upgrade_source_inference.py +0 -0
  526. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_user_config_io.py +0 -0
  527. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_user_config_isolation.py +0 -0
  528. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_user_config_path.py +0 -0
  529. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_user_config_source.py +0 -0
  530. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_user_merge_json.py +0 -0
  531. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_validate_attach_to_agent.py +0 -0
  532. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_validate_categories.py +0 -0
  533. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_validate_cmd.py +0 -0
  534. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
  535. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_values_from_shapes.py +0 -0
  536. {agentbundle-0.32.0 → agentbundle-0.33.0}/tests/unit/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.32.0
3
+ Version: 0.33.0
4
4
  Summary: npm for your coding agent. Install packs of skills, subagents, and hooks into any repo, for every major agent.
5
5
  Author-email: eugenelim <eugenelim@users.noreply.github.com>
6
6
  License-Expression: Apache-2.0 OR MIT
@@ -200,7 +200,12 @@ agentbundle catalogue package \
200
200
  --output dist/
201
201
  ```
202
202
 
203
- Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files), with the same build-residue exclusions as the default flavour. Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
203
+ Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist
204
+ (`catalogue.toml`, packs, profiles, guides, a marketplace manifest when
205
+ present, and legal files), with the same build-residue exclusions as the
206
+ default flavour. Includes a `self-hosted-source-manifest.json` with per-file
207
+ SHA-256 digests and provenance fields. `agentbundle install` refuses to install
208
+ a source archive, preventing accidental misuse.
204
209
 
205
210
  **Org bootstrap — ship the default channel in your fork:**
206
211
 
@@ -233,7 +238,10 @@ security boundary.
233
238
 
234
239
  ## Build your own catalogue
235
240
 
236
- `agentbundle` isn't tied to the agent-ready-repo catalogue. Any repo that lays its packs out the same way can use it.
241
+ `agentbundle` isn't tied to the agent-ready-repo catalogue. A catalogue source
242
+ has two required root markers: a valid `catalogue.toml` and a literal `packs/`
243
+ directory. A custom `catalogue.paths.packs` value controls where pack content
244
+ is read from; it does not replace the root `packs/` marker.
237
245
 
238
246
  **Bootstrap a new catalogue** in an empty directory:
239
247
 
@@ -334,6 +342,11 @@ The org hint fires after the user-config but before the on-disk IDE probe — so
334
342
  agentbundle catalogue lint --root .
335
343
  ```
336
344
 
345
+ Lint validates both source markers and then checks the configured pack content.
346
+ It requires `.claude-plugin/marketplace.json` only when the effective self-host
347
+ adapters include `claude-code`. A Kiro-only catalogue can omit that Claude
348
+ artifact; the default Claude Code and Codex projection still requires it.
349
+
337
350
  For full [agentskills.io spec](https://agentskills.io/specification) compliance (frontmatter key set, description policy, encoding, evals schema), install the `lint` extra and run with `--deep`:
338
351
 
339
352
  ```bash
@@ -180,7 +180,12 @@ agentbundle catalogue package \
180
180
  --output dist/
181
181
  ```
182
182
 
183
- Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files), with the same build-residue exclusions as the default flavour. Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
183
+ Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist
184
+ (`catalogue.toml`, packs, profiles, guides, a marketplace manifest when
185
+ present, and legal files), with the same build-residue exclusions as the
186
+ default flavour. Includes a `self-hosted-source-manifest.json` with per-file
187
+ SHA-256 digests and provenance fields. `agentbundle install` refuses to install
188
+ a source archive, preventing accidental misuse.
184
189
 
185
190
  **Org bootstrap — ship the default channel in your fork:**
186
191
 
@@ -213,7 +218,10 @@ security boundary.
213
218
 
214
219
  ## Build your own catalogue
215
220
 
216
- `agentbundle` isn't tied to the agent-ready-repo catalogue. Any repo that lays its packs out the same way can use it.
221
+ `agentbundle` isn't tied to the agent-ready-repo catalogue. A catalogue source
222
+ has two required root markers: a valid `catalogue.toml` and a literal `packs/`
223
+ directory. A custom `catalogue.paths.packs` value controls where pack content
224
+ is read from; it does not replace the root `packs/` marker.
217
225
 
218
226
  **Bootstrap a new catalogue** in an empty directory:
219
227
 
@@ -314,6 +322,11 @@ The org hint fires after the user-config but before the on-disk IDE probe — so
314
322
  agentbundle catalogue lint --root .
315
323
  ```
316
324
 
325
+ Lint validates both source markers and then checks the configured pack content.
326
+ It requires `.claude-plugin/marketplace.json` only when the effective self-host
327
+ adapters include `claude-code`. A Kiro-only catalogue can omit that Claude
328
+ artifact; the default Claude Code and Codex projection still requires it.
329
+
317
330
  For full [agentskills.io spec](https://agentskills.io/specification) compliance (frontmatter key set, description policy, encoding, evals schema), install the `lint` extra and run with `--deep`:
318
331
 
319
332
  ```bash
@@ -310,6 +310,11 @@ def _effective_adapters(preferred_adapter: str | None) -> tuple[str, ...]:
310
310
  return SELF_HOST_ADAPTERS
311
311
 
312
312
 
313
+ def projects_claude_artifacts(preferred_adapter: str | None) -> bool:
314
+ """Return whether self-host projection includes Claude project artifacts."""
315
+ return "claude-code" in _effective_adapters(preferred_adapter)
316
+
317
+
313
318
  def _project_all_adapters(
314
319
  output_root: Path,
315
320
  packs_dir: Path,
@@ -1268,7 +1273,7 @@ def run_self_host(
1268
1273
  # preferred-adapter is kiro-ide or kiro-cli (or any other adapter not in
1269
1274
  # SELF_HOST_ADAPTERS), those artifacts are neither written nor expected in
1270
1275
  # the drift check.
1271
- _project_claude_artifacts = "claude-code" in _effective_adapters(preferred_adapter)
1276
+ project_claude_artifacts = projects_claude_artifacts(preferred_adapter)
1272
1277
 
1273
1278
  if dry_run:
1274
1279
  with tempfile.TemporaryDirectory(prefix="agentbundle-shadow-") as shadow_str:
@@ -1286,11 +1291,11 @@ def run_self_host(
1286
1291
  except ValueError as exc:
1287
1292
  print(f"self-host: {exc}", file=sys.stderr)
1288
1293
  return 4
1289
- if _project_claude_artifacts:
1294
+ if project_claude_artifacts:
1290
1295
  _aggregate_marketplace(packs_dir, shadow, owner=owner, name=marketplace_name)
1291
1296
  _recreate_claude_symlink(shadow, force_copy=no_symlink)
1292
1297
  extra_marker_paths = list(seed_map.keys())
1293
- if _project_claude_artifacts:
1298
+ if project_claude_artifacts:
1294
1299
  extra_marker_paths.append(Path(".claude-plugin") / "marketplace.json")
1295
1300
  if agents_path is not None:
1296
1301
  extra_marker_paths.append(Path("AGENTS.md"))
@@ -1347,11 +1352,11 @@ def run_self_host(
1347
1352
  except ValueError as exc:
1348
1353
  print(f"self-host: {exc}", file=sys.stderr)
1349
1354
  return 4
1350
- if _project_claude_artifacts:
1355
+ if project_claude_artifacts:
1351
1356
  _aggregate_marketplace(packs_dir, working_tree, owner=owner, name=marketplace_name)
1352
1357
  _recreate_claude_symlink(working_tree, force_copy=no_symlink)
1353
1358
  extra_marker_paths = list(seed_map.keys())
1354
- if _project_claude_artifacts:
1359
+ if project_claude_artifacts:
1355
1360
  extra_marker_paths.append(Path(".claude-plugin") / "marketplace.json")
1356
1361
  if agents_path is not None:
1357
1362
  extra_marker_paths.append(Path("AGENTS.md"))
@@ -10,10 +10,11 @@ from __future__ import annotations
10
10
  import hashlib
11
11
  import json
12
12
  import tarfile
13
- import tempfile
14
13
  from pathlib import Path
15
14
 
15
+ from agentbundle.catalogue import CatalogueError
16
16
  from agentbundle.catalogue_tooling.results import Diagnostic, Severity, VerifyResult
17
+ from agentbundle.https_catalogue import _validated_archive_destination
17
18
 
18
19
  _MANIFEST_NAME = "catalogue-manifest.json"
19
20
  _SOURCE_MANIFEST_NAME = "self-hosted-source-manifest.json"
@@ -87,15 +88,19 @@ def check_members(members: list[tarfile.TarInfo]) -> list[Diagnostic]:
87
88
  """Member-level safety checks. Exported for unit tests (T1)."""
88
89
  diags: list[Diagnostic] = []
89
90
 
90
- # No absolute paths
91
+ # No absolute, traversal, or platform-ambiguous paths. Tar member names
92
+ # are POSIX paths; backslashes are rejected rather than reinterpreted on
93
+ # Windows during extraction.
91
94
  for m in members:
92
- if m.name.startswith("/") or (len(m.name) > 1 and m.name[1] == ":"):
93
- diags.append(_err("CAT-V-ARC-004", f"absolute member path: {m.name!r}", path=m.name))
94
-
95
- # No traversal paths
96
- for m in members:
97
- if ".." in Path(m.name).parts:
98
- diags.append(_err("CAT-V-ARC-005", f"traversal path: {m.name!r}", path=m.name))
95
+ try:
96
+ _validated_archive_destination(Path("/"), m.name)
97
+ except CatalogueError as exc:
98
+ code = (
99
+ "CAT-V-ARC-004"
100
+ if m.name.startswith("/") or (len(m.name) > 1 and m.name[1] == ":")
101
+ else "CAT-V-ARC-005"
102
+ )
103
+ diags.append(_err(code, str(exc), path=m.name))
99
104
 
100
105
  # No symlinks or hard links
101
106
  for m in members:
@@ -262,7 +267,7 @@ def _check_no_undeclared_members(
262
267
 
263
268
 
264
269
  def _check_catalogue_markers(members: list[tarfile.TarInfo]) -> list[Diagnostic]:
265
- """At least one catalogue marker must be present at the archive root."""
270
+ """At least one installable-archive marker must be present at its root."""
266
271
  prefix = _detect_prefix(members)
267
272
  marker_tops = {"catalogue.toml", "AGENTS.md", ".agentbundle"}
268
273
  found: set[str] = set()
@@ -280,6 +285,54 @@ def _check_catalogue_markers(members: list[tarfile.TarInfo]) -> list[Diagnostic]
280
285
  return []
281
286
 
282
287
 
288
+ def _check_marketplace_entries(
289
+ tf: tarfile.TarFile,
290
+ members: list[tarfile.TarInfo],
291
+ ) -> list[Diagnostic]:
292
+ """Apply source-equivalent marketplace semantics without source identity."""
293
+ prefix = _detect_prefix(members)
294
+ member_name = f"{prefix}.claude-plugin/marketplace.json"
295
+ marketplace = next((m for m in members if m.name == member_name), None)
296
+ if marketplace is None:
297
+ return []
298
+
299
+ try:
300
+ fobj = tf.extractfile(marketplace)
301
+ if fobj is None:
302
+ raise ValueError("marketplace member is not a regular file")
303
+ payload = json.loads(fobj.read().decode("utf-8"))
304
+
305
+ from agentbundle.build.main import _read_bundled
306
+ from agentbundle.catalogue_tooling.verify import _validate_marketplace_entries
307
+
308
+ entry_schema = json.loads(_read_bundled("marketplace-entry.schema.json"))
309
+ except Exception as exc:
310
+ return [_err(
311
+ "CAT-V-ARC-017",
312
+ f"marketplace validation failed: {exc}",
313
+ path=".claude-plugin/marketplace.json",
314
+ )]
315
+
316
+ source_diags = _validate_marketplace_entries(
317
+ payload,
318
+ entry_schema,
319
+ ".claude-plugin/marketplace.json",
320
+ )
321
+ return [
322
+ Diagnostic(
323
+ code="CAT-V-ARC-017",
324
+ severity=diagnostic.severity,
325
+ pack=diagnostic.pack,
326
+ path=diagnostic.path,
327
+ line=diagnostic.line,
328
+ col=diagnostic.col,
329
+ message=diagnostic.message,
330
+ remediation=diagnostic.remediation,
331
+ )
332
+ for diagnostic in source_diags
333
+ ]
334
+
335
+
283
336
  def _check_min_agentbundle_compat(manifest: dict) -> list[Diagnostic]:
284
337
  min_ver = manifest.get("minimum_agentbundle_version")
285
338
  if not min_ver or not isinstance(min_ver, str):
@@ -316,9 +369,9 @@ def _make_result(diags: list[Diagnostic], operation: str) -> VerifyResult:
316
369
  def verify_archive(archive: Path, sha256_file: Path | None = None) -> VerifyResult:
317
370
  """Verify a catalogue archive (.tar.gz).
318
371
 
319
- Runs the full safety + semantic pipeline. Stops after safety errors.
320
- Sha256 sidecar mismatch causes immediate early return.
321
- On pass, extracts to tmpdir and calls verify_catalogue for round-trip.
372
+ Runs the full safety + archive-semantic pipeline. Stops after safety errors.
373
+ Sha256 sidecar mismatch causes immediate early return. Installable archives
374
+ are not source catalogues, so they are not passed to ``verify_catalogue``.
322
375
  """
323
376
  diags: list[Diagnostic] = []
324
377
 
@@ -368,34 +421,7 @@ def verify_archive(archive: Path, sha256_file: Path | None = None) -> VerifyResu
368
421
  diags.extend(_check_all_manifest_digests(tf, members, manifest))
369
422
  diags.extend(_check_no_undeclared_members(members, manifest))
370
423
  diags.extend(_check_catalogue_markers(members))
424
+ diags.extend(_check_marketplace_entries(tf, members))
371
425
  diags.extend(_check_min_agentbundle_compat(manifest))
372
426
 
373
- # Local discoverability — extract to tmpdir and verify as catalogue
374
- if not any(d.severity == Severity.ERROR for d in diags):
375
- prefix = _detect_prefix(members)
376
- with tempfile.TemporaryDirectory() as tmpdir_str:
377
- tmpdir = Path(tmpdir_str)
378
- try:
379
- tf.extractall(tmpdir, filter="data")
380
- except TypeError:
381
- # Python < 3.12: extract member-by-member;
382
- # paths pre-validated by check_members()
383
- for _m in tf.getmembers():
384
- _dest = tmpdir / _m.name
385
- _dest.parent.mkdir(parents=True, exist_ok=True)
386
- if _m.isreg():
387
- _fobj = tf.extractfile(_m)
388
- if _fobj is not None:
389
- _dest.write_bytes(_fobj.read())
390
- catalogue_root = tmpdir / prefix.rstrip("/") if prefix else tmpdir
391
- from agentbundle.catalogue_tooling.verify import verify_catalogue
392
- inner = verify_catalogue(catalogue_root)
393
- if not inner.ok:
394
- for d in inner.diagnostics:
395
- diags.append(_err(
396
- "CAT-V-ARC-015",
397
- f"extracted archive not locally discoverable: {d.message}",
398
- path=d.path,
399
- ))
400
-
401
427
  return _make_result(diags, "archive")
@@ -240,10 +240,10 @@ def _validate_path(root: Path, p: str, field_name: str) -> None:
240
240
  f"catalogue.toml: {field_name!r} path must not traverse outside root: {p!r}"
241
241
  )
242
242
  # Resolve and check inside root (catches symlinks)
243
- resolved_root = root.resolve()
244
243
  try:
244
+ resolved_root = root.resolve()
245
245
  resolved_path = (root / p).resolve()
246
- except OSError as exc:
246
+ except (OSError, RuntimeError) as exc:
247
247
  raise CatalogueConfigError(
248
248
  f"catalogue.toml: {field_name!r} path cannot be resolved: {p!r}"
249
249
  ) from exc
@@ -20,7 +20,12 @@ import re
20
20
  import tomllib
21
21
  from pathlib import Path
22
22
 
23
- from agentbundle.catalogue_tooling.config import CatalogueConfigError, load_catalogue_config
23
+ from agentbundle.build.self_host import projects_claude_artifacts
24
+ from agentbundle.catalogue_tooling.config import (
25
+ CatalogueConfig,
26
+ CatalogueConfigError,
27
+ load_catalogue_config,
28
+ )
24
29
  from agentbundle.catalogue_tooling.diagnostics import DiagnosticCode
25
30
  from agentbundle.catalogue_tooling.results import Diagnostic, LintResult, Severity
26
31
 
@@ -967,40 +972,74 @@ def _cs_is_canonical_shim(py: Path, shim_source_dir: Path) -> bool:
967
972
 
968
973
 
969
974
  class _CatalogueRules:
970
- def __init__(self, root: Path, config: object | None) -> None:
975
+ def __init__(self, root: Path, config: CatalogueConfig) -> None:
971
976
  self._root = root
972
977
  self._config = config
978
+ self._resolved_root: Path | None = None
979
+ self._resolved_config_paths: dict[str, Path] = {}
980
+ self._unsafe_config_paths: set[str] = set()
973
981
 
974
982
  def collect(self, pack_filter: str | None) -> list[Diagnostic]:
975
983
  diagnostics: list[Diagnostic] = []
984
+ diagnostics.extend(self._check_config_paths())
976
985
  diagnostics.extend(self._check_markers())
977
986
  diagnostics.extend(self._check_duplicate_identities())
978
- diagnostics.extend(self._check_config_paths())
979
987
  diagnostics.extend(self._check_profiles())
980
988
  return diagnostics
981
989
 
982
- def _packs_dir(self) -> Path:
983
- if self._config is not None:
984
- return self._root / self._config.paths.packs # type: ignore[attr-defined]
985
- return self._root / "packs"
990
+ def _configured_path(self, field: str, default: str) -> Path | None:
991
+ if field in self._unsafe_config_paths:
992
+ return None
993
+ if field in self._resolved_config_paths:
994
+ return self._resolved_config_paths[field]
995
+ return self._root / default
996
+
997
+ def _packs_dir(self) -> Path | None:
998
+ return self._configured_path("packs", "packs")
986
999
 
987
- def _marketplace_path(self) -> Path:
988
- if self._config is not None:
989
- return self._root / self._config.paths.marketplace # type: ignore[attr-defined]
990
- return self._root / ".claude-plugin" / "marketplace.json"
1000
+ def _marketplace_path(self) -> Path | None:
1001
+ return self._configured_path(
1002
+ "marketplace", ".claude-plugin/marketplace.json"
1003
+ )
991
1004
 
992
1005
  def _check_markers(self) -> list[Diagnostic]:
993
1006
  diags: list[Diagnostic] = []
1007
+ root_packs = self._root / "packs"
1008
+ root_packs_valid = root_packs.is_dir()
1009
+ if root_packs_valid and self._resolved_root is not None:
1010
+ try:
1011
+ resolved_root_packs = root_packs.resolve(strict=True)
1012
+ root_packs_valid = resolved_root_packs.is_relative_to(self._resolved_root)
1013
+ except (OSError, RuntimeError):
1014
+ root_packs_valid = False
1015
+ if not root_packs_valid:
1016
+ diags.append(_diag(
1017
+ DiagnosticCode.CAT_L002,
1018
+ Severity.ERROR,
1019
+ f"literal root packs directory missing or unsafe: {root_packs}",
1020
+ remediation="Create a literal packs directory inside the catalogue root.",
1021
+ ))
1022
+
994
1023
  packs_dir = self._packs_dir()
995
- if not packs_dir.is_dir():
1024
+ configured_packs = self._config.paths.packs
1025
+ if configured_packs != "packs" and packs_dir is not None and not packs_dir.is_dir():
996
1026
  diags.append(_diag(
997
1027
  DiagnosticCode.CAT_L002,
998
1028
  Severity.ERROR,
999
- f"packs directory missing: {packs_dir}",
1000
- remediation="Create the packs directory or update catalogue.toml paths.packs.",
1029
+ f"configured packs directory missing: {packs_dir}",
1030
+ remediation=(
1031
+ "Create the configured packs directory or update "
1032
+ "catalogue.toml paths.packs."
1033
+ ),
1001
1034
  ))
1035
+
1002
1036
  mp = self._marketplace_path()
1003
- if not mp.exists():
1037
+ preferred_adapter = self._config.distribution.agentbundle.preferred_adapter
1038
+ if (
1039
+ mp is not None
1040
+ and projects_claude_artifacts(preferred_adapter)
1041
+ and not mp.exists()
1042
+ ):
1004
1043
  diags.append(_diag(
1005
1044
  DiagnosticCode.CAT_L002,
1006
1045
  Severity.ERROR,
@@ -1011,7 +1050,7 @@ class _CatalogueRules:
1011
1050
 
1012
1051
  def _check_duplicate_identities(self) -> list[Diagnostic]:
1013
1052
  packs_dir = self._packs_dir()
1014
- if not packs_dir.is_dir():
1053
+ if packs_dir is None or not packs_dir.is_dir():
1015
1054
  return []
1016
1055
  seen_names: dict[str, str] = {}
1017
1056
  diags: list[Diagnostic] = []
@@ -1038,18 +1077,16 @@ class _CatalogueRules:
1038
1077
  seen_names[pack_name] = entry.name
1039
1078
  return diags
1040
1079
 
1041
- def _profiles_dir(self) -> Path:
1042
- if self._config is not None:
1043
- profiles_val = getattr(self._config.paths, "profiles", None) # type: ignore[attr-defined]
1044
- if profiles_val:
1045
- return self._root / profiles_val
1046
- return self._root / "profiles"
1080
+ def _profiles_dir(self) -> Path | None:
1081
+ return self._configured_path("profiles", "profiles")
1047
1082
 
1048
1083
  def _check_profiles(self) -> list[Diagnostic]:
1049
1084
  profiles_dir = self._profiles_dir()
1050
- if not profiles_dir.is_dir():
1085
+ if profiles_dir is None or not profiles_dir.is_dir():
1051
1086
  return []
1052
1087
  packs_dir = self._packs_dir()
1088
+ if packs_dir is None:
1089
+ return []
1053
1090
  packs = _profile_load_packs(packs_dir)
1054
1091
  diags: list[Diagnostic] = []
1055
1092
  for toml_path in sorted(profiles_dir.glob("*.toml")):
@@ -1074,11 +1111,21 @@ class _CatalogueRules:
1074
1111
  return diags
1075
1112
 
1076
1113
  def _check_config_paths(self) -> list[Diagnostic]:
1077
- if self._config is None:
1078
- return []
1079
1114
  diags: list[Diagnostic] = []
1080
- root = self._root.resolve()
1081
- paths_obj = self._config.paths # type: ignore[attr-defined]
1115
+ try:
1116
+ root = self._root.resolve(strict=True)
1117
+ except (OSError, RuntimeError) as exc:
1118
+ self._unsafe_config_paths.update(
1119
+ {"packs", "profiles", "contracts", "marketplace", "build_output"}
1120
+ )
1121
+ return [_diag(
1122
+ DiagnosticCode.CAT_L021,
1123
+ Severity.ERROR,
1124
+ f"catalogue root cannot be resolved safely: {exc}",
1125
+ remediation="Use a readable catalogue root without circular symlinks.",
1126
+ )]
1127
+ self._resolved_root = root
1128
+ paths_obj = self._config.paths
1082
1129
  for field in ("packs", "profiles", "contracts", "marketplace", "build_output"):
1083
1130
  val = getattr(paths_obj, field, None)
1084
1131
  if not val:
@@ -1086,14 +1133,23 @@ class _CatalogueRules:
1086
1133
  try:
1087
1134
  resolved = (self._root / val).resolve()
1088
1135
  if not resolved.is_relative_to(root):
1136
+ self._unsafe_config_paths.add(field)
1089
1137
  diags.append(_diag(
1090
1138
  DiagnosticCode.CAT_L021,
1091
1139
  Severity.ERROR,
1092
1140
  f"catalogue.paths.{field} resolves outside catalogue root: {val!r}",
1093
1141
  remediation="Use a relative path that stays within the catalogue root.",
1094
1142
  ))
1095
- except OSError:
1096
- pass
1143
+ else:
1144
+ self._resolved_config_paths[field] = resolved
1145
+ except (OSError, RuntimeError) as exc:
1146
+ self._unsafe_config_paths.add(field)
1147
+ diags.append(_diag(
1148
+ DiagnosticCode.CAT_L021,
1149
+ Severity.ERROR,
1150
+ f"catalogue.paths.{field} cannot be resolved safely: {val!r}: {exc}",
1151
+ remediation="Use a relative path without circular or escaping symlinks.",
1152
+ ))
1097
1153
  return diags
1098
1154
 
1099
1155
 
@@ -1791,15 +1847,32 @@ def lint_catalogue(root: Path, pack: str | None = None, *, deep: bool = False) -
1791
1847
  catalogue_schema_version=1,
1792
1848
  )
1793
1849
 
1850
+ if config is None:
1851
+ diagnostics.append(_diag(
1852
+ DiagnosticCode.CAT_L002,
1853
+ Severity.ERROR,
1854
+ f"catalogue.toml missing: {root / 'catalogue.toml'}",
1855
+ remediation="Create a valid catalogue.toml at the catalogue root.",
1856
+ ))
1857
+ return LintResult(
1858
+ ok=False,
1859
+ diagnostics=diagnostics,
1860
+ schema_version=1,
1861
+ command="catalogue lint",
1862
+ operation="lint",
1863
+ agentbundle_version=_get_agentbundle_version(),
1864
+ catalogue_schema_version=1,
1865
+ )
1866
+
1794
1867
  # Step 2: catalogue-level rules
1795
1868
  cat_rules = _CatalogueRules(root, config)
1796
1869
  diagnostics.extend(cat_rules.collect(pack))
1797
1870
 
1798
1871
  # Step 3: determine packs dir
1799
- packs_dir = root / config.paths.packs if config is not None else root / "packs"
1872
+ packs_dir = cat_rules._packs_dir()
1800
1873
 
1801
1874
  # Step 4+5: per-pack rules
1802
- if packs_dir.is_dir():
1875
+ if packs_dir is not None and packs_dir.is_dir():
1803
1876
  for pack_dir in sorted(packs_dir.iterdir()):
1804
1877
  if pack_dir.name.startswith("_"):
1805
1878
  continue # reserved authoring asset
@@ -70,9 +70,7 @@ def _step_config_validation(
70
70
  def _step_lint(
71
71
  root: Path, config: object | None, pack: str | None, tmpdir: Path
72
72
  ) -> list[Diagnostic]:
73
- """Step 2: run catalogue lint. Skips gracefully when catalogue.toml is absent."""
74
- if config is None:
75
- return []
73
+ """Step 2: run catalogue lint, including its source-identity checks."""
76
74
  from agentbundle.catalogue_tooling.lint import lint_catalogue
77
75
  result = lint_catalogue(root, pack=pack)
78
76
  diags: list[Diagnostic] = []
@@ -587,6 +585,67 @@ def _step_marketplace(
587
585
  return []
588
586
 
589
587
 
588
+ def _validate_marketplace_entries(
589
+ payload: object,
590
+ entry_schema: dict,
591
+ label: str,
592
+ ) -> list[Diagnostic]:
593
+ """Validate marketplace entries shared by source and archive verification."""
594
+ from agentbundle.build.validate import validate as validate_manifest
595
+
596
+ if not isinstance(payload, dict):
597
+ return [_err(
598
+ "CAT-V-013",
599
+ f"{label} must contain a JSON object",
600
+ path=label,
601
+ )]
602
+
603
+ plugin_entries = payload.get("plugins", [])
604
+ if not isinstance(plugin_entries, list):
605
+ return [_err(
606
+ "CAT-V-013",
607
+ f"{label} 'plugins' must be a JSON array",
608
+ path=label,
609
+ )]
610
+
611
+ diags: list[Diagnostic] = []
612
+ for plugin_entry in plugin_entries:
613
+ if not isinstance(plugin_entry, dict):
614
+ diags.append(_err(
615
+ "CAT-V-013",
616
+ "marketplace plugin entry must be a JSON object",
617
+ path=label,
618
+ ))
619
+ continue
620
+ name = plugin_entry.get("name", "unknown")
621
+ if "source" not in plugin_entry:
622
+ # WARN, not ERROR. `[pack.links].repository` is optional, the
623
+ # shipped scaffold pack omits it, and an external catalogue may
624
+ # legitimately hold packs it does not publish for marketplace
625
+ # install. Surface the consequence without failing the build.
626
+ diags.append(_warn(
627
+ "CAT-V-013",
628
+ f"marketplace entry '{name}' has no 'source' — set "
629
+ f"[pack.links].repository in that pack's pack.toml so the "
630
+ f"build can emit one, or adopters cannot install it",
631
+ path=label,
632
+ ))
633
+ if "hooks" in plugin_entry:
634
+ diags.append(_err(
635
+ "CAT-V-013",
636
+ f"plugin '{name}' contains 'hooks' — "
637
+ "hooks must not appear in marketplace entries",
638
+ path=label,
639
+ ))
640
+ for error in validate_manifest(plugin_entry, entry_schema):
641
+ diags.append(_err(
642
+ "CAT-V-013",
643
+ f"marketplace entry '{name}': {error}",
644
+ path=label,
645
+ ))
646
+ return diags
647
+
648
+
590
649
  def _step_plugin_manifests(
591
650
  root: Path, config: object | None, pack: str | None, tmpdir: Path
592
651
  ) -> list[Diagnostic]:
@@ -644,34 +703,7 @@ def _step_plugin_manifests(
644
703
  diags.append(_err("CAT-V-013", f"{label} parse error: {exc}",
645
704
  path=label))
646
705
  return
647
- for plugin_entry in payload.get("plugins", []):
648
- name = plugin_entry.get("name", "unknown")
649
- if "source" not in plugin_entry:
650
- # WARN, not ERROR. `[pack.links].repository` is optional, the
651
- # shipped scaffold pack omits it, and an external catalogue may
652
- # legitimately hold packs it does not publish for marketplace
653
- # install. That is a choice, not a defect — so surface the
654
- # consequence and name the cause, but do not fail the build.
655
- diags.append(_warn(
656
- "CAT-V-013",
657
- f"marketplace entry '{name}' has no 'source' — set "
658
- f"[pack.links].repository in that pack's pack.toml so the "
659
- f"build can emit one, or adopters cannot install it",
660
- path=label,
661
- ))
662
- if "hooks" in plugin_entry:
663
- diags.append(_err(
664
- "CAT-V-013",
665
- f"plugin '{name}' contains 'hooks' — "
666
- "hooks must not appear in marketplace entries",
667
- path=label,
668
- ))
669
- for error in _validate_manifest(plugin_entry, entry_schema):
670
- diags.append(_err(
671
- "CAT-V-013",
672
- f"marketplace entry '{name}': {error}",
673
- path=label,
674
- ))
706
+ diags.extend(_validate_marketplace_entries(payload, entry_schema, label))
675
707
 
676
708
  for manifest_path in sorted(dist_dir.rglob("*.claude-plugin/plugin.json")) \
677
709
  if dist_dir.exists() else []:
@@ -991,9 +1023,20 @@ def verify_catalogue(
991
1023
  Build output (step 10) goes to a temporary directory; the catalogue
992
1024
  root has zero new or modified files after verify completes.
993
1025
  """
994
- from agentbundle.catalogue_tooling.config import load_catalogue_config
1026
+ from agentbundle.catalogue_tooling.config import CatalogueConfigError, load_catalogue_config
995
1027
 
996
- config = load_catalogue_config(root)
1028
+ try:
1029
+ config = load_catalogue_config(root)
1030
+ except CatalogueConfigError as exc:
1031
+ return VerifyResult(
1032
+ ok=False,
1033
+ diagnostics=[_err("CAT-V-001", str(exc), path="catalogue.toml")],
1034
+ schema_version=1,
1035
+ command="catalogue verify",
1036
+ operation="source-checkout",
1037
+ agentbundle_version=_get_agentbundle_version(),
1038
+ catalogue_schema_version=1,
1039
+ )
997
1040
  catalogue_schema_version = getattr(config, "schema", 1) if config else 1
998
1041
 
999
1042
  all_diags: list[Diagnostic] = []