agentbundle 0.32.0__tar.gz → 0.33.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 (536) hide show
  1. {agentbundle-0.32.0/agentbundle.egg-info → agentbundle-0.33.1}/PKG-INFO +23 -3
  2. {agentbundle-0.32.0 → agentbundle-0.33.1}/README-pypi.md +22 -2
  3. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/self_host.py +11 -5
  4. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/archive.py +67 -41
  5. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/config.py +2 -2
  6. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/lint.py +104 -31
  7. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/verify.py +76 -33
  8. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/https_catalogue.py +34 -11
  9. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/source_defaults.py +22 -9
  10. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/version.py +1 -1
  11. {agentbundle-0.32.0 → agentbundle-0.33.1/agentbundle.egg-info}/PKG-INFO +23 -3
  12. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle.egg-info/SOURCES.txt +2 -0
  13. {agentbundle-0.32.0 → agentbundle-0.33.1}/pyproject.toml +1 -1
  14. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/README.md +5 -0
  15. agentbundle-0.33.1/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +45 -0
  16. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_hook_wiring_rules.py +8 -13
  17. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_self_host_check.py +35 -0
  18. agentbundle-0.33.1/tests/fixtures/blank_catalogue/catalogue.toml +35 -0
  19. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_editable_source_detection.py +10 -7
  20. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_default_source.py +14 -2
  21. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_show_cmd.py +17 -5
  22. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_archive.py +44 -9
  23. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_foundation.py +13 -0
  24. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_lint.py +163 -10
  25. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_package.py +35 -16
  26. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_self_host.py +25 -6
  27. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_verify.py +35 -14
  28. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_wave2_validation.py +17 -2
  29. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_https_catalogue.py +39 -0
  30. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_package_catalogue.py +32 -6
  31. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_source_defaults.py +33 -2
  32. {agentbundle-0.32.0 → agentbundle-0.33.1}/MANIFEST.in +0 -0
  33. {agentbundle-0.32.0 → agentbundle-0.33.1}/README.md +0 -0
  34. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/__init__.py +0 -0
  35. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/__main__.py +0 -0
  36. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/adapter.schema.json +0 -0
  37. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/adapter.toml +0 -0
  38. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
  39. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  40. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
  41. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
  42. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  43. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  44. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
  45. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
  46. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  47. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  48. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  49. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  50. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  51. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  52. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
  53. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
  54. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
  55. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/catalogue.schema.json +0 -0
  56. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/guide.schema.json +0 -0
  57. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/install-defaults.toml +0 -0
  58. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/install-marker.py +0 -0
  59. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/marketplace-entry.schema.json +0 -0
  60. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/pack.schema.json +0 -0
  61. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  62. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  63. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/profile.schema.json +0 -0
  64. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/skill-manifest.schema.json +0 -0
  65. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/skill.schema.json +0 -0
  66. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/_data/target-vocab.toml +0 -0
  67. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/__init__.py +0 -0
  68. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/__main__.py +0 -0
  69. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapter_root_bins.py +0 -0
  70. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/__init__.py +0 -0
  71. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/claude_code.py +0 -0
  72. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/codex.py +0 -0
  73. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/copilot.py +0 -0
  74. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/cursor.py +0 -0
  75. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/gemini.py +0 -0
  76. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/kiro.py +0 -0
  77. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
  78. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/adapters/kiro_ide.py +0 -0
  79. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/contract.py +0 -0
  80. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/hook_wiring_rules.py +0 -0
  81. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/lint_packs.py +0 -0
  82. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/main.py +0 -0
  83. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/phase_order.py +0 -0
  84. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projection_io.py +0 -0
  85. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/__init__.py +0 -0
  86. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  87. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  88. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  89. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/direct_directory.py +0 -0
  90. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  91. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/hook_id.py +0 -0
  92. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  93. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  94. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/merge_json.py +0 -0
  95. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/plugin_hooks.py +0 -0
  96. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/projections/user_merge_json.py +0 -0
  97. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  98. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  99. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/recipes/marketplace.toml +0 -0
  100. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  101. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  102. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  103. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/recipes/self-host.toml +0 -0
  104. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/scope_rails.py +0 -0
  105. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/shared_libs.py +0 -0
  106. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/target_resolver.py +0 -0
  107. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/user_libs.py +0 -0
  108. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/build/validate.py +0 -0
  109. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue.py +0 -0
  110. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
  111. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/build.py +0 -0
  112. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
  113. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  114. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/file_safety.py +0 -0
  115. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/identity.py +0 -0
  116. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/initialise.py +0 -0
  117. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
  118. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/package.py +0 -0
  119. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/results.py +0 -0
  120. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
  121. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
  122. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  123. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  124. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/categories.py +0 -0
  125. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/cli.py +0 -0
  126. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/__init__.py +0 -0
  127. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/_common.py +0 -0
  128. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/_drop_warning.py +0 -0
  129. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/adapt.py +0 -0
  130. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_build.py +0 -0
  131. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_init.py +0 -0
  132. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_lint.py +0 -0
  133. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_package.py +0 -0
  134. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_self_host.py +0 -0
  135. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  136. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  137. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/catalogue_verify.py +0 -0
  138. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/config.py +0 -0
  139. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/diff.py +0 -0
  140. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/docs.py +0 -0
  141. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/init_state.py +0 -0
  142. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/install.py +0 -0
  143. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/list_installed.py +0 -0
  144. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/list_packs.py +0 -0
  145. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/list_profiles.py +0 -0
  146. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/list_targets.py +0 -0
  147. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/oplog_cmd.py +0 -0
  148. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/pack_config_cmd.py +0 -0
  149. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/pack_evals.py +0 -0
  150. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/package_catalogue.py +0 -0
  151. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/profile.py +0 -0
  152. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/reconcile.py +0 -0
  153. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/render.py +0 -0
  154. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/scaffold.py +0 -0
  155. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/show.py +0 -0
  156. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/uninstall.py +0 -0
  157. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/upgrade.py +0 -0
  158. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/commands/validate.py +0 -0
  159. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/config.py +0 -0
  160. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/local_exclude.py +0 -0
  161. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/oplog.py +0 -0
  162. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/pack_inventory.py +0 -0
  163. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/render.py +0 -0
  164. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/safety.py +0 -0
  165. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/scaffold.py +0 -0
  166. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/scope.py +0 -0
  167. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/statelock.py +0 -0
  168. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/user_config.py +0 -0
  169. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle/workspace_mcp.py +0 -0
  170. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle.egg-info/dependency_links.txt +0 -0
  171. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle.egg-info/entry_points.txt +0 -0
  172. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle.egg-info/requires.txt +0 -0
  173. {agentbundle-0.32.0 → agentbundle-0.33.1}/agentbundle.egg-info/top_level.txt +0 -0
  174. {agentbundle-0.32.0 → agentbundle-0.33.1}/conftest.py +0 -0
  175. {agentbundle-0.32.0 → agentbundle-0.33.1}/setup.cfg +0 -0
  176. {agentbundle-0.32.0 → agentbundle-0.33.1}/templates/install-marker.py +0 -0
  177. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/__init__.py +0 -0
  178. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/_support.py +0 -0
  179. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/__init__.py +0 -0
  180. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
  181. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
  182. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
  183. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
  184. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
  185. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
  186. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
  187. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
  188. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
  189. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
  190. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
  191. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
  192. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
  193. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
  194. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
  195. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
  196. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
  197. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
  198. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
  199. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
  200. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
  201. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
  202. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
  203. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_codex.py +0 -0
  204. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_copilot.py +0 -0
  205. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_cursor.py +0 -0
  206. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_gemini.py +0 -0
  207. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_kiro.py +0 -0
  208. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
  209. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
  210. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
  211. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
  212. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
  213. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_contract.py +0 -0
  214. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_contract_scope.py +0 -0
  215. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_contract_v07.py +0 -0
  216. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_contract_v08.py +0 -0
  217. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
  218. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_end_to_end_build.py +0 -0
  219. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_lint_packs.py +0 -0
  220. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
  221. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_pack_schema.py +0 -0
  222. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
  223. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_pack_schema_install.py +0 -0
  224. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_pipeline.py +0 -0
  225. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_plugin_hooks.py +0 -0
  226. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
  227. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_projectable_subset.py +0 -0
  228. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_projections_merge_json.py +0 -0
  229. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_scope_rails.py +0 -0
  230. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_security.py +0 -0
  231. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
  232. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
  233. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
  234. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
  235. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_user_libs_projection.py +0 -0
  236. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_validate.py +0 -0
  237. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
  238. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/conftest.py +0 -0
  239. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
  240. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/adapt/values.toml +0 -0
  241. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
  242. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
  243. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  244. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
  245. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
  246. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
  247. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
  248. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
  249. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
  250. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
  251. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield/values.toml +0 -0
  252. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
  253. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
  254. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
  255. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
  256. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
  257. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
  258. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
  259. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
  260. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
  261. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
  262. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
  263. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
  264. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
  265. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
  266. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
  267. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
  268. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
  269. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
  270. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
  271. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
  272. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
  273. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
  274. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
  275. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
  276. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
  277. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
  278. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
  279. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
  280. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
  281. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
  282. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
  283. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
  284. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
  285. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
  286. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
  287. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
  288. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
  289. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/list-installed/golden_120col.txt +0 -0
  290. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/list-installed/golden_80col.txt +0 -0
  291. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
  292. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
  293. {agentbundle-0.32.0 → agentbundle-0.33.1}/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.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
  295. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
  296. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
  297. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
  298. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
  299. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  300. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
  301. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
  302. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
  303. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  304. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
  305. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
  306. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
  307. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
  308. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
  309. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
  310. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
  311. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
  312. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
  313. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
  314. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
  315. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
  316. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
  317. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
  318. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
  319. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
  320. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
  321. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
  322. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
  323. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  324. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
  325. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
  326. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  327. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
  328. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
  329. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
  330. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
  331. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  332. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
  333. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
  334. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  335. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
  336. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
  337. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
  338. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
  339. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  340. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
  341. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
  342. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  343. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
  344. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
  345. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
  346. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
  347. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
  348. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
  349. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/__init__.py +0 -0
  350. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_adapt_cmd.py +0 -0
  351. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_adapt_dual_scope.py +0 -0
  352. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_adapt_preflight_detection.py +0 -0
  353. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_adapt_schema_migration.py +0 -0
  354. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_apm_install_route.py +0 -0
  355. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_blank_catalogue.py +0 -0
  356. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
  357. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_brownfield_round_trip.py +0 -0
  358. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
  359. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_build_check_drift_gates.py +0 -0
  360. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_build_derivation_apm.py +0 -0
  361. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
  362. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_catalogue_init.py +0 -0
  363. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
  364. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_claude_plugins_install_route.py +0 -0
  365. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_config_cascade.py +0 -0
  366. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_credential_brokers_pack_install.py +0 -0
  367. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_credentials_wheel.py +0 -0
  368. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
  369. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_fixtures_validate.py +0 -0
  370. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_hook_wiring_ingress.py +0 -0
  371. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_adapt_chain.py +0 -0
  372. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_cmd.py +0 -0
  373. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_converters_user_scope.py +0 -0
  374. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_copilot_full_parity.py +0 -0
  375. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_core_smoke.py +0 -0
  376. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_dependencies_gate.py +0 -0
  377. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
  378. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_dual_scope.py +0 -0
  379. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_orphan_reshape.py +0 -0
  380. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_pack_metadata_shape.py +0 -0
  381. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_profile.py +0 -0
  382. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_profile_live.py +0 -0
  383. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
  384. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_research_user_scope.py +0 -0
  385. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_seed_delivery.py +0 -0
  386. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_session_start_wiring.py +0 -0
  387. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_upgrade_offer.py +0 -0
  388. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_user_hooks.py +0 -0
  389. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
  390. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
  391. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
  392. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
  393. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_list_packs_cmd.py +0 -0
  394. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_local_scope_install.py +0 -0
  395. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_marketplace_entry_validation.py +0 -0
  396. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_marketplace_manifest_regression.py +0 -0
  397. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_multi_pack_install.py +0 -0
  398. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
  399. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_plugin_route_membership.py +0 -0
  400. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_recommends_cross_scope.py +0 -0
  401. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_reconcile.py +0 -0
  402. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_reserved_path_filter.py +0 -0
  403. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_scaffold_projection.py +0 -0
  404. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_self_host_schema_migration.py +0 -0
  405. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
  406. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_shared_prefix_coexistence.py +0 -0
  407. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_tier_invariants.py +0 -0
  408. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_uninstall_cmd.py +0 -0
  409. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_uninstall_user_hooks.py +0 -0
  410. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
  411. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_upgrade_cmd.py +0 -0
  412. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_upgrade_user_hooks.py +0 -0
  413. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_version_gate_matrix.py +0 -0
  414. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
  415. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/integration/test_zipapp.py +0 -0
  416. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/test_adapter_permissions_projection.py +0 -0
  417. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/test_workspace_mcp_elicit.py +0 -0
  418. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/test_workspace_mcp_event_bridge.py +0 -0
  419. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/test_workspace_mcp_git.py +0 -0
  420. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/test_workspace_mcp_lifecycle.py +0 -0
  421. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/test_workspace_mcp_stdin.py +0 -0
  422. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/test_workspace_mcp_tools.py +0 -0
  423. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/__init__.py +0 -0
  424. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_adapt_discovery_schema.py +0 -0
  425. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_append_layout_section.py +0 -0
  426. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_architect_readme_install_command.py +0 -0
  427. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_ci_contract.py +0 -0
  428. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_curation_deps.py +0 -0
  429. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
  430. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_pack_defaults.py +0 -0
  431. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
  432. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_skill_spec_lint.py +0 -0
  433. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_build.py +0 -0
  434. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
  435. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_identity.py +0 -0
  436. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_init.py +0 -0
  437. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
  438. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
  439. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_catalogue_wave2_schema.py +0 -0
  440. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_cli_catalogue_optional.py +0 -0
  441. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_cli_help_lists_config.py +0 -0
  442. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_cli_path_normalisation.py +0 -0
  443. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_cli_profile_surface.py +0 -0
  444. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_cli_scope_flags.py +0 -0
  445. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_codex_agent_toml.py +0 -0
  446. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_codex_projection_modes.py +0 -0
  447. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_common_classify_seeds.py +0 -0
  448. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_config.py +0 -0
  449. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_config_cmd.py +0 -0
  450. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_configured_adapter.py +0 -0
  451. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_confirm_helper.py +0 -0
  452. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_contract_parity.py +0 -0
  453. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_contract_v0_3_schema.py +0 -0
  454. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_copilot_agent_md.py +0 -0
  455. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_copilot_hooks_json.py +0 -0
  456. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
  457. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_credbroker_lint_hardening.py +0 -0
  458. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_dependencies_batch.py +0 -0
  459. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_diff_cmd.py +0 -0
  460. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_footprint_ownership.py +0 -0
  461. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_init_state_cmd.py +0 -0
  462. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
  463. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
  464. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
  465. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
  466. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_event_dropped_wirings.py +0 -0
  467. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_first_value_handoff.py +0 -0
  468. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_force_help.py +0 -0
  469. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_inband_detection.py +0 -0
  470. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_messages.py +0 -0
  471. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_messages_repo_scope.py +0 -0
  472. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_refusal_ordering.py +0 -0
  473. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_install_state_provenance.py +0 -0
  474. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
  475. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
  476. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
  477. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
  478. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_list_installed_cmd.py +0 -0
  479. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_list_installed_status.py +0 -0
  480. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_list_targets_cmd.py +0 -0
  481. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_schema.py +0 -0
  482. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
  483. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t12_show.py +0 -0
  484. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t2_resolve.py +0 -0
  485. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t3_config.py +0 -0
  486. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t4_state_path.py +0 -0
  487. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
  488. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
  489. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t8_install.py +0 -0
  490. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_local_scope_t9_exclude.py +0 -0
  491. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_marker_schema_version_parity.py +0 -0
  492. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_merge_into_agent_json.py +0 -0
  493. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
  494. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_nested_symlink_hardening.py +0 -0
  495. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_org_bootstrap.py +0 -0
  496. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_pack_config_api.py +0 -0
  497. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_pack_inventory.py +0 -0
  498. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_packstate_source_provenance.py +0 -0
  499. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_pipeline_phase_order.py +0 -0
  500. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_plugin_scope_filter.py +0 -0
  501. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_profile_reader.py +0 -0
  502. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_render.py +0 -0
  503. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_render_cmd.py +0 -0
  504. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_render_table.py +0 -0
  505. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_resolve_state_path.py +0 -0
  506. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
  507. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
  508. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_safety.py +0 -0
  509. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
  510. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
  511. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_scaffold_cmd.py +0 -0
  512. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_scope.py +0 -0
  513. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_self_host_windows.py +0 -0
  514. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_shared_prefix_disclosure.py +0 -0
  515. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_source_conflict_guard.py +0 -0
  516. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_state_v01_refuse_write.py +0 -0
  517. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_state_v02.py +0 -0
  518. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_state_v0_4_schema.py +0 -0
  519. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_statelock.py +0 -0
  520. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_target_resolver.py +0 -0
  521. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_toml_emitters.py +0 -0
  522. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_unresolved_markers.py +0 -0
  523. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_upgrade_bulk_all.py +0 -0
  524. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_upgrade_recap.py +0 -0
  525. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_upgrade_source_inference.py +0 -0
  526. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_user_config_io.py +0 -0
  527. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_user_config_isolation.py +0 -0
  528. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_user_config_path.py +0 -0
  529. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_user_config_source.py +0 -0
  530. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_user_merge_json.py +0 -0
  531. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_validate_attach_to_agent.py +0 -0
  532. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_validate_categories.py +0 -0
  533. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_validate_cmd.py +0 -0
  534. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
  535. {agentbundle-0.32.0 → agentbundle-0.33.1}/tests/unit/test_values_from_shapes.py +0 -0
  536. {agentbundle-0.32.0 → agentbundle-0.33.1}/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.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
