agentbundle 0.58.0__tar.gz → 0.59.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 (713) hide show
  1. {agentbundle-0.58.0/agentbundle.egg-info → agentbundle-0.59.1}/PKG-INFO +20 -1
  2. {agentbundle-0.58.0 → agentbundle-0.59.1}/README-pypi.md +19 -0
  3. agentbundle-0.59.1/agentbundle/_data/_content_safety.py +419 -0
  4. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/cooling.py +79 -2
  5. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/work_intake_refresh.py +242 -177
  6. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/workspace_status_engine.py +516 -96
  7. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/self_host.py +10 -0
  8. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/version.py +1 -1
  9. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/workspace_mcp.py +285 -149
  10. {agentbundle-0.58.0 → agentbundle-0.59.1/agentbundle.egg-info}/PKG-INFO +20 -1
  11. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/SOURCES.txt +3 -1
  12. {agentbundle-0.58.0 → agentbundle-0.59.1}/pyproject.toml +1 -1
  13. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_policy_registry_projection.py +2 -2
  14. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_check.py +42 -0
  15. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_skill_spec_lint.py +1 -1
  16. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_workspace_mcp_events_poller.py +2 -3
  17. agentbundle-0.59.1/tests/unit/test_workspace_mcp_supervisor_run.py +653 -0
  18. {agentbundle-0.58.0 → agentbundle-0.59.1}/MANIFEST.in +0 -0
  19. {agentbundle-0.58.0 → agentbundle-0.59.1}/README.md +0 -0
  20. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/__init__.py +0 -0
  21. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/__main__.py +0 -0
  22. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/__init__.py +0 -0
  23. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/adapter.schema.json +0 -0
  24. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/adapter.toml +0 -0
  25. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/agent-plugin-extension-namespaces.schema.json +0 -0
  26. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/agent-plugin-extension-namespaces.toml +0 -0
  27. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-index.schema.json +0 -0
  28. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-manifest.schema.json +0 -0
  29. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-members.txt +0 -0
  30. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
  31. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  32. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
  33. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
  34. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/CLAUDE.md +0 -0
  35. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  36. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  37. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
  38. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
  39. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  40. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  41. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  42. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/CLAUDE.md +0 -0
  43. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  44. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  45. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  46. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
  47. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_layout_declared_section.py +0 -0
  48. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
  49. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
  50. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue.schema.json +0 -0
  51. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/close_work.py +0 -0
  52. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/distribution-routes.schema.json +0 -0
  53. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/distribution-routes.toml +0 -0
  54. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/file_safety.py +0 -0
  55. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/guide.schema.json +0 -0
  56. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/install-defaults.toml +0 -0
  57. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/install-marker.py +0 -0
  58. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/knowledge-captured-observation.schema.json +0 -0
  59. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/marketplace-entry.schema.json +0 -0
  60. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/pack.schema.json +0 -0
  61. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  62. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  63. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/profile.schema.json +0 -0
  64. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/public-contracts.txt +0 -0
  65. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/skill-manifest.schema.json +0 -0
  66. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/skill.schema.json +0 -0
  67. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/target-vocab.toml +0 -0
  68. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/LICENSE.md +0 -0
  69. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/PROVENANCE.md +0 -0
  70. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/mcp.schema.json +0 -0
  71. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/plugin.schema.json +0 -0
  72. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/workspace_status_prune.py +0 -0
  73. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/bounded_metadata.py +0 -0
  74. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/__init__.py +0 -0
  75. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/__main__.py +0 -0
  76. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapter_root_bins.py +0 -0
  77. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/__init__.py +0 -0
  78. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/_sweep_guard.py +0 -0
  79. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/claude_code.py +0 -0
  80. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/codex.py +0 -0
  81. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/copilot.py +0 -0
  82. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/cursor.py +0 -0
  83. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/gemini.py +0 -0
  84. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/kiro.py +0 -0
  85. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
  86. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/kiro_ide.py +0 -0
  87. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/contract.py +0 -0
  88. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/hook_wiring_rules.py +0 -0
  89. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/lint_packs.py +0 -0
  90. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/main.py +0 -0
  91. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/phase_order.py +0 -0
  92. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projection_io.py +0 -0
  93. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/__init__.py +0 -0
  94. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  95. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  96. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  97. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/direct_directory.py +0 -0
  98. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  99. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/hook_id.py +0 -0
  100. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  101. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  102. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/merge_json.py +0 -0
  103. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/plugin_hooks.py +0 -0
  104. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/user_merge_json.py +0 -0
  105. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  106. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  107. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/marketplace.toml +0 -0
  108. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-agent-plugin.toml +0 -0
  109. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  110. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  111. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  112. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/self-host.toml +0 -0
  113. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_agent_plugin.py +0 -0
  114. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_apm.py +0 -0
  115. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_claude_plugins.py +0 -0
  116. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_lookup.py +0 -0
  117. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/scope_rails.py +0 -0
  118. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/shared_libs.py +0 -0
  119. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/target_resolver.py +0 -0
  120. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/user_libs.py +0 -0
  121. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/validate.py +0 -0
  122. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue.py +0 -0
  123. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/__init__.py +0 -0
  124. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/direct_http.py +0 -0
  125. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/jfrog_cli.py +0 -0
  126. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/models.py +0 -0
  127. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
  128. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/archive.py +0 -0
  129. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/build.py +0 -0
  130. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/config.py +0 -0
  131. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/contracts_inspector.py +0 -0
  132. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
  133. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  134. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/file_safety.py +0 -0
  135. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/identity.py +0 -0
  136. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/index_generator.py +0 -0
  137. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/initialise.py +0 -0
  138. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
  139. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/journey_validator.py +0 -0
  140. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/lint.py +0 -0
  141. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/manifest.py +0 -0
  142. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/okf_discovery.py +0 -0
  143. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/package.py +0 -0
  144. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/results.py +0 -0
  145. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
  146. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
  147. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  148. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  149. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/verify.py +0 -0
  150. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/version_ranges.py +0 -0
  151. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/categories.py +0 -0
  152. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/cli.py +0 -0
  153. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/__init__.py +0 -0
  154. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/_common.py +0 -0
  155. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/_drop_warning.py +0 -0
  156. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/adapt.py +0 -0
  157. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_build.py +0 -0
  158. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_contracts.py +0 -0
  159. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_index.py +0 -0
  160. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_init.py +0 -0
  161. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_lint.py +0 -0
  162. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_package.py +0 -0
  163. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_self_host.py +0 -0
  164. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_sync.py +0 -0
  165. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  166. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  167. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_verify.py +0 -0
  168. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/config.py +0 -0
  169. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/diff.py +0 -0
  170. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/docs.py +0 -0
  171. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/init_state.py +0 -0
  172. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/install.py +0 -0
  173. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_installed.py +0 -0
  174. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_packs.py +0 -0
  175. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_profiles.py +0 -0
  176. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_targets.py +0 -0
  177. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/oplog_cmd.py +0 -0
  178. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/pack_config_cmd.py +0 -0
  179. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/pack_evals.py +0 -0
  180. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/package_catalogue.py +0 -0
  181. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/profile.py +0 -0
  182. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/reconcile.py +0 -0
  183. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/render.py +0 -0
  184. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/scaffold.py +0 -0
  185. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/show.py +0 -0
  186. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/uninstall.py +0 -0
  187. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/upgrade.py +0 -0
  188. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/validate.py +0 -0
  189. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/config.py +0 -0
  190. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_install.py +0 -0
  191. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_source.py +0 -0
  192. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_source_acquisition.py +0 -0
  193. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_source_state.py +0 -0
  194. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_validate.py +0 -0
  195. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/https_catalogue.py +0 -0
  196. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/local_exclude.py +0 -0
  197. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/oplog.py +0 -0
  198. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/pack_inventory.py +0 -0
  199. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/pack_renames.py +0 -0
  200. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/render.py +0 -0
  201. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/safety.py +0 -0
  202. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/scaffold.py +0 -0
  203. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/scope.py +0 -0
  204. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/source_defaults.py +0 -0
  205. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/statelock.py +0 -0
  206. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/system_trust.py +0 -0
  207. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/user_config.py +0 -0
  208. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/dependency_links.txt +0 -0
  209. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/entry_points.txt +0 -0
  210. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/requires.txt +0 -0
  211. {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/top_level.txt +0 -0
  212. {agentbundle-0.58.0 → agentbundle-0.59.1}/conftest.py +0 -0
  213. {agentbundle-0.58.0 → agentbundle-0.59.1}/setup.cfg +0 -0
  214. {agentbundle-0.58.0 → agentbundle-0.59.1}/templates/install-marker.py +0 -0
  215. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/__init__.py +0 -0
  216. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/_direct_acquisition.py +0 -0
  217. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/_rename_fixtures.py +0 -0
  218. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/_support.py +0 -0
  219. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/__init__.py +0 -0
  220. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/README.md +0 -0
  221. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +0 -0
  222. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/claude-code-2.1.228-hook-events.json +0 -0
  223. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
  224. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
  225. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
  226. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
  227. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
  228. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
  229. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
  230. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
  231. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
  232. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
  233. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
  234. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
  235. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
  236. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
  237. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
  238. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
  239. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
  240. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
  241. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
  242. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
  243. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
  244. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
  245. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
  246. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_codex.py +0 -0
  247. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_copilot.py +0 -0
  248. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_cursor.py +0 -0
  249. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_gemini.py +0 -0
  250. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro.py +0 -0
  251. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
  252. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
  253. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
  254. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
  255. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_agent_boundary_metadata_projection.py +0 -0
  256. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_agent_plugin_projection.py +0 -0
  257. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
  258. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_build_validate_bundled_schema.py +0 -0
  259. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract.py +0 -0
  260. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract_scope.py +0 -0
  261. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract_v07.py +0 -0
  262. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract_v08.py +0 -0
  263. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
  264. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_distribution_route_contract.py +0 -0
  265. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_distribution_route_golden.py +0 -0
  266. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_distribution_route_resolution.py +0 -0
  267. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_end_to_end_build.py +0 -0
  268. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_hook_wiring_rules.py +0 -0
  269. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_lint_packs.py +0 -0
  270. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
  271. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pack_schema.py +0 -0
  272. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
  273. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pack_schema_install.py +0 -0
  274. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pipeline.py +0 -0
  275. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_plugin_hooks.py +0 -0
  276. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
  277. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_plugin_publication_gates.py +0 -0
  278. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_projectable_subset.py +0 -0
  279. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_projection_io.py +0 -0
  280. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_projections_merge_json.py +0 -0
  281. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_route_lookup.py +0 -0
  282. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_scope_rails.py +0 -0
  283. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_security.py +0 -0
  284. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
  285. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_metadata_policy.py +0 -0
  286. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
  287. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_sequential_implementer_dispatch_projection.py +0 -0
  288. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
  289. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
  290. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_user_libs_projection.py +0 -0
  291. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_validate.py +0 -0
  292. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
  293. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/conftest.py +0 -0
  294. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/contracts/test_agentbundle_show_schema.py +0 -0
  295. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/contracts/test_catalogue_fetch_credential_boundary.py +0 -0
  296. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/contracts/test_skill_schema.py +0 -0
  297. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
  298. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/adapt/values.toml +0 -0
  299. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
  300. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/catalogue.toml +0 -0
  301. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
  302. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  303. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
  304. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
  305. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
  306. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
  307. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
  308. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
  309. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
  310. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield/values.toml +0 -0
  311. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
  312. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
  313. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
  314. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
  315. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
  316. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
  317. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
  318. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
  319. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
  320. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
  321. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
  322. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_sync/adapter_contract_major_mismatch/pack.toml +0 -0
  323. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/catalogue.toml +0 -0
  324. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/hook-wiring/example.json +0 -0
  325. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/SKILL.md +0 -0
  326. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/scripts/run.py +0 -0
  327. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/JOURNEY.md +0 -0
  328. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/pack.toml +0 -0
  329. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-without-journey/pack.toml +0 -0
  330. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/profiles/test-profile.toml +0 -0
  331. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/cognitive-load-hosts.json +0 -0
  332. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
  333. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
  334. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
  335. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
  336. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
  337. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
  338. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
  339. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
  340. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
  341. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
  342. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
  343. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
  344. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
  345. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
  346. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
  347. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/direct/ac35_corpus_verdicts.json +0 -0
  348. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/direct/golden_state_0_5.toml +0 -0
  349. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/distribution-routes/golden.json +0 -0
  350. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/distribution-routes/witness-packs/portable/.apm/skills/example/SKILL.md +0 -0
  351. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/distribution-routes/witness-packs/portable/pack.toml +0 -0
  352. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/.claude-plugin/marketplace.json +0 -0
  353. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/AGENTS.md +0 -0
  354. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/LICENSE-APACHE +0 -0
  355. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/LICENSE-MIT +0 -0
  356. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/agentbundle/_data/install-defaults.toml +0 -0
  357. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/catalogue.toml +0 -0
  358. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
  359. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
  360. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/pack.toml +0 -0
  361. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/seeds/AGENTS.md +0 -0
  362. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/beta/.claude-plugin/plugin.json +0 -0
  363. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/beta/pack.toml +0 -0
  364. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/profiles/example.toml +0 -0
  365. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
  366. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
  367. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
  368. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
  369. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
  370. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
  371. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
  372. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
  373. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
  374. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
  375. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
  376. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list-installed/golden_120col.txt +0 -0
  377. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list-installed/golden_80col.txt +0 -0
  378. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
  379. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
  380. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +0 -0
  381. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
  382. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
  383. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
  384. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
  385. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
  386. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  387. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
  388. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
  389. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
  390. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  391. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
  392. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
  393. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
  394. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
  395. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
  396. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
  397. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
  398. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
  399. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
  400. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
  401. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
  402. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
  403. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
  404. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
  405. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
  406. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
  407. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
  408. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/show_contract/agentbundle-show.schema.json +0 -0
  409. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/show_contract/catalogue.json +0 -0
  410. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/show_contract/installed_state.json +0 -0
  411. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
  412. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
  413. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  414. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
  415. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
  416. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  417. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
  418. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
  419. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
  420. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
  421. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  422. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
  423. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
  424. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  425. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
  426. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
  427. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
  428. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
  429. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  430. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
  431. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
  432. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  433. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
  434. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
  435. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
  436. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
  437. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
  438. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
  439. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/__init__.py +0 -0
  440. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/_https_archive.py +0 -0
  441. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_cmd.py +0 -0
  442. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_dual_scope.py +0 -0
  443. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_preflight_detection.py +0 -0
  444. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_schema_migration.py +0 -0
  445. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_apm_install_route.py +0 -0
  446. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_blank_catalogue.py +0 -0
  447. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
  448. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_brownfield_round_trip.py +0 -0
  449. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
  450. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_build_check_drift_gates.py +0 -0
  451. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_build_derivation_apm.py +0 -0
  452. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
  453. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_bundled_contracts_fail_closed.py +0 -0
  454. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_init.py +0 -0
  455. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_init_packageable.py +0 -0
  456. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_adapter_compat.py +0 -0
  457. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_dependencies.py +0 -0
  458. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_external_portability.py +0 -0
  459. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_fixture_checks.py +0 -0
  460. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_marketplace.py +0 -0
  461. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_output_drift.py +0 -0
  462. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_package_preflight.py +0 -0
  463. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_plugin_path.py +0 -0
  464. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_profile_schema.py +0 -0
  465. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_step1.py +0 -0
  466. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_index_generator.py +0 -0
  467. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_integration.py +0 -0
  468. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_journey_validator.py +0 -0
  469. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_schema.py +0 -0
  470. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
  471. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_claude_plugins_install_route.py +0 -0
  472. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_config_cascade.py +0 -0
  473. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_credential_brokers_pack_install.py +0 -0
  474. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_credentials_wheel.py +0 -0
  475. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_direct_install.py +0 -0
  476. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
  477. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_editable_source_detection.py +0 -0
  478. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_fixtures_validate.py +0 -0
  479. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_hook_wiring_ingress.py +0 -0
  480. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_adapt_chain.py +0 -0
  481. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_cmd.py +0 -0
  482. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_converters_user_scope.py +0 -0
  483. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_copilot_full_parity.py +0 -0
  484. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_core_smoke.py +0 -0
  485. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_default_source.py +0 -0
  486. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_dependencies_gate.py +0 -0
  487. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
  488. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_dual_scope.py +0 -0
  489. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_layout_is_best_effort.py +0 -0
  490. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_orphan_reshape.py +0 -0
  491. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_pack_metadata_shape.py +0 -0
  492. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_profile.py +0 -0
  493. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_profile_live.py +0 -0
  494. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
  495. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_research_user_scope.py +0 -0
  496. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_seed_delivery.py +0 -0
  497. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_session_start_wiring.py +0 -0
  498. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_upgrade_offer.py +0 -0
  499. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_user_hooks.py +0 -0
  500. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
  501. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_jfrog_cli_contract.py +0 -0
  502. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
  503. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
  504. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
  505. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_list_packs_cmd.py +0 -0
  506. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_local_scope_install.py +0 -0
  507. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_marketplace_entry_validation.py +0 -0
  508. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_marketplace_manifest_regression.py +0 -0
  509. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_multi_pack_install.py +0 -0
  510. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
  511. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_plugin_route_membership.py +0 -0
  512. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_portable_catalogue_authentication.py +0 -0
  513. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_recommends_cross_scope.py +0 -0
  514. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_reconcile.py +0 -0
  515. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_rename_hint_cli.py +0 -0
  516. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_rename_migration_e2e.py +0 -0
  517. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_reserved_path_filter.py +0 -0
  518. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_scaffold_projection.py +0 -0
  519. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_self_host_schema_migration.py +0 -0
  520. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
  521. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_shared_prefix_coexistence.py +0 -0
  522. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_show_cmd.py +0 -0
  523. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_tier_invariants.py +0 -0
  524. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_trust_fallback_tls.py +0 -0
  525. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_uninstall_cmd.py +0 -0
  526. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_uninstall_user_hooks.py +0 -0
  527. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
  528. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_upgrade_cmd.py +0 -0
  529. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_upgrade_user_hooks.py +0 -0
  530. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_version_gate_matrix.py +0 -0
  531. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
  532. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_zipapp.py +0 -0
  533. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/performance/__init__.py +0 -0
  534. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/performance/test_direct_family2_budget_cost.py +0 -0
  535. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_adapter_permissions_projection.py +0 -0
  536. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_depends_on.py +0 -0
  537. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_elicit.py +0 -0
  538. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_event_bridge.py +0 -0
  539. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_git.py +0 -0
  540. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_git_scope.py +0 -0
  541. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_layout_override.py +0 -0
  542. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_lifecycle.py +0 -0
  543. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_stdin.py +0 -0
  544. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_tools.py +0 -0
  545. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/__init__.py +0 -0
  546. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/conftest.py +0 -0
  547. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_adapt_discovery_schema.py +0 -0
  548. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_adapter_symlink_policy.py +0 -0
  549. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_append_layout_section.py +0 -0
  550. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_architect_readme_install_command.py +0 -0
  551. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_bundled_contract_errors.py +0 -0
  552. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue.py +0 -0
  553. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_archive_unit_digests.py +0 -0
  554. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_ci_contract.py +0 -0
  555. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_curation_deps.py +0 -0
  556. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_fetch.py +0 -0
  557. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_fetch_jfrog.py +0 -0
  558. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
  559. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_manifest_schema.py +0 -0
  560. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_pack_defaults.py +0 -0
  561. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_package_compare.py +0 -0
  562. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_package_include_diagnostic.py +0 -0
  563. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_package_refusal.py +0 -0
  564. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
  565. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_spec_version.py +0 -0
  566. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_sync.py +0 -0
  567. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_sync_fixture_set.py +0 -0
  568. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_archive.py +0 -0
  569. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_build.py +0 -0
  570. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
  571. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_file_safety.py +0 -0
  572. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_foundation.py +0 -0
  573. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_identity.py +0 -0
  574. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_init.py +0 -0
  575. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_lint.py +0 -0
  576. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_package.py +0 -0
  577. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_self_host.py +0 -0
  578. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
  579. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
  580. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_verify.py +0 -0
  581. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_trust_fallback.py +0 -0
  582. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_unit_digests.py +0 -0
  583. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave2_schema.py +0 -0
  584. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave2_validation.py +0 -0
  585. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_contracts_cli.py +0 -0
  586. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_contracts_inspector.py +0 -0
  587. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_init_nextsteps.py +0 -0
  588. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_offline_navigation.py +0 -0
  589. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_catalogue_optional.py +0 -0
  590. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_help_lists_config.py +0 -0
  591. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_list_targets_help.py +0 -0
  592. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_namespace_fixture.py +0 -0
  593. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_path_normalisation.py +0 -0
  594. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_profile_surface.py +0 -0
  595. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_scope_flags.py +0 -0
  596. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_codex_agent_toml.py +0 -0
  597. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_codex_projection_modes.py +0 -0
  598. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cognitive_load_seed_contract.py +0 -0
  599. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_collect_tree_symlinks.py +0 -0
  600. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_common_classify_seeds.py +0 -0
  601. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_config.py +0 -0
  602. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_config_cmd.py +0 -0
  603. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_configured_adapter.py +0 -0
  604. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_confirm_helper.py +0 -0
  605. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_contract_parity.py +0 -0
  606. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_contract_v0_3_schema.py +0 -0
  607. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_copilot_agent_md.py +0 -0
  608. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_copilot_hooks_json.py +0 -0
  609. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
  610. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_credbroker_lint_hardening.py +0 -0
  611. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_dependencies_batch.py +0 -0
  612. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_diff_cmd.py +0 -0
  613. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_admission.py +0 -0
  614. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_architecture_controls.py +0 -0
  615. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_diagnostics.py +0 -0
  616. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_lifecycle_facts.py +0 -0
  617. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_source_acquisition.py +0 -0
  618. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_source_state.py +0 -0
  619. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_upgrade.py +0 -0
  620. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_validate.py +0 -0
  621. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_footprint_ownership.py +0 -0
  622. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_https_catalogue.py +0 -0
  623. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_init_state_cmd.py +0 -0
  624. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
  625. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
  626. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
  627. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
  628. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_event_dropped_wirings.py +0 -0
  629. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_first_value_handoff.py +0 -0
  630. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_force_help.py +0 -0
  631. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_inband_detection.py +0 -0
  632. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_messages.py +0 -0
  633. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_messages_repo_scope.py +0 -0
  634. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_refusal_ordering.py +0 -0
  635. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_state_provenance.py +0 -0
  636. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
  637. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
  638. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
  639. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_layout_bases_anchoring.py +0 -0
  640. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
  641. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_list_installed_cmd.py +0 -0
  642. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_list_installed_status.py +0 -0
  643. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_list_targets_cmd.py +0 -0
  644. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_exclude_git_cache.py +0 -0
  645. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_schema.py +0 -0
  646. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
  647. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t12_show.py +0 -0
  648. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t2_resolve.py +0 -0
  649. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t3_config.py +0 -0
  650. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t4_state_path.py +0 -0
  651. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
  652. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
  653. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t8_install.py +0 -0
  654. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t9_exclude.py +0 -0
  655. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_marker_schema_version_parity.py +0 -0
  656. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_merge_into_agent_json.py +0 -0
  657. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
  658. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_nested_symlink_hardening.py +0 -0
  659. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_no_contracts_fallback.py +0 -0
  660. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_offer_upgrade_namespace.py +0 -0
  661. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_okf_discovery.py +0 -0
  662. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_org_bootstrap.py +0 -0
  663. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_orphan_sweep_guards.py +0 -0
  664. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_config_api.py +0 -0
  665. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_evals_bundled_contract.py +0 -0
  666. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_inventory.py +0 -0
  667. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_layout_section_schema.py +0 -0
  668. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_renames.py +0 -0
  669. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_package_catalogue.py +0 -0
  670. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_packstate_source_provenance.py +0 -0
  671. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pipeline_phase_order.py +0 -0
  672. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_plugin_scope_filter.py +0 -0
  673. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_profile_reader.py +0 -0
  674. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_render.py +0 -0
  675. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_render_cmd.py +0 -0
  676. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_render_table.py +0 -0
  677. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_resolve_state_path.py +0 -0
  678. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
  679. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
  680. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_route_surface_parity.py +0 -0
  681. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_safety.py +0 -0
  682. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
  683. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
  684. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_scaffold_cmd.py +0 -0
  685. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_scope.py +0 -0
  686. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_self_host_windows.py +0 -0
  687. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_shared_prefix_disclosure.py +0 -0
  688. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_source_conflict_guard.py +0 -0
  689. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_source_defaults.py +0 -0
  690. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_state_v01_refuse_write.py +0 -0
  691. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_state_v02.py +0 -0
  692. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_state_v0_4_schema.py +0 -0
  693. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_statelock.py +0 -0
  694. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_statelock_hardening.py +0 -0
  695. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_system_trust.py +0 -0
  696. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_target_resolver.py +0 -0
  697. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_toml_emitters.py +0 -0
  698. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_unresolved_markers.py +0 -0
  699. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_upgrade_bulk_all.py +0 -0
  700. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_upgrade_recap.py +0 -0
  701. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_upgrade_source_inference.py +0 -0
  702. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_io.py +0 -0
  703. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_isolation.py +0 -0
  704. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_path.py +0 -0
  705. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_source.py +0 -0
  706. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_merge_json.py +0 -0
  707. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_attach_to_agent.py +0 -0
  708. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_categories.py +0 -0
  709. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_cmd.py +0 -0
  710. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
  711. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_values_from_shapes.py +0 -0
  712. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_version.py +0 -0
  713. {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_windows_direct_suite_registration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.58.0
3
+ Version: 0.59.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
@@ -35,6 +35,25 @@ python -m pip install agentbundle
35
35
 
36
36
  Requires Python 3.11+. Runs on macOS, Linux, and Windows.
37
37
 
38
+ ## What's new in 0.59.1
39
+
40
+ `catalogue self-host` keeps a repository's root `AGENT_RULES.md`, so routing
41
+ rows an adopter adds survive regeneration.
42
+
43
+ ## What's new in 0.59.0
44
+
45
+ The workspace bridge now reads a supervisor run's status file only. The old
46
+ engine-state fallback is removed, so a spec directory with no supervisor status
47
+ shows no run and no pending gate, and `gate_question` is a framed object or null.
48
+
49
+ ## What's new in 0.58.1
50
+
51
+ The workspace MCP bridge understands supervisor runs. While a spec has a
52
+ supervisor status file, `workspace_status` shows that run's id, stage, and
53
+ `run_active` signal. A pending human question appears only as framed untrusted
54
+ text that has passed a content-safety check, or as a fixed placeholder. A
55
+ status file that is a link, oversized, or malformed shows no run and no gate.
56
+
38
57
  ## What's new in 0.58.0
39
58
 
40
59
  The shared file-safety helper gains `write_confined_regular_file`, which creates
@@ -14,6 +14,25 @@ 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.59.1
18
+
19
+ `catalogue self-host` keeps a repository's root `AGENT_RULES.md`, so routing
20
+ rows an adopter adds survive regeneration.
21
+
22
+ ## What's new in 0.59.0
23
+
24
+ The workspace bridge now reads a supervisor run's status file only. The old
25
+ engine-state fallback is removed, so a spec directory with no supervisor status
26
+ shows no run and no pending gate, and `gate_question` is a framed object or null.
27
+
28
+ ## What's new in 0.58.1
29
+
30
+ The workspace MCP bridge understands supervisor runs. While a spec has a
31
+ supervisor status file, `workspace_status` shows that run's id, stage, and
32
+ `run_active` signal. A pending human question appears only as framed untrusted
33
+ text that has passed a content-safety check, or as a fixed placeholder. A
34
+ status file that is a link, oversized, or malformed shows no run and no gate.
35
+
17
36
  ## What's new in 0.58.0
18
37
 
19
38
  The shared file-safety helper gains `write_confined_regular_file`, which creates
@@ -0,0 +1,419 @@
1
+ """_content_safety — content-safety guard for durable semantic writer boundaries.
2
+
3
+ Accepts a named profile and payload bytes; returns a typed ContentSafetyDecision
4
+ without persisting anything. Standard library only.
5
+
6
+ Every durable semantic writer and replay boundary is registered in
7
+ SLICE_1_WRITER_BOUNDARIES before use; a missing or unknown profile refuses
8
+ without persisting payload bytes. The registered writer boundary table names
9
+ the same set and the same profiles.
10
+
11
+ Rejected payload bytes, excerpts, and content-derived hashes never leave this
12
+ module; accepted free text is returned as typed UntrustedData for consumers.
13
+ The inert wrapper signals that the value must not be concatenated into system
14
+ instructions, commands, tool calls, paths, approvals, or authority.
15
+
16
+ Classification vocabulary (content-safety-policy.v1):
17
+ public, repository-internal — may persist as bounded Git text
18
+ restricted — requires a controlled reference; cannot persist
19
+ credential, personal — rejected immediately; producer-declared guard
20
+ unknown — rejected as unknown-class
21
+
22
+ Python 3.11+ standard library only. No third-party imports, no packaging, no
23
+ installation.
24
+ """
25
+
26
+ import hashlib
27
+ import re
28
+ from dataclasses import dataclass
29
+ from typing import ClassVar, Final
30
+
31
+ __all__ = [
32
+ "ContentSafetyDecision",
33
+ "UntrustedData",
34
+ "POLICY_VERSION",
35
+ "BOUNDARY_PROFILES",
36
+ "SLICE_1_WRITER_BOUNDARIES",
37
+ "check_content_safety",
38
+ "wrap_as_untrusted",
39
+ ]
40
+
41
+ # ── Policy identity ──────────────────────────────────────────────────────────
42
+
43
+ # Stable version identifier for this policy, matching content-safety-policy.v1.
44
+ POLICY_VERSION: Final[str] = "slice-1.v1"
45
+
46
+ # ── Boundary profile definitions ─────────────────────────────────────────────
47
+ #
48
+ # Per-profile size and shape limits for each content-safety boundary profile.
49
+ # Keys: profile names used in the semantic boundary and writer boundary tables.
50
+ # Every key in SLICE_1_WRITER_BOUNDARIES must map to a key here.
51
+ BOUNDARY_PROFILES: Final[dict[str, dict]] = {
52
+ # 64 KiB: allowlisted identifiers, enums, digests, numbers, repo-relative paths
53
+ "structured-control": {
54
+ "max_bytes": 64 * 1024,
55
+ },
56
+ # 64 KiB: embedded evidence; raw output is a controlled reference, never embedded
57
+ "evidence-embedded-record": {
58
+ "max_bytes": 64 * 1024,
59
+ },
60
+ # 1 MiB total, 64 KiB per free-text field: natural prose is UntrustedData
61
+ "review-report": {
62
+ "max_total_bytes": 1 * 1024 * 1024,
63
+ "max_free_text_bytes": 64 * 1024,
64
+ },
65
+ # 256 KiB, 1 000 conflict paths: paths are repository-relative and classified
66
+ "integration-diagnostic": {
67
+ "max_bytes": 256 * 1024,
68
+ },
69
+ # 64 KiB: raw transcripts and unbounded tool output reject
70
+ "knowledge-observation": {
71
+ "max_bytes": 64 * 1024,
72
+ },
73
+ # Existing result byte cap: uses admission and scanner policy
74
+ "product-addition": {},
75
+ }
76
+
77
+ # ── Writer boundary registry ──────────────────────────────────────────────────
78
+ #
79
+ # The SINGLE declared registry that every durable semantic writer and replay
80
+ # boundary must use. A writer that bypasses this registry or uses a profile
81
+ # other than the one assigned here violates the content-safety contract.
82
+ #
83
+ # The registered writer boundary table names this same set and these same
84
+ # profiles. The roster test asserts both agree.
85
+ #
86
+ # Policy-import writers: initial-plan-review.v1, approval-record.v1, reviewed-execution-envelope.v1
87
+ # Evidence-store writers: semantic-evidence-transaction.v1 (frame), evidence-receipt.v1,
88
+ # evidence-supersession.v1
89
+ # Security-event writer: security-event.v1
90
+ # Shadow facade writers: delivery-subject.v1, acceptance-property.v1,
91
+ # acceptance-verdict.v1
92
+ SLICE_1_WRITER_BOUNDARIES: Final[dict[str, str]] = {
93
+ "initial-plan-review.v1": "structured-control",
94
+ "approval-record.v1": "structured-control",
95
+ "reviewed-execution-envelope.v1": "structured-control",
96
+ "security-event.v1": "structured-control",
97
+ "semantic-evidence-transaction.v1": "structured-control",
98
+ "evidence-receipt.v1": "evidence-embedded-record",
99
+ "evidence-supersession.v1": "evidence-embedded-record",
100
+ "delivery-subject.v1": "structured-control",
101
+ "acceptance-property.v1": "structured-control",
102
+ "acceptance-verdict.v1": "structured-control",
103
+ }
104
+
105
+ # ── Classification vocabulary ─────────────────────────────────────────────────
106
+
107
+ # Only these two classes may persist as bounded Git text.
108
+ _PERSISTABLE_CLASSES: Final[frozenset[str]] = frozenset(
109
+ {"public", "repository-internal"}
110
+ )
111
+ _CREDENTIAL_CLASS: Final[str] = "credential"
112
+ _PERSONAL_CLASS: Final[str] = "personal"
113
+
114
+ # ── C0 control-character scanner ─────────────────────────────────────────────
115
+ #
116
+ # Rejects C0 control characters (0x00–0x1F) and DEL (0x7F), except:
117
+ # HT (0x09), LF (0x0A), CR (0x0D) — valid whitespace in text content.
118
+ # ESC and other C0 survivors are dangerous in terminal-captured streams.
119
+ _CONTROL_RE: Final[re.Pattern[str]] = re.compile(
120
+ r"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]"
121
+ )
122
+
123
+ # ── Credential scanner patterns ───────────────────────────────────────────────
124
+ #
125
+ # High-confidence token shapes from the required scanner corpus.
126
+ # Matching any pattern returns rejected-credential without payload retention.
127
+ _CREDENTIAL_PATTERNS: Final[list[re.Pattern[str]]] = [
128
+ # GitHub personal access tokens (classic 40-char suffix form)
129
+ re.compile(r"ghp_[A-Za-z0-9]{36,}"),
130
+ # GitHub fine-grained PATs
131
+ re.compile(r"github_pat_[A-Za-z0-9_]{76,}"),
132
+ # AWS access key IDs
133
+ re.compile(r"AKIA[0-9A-Z]{16}"),
134
+ # Generic high-entropy API/secret/access-token assignments (case-insensitive)
135
+ re.compile(r"(?i)api[-_]?key\s*[:=]\s*[A-Za-z0-9/+_.\-]{20,}"),
136
+ re.compile(r"(?i)secret[-_]?key\s*[:=]\s*[A-Za-z0-9/+_.\-]{20,}"),
137
+ re.compile(r"(?i)access[-_]?token\s*[:=]\s*[A-Za-z0-9/+_.\-]{20,}"),
138
+ ]
139
+
140
+ # ── Personal-data scanner patterns ────────────────────────────────────────────
141
+ #
142
+ # Direct personal identifiers from the required scanner corpus.
143
+ # Matching any pattern returns rejected-personal-data without payload retention.
144
+ _PERSONAL_DATA_PATTERNS: Final[list[re.Pattern[str]]] = [
145
+ # Email addresses (any domain)
146
+ re.compile(r"[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"),
147
+ # US Social Security Numbers
148
+ re.compile(r"\b\d{3}-\d{2}-\d{4}\b"),
149
+ # US phone numbers (various formats)
150
+ re.compile(r"\b(?:\+1[-. ]?)?\(?\d{3}\)?[-. ]?\d{3}[-. ]?\d{4}\b"),
151
+ ]
152
+
153
+ # ── Executable-structure scanner patterns ─────────────────────────────────────
154
+ #
155
+ # Tool-call objects, shell shebangs, and authority-shaped fields that must not
156
+ # persist in any semantic record. These form executable or capability-granting
157
+ # structures in the content stream.
158
+ _EXECUTABLE_PATTERNS: Final[list[re.Pattern[str]]] = [
159
+ # Agentic tool-call object patterns (common in LLM APIs)
160
+ re.compile(r'"tool_call[s]?"\s*:', re.IGNORECASE),
161
+ re.compile(r'"type"\s*:\s*"tool_use"', re.IGNORECASE),
162
+ re.compile(r'"function"\s*:\s*\{[^}]*"name"\s*:', re.IGNORECASE),
163
+ # Shell shebangs — interpreter invocations that must not appear in records
164
+ re.compile(r"^#!(?:/usr)?/(?:bin|env)\b"),
165
+ # Authority-shaped fields — unknown capability grants or privilege escalations
166
+ re.compile(r'"_(?:grant|authority|sudo|root|admin|capability)\b', re.IGNORECASE),
167
+ # Embedded script/frame tags
168
+ re.compile(r"<(?:script|iframe|object|embed)\b", re.IGNORECASE),
169
+ ]
170
+
171
+
172
+ # ── Decision dataclass ────────────────────────────────────────────────────────
173
+
174
+
175
+ @dataclass(frozen=True)
176
+ class ContentSafetyDecision:
177
+ """Typed content-safety decision returned by check_content_safety.
178
+
179
+ Maps to content-safety-decision.v1 schema fields.
180
+
181
+ Invariant: rejected decisions carry NO payload bytes, excerpts, or
182
+ content-derived hashes. Only ``accepted`` carries normalized_record_digest.
183
+ The dataclass raises ValueError if either half of the invariant is violated,
184
+ so any code that constructs a decision with a digest on rejection is caught
185
+ at construction time rather than silently leaking.
186
+ """
187
+
188
+ source_record_id: str
189
+ policy_version: str
190
+ profile: str
191
+ decision_code: str
192
+ # Present only when decision_code == "accepted". Absent on any rejection.
193
+ normalized_record_digest: str | None = None
194
+
195
+ def __post_init__(self) -> None:
196
+ if self.decision_code != "accepted" and self.normalized_record_digest is not None:
197
+ raise ValueError(
198
+ "ContentSafetyDecision: rejected decision must not carry "
199
+ f"normalized_record_digest (decision_code={self.decision_code!r})"
200
+ )
201
+ if self.decision_code == "accepted" and self.normalized_record_digest is None:
202
+ raise ValueError(
203
+ "ContentSafetyDecision: accepted decision must carry "
204
+ "normalized_record_digest"
205
+ )
206
+
207
+ @property
208
+ def accepted(self) -> bool:
209
+ """True iff decision_code is 'accepted'."""
210
+ return self.decision_code == "accepted"
211
+
212
+
213
+ # ── UntrustedData wrapper ─────────────────────────────────────────────────────
214
+
215
+
216
+ @dataclass(frozen=True)
217
+ class UntrustedData:
218
+ """Typed inert-data wrapper for accepted free text.
219
+
220
+ Maps to untrusted-data.v1 schema fields.
221
+
222
+ Consumers MUST NOT concatenate .value into system instructions, commands,
223
+ tool calls, paths, approvals, or authority. The value field is opaque data,
224
+ not procedure. The four boolean properties below enforce the typed boundary:
225
+ they always return False because an inert wrapper is never an executable.
226
+ """
227
+
228
+ record_id: str
229
+ field_path: str
230
+ policy_version: str
231
+ value: str
232
+
233
+ # Schema version for untrusted-data.v1 (class-level constant, not a field).
234
+ SCHEMA_VERSION: ClassVar[int] = 1
235
+
236
+ def can_select_tools(self) -> bool:
237
+ """Always False: typed inert data cannot select tools."""
238
+ return False
239
+
240
+ def can_grant_authority(self) -> bool:
241
+ """Always False: typed inert data cannot grant authority."""
242
+ return False
243
+
244
+ def can_alter_procedure(self) -> bool:
245
+ """Always False: typed inert data cannot alter procedure."""
246
+ return False
247
+
248
+ def can_supply_executable_path(self) -> bool:
249
+ """Always False: typed inert data cannot supply executable paths."""
250
+ return False
251
+
252
+
253
+ # ── Internal helpers ──────────────────────────────────────────────────────────
254
+
255
+
256
+ def _reject(
257
+ source_record_id: str,
258
+ policy_version: str,
259
+ profile: str,
260
+ decision_code: str,
261
+ ) -> ContentSafetyDecision:
262
+ """Construct a rejection decision.
263
+
264
+ Carries NO payload bytes, excerpts, or content-derived hashes.
265
+ normalized_record_digest is always absent.
266
+ """
267
+ return ContentSafetyDecision(
268
+ source_record_id=source_record_id,
269
+ policy_version=policy_version,
270
+ profile=profile,
271
+ decision_code=decision_code,
272
+ normalized_record_digest=None,
273
+ )
274
+
275
+
276
+ def _accept(
277
+ source_record_id: str,
278
+ policy_version: str,
279
+ profile: str,
280
+ normalized_bytes: bytes,
281
+ ) -> ContentSafetyDecision:
282
+ """Construct an acceptance decision.
283
+
284
+ The normalized_record_digest is the SHA-256 of the normalized bytes,
285
+ prefixed with 'sha256:'. The caller supplies normalized bytes, not raw.
286
+ """
287
+ digest = "sha256:" + hashlib.sha256(normalized_bytes).hexdigest()
288
+ return ContentSafetyDecision(
289
+ source_record_id=source_record_id,
290
+ policy_version=policy_version,
291
+ profile=profile,
292
+ decision_code="accepted",
293
+ normalized_record_digest=digest,
294
+ )
295
+
296
+
297
+ def _profile_max_bytes(profile_cfg: dict) -> int | None:
298
+ """Return the byte cap for the given profile config, or None if uncapped."""
299
+ if "max_bytes" in profile_cfg:
300
+ return profile_cfg["max_bytes"]
301
+ if "max_total_bytes" in profile_cfg:
302
+ return profile_cfg["max_total_bytes"]
303
+ return None
304
+
305
+
306
+ # ── Public guard entry point ──────────────────────────────────────────────────
307
+
308
+
309
+ def check_content_safety(
310
+ profile: str,
311
+ payload: bytes,
312
+ *,
313
+ source_record_id: str,
314
+ classification: str = "public",
315
+ ) -> ContentSafetyDecision:
316
+ """Apply the named content-safety profile to payload bytes.
317
+
318
+ Returns a ContentSafetyDecision without persisting anything.
319
+ On rejection, carries NO payload bytes, excerpts, or content-derived hashes.
320
+ On acceptance, carries a SHA-256 digest of the normalized bytes.
321
+
322
+ Checks, in order:
323
+ 1. Profile lookup — unknown profile: rejected-missing-profile
324
+ 2. Classification check — credential: rejected-credential
325
+ personal: rejected-personal-data
326
+ restricted or unknown: rejected-unknown-class
327
+ 3. UTF-8 decoding — invalid encoding: rejected-encoding
328
+ 4. Control characters — C0 except HT/LF/CR and DEL: rejected-encoding
329
+ 5. Size limit — over profile cap: rejected-size
330
+ 6. Executable structure — tool-call, shebang, authority field: rejected-structure
331
+ 7. Credential scanner — high-confidence token patterns: rejected-credential
332
+ 8. Personal-data scanner — direct identifiers: rejected-personal-data
333
+ 9. Accept — returns digest of CRLF-normalized UTF-8 bytes
334
+
335
+ Args:
336
+ profile: Named boundary profile from BOUNDARY_PROFILES.
337
+ payload: Raw bytes to evaluate. Never stored on rejection.
338
+ source_record_id: Stable identity of the source record.
339
+ classification: Producer-declared content class. Defaults to 'public'.
340
+ Only 'public' and 'repository-internal' may persist.
341
+ """
342
+ # Step 1 — Profile lookup. An unknown profile blocks without inspecting payload.
343
+ profile_cfg = BOUNDARY_PROFILES.get(profile)
344
+ if profile_cfg is None:
345
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-missing-profile")
346
+
347
+ # Step 2 — Classification check. Reject non-persistable classes immediately.
348
+ if classification not in _PERSISTABLE_CLASSES:
349
+ if classification == _CREDENTIAL_CLASS:
350
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-credential")
351
+ if classification == _PERSONAL_CLASS:
352
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-personal-data")
353
+ # restricted and any unknown class use the unknown-class code.
354
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-unknown-class")
355
+
356
+ # Step 3 — UTF-8 encoding check. Payload must decode without error.
357
+ try:
358
+ text = payload.decode("utf-8", errors="strict")
359
+ except UnicodeDecodeError:
360
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-encoding")
361
+
362
+ # Step 4 — Control-character check. C0 except HT/LF/CR and DEL reject.
363
+ if _CONTROL_RE.search(text):
364
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-encoding")
365
+
366
+ # Step 5 — Size limit against the profile cap.
367
+ max_bytes = _profile_max_bytes(profile_cfg)
368
+ if max_bytes is not None and len(payload) > max_bytes:
369
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-size")
370
+
371
+ # Step 6 — Executable-structure check. Tool-call objects, shebangs, and
372
+ # authority-shaped fields signal executable or capability-granting content.
373
+ for pattern in _EXECUTABLE_PATTERNS:
374
+ if pattern.search(text):
375
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-structure")
376
+
377
+ # Step 7 — Credential scanner. High-confidence token patterns reject the
378
+ # whole record without retaining any payload bytes.
379
+ for pattern in _CREDENTIAL_PATTERNS:
380
+ if pattern.search(text):
381
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-credential")
382
+
383
+ # Step 8 — Personal-data scanner. Direct personal identifiers reject without
384
+ # payload retention.
385
+ for pattern in _PERSONAL_DATA_PATTERNS:
386
+ if pattern.search(text):
387
+ return _reject(source_record_id, POLICY_VERSION, profile, "rejected-personal-data")
388
+
389
+ # Step 9 — Accept. Normalize CRLF→LF (matches canonical_contract normalization)
390
+ # and compute the SHA-256 digest of the normalized UTF-8 bytes.
391
+ normalized = text.replace("\r\n", "\n").replace("\r", "\n")
392
+ normalized_bytes = normalized.encode("utf-8")
393
+ return _accept(source_record_id, POLICY_VERSION, profile, normalized_bytes)
394
+
395
+
396
+ # ── UntrustedData constructor ─────────────────────────────────────────────────
397
+
398
+
399
+ def wrap_as_untrusted(
400
+ record_id: str,
401
+ field_path: str,
402
+ value: str,
403
+ ) -> UntrustedData:
404
+ """Wrap accepted free text as typed inert UntrustedData.
405
+
406
+ The returned wrapper records the policy version that admitted the value
407
+ and the field path within the source record. Callers MUST NOT pass a value
408
+ that was rejected by check_content_safety; this function has no way to
409
+ verify that precondition and trusts the caller's decision record.
410
+
411
+ Consumers of the returned UntrustedData MUST NOT concatenate .value into
412
+ system instructions, commands, tool calls, paths, approvals, or authority.
413
+ """
414
+ return UntrustedData(
415
+ record_id=record_id,
416
+ field_path=field_path,
417
+ policy_version=POLICY_VERSION,
418
+ value=value,
419
+ )
@@ -8,7 +8,7 @@ import re
8
8
  import stat
9
9
  import sys
10
10
  from contextlib import suppress
11
- from dataclasses import dataclass
11
+ from dataclasses import dataclass, replace
12
12
  from datetime import date, datetime, timedelta
13
13
  from pathlib import Path
14
14
  from typing import Any, TypeGuard
@@ -40,6 +40,13 @@ REFUSAL_CODES = frozenset(
40
40
  }
41
41
  )
42
42
 
43
+ _PARENT_RE = re.compile(r"^docs/product/briefs/[a-z0-9][a-z0-9-]{0,127}\.md$")
44
+ _BRIEF_SLUG_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,127}$")
45
+ _SPEC_LOCATOR_RE = re.compile(r"^docs/specs/[^/]+/spec\.md$")
46
+ _BRIEF_HEADER_RE = re.compile(r"^- \*\*Brief:\*\*(.*)$")
47
+ _HTML_COMMENT_RE = re.compile(r"<!--.*?-->", re.DOTALL)
48
+ MAX_SPEC_BYTES = 1_000_000
49
+ _BRIEFS_DIRECTORY = ("docs", "product", "briefs")
43
50
  _DELIVERY_ID_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,127}$")
