agentbundle 0.34.0__tar.gz → 0.35.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 (553) hide show
  1. {agentbundle-0.34.0/agentbundle.egg-info → agentbundle-0.35.0}/PKG-INFO +77 -15
  2. {agentbundle-0.34.0 → agentbundle-0.35.0}/README-pypi.md +76 -14
  3. agentbundle-0.35.0/agentbundle/catalogue.py +380 -0
  4. agentbundle-0.35.0/agentbundle/system_trust.py +252 -0
  5. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/version.py +1 -1
  6. {agentbundle-0.34.0 → agentbundle-0.35.0/agentbundle.egg-info}/PKG-INFO +77 -15
  7. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/SOURCES.txt +4 -0
  8. {agentbundle-0.34.0 → agentbundle-0.35.0}/pyproject.toml +1 -1
  9. agentbundle-0.35.0/tests/integration/test_trust_fallback_tls.py +201 -0
  10. agentbundle-0.35.0/tests/unit/test_catalogue_trust_fallback.py +295 -0
  11. agentbundle-0.35.0/tests/unit/test_system_trust.py +345 -0
  12. agentbundle-0.34.0/agentbundle/catalogue.py +0 -176
  13. {agentbundle-0.34.0 → agentbundle-0.35.0}/MANIFEST.in +0 -0
  14. {agentbundle-0.34.0 → agentbundle-0.35.0}/README.md +0 -0
  15. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/__init__.py +0 -0
  16. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/__main__.py +0 -0
  17. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/adapter.schema.json +0 -0
  18. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/adapter.toml +0 -0
  19. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
  20. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  21. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
  22. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
  23. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  24. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  25. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
  26. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
  27. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  28. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  29. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  30. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  31. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  32. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  33. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
  34. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
  35. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
  36. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/catalogue.schema.json +0 -0
  37. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/guide.schema.json +0 -0
  38. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/install-defaults.toml +0 -0
  39. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/install-marker.py +0 -0
  40. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/marketplace-entry.schema.json +0 -0
  41. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/pack.schema.json +0 -0
  42. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  43. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  44. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/profile.schema.json +0 -0
  45. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/public-contracts.txt +0 -0
  46. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/skill-manifest.schema.json +0 -0
  47. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/skill.schema.json +0 -0
  48. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/target-vocab.toml +0 -0
  49. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/_data/workspace_status_engine.py +0 -0
  50. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/__init__.py +0 -0
  51. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/__main__.py +0 -0
  52. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapter_root_bins.py +0 -0
  53. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/__init__.py +0 -0
  54. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/claude_code.py +0 -0
  55. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/codex.py +0 -0
  56. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/copilot.py +0 -0
  57. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/cursor.py +0 -0
  58. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/gemini.py +0 -0
  59. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/kiro.py +0 -0
  60. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
  61. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/adapters/kiro_ide.py +0 -0
  62. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/contract.py +0 -0
  63. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/hook_wiring_rules.py +0 -0
  64. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/lint_packs.py +0 -0
  65. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/main.py +0 -0
  66. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/phase_order.py +0 -0
  67. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projection_io.py +0 -0
  68. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/__init__.py +0 -0
  69. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  70. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  71. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  72. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/direct_directory.py +0 -0
  73. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  74. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/hook_id.py +0 -0
  75. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  76. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  77. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/merge_json.py +0 -0
  78. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/plugin_hooks.py +0 -0
  79. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/projections/user_merge_json.py +0 -0
  80. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  81. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  82. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/marketplace.toml +0 -0
  83. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  84. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  85. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  86. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/recipes/self-host.toml +0 -0
  87. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/scope_rails.py +0 -0
  88. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/self_host.py +0 -0
  89. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/shared_libs.py +0 -0
  90. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/target_resolver.py +0 -0
  91. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/user_libs.py +0 -0
  92. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/build/validate.py +0 -0
  93. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/__init__.py +0 -0
  94. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/archive.py +0 -0
  95. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/build.py +0 -0
  96. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/config.py +0 -0
  97. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/contracts_inspector.py +0 -0
  98. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/defaults.py +0 -0
  99. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  100. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/file_safety.py +0 -0
  101. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/identity.py +0 -0
  102. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/initialise.py +0 -0
  103. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
  104. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/lint.py +0 -0
  105. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/package.py +0 -0
  106. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/results.py +0 -0
  107. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/self_host.py +0 -0
  108. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
  109. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  110. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  111. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/catalogue_tooling/verify.py +0 -0
  112. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/categories.py +0 -0
  113. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/cli.py +0 -0
  114. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/__init__.py +0 -0
  115. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/_common.py +0 -0
  116. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/_drop_warning.py +0 -0
  117. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/adapt.py +0 -0
  118. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_build.py +0 -0
  119. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_contracts.py +0 -0
  120. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_init.py +0 -0
  121. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_lint.py +0 -0
  122. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_package.py +0 -0
  123. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_self_host.py +0 -0
  124. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  125. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  126. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/catalogue_verify.py +0 -0
  127. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/config.py +0 -0
  128. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/diff.py +0 -0
  129. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/docs.py +0 -0
  130. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/init_state.py +0 -0
  131. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/install.py +0 -0
  132. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_installed.py +0 -0
  133. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_packs.py +0 -0
  134. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_profiles.py +0 -0
  135. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/list_targets.py +0 -0
  136. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/oplog_cmd.py +0 -0
  137. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/pack_config_cmd.py +0 -0
  138. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/pack_evals.py +0 -0
  139. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/package_catalogue.py +0 -0
  140. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/profile.py +0 -0
  141. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/reconcile.py +0 -0
  142. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/render.py +0 -0
  143. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/scaffold.py +0 -0
  144. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/show.py +0 -0
  145. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/uninstall.py +0 -0
  146. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/upgrade.py +0 -0
  147. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/commands/validate.py +0 -0
  148. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/config.py +0 -0
  149. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/https_catalogue.py +0 -0
  150. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/local_exclude.py +0 -0
  151. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/oplog.py +0 -0
  152. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/pack_inventory.py +0 -0
  153. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/render.py +0 -0
  154. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/safety.py +0 -0
  155. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/scaffold.py +0 -0
  156. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/scope.py +0 -0
  157. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/source_defaults.py +0 -0
  158. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/statelock.py +0 -0
  159. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/user_config.py +0 -0
  160. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle/workspace_mcp.py +0 -0
  161. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/dependency_links.txt +0 -0
  162. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/entry_points.txt +0 -0
  163. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/requires.txt +0 -0
  164. {agentbundle-0.34.0 → agentbundle-0.35.0}/agentbundle.egg-info/top_level.txt +0 -0
  165. {agentbundle-0.34.0 → agentbundle-0.35.0}/conftest.py +0 -0
  166. {agentbundle-0.34.0 → agentbundle-0.35.0}/setup.cfg +0 -0
  167. {agentbundle-0.34.0 → agentbundle-0.35.0}/templates/install-marker.py +0 -0
  168. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/__init__.py +0 -0
  169. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/_support.py +0 -0
  170. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/__init__.py +0 -0
  171. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/README.md +0 -0
  172. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +0 -0
  173. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/claude-code-2.1.228-hook-events.json +0 -0
  174. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
  175. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
  176. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
  177. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
  178. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
  179. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
  180. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
  181. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
  182. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
  183. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
  184. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
  185. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
  186. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
  187. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
  188. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
  189. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
  190. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
  191. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
  192. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
  193. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
  194. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
  195. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
  196. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
  197. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_codex.py +0 -0
  198. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_copilot.py +0 -0
  199. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_cursor.py +0 -0
  200. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_gemini.py +0 -0
  201. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro.py +0 -0
  202. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
  203. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
  204. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
  205. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
  206. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
  207. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract.py +0 -0
  208. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract_scope.py +0 -0
  209. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract_v07.py +0 -0
  210. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_contract_v08.py +0 -0
  211. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
  212. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_end_to_end_build.py +0 -0
  213. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_hook_wiring_rules.py +0 -0
  214. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_lint_packs.py +0 -0
  215. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
  216. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pack_schema.py +0 -0
  217. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
  218. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pack_schema_install.py +0 -0
  219. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_pipeline.py +0 -0
  220. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_plugin_hooks.py +0 -0
  221. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
  222. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_plugin_publication_gates.py +0 -0
  223. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_projectable_subset.py +0 -0
  224. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_projection_io.py +0 -0
  225. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_projections_merge_json.py +0 -0
  226. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_scope_rails.py +0 -0
  227. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_security.py +0 -0
  228. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_check.py +0 -0
  229. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
  230. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_metadata_policy.py +0 -0
  231. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
  232. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
  233. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
  234. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_user_libs_projection.py +0 -0
  235. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_validate.py +0 -0
  236. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
  237. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/conftest.py +0 -0
  238. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
  239. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/adapt/values.toml +0 -0
  240. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
  241. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/catalogue.toml +0 -0
  242. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
  243. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  244. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
  245. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
  246. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
  247. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
  248. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
  249. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
  250. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
  251. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield/values.toml +0 -0
  252. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
  253. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
  254. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
  255. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
  256. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
  257. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
  258. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
  259. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
  260. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
  261. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
  262. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
  263. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
  264. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
  265. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
  266. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
  267. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
  268. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
  269. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
  270. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
  271. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
  272. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
  273. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
  274. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
  275. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
  276. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
  277. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
  278. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
  279. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
  280. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
  281. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
  282. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
  283. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
  284. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
  285. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
  286. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
  287. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
  288. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
  289. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list-installed/golden_120col.txt +0 -0
  290. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list-installed/golden_80col.txt +0 -0
  291. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
  292. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
  293. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +0 -0
  294. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
  295. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
  296. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
  297. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
  298. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
  299. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  300. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
  301. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
  302. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
  303. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  304. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
  305. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
  306. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
  307. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
  308. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
  309. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
  310. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
  311. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
  312. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
  313. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
  314. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
  315. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
  316. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
  317. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
  318. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
  319. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
  320. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
  321. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
  322. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
  323. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  324. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
  325. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
  326. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  327. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
  328. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
  329. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
  330. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
  331. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  332. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
  333. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
  334. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  335. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
  336. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
  337. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
  338. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
  339. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  340. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
  341. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
  342. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  343. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
  344. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
  345. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
  346. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
  347. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
  348. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
  349. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/__init__.py +0 -0
  350. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_cmd.py +0 -0
  351. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_dual_scope.py +0 -0
  352. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_preflight_detection.py +0 -0
  353. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_adapt_schema_migration.py +0 -0
  354. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_apm_install_route.py +0 -0
  355. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_blank_catalogue.py +0 -0
  356. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
  357. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_brownfield_round_trip.py +0 -0
  358. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
  359. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_build_check_drift_gates.py +0 -0
  360. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_build_derivation_apm.py +0 -0
  361. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
  362. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_catalogue_init.py +0 -0
  363. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
  364. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_claude_plugins_install_route.py +0 -0
  365. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_config_cascade.py +0 -0
  366. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_credential_brokers_pack_install.py +0 -0
  367. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_credentials_wheel.py +0 -0
  368. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
  369. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_editable_source_detection.py +0 -0
  370. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_fixtures_validate.py +0 -0
  371. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_hook_wiring_ingress.py +0 -0
  372. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_adapt_chain.py +0 -0
  373. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_cmd.py +0 -0
  374. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_converters_user_scope.py +0 -0
  375. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_copilot_full_parity.py +0 -0
  376. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_core_smoke.py +0 -0
  377. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_default_source.py +0 -0
  378. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_dependencies_gate.py +0 -0
  379. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
  380. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_dual_scope.py +0 -0
  381. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_orphan_reshape.py +0 -0
  382. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_pack_metadata_shape.py +0 -0
  383. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_profile.py +0 -0
  384. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_profile_live.py +0 -0
  385. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
  386. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_research_user_scope.py +0 -0
  387. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_seed_delivery.py +0 -0
  388. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_session_start_wiring.py +0 -0
  389. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_upgrade_offer.py +0 -0
  390. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_user_hooks.py +0 -0
  391. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
  392. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
  393. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
  394. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
  395. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_list_packs_cmd.py +0 -0
  396. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_local_scope_install.py +0 -0
  397. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_marketplace_entry_validation.py +0 -0
  398. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_marketplace_manifest_regression.py +0 -0
  399. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_multi_pack_install.py +0 -0
  400. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
  401. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_plugin_route_membership.py +0 -0
  402. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_recommends_cross_scope.py +0 -0
  403. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_reconcile.py +0 -0
  404. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_reserved_path_filter.py +0 -0
  405. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_scaffold_projection.py +0 -0
  406. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_self_host_schema_migration.py +0 -0
  407. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
  408. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_shared_prefix_coexistence.py +0 -0
  409. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_show_cmd.py +0 -0
  410. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_tier_invariants.py +0 -0
  411. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_uninstall_cmd.py +0 -0
  412. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_uninstall_user_hooks.py +0 -0
  413. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
  414. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_upgrade_cmd.py +0 -0
  415. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_upgrade_user_hooks.py +0 -0
  416. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_version_gate_matrix.py +0 -0
  417. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
  418. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/integration/test_zipapp.py +0 -0
  419. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_adapter_permissions_projection.py +0 -0
  420. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_elicit.py +0 -0
  421. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_event_bridge.py +0 -0
  422. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_git.py +0 -0
  423. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_lifecycle.py +0 -0
  424. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_stdin.py +0 -0
  425. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/test_workspace_mcp_tools.py +0 -0
  426. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/__init__.py +0 -0
  427. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_adapt_discovery_schema.py +0 -0
  428. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_append_layout_section.py +0 -0
  429. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_architect_readme_install_command.py +0 -0
  430. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_ci_contract.py +0 -0
  431. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_curation_deps.py +0 -0
  432. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
  433. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_pack_defaults.py +0 -0
  434. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
  435. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_skill_spec_lint.py +0 -0
  436. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_archive.py +0 -0
  437. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_build.py +0 -0
  438. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
  439. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_foundation.py +0 -0
  440. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_identity.py +0 -0
  441. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_init.py +0 -0
  442. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_lint.py +0 -0
  443. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_package.py +0 -0
  444. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_self_host.py +0 -0
  445. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
  446. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
  447. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_tooling_verify.py +0 -0
  448. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave2_schema.py +0 -0
  449. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave2_validation.py +0 -0
  450. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_contracts_cli.py +0 -0
  451. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_contracts_inspector.py +0 -0
  452. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_init_nextsteps.py +0 -0
  453. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_catalogue_wave3_offline_navigation.py +0 -0
  454. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_catalogue_optional.py +0 -0
  455. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_help_lists_config.py +0 -0
  456. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_path_normalisation.py +0 -0
  457. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_profile_surface.py +0 -0
  458. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_cli_scope_flags.py +0 -0
  459. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_codex_agent_toml.py +0 -0
  460. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_codex_projection_modes.py +0 -0
  461. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_common_classify_seeds.py +0 -0
  462. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_config.py +0 -0
  463. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_config_cmd.py +0 -0
  464. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_configured_adapter.py +0 -0
  465. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_confirm_helper.py +0 -0
  466. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_contract_parity.py +0 -0
  467. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_contract_v0_3_schema.py +0 -0
  468. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_copilot_agent_md.py +0 -0
  469. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_copilot_hooks_json.py +0 -0
  470. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
  471. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_credbroker_lint_hardening.py +0 -0
  472. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_dependencies_batch.py +0 -0
  473. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_diff_cmd.py +0 -0
  474. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_footprint_ownership.py +0 -0
  475. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_https_catalogue.py +0 -0
  476. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_init_state_cmd.py +0 -0
  477. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
  478. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
  479. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
  480. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
  481. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_event_dropped_wirings.py +0 -0
  482. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_first_value_handoff.py +0 -0
  483. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_force_help.py +0 -0
  484. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_inband_detection.py +0 -0
  485. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_messages.py +0 -0
  486. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_messages_repo_scope.py +0 -0
  487. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_refusal_ordering.py +0 -0
  488. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_install_state_provenance.py +0 -0
  489. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
  490. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
  491. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
  492. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
  493. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_list_installed_cmd.py +0 -0
  494. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_list_installed_status.py +0 -0
  495. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_list_targets_cmd.py +0 -0
  496. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_schema.py +0 -0
  497. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
  498. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t12_show.py +0 -0
  499. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t2_resolve.py +0 -0
  500. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t3_config.py +0 -0
  501. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t4_state_path.py +0 -0
  502. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
  503. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
  504. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t8_install.py +0 -0
  505. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_local_scope_t9_exclude.py +0 -0
  506. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_marker_schema_version_parity.py +0 -0
  507. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_merge_into_agent_json.py +0 -0
  508. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
  509. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_nested_symlink_hardening.py +0 -0
  510. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_org_bootstrap.py +0 -0
  511. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_pack_config_api.py +0 -0
  512. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_pack_inventory.py +0 -0
  513. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_package_catalogue.py +0 -0
  514. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_packstate_source_provenance.py +0 -0
  515. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_pipeline_phase_order.py +0 -0
  516. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_plugin_scope_filter.py +0 -0
  517. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_profile_reader.py +0 -0
  518. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_render.py +0 -0
  519. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_render_cmd.py +0 -0
  520. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_render_table.py +0 -0
  521. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_resolve_state_path.py +0 -0
  522. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
  523. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
  524. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_safety.py +0 -0
  525. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
  526. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
  527. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_scaffold_cmd.py +0 -0
  528. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_scope.py +0 -0
  529. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_self_host_windows.py +0 -0
  530. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_shared_prefix_disclosure.py +0 -0
  531. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_source_conflict_guard.py +0 -0
  532. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_source_defaults.py +0 -0
  533. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_state_v01_refuse_write.py +0 -0
  534. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_state_v02.py +0 -0
  535. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_state_v0_4_schema.py +0 -0
  536. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_statelock.py +0 -0
  537. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_target_resolver.py +0 -0
  538. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_toml_emitters.py +0 -0
  539. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_unresolved_markers.py +0 -0
  540. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_upgrade_bulk_all.py +0 -0
  541. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_upgrade_recap.py +0 -0
  542. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_upgrade_source_inference.py +0 -0
  543. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_io.py +0 -0
  544. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_isolation.py +0 -0
  545. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_path.py +0 -0
  546. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_config_source.py +0 -0
  547. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_user_merge_json.py +0 -0
  548. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_attach_to_agent.py +0 -0
  549. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_categories.py +0 -0
  550. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_cmd.py +0 -0
  551. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
  552. {agentbundle-0.34.0 → agentbundle-0.35.0}/tests/unit/test_values_from_shapes.py +0 -0
  553. {agentbundle-0.34.0 → agentbundle-0.35.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.34.0
3
+ Version: 0.35.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
@@ -34,25 +34,42 @@ 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.34.0
37
+ ## What's new in 0.35.0
38
38
 
39
- Inspect the exact public contracts bundled with the installed AgentBundle
40
- version without network access:
39
+ **Installs now work on corporate networks that inspect TLS.** If your employer
40
+ runs a proxy that re-signs HTTPS traffic, an install used to fail like this and
41
+ leave you nothing to act on:
41
42
 
42
- ```bash
43
- agentbundle catalogue contracts list
44
- agentbundle catalogue contracts show pack.schema.json
45
- agentbundle catalogue contracts export --output ./reference-contracts
43
+ ```
44
+ install: Failed to fetch catalogue archive: … —
45
+ [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:
46
+ unable to get local issuer certificate
47
+ ```
48
+
49
+ The certificate authority your IT team installed is in the operating system's
50
+ trust store, and Python does not read that store on macOS. AgentBundle now
51
+ recovers on its own:
52
+
53
+ ```
54
+ agentbundle: certificate verification failed for github.com;
55
+ retrying with operating-system trust anchors
46
56
  ```
47
57
 
48
- `list` and `show` are read-only. `export` writes reference copies through a
49
- no-follow, preflighted batch writer; those copies do not override the contracts
50
- AgentBundle uses for validation.
58
+ Verification stays strict throughout — the retry *adds* trust anchors and never
59
+ removes one, and no flag or environment variable can disable verification. Only
60
+ the administrator keychain is read; your login keychain never is, because it is
61
+ writable without administrator rights. Set `AGENTBUNDLE_NO_SYSTEM_TRUST=1` to
62
+ opt out and see the underlying error.
51
63
 
52
- Successful `agentbundle catalogue init` output now points to the scaffolded
53
- `guides/_shared/reference/catalogue-authoring-standards.md`, contract discovery,
54
- and catalogue verification. The guide's bundled-contract section documents all
55
- three commands. JSON init output remains unchanged.
64
+ `AGENTBUNDLE_CA_BUNDLE` also works on `git+https://` sources now — previously
65
+ only the `catalogue+https://` and `archive+https://` forms read it, so following
66
+ the documentation did not help. `SSL_CERT_FILE`, `SSL_CERT_DIR`, and
67
+ `REQUESTS_CA_BUNDLE` are honoured there too. See
68
+ [Corporate networks](#corporate-networks) below.
69
+
70
+ When a fetch still fails, the error names the likely cause and ordered next
71
+ steps, and the request now carries a 30-second timeout so a proxy that accepts
72
+ the connection and never answers fails instead of hanging.
56
73
 
57
74
  **Install into a repo** — so everyone who clones it gets the pack. `core` is the flagship pack, the loop itself:
58
75
 
@@ -493,6 +510,51 @@ or `WORKSPACE_MCP_DISPATCHED_ITEM` (`ini_slug/type:slug`) for non-FSM shaping
493
510
  items. Setting neither gives discovery-only mode (git writes disabled). Setting
494
511
  both is unsupported — only one selects the mode.
495
512
 
513
+ ## Corporate networks
514
+
515
+ macOS is the only platform where Python ignores the operating system's trust
516
+ store, which is why the automatic fallback above is macOS-only:
517
+
518
+ | Platform | Trust source | Needs anything from you? |
519
+ | --- | --- | --- |
520
+ | **Windows** | Python loads the Windows `CA` and `ROOT` stores and honours each certificate's trust settings | No — a root pushed by Group Policy or Intune already works |
521
+ | **Linux** | OpenSSL reads `/etc/ssl/certs` | No, once the authority is installed there |
522
+ | **WSL** | Same as Linux — a WSL distribution does **not** inherit the Windows certificate store | **Yes** — see below |
523
+ | **macOS** | OpenSSL reads a PEM file; the keychain is invisible to it | No — this is the case the fallback handles |
524
+
525
+ If your IT team gives you a CA bundle, point AgentBundle at it directly:
526
+
527
+ ```bash
528
+ export AGENTBUNDLE_CA_BUNDLE=/path/to/corporate-ca.pem
529
+ agentbundle install --pack core
530
+ ```
531
+
532
+ On `git+https://` sources that bundle is **added** to the default trust store, so
533
+ a bundle holding only your private authority still verifies public hosts. On
534
+ `catalogue+https://` and `archive+https://` it **replaces** the store, pinning
535
+ verification to your own authority — useful for an internal Artifactory mirror.
536
+
537
+ **WSL** is the case most likely to catch out a Windows-standardised organisation:
538
+ your IT team pushes the authority to Windows, Windows tools pick it up, and
539
+ nothing inside the WSL distribution does. Export it from Windows (Certificate
540
+ Manager → Trusted Root Certification Authorities → Export as Base-64 X.509), then
541
+ install it in the distribution:
542
+
543
+ ```bash
544
+ sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
545
+ sudo update-ca-certificates
546
+ ```
547
+
548
+ Two things no certificate configuration can fix: a proxy that requires Kerberos
549
+ or NTLM authentication, and an egress allowlist that permits `github.com` but not
550
+ `codeload.github.com` — a GitHub archive fetch redirects across both hosts.
551
+
552
+ A note on virtualenvs, since it comes up: creating one does **not** change TLS
553
+ trust. A virtualenv inherits its base interpreter's certificate store unchanged.
554
+ If an install works under one `python3` and not another, the interpreters differ,
555
+ not the environment — compare them with
556
+ `python3 -c "import ssl; print(ssl.get_default_verify_paths())"`.
557
+
496
558
  ## Credentials
497
559
 
498
560
  `agentbundle` doesn't resolve secrets. Credentialed skills use [`credbroker`](https://pypi.org/project/credbroker/), a standalone resolver that keeps cleartext out of the model's reach.
@@ -14,25 +14,42 @@ 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.34.0
17
+ ## What's new in 0.35.0
18
18
 
19
- Inspect the exact public contracts bundled with the installed AgentBundle
20
- version without network access:
19
+ **Installs now work on corporate networks that inspect TLS.** If your employer
20
+ runs a proxy that re-signs HTTPS traffic, an install used to fail like this and
21
+ leave you nothing to act on:
21
22
 
22
- ```bash
23
- agentbundle catalogue contracts list
24
- agentbundle catalogue contracts show pack.schema.json
25
- agentbundle catalogue contracts export --output ./reference-contracts
23
+ ```
24
+ install: Failed to fetch catalogue archive: … —
25
+ [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:
26
+ unable to get local issuer certificate
27
+ ```
28
+
29
+ The certificate authority your IT team installed is in the operating system's
30
+ trust store, and Python does not read that store on macOS. AgentBundle now
31
+ recovers on its own:
32
+
33
+ ```
34
+ agentbundle: certificate verification failed for github.com;
35
+ retrying with operating-system trust anchors
26
36
  ```
27
37
 
28
- `list` and `show` are read-only. `export` writes reference copies through a
29
- no-follow, preflighted batch writer; those copies do not override the contracts
30
- AgentBundle uses for validation.
38
+ Verification stays strict throughout — the retry *adds* trust anchors and never
39
+ removes one, and no flag or environment variable can disable verification. Only
40
+ the administrator keychain is read; your login keychain never is, because it is
41
+ writable without administrator rights. Set `AGENTBUNDLE_NO_SYSTEM_TRUST=1` to
42
+ opt out and see the underlying error.
31
43
 
32
- Successful `agentbundle catalogue init` output now points to the scaffolded
33
- `guides/_shared/reference/catalogue-authoring-standards.md`, contract discovery,
34
- and catalogue verification. The guide's bundled-contract section documents all
35
- three commands. JSON init output remains unchanged.
44
+ `AGENTBUNDLE_CA_BUNDLE` also works on `git+https://` sources now — previously
45
+ only the `catalogue+https://` and `archive+https://` forms read it, so following
46
+ the documentation did not help. `SSL_CERT_FILE`, `SSL_CERT_DIR`, and
47
+ `REQUESTS_CA_BUNDLE` are honoured there too. See
48
+ [Corporate networks](#corporate-networks) below.
49
+
50
+ When a fetch still fails, the error names the likely cause and ordered next
51
+ steps, and the request now carries a 30-second timeout so a proxy that accepts
52
+ the connection and never answers fails instead of hanging.
36
53
 
37
54
  **Install into a repo** — so everyone who clones it gets the pack. `core` is the flagship pack, the loop itself:
38
55
 
@@ -473,6 +490,51 @@ or `WORKSPACE_MCP_DISPATCHED_ITEM` (`ini_slug/type:slug`) for non-FSM shaping
473
490
  items. Setting neither gives discovery-only mode (git writes disabled). Setting
474
491
  both is unsupported — only one selects the mode.
475
492
 
493
+ ## Corporate networks
494
+
495
+ macOS is the only platform where Python ignores the operating system's trust
496
+ store, which is why the automatic fallback above is macOS-only:
497
+
498
+ | Platform | Trust source | Needs anything from you? |
499
+ | --- | --- | --- |
500
+ | **Windows** | Python loads the Windows `CA` and `ROOT` stores and honours each certificate's trust settings | No — a root pushed by Group Policy or Intune already works |
501
+ | **Linux** | OpenSSL reads `/etc/ssl/certs` | No, once the authority is installed there |
502
+ | **WSL** | Same as Linux — a WSL distribution does **not** inherit the Windows certificate store | **Yes** — see below |
503
+ | **macOS** | OpenSSL reads a PEM file; the keychain is invisible to it | No — this is the case the fallback handles |
504
+
505
+ If your IT team gives you a CA bundle, point AgentBundle at it directly:
506
+
507
+ ```bash
508
+ export AGENTBUNDLE_CA_BUNDLE=/path/to/corporate-ca.pem
509
+ agentbundle install --pack core
510
+ ```
511
+
512
+ On `git+https://` sources that bundle is **added** to the default trust store, so
513
+ a bundle holding only your private authority still verifies public hosts. On
514
+ `catalogue+https://` and `archive+https://` it **replaces** the store, pinning
515
+ verification to your own authority — useful for an internal Artifactory mirror.
516
+
517
+ **WSL** is the case most likely to catch out a Windows-standardised organisation:
518
+ your IT team pushes the authority to Windows, Windows tools pick it up, and
519
+ nothing inside the WSL distribution does. Export it from Windows (Certificate
520
+ Manager → Trusted Root Certification Authorities → Export as Base-64 X.509), then
521
+ install it in the distribution:
522
+
523
+ ```bash
524
+ sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
525
+ sudo update-ca-certificates
526
+ ```
527
+
528
+ Two things no certificate configuration can fix: a proxy that requires Kerberos
529
+ or NTLM authentication, and an egress allowlist that permits `github.com` but not
530
+ `codeload.github.com` — a GitHub archive fetch redirects across both hosts.
531
+
532
+ A note on virtualenvs, since it comes up: creating one does **not** change TLS
533
+ trust. A virtualenv inherits its base interpreter's certificate store unchanged.
534
+ If an install works under one `python3` and not another, the interpreters differ,
535
+ not the environment — compare them with
536
+ `python3 -c "import ssl; print(ssl.get_default_verify_paths())"`.
537
+
476
538
  ## Credentials
477
539
 
478
540
  `agentbundle` doesn't resolve secrets. Credentialed skills use [`credbroker`](https://pypi.org/project/credbroker/), a standalone resolver that keeps cleartext out of the model's reach.
@@ -0,0 +1,380 @@
1
+ """Catalogue URI resolver — T5 deliverable, reused by T6/T8/T11/T12.
2
+
3
+ Accepts:
4
+ - Local relative or absolute paths.
5
+ - ``git+https://github.com/<owner>/<repo>[@<ref>]``
6
+
7
+ For ``git+https://`` URIs the resolver:
8
+ 1. Parses owner, repo, and optional ref.
9
+ 2. Constructs a GitHub archive URL (tag, branch, or SHA — tried in
10
+ that order by a light heuristic: tags contain only ``v`` + semver
11
+ chars or no slash; SHAs are exactly 40 hex chars; everything else
12
+ is a branch).
13
+ 3. Fetches with ``urllib.request.urlopen`` — no subprocess, no git.
14
+ 4. Extracts with ``tarfile`` into a per-call tempdir and returns the
15
+ inner ``<repo>-<ref>/`` directory.
16
+
17
+ ``git+ssh://`` URIs raise ``CatalogueError`` immediately — SSH is
18
+ deferred to v1.1.
19
+
20
+ Unreachable URLs raise ``CatalogueError`` with the tarball URL in the
21
+ message so the caller can report exactly what was attempted.
22
+
23
+ TLS trust is delegated to ``system_trust.py``: the fetch honours the
24
+ corporate CA-bundle environment variables, and a certificate-verification
25
+ failure is retried exactly once against operating-system trust anchors,
26
+ announced on stderr. Verification is never weakened on any path.
27
+
28
+ No subprocess calls in this module. The macOS keychain export that the
29
+ trust fallback needs lives in ``system_trust.py``, which this module
30
+ imports lazily and delegates to.
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ import atexit
36
+ import re
37
+ import shutil
38
+ import ssl
39
+ import sys
40
+ import tarfile
41
+ import tempfile
42
+ import urllib.error
43
+ import urllib.parse
44
+ import urllib.request
45
+ from collections.abc import Callable
46
+ from pathlib import Path
47
+
48
+ # A black-holing corporate proxy accepts the connection and never answers, so an
49
+ # unbounded fetch hangs forever rather than failing. The value matches
50
+ # https_catalogue._HTTP_TIMEOUT deliberately: both fetch archives over the same
51
+ # networks, and one number is easier to reason about than two. urllib applies it
52
+ # per socket operation, not to the whole transfer, so a large archive on a slow
53
+ # link is unaffected — only 30s of silence trips it.
54
+ _FETCH_TIMEOUT_S = 30
55
+
56
+ _SSH_PREFIX = "git+ssh://"
57
+ _HTTPS_PREFIX = "git+https://"
58
+
59
+ # Match git+https://github.com/<owner>/<repo>[@<ref>]
60
+ # Group 1: owner, Group 2: repo (no .git suffix), Group 3: ref (optional)
61
+ _HTTPS_RE = re.compile(
62
+ r"^git\+https://github\.com/([^/]+)/([^/@]+?)(?:\.git)?(?:@([^@]+))?$"
63
+ )
64
+
65
+ # A SHA is exactly 40 lowercase hex digits (or 7–40 for abbreviated SHAs;
66
+ # we accept the full pattern only to keep the heuristic simple).
67
+ _SHA_RE = re.compile(r"^[0-9a-f]{7,40}$")
68
+
69
+
70
+ class CatalogueError(ValueError):
71
+ """Raised when a catalogue URI cannot be resolved."""
72
+
73
+
74
+ def resolve_catalogue(uri: str) -> Path:
75
+ """Resolve *uri* to a local directory rooted at the catalogue.
76
+
77
+ Returns a ``Path`` to the local directory. For ``git+https://`` URIs
78
+ the path lives inside a per-call tempdir registered with ``atexit``
79
+ so it's removed at process exit — see ``_resolve_https``. Callers
80
+ must not assume the directory survives past process termination.
81
+ """
82
+ if uri.startswith(_SSH_PREFIX):
83
+ raise CatalogueError(
84
+ "SSH git URLs deferred to v1.1; use https or local path."
85
+ )
86
+
87
+ # Explicit reject for http:// variants — layer-1 explicit arg bypasses
88
+ # _is_valid_source, so we must guard here to avoid silent local-path fallback.
89
+ if uri.startswith(("catalogue+http://", "archive+http://")):
90
+ raise CatalogueError(
91
+ "HTTPS-only: catalogue+http:// and archive+http:// are not supported; "
92
+ "use catalogue+https:// or archive+https://"
93
+ )
94
+
95
+ # Dispatch new HTTPS catalogue schemes
96
+ if uri.startswith(("catalogue+https://", "archive+https://")):
97
+ from agentbundle.https_catalogue import fetch_catalogue_archive
98
+ return fetch_catalogue_archive(uri)
99
+
100
+ if uri.startswith(_HTTPS_PREFIX):
101
+ return _resolve_https(uri)
102
+
103
+ # Local path — relative or absolute.
104
+ return Path(uri)
105
+
106
+
107
+ def _resolve_https(uri: str) -> Path:
108
+ m = _HTTPS_RE.match(uri)
109
+ if not m:
110
+ raise CatalogueError(
111
+ f"Cannot parse git+https URI: {uri!r}. "
112
+ "Expected format: git+https://github.com/<owner>/<repo>[@<ref>]"
113
+ )
114
+ owner, repo, ref = m.group(1), m.group(2), m.group(3)
115
+ if not ref:
116
+ ref = "main"
117
+
118
+ tarball_url = _github_archive_url(owner, repo, ref)
119
+ tmpdir = Path(tempfile.mkdtemp(prefix="agentbundle-catalogue-"))
120
+ # Best-effort cleanup at process exit — atexit handlers run on normal
121
+ # interpreter shutdown; for crash paths the OS reaps /tmp eventually.
122
+ atexit.register(shutil.rmtree, str(tmpdir), True)
123
+ _fetch_and_extract(tarball_url, tmpdir)
124
+ # The GitHub archive extracts to <repo>-<ref>/ (with '/' → '-' in SHAs).
125
+ return _find_inner_dir(tmpdir)
126
+
127
+
128
+ def _ref_type(ref: str) -> str:
129
+ """Heuristically classify a ref as 'tag', 'sha', or 'branch'.
130
+
131
+ The plan specifies: try tag, then branch, then SHA order — but we
132
+ need to pick exactly one URL at construction time because the caller
133
+ doesn't retry across URL forms (the tarball fetch either succeeds or
134
+ raises ``CatalogueError``).
135
+
136
+ Heuristic:
137
+ - Exactly 40 lowercase hex chars → SHA.
138
+ - Looks like a version tag (optional 'v' + digits/dots, e.g. v1.0
139
+ or 1.0.0) → tag.
140
+ - Anything else → branch.
141
+
142
+ This matches the plan's examples: ``v1.0`` → tag, ``main`` → branch,
143
+ ``deadbeef`` (7 chars) or a full 40-char SHA → sha.
144
+
145
+ Abbreviated SHAs (7–39 chars, all hex) are treated as SHA because
146
+ that's the most likely intent and ``archive/<sha>`` accepts prefixes.
147
+ """
148
+ if _SHA_RE.match(ref):
149
+ return "sha"
150
+ # Version tag pattern: optional 'v', one or more numeric segments
151
+ if re.match(r"^v?\d+(\.\d+)*$", ref):
152
+ return "tag"
153
+ return "branch"
154
+
155
+
156
+ def _github_archive_url(owner: str, repo: str, ref: str) -> str:
157
+ rtype = _ref_type(ref)
158
+ if rtype == "tag":
159
+ return f"https://github.com/{owner}/{repo}/archive/refs/tags/{ref}.tar.gz"
160
+ if rtype == "branch":
161
+ return f"https://github.com/{owner}/{repo}/archive/refs/heads/{ref}.tar.gz"
162
+ # SHA
163
+ return f"https://github.com/{owner}/{repo}/archive/{ref}.tar.gz"
164
+
165
+
166
+ def _is_cert_verification_failure(exc: BaseException) -> bool:
167
+ """True when *exc* is a certificate-verification failure.
168
+
169
+ ``urlopen`` never lets ``ssl.SSLCertVerificationError`` escape directly — it
170
+ wraps it in ``URLError.reason`` — so matching the bare exception type would
171
+ silently never fire the fallback. Both shapes are accepted.
172
+ """
173
+ if isinstance(exc, ssl.SSLCertVerificationError):
174
+ return True
175
+ reason = getattr(exc, "reason", None)
176
+ return isinstance(reason, ssl.SSLCertVerificationError)
177
+
178
+
179
+ def _verification_failure_message(
180
+ url: str,
181
+ detail: object,
182
+ *,
183
+ fallback_note: str,
184
+ offer_opt_out: bool = True,
185
+ ) -> str:
186
+ """Explain a verification failure in terms of the adopter's next action.
187
+
188
+ A raw OpenSSL string tells an adopter behind a TLS-inspecting proxy nothing
189
+ they can act on, which is how this failure reaches a maintainer instead of
190
+ being self-served.
191
+
192
+ *fallback_note* keeps the diagnosis honest — the caller states what actually
193
+ happened to the operating-system fallback, because claiming the anchors were
194
+ exhausted when they were never consulted sends the adopter after the wrong
195
+ cause. *offer_opt_out* is false once the adopter has already opted out, so
196
+ the message never advises setting a variable that is already set.
197
+ """
198
+ host = urllib.parse.urlsplit(url).netloc
199
+ steps = [
200
+ " 1. Install from a local clone — needs no HTTPS at all:\n"
201
+ " git clone <catalogue-repo> && agentbundle install --pack "
202
+ "<pack> ./<clone>",
203
+ " 2. Ask your IT team for the corporate CA bundle, then:\n"
204
+ " export AGENTBUNDLE_CA_BUNDLE=/path/to/corporate-ca.pem",
205
+ " 3. Check whether a different Python already trusts this network. "
206
+ "Interpreters\n"
207
+ " do not share a certificate store, so one may work where another "
208
+ "fails:\n"
209
+ ' python3 -c "import ssl; print(ssl.get_default_verify_paths())"\n'
210
+ " Run that under each python3 on your PATH. If one differs and "
211
+ "works, point\n"
212
+ " SSL_CERT_FILE at its cafile. Creating a virtualenv does NOT "
213
+ "change trust —\n"
214
+ " a venv inherits its base interpreter's store unchanged.",
215
+ " 4. Confirm your proxy allows every host in the redirect chain. A "
216
+ "GitHub\n"
217
+ " archive fetch redirects github.com to codeload.github.com; an "
218
+ "allowlist\n"
219
+ " permitting only the first host fails here even once "
220
+ "certificates work.",
221
+ ]
222
+ if offer_opt_out:
223
+ steps.append(
224
+ " 5. Set AGENTBUNDLE_NO_SYSTEM_TRUST=1 to see the raw "
225
+ "verification error."
226
+ )
227
+ body = "\n\n".join(steps)
228
+ return (
229
+ f"Failed to fetch catalogue archive: {url} — {detail}\n"
230
+ "\n"
231
+ f"The certificate for {host} could not be verified. {fallback_note} On a "
232
+ "corporate network this usually means a TLS-inspecting proxy re-signs "
233
+ "traffic with a private root CA that Python does not read.\n"
234
+ "\n"
235
+ "Troubleshooting, cheapest first:\n"
236
+ "\n"
237
+ f"{body}"
238
+ )
239
+
240
+
241
+ def _system_trust_module():
242
+ """Import ``system_trust`` lazily.
243
+
244
+ Deferred so this module keeps making no subprocess call of its own, and to
245
+ avoid a circular import — ``system_trust`` raises ``CatalogueError``.
246
+ """
247
+ from agentbundle import system_trust
248
+
249
+ return system_trust
250
+
251
+
252
+ def _fetch_and_extract(url: str, dest: Path) -> None:
253
+ system_trust = _system_trust_module()
254
+
255
+ def attempt(context: ssl.SSLContext) -> None:
256
+ # B310: constant github.com archive base assembled from parsed owner/repo/ref.
257
+ with urllib.request.urlopen( # nosec B310
258
+ url, timeout=_FETCH_TIMEOUT_S, context=context
259
+ ) as resp, tarfile.open(fileobj=resp, mode="r|gz") as tf:
260
+ # filter="data" rejects unsafe members (absolute paths, ..
261
+ # links, devices, setuid bits) — Python 3.12+ default but
262
+ # explicit for 3.11 compatibility and to silence the 3.14
263
+ # DeprecationWarning. Path-jail is belt; this is braces.
264
+ tf.extractall(path=dest, filter="data")
265
+
266
+ try:
267
+ attempt(system_trust.build_context())
268
+ except (urllib.error.URLError, ssl.SSLError, TimeoutError) as exc:
269
+ # ssl.SSLError and TimeoutError are caught alongside URLError because
270
+ # urlopen only wraps failures raised during connect. A stall or TLS
271
+ # error while the tarball body is still streaming escapes unwrapped,
272
+ # which would break this module's documented promise that an
273
+ # unreachable URL raises CatalogueError.
274
+ detail = getattr(exc, "reason", None) or exc
275
+ if not _is_cert_verification_failure(exc):
276
+ raise CatalogueError(
277
+ f"Failed to fetch catalogue archive: {url} — {detail}"
278
+ ) from exc
279
+ if system_trust.system_trust_disabled():
280
+ raise CatalogueError(
281
+ _verification_failure_message(
282
+ url,
283
+ detail,
284
+ fallback_note=(
285
+ "The operating-system trust fallback was not attempted, "
286
+ "because AGENTBUNDLE_NO_SYSTEM_TRUST is set."
287
+ ),
288
+ offer_opt_out=False,
289
+ )
290
+ ) from exc
291
+ # Resolve the anchors BEFORE announcing anything. On a platform with no
292
+ # administrator trust store to read, a second connection against an
293
+ # identical context would be pure noise, and claiming the anchors "did
294
+ # not complete the chain" would send the adopter after the wrong cause.
295
+ anchors = system_trust.system_anchor_pem()
296
+ if not anchors:
297
+ # Two different causes, and conflating them misdirects the adopter.
298
+ # Off macOS the fallback does not apply at all. *On* macOS it applied
299
+ # and found an empty administrator keychain, which means the
300
+ # authority is installed somewhere this deliberately does not read.
301
+ if sys.platform == "darwin":
302
+ note = (
303
+ "The administrator keychain holds no certificates to retry "
304
+ "with, so the authority is likely installed somewhere else — "
305
+ "a login keychain, or an application's own store. Only "
306
+ "/Library/Keychains/System.keychain is read, because it is "
307
+ "the one store that requires administrator rights to write."
308
+ )
309
+ else:
310
+ note = (
311
+ f"No operating-system trust anchors were consulted on "
312
+ f"{sys.platform}: the automatic fallback is macOS-only, "
313
+ "because macOS is the only platform where Python ignores "
314
+ "the operating system's trust store."
315
+ )
316
+ raise CatalogueError(
317
+ _verification_failure_message(url, detail, fallback_note=note)
318
+ ) from exc
319
+ _retry_with_system_trust(url, dest, attempt, anchors)
320
+ except tarfile.TarError as exc:
321
+ raise CatalogueError(
322
+ f"Failed to extract tarball from {url}: {exc}"
323
+ ) from exc
324
+
325
+
326
+ def _retry_with_system_trust(
327
+ url: str,
328
+ dest: Path,
329
+ attempt: Callable[[ssl.SSLContext], None],
330
+ anchors: str,
331
+ ) -> None:
332
+ """Retry *attempt* once against operating-system trust *anchors*.
333
+
334
+ Announced on stderr unconditionally: a trust decision the adopter cannot see
335
+ is a trust decision they cannot audit. Bounded at one extra attempt, reached
336
+ only for a certificate-verification failure — never a timeout, DNS failure,
337
+ or HTTP error — and only when *anchors* actually exist, so the notice never
338
+ describes work that did not happen.
339
+ """
340
+ system_trust = _system_trust_module()
341
+ host = urllib.parse.urlsplit(url).netloc
342
+ print(
343
+ f"agentbundle: certificate verification failed for {host}; "
344
+ "retrying with operating-system trust anchors",
345
+ file=sys.stderr,
346
+ )
347
+ exhausted = (
348
+ "The operating-system trust anchors did not complete the chain either."
349
+ )
350
+ # Attempt 1 may have extracted part of the archive before failing mid-stream.
351
+ # Clearing the destination keeps the retry from layering a second download
352
+ # over the first and producing a catalogue that is a mix of both.
353
+ shutil.rmtree(dest, ignore_errors=True)
354
+ dest.mkdir(parents=True, exist_ok=True)
355
+ try:
356
+ attempt(system_trust.build_context(system_anchors=anchors))
357
+ except (urllib.error.URLError, ssl.SSLError, TimeoutError) as exc:
358
+ # Same tuple as the first attempt: a read-phase stall or TLS error is not
359
+ # wrapped by urlopen and would otherwise escape as a bare exception.
360
+ detail = getattr(exc, "reason", None) or exc
361
+ raise CatalogueError(
362
+ _verification_failure_message(url, detail, fallback_note=exhausted)
363
+ ) from exc
364
+ except tarfile.TarError as exc:
365
+ raise CatalogueError(
366
+ f"Failed to extract tarball from {url}: {exc}"
367
+ ) from exc
368
+
369
+
370
+ def _find_inner_dir(tmpdir: Path) -> Path:
371
+ """Return the single top-level directory inside *tmpdir*.
372
+
373
+ GitHub archives always produce exactly one top-level directory
374
+ (``<repo>-<ref>/``). If the extraction produced something else,
375
+ return *tmpdir* itself so callers still have something to work with.
376
+ """
377
+ children = [p for p in tmpdir.iterdir() if p.is_dir()]
378
+ if len(children) == 1:
379
+ return children[0]
380
+ return tmpdir