6
  License-Expression: Apache-2.0 OR MIT
@@ -34,6 +34,13 @@ python -m pip install agentbundle
34
34
 
35
35
  Requires Python 3.11+. Runs on macOS, Linux, and Windows.
36
36
 
37
+ ## What's new in 0.33.1
38
+
39
+ If you maintain a catalogue with repository-level tests, `agentbundle catalogue
40
+ verify --root .` now recognizes the top-level `tests/` tree as
41
+ repository-owned. Those paths no longer produce `[info] unclassified` notices;
42
+ genuinely unknown paths still do, and the notices remain informational.
43
+
37
44
  **Install into a repo** — so everyone who clones it gets the pack. `core` is the flagship pack, the loop itself:
38
45
 
39
46
  ```bash
@@ -200,7 +207,12 @@ agentbundle catalogue package \
200
207
  --output dist/
201
208
  ```
202
209
 
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.
210
+ Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist
211
+ (`catalogue.toml`, packs, profiles, guides, a marketplace manifest when
212
+ present, and legal files), with the same build-residue exclusions as the
213
+ default flavour. Includes a `self-hosted-source-manifest.json` with per-file
214
+ SHA-256 digests and provenance fields. `agentbundle install` refuses to install
215
+ a source archive, preventing accidental misuse.
204
216
 