44
51
  _DIGEST_RE = re.compile(r"^sha256:[0-9a-f]{64}$")
45
52
  _EVIDENCE_RE = re.compile(r"^(?:commit:[0-9a-f]{40}|pr:[0-9]+|run:[0-9]+)$")
@@ -90,6 +97,7 @@ class CoolingRecord:
90
97
  authority: tuple[tuple[str, tuple[tuple[str, str], ...]], ...]
91
98
  confirmation_proof: str
92
99
  exception: tuple[tuple[str, str], ...] | None = None
100
+ parent: str | None = None
93
101
 
94
102
  @classmethod
95
103
  def from_payload(cls, payload: dict[str, object]) -> "CoolingRecord":
@@ -123,6 +131,7 @@ class CoolingRecord:
123
131
  tuple((key, str(value)) for key, value in exception.items())
124
132
  if exception is not None else None
125
133
  ),
134
+ parent=None if payload.get("parent") is None else str(payload["parent"]),
126
135
  )
127
136
 
128
137
  def as_payload(self) -> dict[str, object]:
@@ -145,6 +154,8 @@ class CoolingRecord:
145
154
  }
146
155
  if self.exception is not None:
147
156
  payload["exception"] = dict(self.exception)
157
+ if self.parent is not None:
158
+ payload["parent"] = self.parent
148
159
  return payload
