agentbundle 0.57.0__tar.gz → 0.58.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 (714) hide show
  1. {agentbundle-0.57.0/agentbundle.egg-info → agentbundle-0.58.1}/PKG-INFO +15 -1
  2. {agentbundle-0.57.0 → agentbundle-0.58.1}/README-pypi.md +14 -0
  3. agentbundle-0.58.1/agentbundle/_data/_content_safety.py +419 -0
  4. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/file_safety.py +208 -0
  5. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/workspace_status_engine.py +1126 -50
  6. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/self_host.py +8 -0
  7. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/file_safety.py +208 -0
  8. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/version.py +1 -1
  9. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/workspace_mcp.py +286 -7
  10. {agentbundle-0.57.0 → agentbundle-0.58.1/agentbundle.egg-info}/PKG-INFO +15 -1
  11. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/SOURCES.txt +4 -1
  12. {agentbundle-0.57.0 → agentbundle-0.58.1}/pyproject.toml +1 -1
  13. agentbundle-0.58.1/tests/test_workspace_mcp_depends_on.py +84 -0
  14. agentbundle-0.58.1/tests/unit/test_catalogue_tooling_file_safety.py +668 -0
  15. agentbundle-0.58.1/tests/unit/test_workspace_mcp_supervisor_run.py +661 -0
  16. agentbundle-0.57.0/tests/unit/test_catalogue_tooling_file_safety.py +0 -311
  17. {agentbundle-0.57.0 → agentbundle-0.58.1}/MANIFEST.in +0 -0
  18. {agentbundle-0.57.0 → agentbundle-0.58.1}/README.md +0 -0
  19. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/__init__.py +0 -0
  20. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/__main__.py +0 -0
  21. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/__init__.py +0 -0
  22. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/adapter.schema.json +0 -0
  23. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/adapter.toml +0 -0
  24. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/agent-plugin-extension-namespaces.schema.json +0 -0
  25. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/agent-plugin-extension-namespaces.toml +0 -0
  26. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-index.schema.json +0 -0
  27. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-manifest.schema.json +0 -0
  28. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-members.txt +0 -0
  29. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
  30. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  31. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
  32. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
  33. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/CLAUDE.md +0 -0
  34. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  35. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  36. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
  37. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
  38. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  39. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  40. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  41. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/CLAUDE.md +0 -0
  42. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  43. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  44. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  45. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
  46. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_layout_declared_section.py +0 -0
  47. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
  48. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
  49. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue.schema.json +0 -0
  50. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/close_work.py +0 -0
  51. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/cooling.py +0 -0
  52. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/distribution-routes.schema.json +0 -0
  53. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/distribution-routes.toml +0 -0
  54. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/guide.schema.json +0 -0
  55. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/install-defaults.toml +0 -0
  56. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/install-marker.py +0 -0
  57. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/knowledge-captured-observation.schema.json +0 -0
  58. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/marketplace-entry.schema.json +0 -0
  59. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/pack.schema.json +0 -0
  60. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  61. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  62. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/profile.schema.json +0 -0
  63. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/public-contracts.txt +0 -0
  64. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/skill-manifest.schema.json +0 -0
  65. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/skill.schema.json +0 -0
  66. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/target-vocab.toml +0 -0
  67. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/LICENSE.md +0 -0
  68. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/PROVENANCE.md +0 -0
  69. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/mcp.schema.json +0 -0
  70. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/plugin.schema.json +0 -0
  71. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/work_intake_refresh.py +0 -0
  72. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/workspace_status_prune.py +0 -0
  73. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/bounded_metadata.py +0 -0
  74. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/__init__.py +0 -0
  75. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/__main__.py +0 -0
  76. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapter_root_bins.py +0 -0
  77. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/__init__.py +0 -0
  78. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/_sweep_guard.py +0 -0
  79. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/claude_code.py +0 -0
  80. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/codex.py +0 -0
  81. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/copilot.py +0 -0
  82. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/cursor.py +0 -0
  83. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/gemini.py +0 -0
  84. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/kiro.py +0 -0
  85. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
  86. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/kiro_ide.py +0 -0
  87. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/contract.py +0 -0
  88. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/hook_wiring_rules.py +0 -0
  89. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/lint_packs.py +0 -0
  90. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/main.py +0 -0
  91. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/phase_order.py +0 -0
  92. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projection_io.py +0 -0
  93. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/__init__.py +0 -0
  94. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  95. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  96. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  97. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/direct_directory.py +0 -0
  98. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  99. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/hook_id.py +0 -0
  100. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  101. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  102. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/merge_json.py +0 -0
  103. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/plugin_hooks.py +0 -0
  104. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/user_merge_json.py +0 -0
  105. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  106. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  107. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/marketplace.toml +0 -0
  108. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-agent-plugin.toml +0 -0
  109. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  110. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  111. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  112. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/self-host.toml +0 -0
  113. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_agent_plugin.py +0 -0
  114. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_apm.py +0 -0
  115. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_claude_plugins.py +0 -0
  116. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_lookup.py +0 -0
  117. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/scope_rails.py +0 -0
  118. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/shared_libs.py +0 -0
  119. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/target_resolver.py +0 -0
  120. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/user_libs.py +0 -0
  121. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/validate.py +0 -0
  122. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue.py +0 -0
  123. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/__init__.py +0 -0
  124. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/direct_http.py +0 -0
  125. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/jfrog_cli.py +0 -0
  126. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/models.py +0 -0
  127. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
  128. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/archive.py +0 -0
  129. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/build.py +0 -0
  130. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/config.py +0 -0
  131. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/contracts_inspector.py +0 -0
  132. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
  133. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  134. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/identity.py +0 -0
  135. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/index_generator.py +0 -0
  136. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/initialise.py +0 -0
  137. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
  138. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/journey_validator.py +0 -0
  139. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/lint.py +0 -0
  140. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/manifest.py +0 -0
  141. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/okf_discovery.py +0 -0
  142. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/package.py +0 -0
  143. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/results.py +0 -0
  144. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
  145. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
  146. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  147. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  148. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/verify.py +0 -0
  149. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/version_ranges.py +0 -0
  150. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/categories.py +0 -0
  151. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/cli.py +0 -0
  152. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/__init__.py +0 -0
  153. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/_common.py +0 -0
  154. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/_drop_warning.py +0 -0
  155. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/adapt.py +0 -0
  156. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_build.py +0 -0
  157. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_contracts.py +0 -0
  158. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_index.py +0 -0
  159. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_init.py +0 -0
  160. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_lint.py +0 -0
  161. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_package.py +0 -0
  162. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_self_host.py +0 -0
  163. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_sync.py +0 -0
  164. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  165. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  166. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_verify.py +0 -0
  167. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/config.py +0 -0
  168. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/diff.py +0 -0
  169. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/docs.py +0 -0
  170. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/init_state.py +0 -0
  171. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/install.py +0 -0
  172. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_installed.py +0 -0
  173. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_packs.py +0 -0
  174. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_profiles.py +0 -0
  175. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_targets.py +0 -0
  176. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/oplog_cmd.py +0 -0
  177. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/pack_config_cmd.py +0 -0
  178. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/pack_evals.py +0 -0
  179. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/package_catalogue.py +0 -0
  180. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/profile.py +0 -0
  181. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/reconcile.py +0 -0
  182. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/render.py +0 -0
  183. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/scaffold.py +0 -0
  184. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/show.py +0 -0
  185. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/uninstall.py +0 -0
  186. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/upgrade.py +0 -0
  187. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/validate.py +0 -0
  188. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/config.py +0 -0
  189. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_install.py +0 -0
  190. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_source.py +0 -0
  191. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_source_acquisition.py +0 -0
  192. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_source_state.py +0 -0
  193. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_validate.py +0 -0
  194. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/https_catalogue.py +0 -0
  195. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/local_exclude.py +0 -0
  196. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/oplog.py +0 -0
  197. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/pack_inventory.py +0 -0
  198. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/pack_renames.py +0 -0
  199. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/render.py +0 -0
  200. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/safety.py +0 -0
  201. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/scaffold.py +0 -0
  202. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/scope.py +0 -0
  203. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/source_defaults.py +0 -0
  204. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/statelock.py +0 -0
  205. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/system_trust.py +0 -0
  206. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/user_config.py +0 -0
  207. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/dependency_links.txt +0 -0
  208. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/entry_points.txt +0 -0
  209. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/requires.txt +0 -0
  210. {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/top_level.txt +0 -0
  211. {agentbundle-0.57.0 → agentbundle-0.58.1}/conftest.py +0 -0
  212. {agentbundle-0.57.0 → agentbundle-0.58.1}/setup.cfg +0 -0
  213. {agentbundle-0.57.0 → agentbundle-0.58.1}/templates/install-marker.py +0 -0
  214. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/__init__.py +0 -0
  215. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/_direct_acquisition.py +0 -0
  216. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/_rename_fixtures.py +0 -0
  217. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/_support.py +0 -0
  218. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/__init__.py +0 -0
  219. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/README.md +0 -0
  220. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +0 -0
  221. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/claude-code-2.1.228-hook-events.json +0 -0
  222. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
  223. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
  224. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
  225. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
  226. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
  227. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
  228. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
  229. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
  230. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
  231. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
  232. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
  233. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
  234. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
  235. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
  236. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
  237. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
  238. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
  239. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
  240. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
  241. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
  242. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
  243. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
  244. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
  245. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_codex.py +0 -0
  246. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_copilot.py +0 -0
  247. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_cursor.py +0 -0
  248. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_gemini.py +0 -0
  249. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro.py +0 -0
  250. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
  251. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
  252. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
  253. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
  254. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_agent_boundary_metadata_projection.py +0 -0
  255. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_agent_plugin_projection.py +0 -0
  256. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
  257. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_build_validate_bundled_schema.py +0 -0
  258. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract.py +0 -0
  259. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract_scope.py +0 -0
  260. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract_v07.py +0 -0
  261. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract_v08.py +0 -0
  262. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
  263. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_distribution_route_contract.py +0 -0
  264. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_distribution_route_golden.py +0 -0
  265. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_distribution_route_resolution.py +0 -0
  266. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_end_to_end_build.py +0 -0
  267. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_hook_wiring_rules.py +0 -0
  268. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_lint_packs.py +0 -0
  269. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
  270. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pack_schema.py +0 -0
  271. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
  272. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pack_schema_install.py +0 -0
  273. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pipeline.py +0 -0
  274. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_plugin_hooks.py +0 -0
  275. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
  276. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_plugin_publication_gates.py +0 -0
  277. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_policy_registry_projection.py +0 -0
  278. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_projectable_subset.py +0 -0
  279. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_projection_io.py +0 -0
  280. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_projections_merge_json.py +0 -0
  281. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_route_lookup.py +0 -0
  282. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_scope_rails.py +0 -0
  283. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_security.py +0 -0
  284. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_check.py +0 -0
  285. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
  286. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_metadata_policy.py +0 -0
  287. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
  288. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_sequential_implementer_dispatch_projection.py +0 -0
  289. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
  290. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
  291. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_user_libs_projection.py +0 -0
  292. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_validate.py +0 -0
  293. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
  294. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/conftest.py +0 -0
  295. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/contracts/test_agentbundle_show_schema.py +0 -0
  296. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/contracts/test_catalogue_fetch_credential_boundary.py +0 -0
  297. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/contracts/test_skill_schema.py +0 -0
  298. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
  299. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/adapt/values.toml +0 -0
  300. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
  301. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/catalogue.toml +0 -0
  302. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
  303. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
  304. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
  305. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
  306. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
  307. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
  308. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
  309. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
  310. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
  311. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield/values.toml +0 -0
  312. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
  313. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
  314. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
  315. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
  316. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
  317. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
  318. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
  319. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
  320. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
  321. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
  322. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
  323. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_sync/adapter_contract_major_mismatch/pack.toml +0 -0
  324. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/catalogue.toml +0 -0
  325. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/hook-wiring/example.json +0 -0
  326. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/SKILL.md +0 -0
  327. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/scripts/run.py +0 -0
  328. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/JOURNEY.md +0 -0
  329. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/pack.toml +0 -0
  330. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-without-journey/pack.toml +0 -0
  331. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/profiles/test-profile.toml +0 -0
  332. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/cognitive-load-hosts.json +0 -0
  333. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
  334. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
  335. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
  336. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
  337. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
  338. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
  339. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
  340. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
  341. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
  342. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
  343. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
  344. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
  345. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
  346. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
  347. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
  348. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/direct/ac35_corpus_verdicts.json +0 -0
  349. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/direct/golden_state_0_5.toml +0 -0
  350. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/distribution-routes/golden.json +0 -0
  351. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/distribution-routes/witness-packs/portable/.apm/skills/example/SKILL.md +0 -0
  352. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/distribution-routes/witness-packs/portable/pack.toml +0 -0
  353. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/.claude-plugin/marketplace.json +0 -0
  354. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/AGENTS.md +0 -0
  355. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/LICENSE-APACHE +0 -0
  356. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/LICENSE-MIT +0 -0
  357. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/agentbundle/_data/install-defaults.toml +0 -0
  358. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/catalogue.toml +0 -0
  359. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
  360. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
  361. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/pack.toml +0 -0
  362. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/seeds/AGENTS.md +0 -0
  363. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/beta/.claude-plugin/plugin.json +0 -0
  364. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/beta/pack.toml +0 -0
  365. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/profiles/example.toml +0 -0
  366. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
  367. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
  368. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
  369. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
  370. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
  371. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
  372. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
  373. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
  374. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
  375. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
  376. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
  377. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list-installed/golden_120col.txt +0 -0
  378. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list-installed/golden_80col.txt +0 -0
  379. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
  380. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
  381. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +0 -0
  382. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
  383. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
  384. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
  385. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
  386. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
  387. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  388. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
  389. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
  390. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
  391. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
  392. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
  393. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
  394. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
  395. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
  396. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
  397. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
  398. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
  399. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
  400. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
  401. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
  402. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
  403. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
  404. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
  405. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
  406. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
  407. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
  408. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
  409. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/show_contract/agentbundle-show.schema.json +0 -0
  410. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/show_contract/catalogue.json +0 -0
  411. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/show_contract/installed_state.json +0 -0
  412. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
  413. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
  414. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  415. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
  416. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
  417. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  418. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
  419. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
  420. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
  421. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
  422. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  423. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
  424. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
  425. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  426. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
  427. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
  428. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
  429. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
  430. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
  431. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
  432. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
  433. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
  434. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
  435. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
  436. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
  437. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
  438. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
  439. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
  440. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/__init__.py +0 -0
  441. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/_https_archive.py +0 -0
  442. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_cmd.py +0 -0
  443. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_dual_scope.py +0 -0
  444. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_preflight_detection.py +0 -0
  445. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_schema_migration.py +0 -0
  446. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_apm_install_route.py +0 -0
  447. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_blank_catalogue.py +0 -0
  448. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
  449. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_brownfield_round_trip.py +0 -0
  450. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
  451. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_build_check_drift_gates.py +0 -0
  452. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_build_derivation_apm.py +0 -0
  453. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
  454. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_bundled_contracts_fail_closed.py +0 -0
  455. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_init.py +0 -0
  456. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_init_packageable.py +0 -0
  457. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_adapter_compat.py +0 -0
  458. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_dependencies.py +0 -0
  459. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_external_portability.py +0 -0
  460. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_fixture_checks.py +0 -0
  461. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_marketplace.py +0 -0
  462. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_output_drift.py +0 -0
  463. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_package_preflight.py +0 -0
  464. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_plugin_path.py +0 -0
  465. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_profile_schema.py +0 -0
  466. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_step1.py +0 -0
  467. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_index_generator.py +0 -0
  468. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_integration.py +0 -0
  469. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_journey_validator.py +0 -0
  470. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_schema.py +0 -0
  471. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
  472. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_claude_plugins_install_route.py +0 -0
  473. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_config_cascade.py +0 -0
  474. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_credential_brokers_pack_install.py +0 -0
  475. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_credentials_wheel.py +0 -0
  476. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_direct_install.py +0 -0
  477. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
  478. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_editable_source_detection.py +0 -0
  479. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_fixtures_validate.py +0 -0
  480. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_hook_wiring_ingress.py +0 -0
  481. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_adapt_chain.py +0 -0
  482. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_cmd.py +0 -0
  483. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_converters_user_scope.py +0 -0
  484. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_copilot_full_parity.py +0 -0
  485. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_core_smoke.py +0 -0
  486. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_default_source.py +0 -0
  487. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_dependencies_gate.py +0 -0
  488. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
  489. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_dual_scope.py +0 -0
  490. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_layout_is_best_effort.py +0 -0
  491. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_orphan_reshape.py +0 -0
  492. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_pack_metadata_shape.py +0 -0
  493. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_profile.py +0 -0
  494. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_profile_live.py +0 -0
  495. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
  496. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_research_user_scope.py +0 -0
  497. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_seed_delivery.py +0 -0
  498. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_session_start_wiring.py +0 -0
  499. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_upgrade_offer.py +0 -0
  500. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_user_hooks.py +0 -0
  501. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
  502. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_jfrog_cli_contract.py +0 -0
  503. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
  504. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
  505. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
  506. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_list_packs_cmd.py +0 -0
  507. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_local_scope_install.py +0 -0
  508. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_marketplace_entry_validation.py +0 -0
  509. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_marketplace_manifest_regression.py +0 -0
  510. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_multi_pack_install.py +0 -0
  511. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
  512. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_plugin_route_membership.py +0 -0
  513. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_portable_catalogue_authentication.py +0 -0
  514. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_recommends_cross_scope.py +0 -0
  515. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_reconcile.py +0 -0
  516. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_rename_hint_cli.py +0 -0
  517. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_rename_migration_e2e.py +0 -0
  518. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_reserved_path_filter.py +0 -0
  519. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_scaffold_projection.py +0 -0
  520. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_self_host_schema_migration.py +0 -0
  521. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
  522. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_shared_prefix_coexistence.py +0 -0
  523. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_show_cmd.py +0 -0
  524. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_tier_invariants.py +0 -0
  525. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_trust_fallback_tls.py +0 -0
  526. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_uninstall_cmd.py +0 -0
  527. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_uninstall_user_hooks.py +0 -0
  528. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
  529. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_upgrade_cmd.py +0 -0
  530. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_upgrade_user_hooks.py +0 -0
  531. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_version_gate_matrix.py +0 -0
  532. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
  533. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_zipapp.py +0 -0
  534. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/performance/__init__.py +0 -0
  535. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/performance/test_direct_family2_budget_cost.py +0 -0
  536. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_adapter_permissions_projection.py +0 -0
  537. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_elicit.py +0 -0
  538. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_event_bridge.py +0 -0
  539. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_git.py +0 -0
  540. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_git_scope.py +0 -0
  541. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_layout_override.py +0 -0
  542. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_lifecycle.py +0 -0
  543. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_stdin.py +0 -0
  544. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_tools.py +0 -0
  545. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/__init__.py +0 -0
  546. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/conftest.py +0 -0
  547. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_adapt_discovery_schema.py +0 -0
  548. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_adapter_symlink_policy.py +0 -0
  549. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_append_layout_section.py +0 -0
  550. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_architect_readme_install_command.py +0 -0
  551. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_bundled_contract_errors.py +0 -0
  552. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue.py +0 -0
  553. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_archive_unit_digests.py +0 -0
  554. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_ci_contract.py +0 -0
  555. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_curation_deps.py +0 -0
  556. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_fetch.py +0 -0
  557. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_fetch_jfrog.py +0 -0
  558. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
  559. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_manifest_schema.py +0 -0
  560. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_pack_defaults.py +0 -0
  561. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_package_compare.py +0 -0
  562. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_package_include_diagnostic.py +0 -0
  563. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_package_refusal.py +0 -0
  564. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
  565. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_skill_spec_lint.py +0 -0
  566. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_spec_version.py +0 -0
  567. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_sync.py +0 -0
  568. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_sync_fixture_set.py +0 -0
  569. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_archive.py +0 -0
  570. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_build.py +0 -0
  571. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
  572. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_foundation.py +0 -0
  573. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_identity.py +0 -0
  574. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_init.py +0 -0
  575. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_lint.py +0 -0
  576. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_package.py +0 -0
  577. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_self_host.py +0 -0
  578. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
  579. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
  580. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_verify.py +0 -0
  581. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_trust_fallback.py +0 -0
  582. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_unit_digests.py +0 -0
  583. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave2_schema.py +0 -0
  584. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave2_validation.py +0 -0
  585. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_contracts_cli.py +0 -0
  586. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_contracts_inspector.py +0 -0
  587. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_init_nextsteps.py +0 -0
  588. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_offline_navigation.py +0 -0
  589. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_catalogue_optional.py +0 -0
  590. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_help_lists_config.py +0 -0
  591. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_list_targets_help.py +0 -0
  592. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_namespace_fixture.py +0 -0
  593. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_path_normalisation.py +0 -0
  594. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_profile_surface.py +0 -0
  595. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_scope_flags.py +0 -0
  596. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_codex_agent_toml.py +0 -0
  597. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_codex_projection_modes.py +0 -0
  598. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cognitive_load_seed_contract.py +0 -0
  599. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_collect_tree_symlinks.py +0 -0
  600. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_common_classify_seeds.py +0 -0
  601. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_config.py +0 -0
  602. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_config_cmd.py +0 -0
  603. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_configured_adapter.py +0 -0
  604. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_confirm_helper.py +0 -0
  605. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_contract_parity.py +0 -0
  606. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_contract_v0_3_schema.py +0 -0
  607. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_copilot_agent_md.py +0 -0
  608. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_copilot_hooks_json.py +0 -0
  609. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
  610. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_credbroker_lint_hardening.py +0 -0
  611. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_dependencies_batch.py +0 -0
  612. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_diff_cmd.py +0 -0
  613. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_admission.py +0 -0
  614. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_architecture_controls.py +0 -0
  615. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_diagnostics.py +0 -0
  616. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_lifecycle_facts.py +0 -0
  617. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_source_acquisition.py +0 -0
  618. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_source_state.py +0 -0
  619. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_upgrade.py +0 -0
  620. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_validate.py +0 -0
  621. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_footprint_ownership.py +0 -0
  622. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_https_catalogue.py +0 -0
  623. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_init_state_cmd.py +0 -0
  624. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
  625. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
  626. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
  627. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
  628. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_event_dropped_wirings.py +0 -0
  629. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_first_value_handoff.py +0 -0
  630. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_force_help.py +0 -0
  631. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_inband_detection.py +0 -0
  632. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_messages.py +0 -0
  633. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_messages_repo_scope.py +0 -0
  634. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_refusal_ordering.py +0 -0
  635. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_state_provenance.py +0 -0
  636. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
  637. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
  638. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
  639. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_layout_bases_anchoring.py +0 -0
  640. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
  641. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_list_installed_cmd.py +0 -0
  642. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_list_installed_status.py +0 -0
  643. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_list_targets_cmd.py +0 -0
  644. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_exclude_git_cache.py +0 -0
  645. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_schema.py +0 -0
  646. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
  647. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t12_show.py +0 -0
  648. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t2_resolve.py +0 -0
  649. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t3_config.py +0 -0
  650. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t4_state_path.py +0 -0
  651. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
  652. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
  653. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t8_install.py +0 -0
  654. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t9_exclude.py +0 -0
  655. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_marker_schema_version_parity.py +0 -0
  656. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_merge_into_agent_json.py +0 -0
  657. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
  658. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_nested_symlink_hardening.py +0 -0
  659. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_no_contracts_fallback.py +0 -0
  660. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_offer_upgrade_namespace.py +0 -0
  661. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_okf_discovery.py +0 -0
  662. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_org_bootstrap.py +0 -0
  663. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_orphan_sweep_guards.py +0 -0
  664. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_config_api.py +0 -0
  665. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_evals_bundled_contract.py +0 -0
  666. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_inventory.py +0 -0
  667. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_layout_section_schema.py +0 -0
  668. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_renames.py +0 -0
  669. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_package_catalogue.py +0 -0
  670. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_packstate_source_provenance.py +0 -0
  671. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pipeline_phase_order.py +0 -0
  672. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_plugin_scope_filter.py +0 -0
  673. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_profile_reader.py +0 -0
  674. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_render.py +0 -0
  675. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_render_cmd.py +0 -0
  676. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_render_table.py +0 -0
  677. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_resolve_state_path.py +0 -0
  678. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
  679. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
  680. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_route_surface_parity.py +0 -0
  681. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_safety.py +0 -0
  682. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
  683. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
  684. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_scaffold_cmd.py +0 -0
  685. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_scope.py +0 -0
  686. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_self_host_windows.py +0 -0
  687. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_shared_prefix_disclosure.py +0 -0
  688. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_source_conflict_guard.py +0 -0
  689. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_source_defaults.py +0 -0
  690. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_state_v01_refuse_write.py +0 -0
  691. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_state_v02.py +0 -0
  692. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_state_v0_4_schema.py +0 -0
  693. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_statelock.py +0 -0
  694. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_statelock_hardening.py +0 -0
  695. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_system_trust.py +0 -0
  696. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_target_resolver.py +0 -0
  697. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_toml_emitters.py +0 -0
  698. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_unresolved_markers.py +0 -0
  699. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_upgrade_bulk_all.py +0 -0
  700. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_upgrade_recap.py +0 -0
  701. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_upgrade_source_inference.py +0 -0
  702. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_io.py +0 -0
  703. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_isolation.py +0 -0
  704. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_path.py +0 -0
  705. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_source.py +0 -0
  706. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_merge_json.py +0 -0
  707. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_attach_to_agent.py +0 -0
  708. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_categories.py +0 -0
  709. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_cmd.py +0 -0
  710. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
  711. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_values_from_shapes.py +0 -0
  712. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_version.py +0 -0
  713. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_windows_direct_suite_registration.py +0 -0
  714. {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_workspace_mcp_events_poller.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.57.0
3
+ Version: 0.58.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,20 @@ 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.58.1
39
+
40
+ The workspace MCP bridge understands supervisor runs. While a spec has a
41
+ supervisor status file, `workspace_status` shows that run's id, stage, and
42
+ `run_active` signal. A pending human question appears only as framed untrusted
43
+ text that has passed a content-safety check, or as a fixed placeholder. A
44
+ status file that is a link, oversized, or malformed shows no run and no gate.
45
+
46
+ ## What's new in 0.58.0
47
+
48
+ The shared file-safety helper gains `write_confined_regular_file`, which creates
49
+ or updates a file inside a root without following links and restores the
50
+ original bytes if a write fails.
51
+
38
52
  ## What's new in 0.57.0
39
53
 
40
54
  `install` and `upgrade` now print the steps to move to a renamed pack when the
@@ -14,6 +14,20 @@ 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.58.1
18
+
19
+ The workspace MCP bridge understands supervisor runs. While a spec has a
20
+ supervisor status file, `workspace_status` shows that run's id, stage, and
21
+ `run_active` signal. A pending human question appears only as framed untrusted
22
+ text that has passed a content-safety check, or as a fixed placeholder. A
23
+ status file that is a link, oversized, or malformed shows no run and no gate.
24
+
25
+ ## What's new in 0.58.0
26
+
27
+ The shared file-safety helper gains `write_confined_regular_file`, which creates
28
+ or updates a file inside a root without following links and restores the
29
+ original bytes if a write fails.
30
+
17
31
  ## What's new in 0.57.0
18
32
 
19
33
  `install` and `upgrade` now print the steps to move to a renamed pack when the
@@ -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
+ )
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
+ import re
6
7
  import stat
7
8
  from contextlib import contextmanager
8
9
  from hashlib import sha256
@@ -482,3 +483,210 @@ def sha256_confined_regular_file(root: Path, path: Path) -> str:
482
483
  for chunk in iter(lambda: handle.read(1024 * 1024), b""):
483
484
  digest.update(chunk)
484
485
  return digest.hexdigest()
486
+
487
+
488
+ _SHA256_HEX = re.compile(r"[0-9a-f]{64}")
489
+
490
+
491
+ def _write_open_flags() -> int:
492
+ """Flags every write-path ``os.open`` adds, limited to what ``os`` has."""
493
+ flags = getattr(os, "O_BINARY", 0)
494
+ for name in ("O_NOFOLLOW", "O_CLOEXEC", "O_NONBLOCK"):
495
+ flags |= getattr(os, name, 0)
496
+ return flags
497
+
498
+
499
+ def _write_all(descriptor: int, data: bytes) -> None:
500
+ """Write every byte of *data*, continuing after a short write."""
501
+ view = memoryview(data)
502
+ while len(view):
503
+ written = os.write(descriptor, view)
504
+ if written <= 0:
505
+ raise OSError("write made no progress")
506
+ view = view[written:]
507
+
508
+
509
+ def _read_all(descriptor: int) -> bytes:
510
+ """Read a descriptor to end of file."""
511
+ chunks: list[bytes] = []
512
+ while True:
513
+ chunk = os.read(descriptor, 1024 * 1024)
514
+ if not chunk:
515
+ return b"".join(chunks)
516
+ chunks.append(chunk)
517
+
518
+
519
+ def _create_confined_file(
520
+ root: Path,
521
+ path: Path,
522
+ data: bytes,
523
+ *,
524
+ relative: str,
525
+ parent_fd: int | None,
526
+ leaf: str,
527
+ ) -> None:
528
+ """Create *path* exclusively; remove only the file this call created."""
529
+ flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL | _write_open_flags()
530
+ try:
531
+ if parent_fd is None:
532
+ descriptor = os.open(path, flags, 0o600)
533
+ else:
534
+ descriptor = os.open(leaf, flags, 0o600, dir_fd=parent_fd)
535
+ except OSError as exc:
536
+ raise UnsafeContentError(
537
+ f"target cannot be created safely: {relative}"
538
+ ) from exc
539
+ identity: tuple[int, int] | None = None
540
+ try:
541
+ try:
542
+ created = os.fstat(descriptor)
543
+ identity = (created.st_dev, created.st_ino)
544
+ _validate_regular_file_stat(created, relative)
545
+ if parent_fd is None:
546
+ # No byte is written until the created path is known to be
547
+ # inside the root and to be the file this call created.
548
+ path.resolve(strict=True).relative_to(root.resolve(strict=True))
549
+ named = path.lstat()
550
+ if (named.st_dev, named.st_ino) != identity:
551
+ raise UnsafeContentError(
552
+ f"target changed while creating: {relative}"
553
+ )
554
+ _write_all(descriptor, data)
555
+ os.fsync(descriptor)
556
+ except (UnsafeContentError, OSError, RuntimeError, ValueError) as exc:
557
+ _remove_created(path, parent_fd, leaf, identity)
558
+ if isinstance(exc, UnsafeContentError):
559
+ raise
560
+ raise UnsafeContentError(
561
+ f"target cannot be written safely: {relative}"
562
+ ) from exc
563
+ finally:
564
+ os.close(descriptor)
565
+
566
+
567
+ def _remove_created(
568
+ path: Path, parent_fd: int | None, leaf: str, identity: tuple[int, int] | None
569
+ ) -> None:
570
+ """Unlink the leaf only when it still has the created file's identity."""
571
+ if identity is None:
572
+ return
573
+ try:
574
+ if parent_fd is None:
575
+ named = path.lstat()
576
+ if (named.st_dev, named.st_ino) == identity:
577
+ path.unlink()
578
+ else:
579
+ named = os.stat(leaf, dir_fd=parent_fd, follow_symlinks=False)
580
+ if (named.st_dev, named.st_ino) == identity:
581
+ os.unlink(leaf, dir_fd=parent_fd)
582
+ except OSError:
583
+ pass
584
+
585
+
586
+ def _update_confined_file(
587
+ root: Path,
588
+ path: Path,
589
+ data: bytes,
590
+ expect_sha256: str,
591
+ *,
592
+ relative: str,
593
+ parent_fd: int | None,
594
+ leaf: str,
595
+ ) -> None:
596
+ """Rewrite *path* in place when its bytes still hash to *expect_sha256*."""
597
+ flags = os.O_RDWR | _write_open_flags()
598
+ try:
599
+ if parent_fd is None:
600
+ before = path.lstat()
601
+ _validate_regular_file_stat(before, relative)
602
+ path.resolve(strict=True).relative_to(root.resolve(strict=True))
603
+ descriptor = os.open(path, flags)
604
+ else:
605
+ before = os.stat(leaf, dir_fd=parent_fd, follow_symlinks=False)
606
+ _validate_regular_file_stat(before, relative)
607
+ descriptor = os.open(leaf, flags, dir_fd=parent_fd)
608
+ except UnsafeContentError:
609
+ raise
610
+ except (OSError, RuntimeError, ValueError) as exc:
611
+ raise UnsafeContentError(
612
+ f"target cannot be opened safely: {relative}"
613
+ ) from exc
614
+ try:
615
+ try:
616
+ after = os.fstat(descriptor)
617
+ _validate_regular_file_stat(after, relative)
618
+ if (before.st_dev, before.st_ino) != (after.st_dev, after.st_ino):
619
+ raise UnsafeContentError(f"target changed while opening: {relative}")
620
+ original = _read_all(descriptor)
621
+ except OSError as exc:
622
+ raise UnsafeContentError(
623
+ f"target cannot be read safely: {relative}"
624
+ ) from exc
625
+ if sha256(original).hexdigest() != expect_sha256:
626
+ raise UnsafeContentError(f"target does not match its digest: {relative}")
627
+ try:
628
+ os.lseek(descriptor, 0, os.SEEK_SET)
629
+ _write_all(descriptor, data)
630
+ os.ftruncate(descriptor, len(data))
631
+ os.fsync(descriptor)
632
+ except OSError as exc:
633
+ try:
634
+ os.lseek(descriptor, 0, os.SEEK_SET)
635
+ _write_all(descriptor, original)
636
+ os.ftruncate(descriptor, len(original))
637
+ os.fsync(descriptor)
638
+ except OSError as restore_exc:
639
+ raise UnsafeContentError(
640
+ f"target write failed and was not restored: {relative}"
641
+ ) from restore_exc
642
+ raise UnsafeContentError(
643
+ f"target cannot be written safely: {relative}"
644
+ ) from exc
645
+ finally:
646
+ os.close(descriptor)
647
+
648
+
649
+ def write_confined_regular_file(
650
+ root: Path,
651
+ path: Path,
652
+ data: bytes,
653
+ *,
654
+ expect_sha256: str | None,
655
+ ) -> None:
656
+ """Write *data* to a confined, no-follow, single-link regular file.
657
+
658
+ ``expect_sha256=None`` creates the target exclusively, so anything already
659
+ present (a dangling link included) is refused. Otherwise the target must
660
+ exist and its bytes, read from the same descriptor that is then written,
661
+ must hash to ``expect_sha256`` (lowercase hex); the file is rewritten in
662
+ place so its identity is kept, and restored from the bytes read if a write,
663
+ truncate or sync fails. A failed create removes only the file it created.
664
+ Every refusal is an ``UnsafeContentError``; a non-``bytes`` *data* or a
665
+ malformed digest is a ``ValueError``.
666
+ """
667
+ if not isinstance(data, bytes):
668
+ raise ValueError("data must be bytes")
669
+ if expect_sha256 is not None and (
670
+ not isinstance(expect_sha256, str)
671
+ or _SHA256_HEX.fullmatch(expect_sha256) is None
672
+ ):
673
+ raise ValueError("expect_sha256 must be 64 lowercase hex characters or None")
674
+ try:
675
+ relative = path.relative_to(root).as_posix()
676
+ except ValueError as exc:
677
+ raise UnsafeContentError("target path is outside its declared root") from exc
678
+ with _open_confined_parent(root, path, relative=relative) as (parent_fd, leaf):
679
+ if expect_sha256 is None:
680
+ _create_confined_file(
681
+ root, path, data, relative=relative, parent_fd=parent_fd, leaf=leaf
682
+ )
683
+ else:
684
+ _update_confined_file(
685
+ root,
686
+ path,
687
+ data,
688
+ expect_sha256,
689
+ relative=relative,
690
+ parent_fd=parent_fd,
691
+ leaf=leaf,
692
+ )