205
217
  **Org bootstrap — ship the default channel in your fork:**
206
218
 
@@ -233,7 +245,10 @@ security boundary.
233
245
 
234
246
  ## Build your own catalogue
235
247
 
236
- `agentbundle` isn't tied to the agent-ready-repo catalogue. Any repo that lays its packs out the same way can use it.
248
+ `agentbundle` isn't tied to the agent-ready-repo catalogue. A catalogue source
249
+ has two required root markers: a valid `catalogue.toml` and a literal `packs/`
250
+ directory. A custom `catalogue.paths.packs` value controls where pack content
251
+ is read from; it does not replace the root `packs/` marker.
237
252
 
238
253
  **Bootstrap a new catalogue** in an empty directory:
239
254
 
@@ -334,6 +349,11 @@ The org hint fires after the user-config but before the on-disk IDE probe — so
334
349
  agentbundle catalogue lint --root .
335
350
  ```
336
351
 
352
+ Lint validates both source markers and then checks the configured pack content.
353
+ It requires `.claude-plugin/marketplace.json` only when the effective self-host
354
+ adapters include `claude-code`. A Kiro-only catalogue can omit that Claude
355
+ artifact; the default Claude Code and Codex projection still requires it.
356
+
337
357
  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
358
 
339
359
  ```bash