149
160
 
150
161
 
@@ -302,7 +313,7 @@ def validate_payload(payload: object) -> CoolingResult:
302
313
  """Validate the closed lifecycle shape without raising on untrusted input."""
303
314
  if (
304
315
  not isinstance(payload, dict)
305
- or set(payload) - (_REQUIRED | {"exception"})
316
+ or set(payload) - (_REQUIRED | {"exception", "parent"})
306
317
  or not set(payload) >= _REQUIRED
307
318
  ):
308
319
  return CoolingResult(code="record-invalid")
@@ -347,6 +358,10 @@ def validate_payload(payload: object) -> CoolingResult:
347
358
  return CoolingResult(code="record-invalid")
348
359
  if _zone(payload["timezone"]) is None:
349
360
  return CoolingResult(code="record-invalid")
361
+ if "parent" in payload and payload["parent"] != "none" and not _matches(
362
+ _PARENT_RE, payload["parent"]
363
+ ):
364
+ return CoolingResult(code="record-invalid")
350
365
  has_exception = "exception" in payload
351
366
  if (payload["disposition"] == "retain-exception") != has_exception:
352
367
  return CoolingResult(code="record-invalid")
@@ -698,6 +713,63 @@ def _resolve_destination(root: Path, candidates: object) -> Path | str:
698
713
  return "unsafe-target"