@@ -14,6 +14,13 @@ python -m pip install agentbundle
14
14
 
15
15
  Requires Python 3.11+. Runs on macOS, Linux, and Windows.
16
16
 
17
+ ## What's new in 0.33.1
18
+
19
+ If you maintain a catalogue with repository-level tests, `agentbundle catalogue
20
+ verify --root .` now recognizes the top-level `tests/` tree as
21
+ repository-owned. Those paths no longer produce `[info] unclassified` notices;
22
+ genuinely unknown paths still do, and the notices remain informational.
23
+
17
24
  **Install into a repo** — so everyone who clones it gets the pack. `core` is the flagship pack, the loop itself:
18
25
 
19
26
  ```bash
@@ -180,7 +187,12 @@ agentbundle catalogue package \
180
187
  --output dist/
181
188
  ```
182
189
 
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.
190
+ Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist
191
+ (`catalogue.toml`, packs, profiles, guides, a marketplace manifest when
192
+ present, and legal files), with the same build-residue exclusions as the
193
+ default flavour. Includes a `self-hosted-source-manifest.json` with per-file
194
+ SHA-256 digests and provenance fields. `agentbundle install` refuses to install
195
+ a source archive, preventing accidental misuse.
184
196
 
185
197
  **Org bootstrap — ship the default channel in your fork:**
186
198
 
@@ -213,7 +225,10 @@ security boundary.
213
225
 
214
226
  ## Build your own catalogue
215
227
 
216
- `agentbundle` isn't tied to the agent-ready-repo catalogue. Any repo that lays its packs out the same way can use it.
228
+ `agentbundle` isn't tied to the agent-ready-repo catalogue. A catalogue source
229
+ has two required root markers: a valid `catalogue.toml` and a literal `packs/`
230
+ directory. A custom `catalogue.paths.packs` value controls where pack content
231
+ is read from; it does not replace the root `packs/` marker.
217
232
 
218
233
  **Bootstrap a new catalogue** in an empty directory:
219
234
 
@@ -314,6 +329,11 @@ The org hint fires after the user-config but before the on-disk IDE probe — so
314
329
  agentbundle catalogue lint --root .
315
330
  ```
316
331
 
332
+ Lint validates both source markers and then checks the configured pack content.
333
+ It requires `.claude-plugin/marketplace.json` only when the effective self-host
334
+ adapters include `claude-code`. A Kiro-only catalogue can omit that Claude
335
+ artifact; the default Claude Code and Codex projection still requires it.
336
+
317
337
  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
338
 
319
339
  ```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,
@@ -415,6 +420,7 @@ EXCLUDED_PATTERNS: tuple[str, ...] = (
415
420
  "guides/**/*.md",
416
421
  "web/**",
417
422
  "profiles/**",
423
+ "tests/**",
418
424
  # Seeded-once / adopter-curated files (Manual semantics).
419
425
  "workspace.toml", # Seeded once; adopter-curated thereafter
420
426
  # Manual seed-projected root path (amendment 2026-05-25). The subtree
@@ -1268,7 +1274,7 @@ def run_self_host(
1268
1274
  # preferred-adapter is kiro-ide or kiro-cli (or any other adapter not in
1269
1275
  # SELF_HOST_ADAPTERS), those artifacts are neither written nor expected in
1270
1276
  # the drift check.
1271
- _project_claude_artifacts = "claude-code" in _effective_adapters(preferred_adapter)
1277
+ project_claude_artifacts = projects_claude_artifacts(preferred_adapter)
1272
1278
 
1273
1279
  if dry_run:
1274
1280
  with tempfile.TemporaryDirectory(prefix="agentbundle-shadow-") as shadow_str:
@@ -1286,11 +1292,11 @@ def run_self_host(
1286
1292
  except ValueError as exc:
1287
1293
  print(f"self-host: {exc}", file=sys.stderr)
1288
1294
  return 4
1289
- if _project_claude_artifacts:
1295
+ if project_claude_artifacts:
1290
1296
  _aggregate_marketplace(packs_dir, shadow, owner=owner, name=marketplace_name)
1291
1297
  _recreate_claude_symlink(shadow, force_copy=no_symlink)
1292
1298
  extra_marker_paths = list(seed_map.keys())
1293
- if _project_claude_artifacts:
1299
+ if project_claude_artifacts:
1294
1300
  extra_marker_paths.append(Path(".claude-plugin") / "marketplace.json")
1295
1301
  if agents_path is not None:
1296
1302
  extra_marker_paths.append(Path("AGENTS.md"))
@@ -1347,11 +1353,11 @@ def run_self_host(
1347
1353
  except ValueError as exc:
1348
1354
  print(f"self-host: {exc}", file=sys.stderr)
1349
1355
  return 4
1350
- if _project_claude_artifacts:
1356
+ if project_claude_artifacts:
1351
1357
  _aggregate_marketplace(packs_dir, working_tree, owner=owner, name=marketplace_name)
1352
1358
  _recreate_claude_symlink(working_tree, force_copy=no_symlink)
1353
1359
  extra_marker_paths = list(seed_map.keys())
1354
- if _project_claude_artifacts:
1360
+ if project_claude_artifacts:
1355
1361
  extra_marker_paths.append(Path(".claude-plugin") / "marketplace.json")
1356
1362
  if agents_path is not None:
1357
1363
  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