699
714
 
700
715
 
716
+ def _brief_file_exists(root: Path, slug: str) -> bool:
717
+ """Report whether `docs/product/briefs/<slug>.md` is a listed regular file.
718
+
719
+ The three directories must be real, and the name must appear in the
720
+ directory listing byte-for-byte, so a case variant or a link never counts.
721
+ """
722
+ file_safety = _close_work().file_safety()
723
+ directory = root.joinpath(*_BRIEFS_DIRECTORY)
724
+ name = f"{slug}.md"
725
+ try:
726
+ file_safety.validate_confined_directory(root, directory)
727
+ if name not in {entry.name for entry in directory.iterdir()}:
728
+ return False
729
+ return stat.S_ISREG(os.lstat(directory / name).st_mode)
730
+ except (OSError, ValueError):
731
+ return False
732
+
733
+
734
+ def _derive_parent(root: Path, locator: str) -> str | None:
735
+ """Read a spec's `Brief:` header and return a `parent` value, or None.
736
+
737
+ None means the scope stays unknown, so every unreadable or unrecognised
738
+ input fails closed. Only the preamble before the first `##` heading is read.
739
+ """
740
+ try:
741
+ root = Path(root)
742
+ raw = _close_work().file_safety().read_confined_regular_file(
743
+ root, root / locator, max_bytes=MAX_SPEC_BYTES
744
+ )
745
+ text = raw.decode("utf-8")
746
+ except (ImportError, OSError, ValueError, RecursionError):
747
+ return None
748
+ values: list[str] = []
749
+ for line in text.splitlines():
750
+ if line.startswith("## "):
751
+ break
752
+ found = _BRIEF_HEADER_RE.match(line)
753
+ if found:
754
+ values.append(_HTML_COMMENT_RE.sub("", found.group(1)).strip())
755
+ if not values:
756
+ return "none"
757
+ if len(values) != 1:
758
+ return None
759
+ value = values[0]
760
+ if value in {"", "none"}:
761
+ return "none"
762
+ if value.startswith("brief:"):
763
+ slug = value[len("brief:"):]
764
+ path = f"docs/product/briefs/{slug}.md"
765
+ else:
766
+ path = value
767
+ slug = path[len("docs/product/briefs/"):-len(".md")]
768
+ if not _PARENT_RE.fullmatch(path) or not _BRIEF_SLUG_RE.fullmatch(slug):
769
+ return None
770
+ return path if _brief_file_exists(root, slug) else None
771
+
772
+
701
773
  def enrol(
702
774
  *,
703
775
  root: Path,
@@ -721,6 +793,11 @@ def enrol(
721
793
  destination = _resolve_destination(root, candidates)
722
794
  if isinstance(destination, str):
723
795
  return CoolingResult(code=destination)
796
+ if record.parent is None and _SPEC_LOCATOR_RE.fullmatch(record.locator):
797
+ # Read before the write: a cooled spec body is never read afterwards.
798
+ derived = _derive_parent(root, record.locator)
799
+ if derived is not None:
800
+ record = replace(record, parent=derived)
724
801
  try:
725
802
  return _write_record(root, destination, record, authority_binding)
726
803
  except (ImportError, OSError, ValueError):