agentbundle 0.29.4__tar.gz → 0.29.5__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 (197) hide show
  1. {agentbundle-0.29.4 → agentbundle-0.29.5}/PKG-INFO +9 -2
  2. {agentbundle-0.29.4 → agentbundle-0.29.5}/README-pypi.md +8 -1
  3. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +39 -5
  4. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/manifest.json +2 -2
  5. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +3 -2
  6. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/package.py +84 -28
  7. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/self_host_windows.py +14 -3
  8. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/version.py +1 -1
  9. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle.egg-info/PKG-INFO +9 -2
  10. {agentbundle-0.29.4 → agentbundle-0.29.5}/pyproject.toml +1 -1
  11. {agentbundle-0.29.4 → agentbundle-0.29.5}/README.md +0 -0
  12. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/__init__.py +0 -0
  13. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/__main__.py +0 -0
  14. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/adapter.schema.json +0 -0
  15. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/adapter.toml +0 -0
  16. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
  17. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
  18. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
  19. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
  20. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
  21. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
  22. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
  23. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
  24. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/catalogue.schema.json +0 -0
  25. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/guide.schema.json +0 -0
  26. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/install-defaults.toml +0 -0
  27. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/install-marker.py +0 -0
  28. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/pack.schema.json +0 -0
  29. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  30. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  31. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/profile.schema.json +0 -0
  32. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/skill-manifest.schema.json +0 -0
  33. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/skill.schema.json +0 -0
  34. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/_data/target-vocab.toml +0 -0
  35. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/__init__.py +0 -0
  36. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/__main__.py +0 -0
  37. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapter_root_bins.py +0 -0
  38. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/__init__.py +0 -0
  39. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/claude_code.py +0 -0
  40. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/codex.py +0 -0
  41. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/copilot.py +0 -0
  42. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/cursor.py +0 -0
  43. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/gemini.py +0 -0
  44. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/kiro.py +0 -0
  45. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/kiro_cli.py +0 -0
  46. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/adapters/kiro_ide.py +0 -0
  47. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/contract.py +0 -0
  48. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/lint_packs.py +0 -0
  49. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/main.py +0 -0
  50. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/phase_order.py +0 -0
  51. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/__init__.py +0 -0
  52. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  53. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  54. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  55. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/direct_directory.py +0 -0
  56. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  57. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/hook_id.py +0 -0
  58. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  59. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  60. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/merge_json.py +0 -0
  61. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/projections/user_merge_json.py +0 -0
  62. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  63. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  64. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/recipes/marketplace.toml +0 -0
  65. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  66. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  67. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  68. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/recipes/self-host.toml +0 -0
  69. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/scope_rails.py +0 -0
  70. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/self_host.py +0 -0
  71. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/shared_libs.py +0 -0
  72. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/target_resolver.py +0 -0
  73. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/__init__.py +0 -0
  74. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_claude_code.py +0 -0
  75. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_codex.py +0 -0
  76. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_copilot.py +0 -0
  77. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_cursor.py +0 -0
  78. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_gemini.py +0 -0
  79. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_kiro.py +0 -0
  80. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_kiro_alias.py +0 -0
  81. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_kiro_cli.py +0 -0
  82. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_kiro_ide.py +0 -0
  83. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_adapter_root_bins_projection.py +0 -0
  84. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_architect_design_reviewer_projection.py +0 -0
  85. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_architect_design_reviewer_rubric_parity.py +0 -0
  86. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_build_ships_seeds.py +0 -0
  87. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_contract.py +0 -0
  88. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_contract_scope.py +0 -0
  89. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_contract_v07.py +0 -0
  90. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_contract_v08.py +0 -0
  91. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_direct_directory_cleanup.py +0 -0
  92. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_end_to_end_build.py +0 -0
  93. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_lint_agents_md_diataxis_block.py +0 -0
  94. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_lint_agents_md_legacy_block.py +0 -0
  95. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_lint_agents_md_risk_block.py +0 -0
  96. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_lint_packs.py +0 -0
  97. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_load_pack_hook_wiring_safely.py +0 -0
  98. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_pack_schema.py +0 -0
  99. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_pack_schema_allowed_adapters.py +0 -0
  100. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_pack_schema_install.py +0 -0
  101. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_pipeline.py +0 -0
  102. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_plugin_manifest_schema.py +0 -0
  103. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_projectable_subset.py +0 -0
  104. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_projections_merge_json.py +0 -0
  105. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_scope_rails.py +0 -0
  106. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_security.py +0 -0
  107. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_self_host_check.py +0 -0
  108. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_self_host_fixture_guard.py +0 -0
  109. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_self_host_recipe_config.py +0 -0
  110. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_shared_libs_projection.py +0 -0
  111. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_shared_prefix_contract.py +0 -0
  112. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_shipped_packs_v07_declarations.py +0 -0
  113. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_shipped_packs_v08_declarations.py +0 -0
  114. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_user_libs_projection.py +0 -0
  115. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_validate.py +0 -0
  116. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_workspace_status_projection.py +0 -0
  117. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/tests/test_writers_emit_lf.py +0 -0
  118. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/user_libs.py +0 -0
  119. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/build/validate.py +0 -0
  120. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue.py +0 -0
  121. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/__init__.py +0 -0
  122. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/archive.py +0 -0
  123. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/build.py +0 -0
  124. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/config.py +0 -0
  125. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/defaults.py +0 -0
  126. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  127. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/identity.py +0 -0
  128. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/initialise.py +0 -0
  129. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
  130. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/lint.py +0 -0
  131. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/results.py +0 -0
  132. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/self_host.py +0 -0
  133. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  134. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
  135. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/catalogue_tooling/verify.py +0 -0
  136. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/categories.py +0 -0
  137. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/cli.py +0 -0
  138. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/__init__.py +0 -0
  139. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/_common.py +0 -0
  140. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/_drop_warning.py +0 -0
  141. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/adapt.py +0 -0
  142. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_build.py +0 -0
  143. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_init.py +0 -0
  144. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_lint.py +0 -0
  145. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_package.py +0 -0
  146. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_self_host.py +0 -0
  147. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  148. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  149. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/catalogue_verify.py +0 -0
  150. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/config.py +0 -0
  151. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/diff.py +0 -0
  152. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/docs.py +0 -0
  153. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/init_state.py +0 -0
  154. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/install.py +0 -0
  155. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/list_installed.py +0 -0
  156. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/list_packs.py +0 -0
  157. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/list_profiles.py +0 -0
  158. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/list_targets.py +0 -0
  159. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/oplog_cmd.py +0 -0
  160. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/pack_config_cmd.py +0 -0
  161. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/pack_evals.py +0 -0
  162. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/package_catalogue.py +0 -0
  163. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/profile.py +0 -0
  164. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/reconcile.py +0 -0
  165. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/render.py +0 -0
  166. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/scaffold.py +0 -0
  167. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/show.py +0 -0
  168. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/uninstall.py +0 -0
  169. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/upgrade.py +0 -0
  170. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/commands/validate.py +0 -0
  171. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/config.py +0 -0
  172. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/https_catalogue.py +0 -0
  173. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/local_exclude.py +0 -0
  174. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/oplog.py +0 -0
  175. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/pack_inventory.py +0 -0
  176. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/render.py +0 -0
  177. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/safety.py +0 -0
  178. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/scaffold.py +0 -0
  179. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/scope.py +0 -0
  180. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/source_defaults.py +0 -0
  181. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/statelock.py +0 -0
  182. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/user_config.py +0 -0
  183. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle/workspace_mcp.py +0 -0
  184. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle.egg-info/SOURCES.txt +0 -0
  185. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle.egg-info/dependency_links.txt +0 -0
  186. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle.egg-info/entry_points.txt +0 -0
  187. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle.egg-info/requires.txt +0 -0
  188. {agentbundle-0.29.4 → agentbundle-0.29.5}/agentbundle.egg-info/top_level.txt +0 -0
  189. {agentbundle-0.29.4 → agentbundle-0.29.5}/setup.cfg +0 -0
  190. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_adapter_permissions_projection.py +0 -0
  191. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_linear_primitive.py +0 -0
  192. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_workspace_mcp_elicit.py +0 -0
  193. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_workspace_mcp_event_bridge.py +0 -0
  194. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_workspace_mcp_git.py +0 -0
  195. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_workspace_mcp_lifecycle.py +0 -0
  196. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_workspace_mcp_stdin.py +0 -0
  197. {agentbundle-0.29.4 → agentbundle-0.29.5}/tests/test_workspace_mcp_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.29.4
3
+ Version: 0.29.5
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: Apache-2.0 OR MIT
@@ -156,6 +156,13 @@ Produces a deterministic, reproducible gzip archive (versioned) and a mutable ch
156
156
  descriptor JSON (`stable.json`), ready to upload to Artifactory. Identical inputs
157
157
  produce byte-identical archives (honors `SOURCE_DATE_EPOCH`).
158
158
 
159
+ Build residue is excluded, so it does not matter whether you packaged a working
160
+ tree you had just tested or npm-installed in. Pruned at every level of a pack:
161
+ `__pycache__`, `.pytest_cache`, `.mypy_cache`, `.ruff_cache`, `.tox`,
162
+ `.hypothesis`, `htmlcov`, `node_modules`, `.venv`, `venv` — plus `*.pyc`,
163
+ `*.pyo`, `.DS_Store`, `coverage.xml` and `.coverage*` shards. The drop is
164
+ silent, so do not name a directory you mean to ship after one of those.
165
+
159
166
  **Source distribution for air-gapped or self-hosted catalogues:**
160
167
 
161
168
  ```bash
@@ -167,7 +174,7 @@ agentbundle catalogue package \
167
174
  --output dist/
168
175
  ```
169
176
 
170
- Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files). Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
177
+ Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files), with the same build-residue exclusions as the default flavour. Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
171
178
 
172
179
  **Org bootstrap — ship the default channel in your fork:**
173
180
 
@@ -134,6 +134,13 @@ Produces a deterministic, reproducible gzip archive (versioned) and a mutable ch
134
134
  descriptor JSON (`stable.json`), ready to upload to Artifactory. Identical inputs
135
135
  produce byte-identical archives (honors `SOURCE_DATE_EPOCH`).
136
136
 
137
+ Build residue is excluded, so it does not matter whether you packaged a working
138
+ tree you had just tested or npm-installed in. Pruned at every level of a pack:
139
+ `__pycache__`, `.pytest_cache`, `.mypy_cache`, `.ruff_cache`, `.tox`,
140
+ `.hypothesis`, `htmlcov`, `node_modules`, `.venv`, `venv` — plus `*.pyc`,
141
+ `*.pyo`, `.DS_Store`, `coverage.xml` and `.coverage*` shards. The drop is
142
+ silent, so do not name a directory you mean to ship after one of those.
143
+
137
144
  **Source distribution for air-gapped or self-hosted catalogues:**
138
145
 
139
146
  ```bash
@@ -145,7 +152,7 @@ agentbundle catalogue package \
145
152
  --output dist/
146
153
  ```
147
154
 
148
- Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files). Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
155
+ Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files), with the same build-residue exclusions as the default flavour. Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
149
156
 
150
157
  **Org bootstrap — ship the default channel in your fork:**
151
158
 
@@ -156,17 +156,51 @@ credentials or private data, prefer synthetic data, stay modest in size, and
156
156
  name their licence when sourced externally. Fuzzing corpora, generated output,
157
157
  coverage reports, and caches are neither committed nor packaged.
158
158
 
159
+ The packager enforces the second half. It prunes these directory names at every
160
+ level of a pack, and never descends into them:
161
+
162
+ ```
163
+ __pycache__ .pytest_cache .mypy_cache .ruff_cache .tox
164
+ .hypothesis htmlcov node_modules .venv venv
165
+ ```
166
+
167
+ plus `*.pyc`, `*.pyo`, `.DS_Store`, `coverage.xml`, and any `.coverage*` shard.
168
+ A directory you mean to ship must not be named one of those — the drop is
169
+ silent. Note this is matched by name at any depth, so it is deliberately *not*
170
+ the same list as the repository-root exclusions.
171
+
159
172
  ### Repository-root tests
160
173
 
161
174
  A test concerning one pack stays inside that pack. Behaviour no single pack
162
175
  owns — the catalogue system, packaging, shared projection machinery, profiles,
163
176
  cross-pack interaction — belongs to the repository, not to a pack.
164
177
 
165
- Where that lives is the repository's call. This catalogue keeps it in the
166
- engine's own suite (`packages/agentbundle/tests/`) rather than a root `tests/`
167
- tree; a catalogue that wants the separate tree can add one. Don't create a
168
- top-level directory for a single test — the ownership rule is what matters,
169
- not the path.
178
+ Where that lives is the repository's call. This catalogue splits it: behaviour
179
+ that exercises the engine keeps to the engine's own suite
180
+ (`packages/agentbundle/tests/`), while cross-pack *lints* — the ones that read
181
+ every pack's tree and belong to no pack — live with the repository's other
182
+ tooling. Neither is a root `tests/` tree; a catalogue that wants the separate
183
+ tree can add one. Don't create a top-level directory for a single test — the
184
+ ownership rule is what matters, not the path.
185
+
186
+ ### One test process per skill
187
+
188
+ Run each skill's suite in its own process. This is a correctness requirement,
189
+ not a performance preference.
190
+
191
+ Skills are independent, so two of them may reasonably ship a `render.py`, and
192
+ their suites may both be called `test_render.py`. Collect them into one pytest
193
+ run and two things break: pytest refuses the duplicate test basenames outright
194
+ (`import file mismatch`), and if it did not, the first `render` module imported
195
+ would serve every suite that expects its own.
196
+
197
+ ```
198
+ pytest packs/<pack>/tests/skills/<skill>/ # one invocation per skill
199
+ ```
200
+
201
+ An invocation that spans two skill test directories is safe only while their
202
+ basenames happen not to collide — which is a property of today's contents, not
203
+ of the layout. Keep the invocations separate and the question never arises.
170
204
 
171
205
  ### Normative summary
172
206
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "files": {
3
- "guides/_shared/reference/catalogue-authoring-standards.md": "0d278062872d62d059e322bae9e5af9f573d79bc93ff24ca18fb750705da5cc6",
3
+ "guides/_shared/reference/catalogue-authoring-standards.md": "cec0f7afd7a0bf61d7bedd9facd096b083cb7413679a6fbcd0af28d40bece58c",
4
4
  "guides/_shared/reference/catalogue-ci-contract.md": "fae793ab47989b6dd3c731afcb0b4cda21c7d08bbe7fa40fca6d3abb3d158141",
5
- "packs/AGENTS.md": "7b534acfdaab757079ca678d9290c2257267d7f4e0b4b3c3401d9da22cb4be0b",
5
+ "packs/AGENTS.md": "861a029007741cd7645cdfcc018e5ac85cf218d332f6688115156c9c676381b8",
6
6
  "packs/README.md": "d2de5f9556f4c8e521103474bde74636e02cc805f9bf5312a3a61a1f3eb45d8f",
7
7
  "packs/_example/.apm/skills/example-skill/SKILL.md": "33be8cbf4b2c014a5a63e788b7d0b350ad8061c6c4b2579369a3e984135bf9f1",
8
8
  "packs/_example/.apm/skills/example-skill/evals/eval_queries.json": "f41ecda0834a22f3b4823c81ab02e58b0e4beba610e3b40c185579abff9cfeee",
@@ -6,8 +6,9 @@ Read `packs/AGENTS.local.md` when present — it carries host-specific overrides
6
6
  ## Pack layout
7
7
 
8
8
  The pack is the ownership and test-execution boundary; `.apm/` is the runtime export boundary; a skill is the
9
- evaluation-fixture boundary. Tests go in `packs/<pack>/tests/`, never under `.apm/`. Evals stay skill-local at
10
- `.apm/skills/<skill>/evals/` and project with the skill.
9
+ evaluation-fixture boundary. Tests go in `packs/<pack>/tests/`, never under `.apm/`; evals stay skill-local at
10
+ `.apm/skills/<skill>/evals/` and project with the skill. `tools/lint-pack-test-boundary.py` enforces both across
11
+ every pack, plus one pytest process per skill test dir. Shape: `docs/architecture/pack-layout.md`.
11
12
 
12
13
  | Path | Purpose |
13
14
  |------|---------|
@@ -62,14 +62,60 @@ _REQUIRED_PATHS: tuple[str, ...] = (
62
62
  )
63
63
 
64
64
  # Implicit denylist — top-level directories always excluded regardless of include.
65
- _IMPLICIT_DENY_DIRS: frozenset[str] = frozenset({
66
- ".git",
67
- "tools",
68
- "packages",
69
- "dist",
65
+ # Build residue: never authored, never packaged. Pruned at *every* level of every
66
+ # collection walk, so a cache anywhere under an included root is dropped.
67
+ #
68
+ # This replaces an earlier `_IMPLICIT_DENY_DIRS` that also listed `.git`,
69
+ # `tools`, `packages` and `dist`. That set was referenced nowhere — the archive
70
+ # collected caches for as long as it has existed — and it could not simply be
71
+ # applied as written: those four are *repository-root* names, already excluded
72
+ # because `_DEFAULT_INCLUDE_DIRS` is an allowlist, and pruning them at every
73
+ # level would have silently dropped real content. `packs/monorepo-extras/seeds/packages/`
74
+ # is exactly that case.
75
+ #
76
+ # `catalogue-authoring-standards.md` § 4 tells adopters that caches, coverage
77
+ # output and generated artefacts are "neither committed nor packaged". This is
78
+ # what makes the second half true.
79
+ _TRANSIENT_DIRS: frozenset[str] = frozenset({
70
80
  "__pycache__",
81
+ ".pytest_cache",
82
+ ".mypy_cache",
83
+ ".ruff_cache",
84
+ ".tox",
85
+ "node_modules",
86
+ ".venv",
87
+ "venv",
88
+ "htmlcov",
89
+ ".hypothesis",
71
90
  })
72
91
 
92
+ # Same idea, for files that sit beside authored content rather than in a cache
93
+ # directory of their own.
94
+ _TRANSIENT_FILE_SUFFIXES: tuple[str, ...] = (".pyc", ".pyo")
95
+ _TRANSIENT_FILE_NAMES: frozenset[str] = frozenset({".DS_Store", "coverage.xml"})
96
+
97
+
98
+ def _is_transient_file(p: Path) -> bool:
99
+ # `.coverage` by prefix, not equality: `coverage combine` writes shards named
100
+ # `.coverage.<host>.<pid>.<random>`, whose suffix is the random component.
101
+ return (
102
+ p.name in _TRANSIENT_FILE_NAMES
103
+ or p.name.startswith(".coverage")
104
+ or p.suffix in _TRANSIENT_FILE_SUFFIXES
105
+ )
106
+
107
+
108
+ def _prune(dp: Path, dirnames: list[str]) -> None:
109
+ """Drop symlinked and build-residue directories from an `os.walk` descent.
110
+
111
+ Mutates `dirnames` in place — that is how `os.walk` is told not to descend.
112
+ """
113
+ dirnames[:] = [
114
+ dn for dn in dirnames
115
+ if dn not in _TRANSIENT_DIRS and not (dp / dn).is_symlink()
116
+ ]
117
+
118
+
73
119
  # Path-safety pattern for --bundle/--release/--channel flag values.
74
120
  _SAFE_NAME_RE = re.compile(r"^[A-Za-z0-9\-._]+$")
75
121
 
@@ -111,17 +157,22 @@ def _scan_content(root: Path, pack_include: list[str] | None = None) -> list[Pat
111
157
  f"contain path traversal components"
112
158
  )
113
159
  d = root / entry
114
- if not d.is_dir():
160
+ if not d.is_dir() or d.is_symlink():
115
161
  raise ValueError(
116
162
  f"pack_include entry {entry!r} does not exist on disk at {d}"
117
163
  )
164
+ if Path(entry).name in _TRANSIENT_DIRS:
165
+ raise ValueError(
166
+ f"pack_include entry {entry!r} names build residue; "
167
+ f"it is never packaged"
168
+ )
118
169
  for dirpath, dirnames, filenames in os.walk(str(d), followlinks=False):
119
170
  dp = Path(dirpath)
171
+ _prune(dp, dirnames)
120
172
  for fname in filenames:
121
173
  p = dp / fname
122
- if p.is_file() and not p.is_symlink():
174
+ if p.is_file() and not p.is_symlink() and not _is_transient_file(p):
123
175
  collected.append(p)
124
- dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
125
176
  for dir_parts in _DEFAULT_INCLUDE_DIRS:
126
177
  if dir_parts[0] == "packs":
127
178
  continue
@@ -133,15 +184,12 @@ def _scan_content(root: Path, pack_include: list[str] | None = None) -> list[Pat
133
184
  dp = Path(dirpath)
134
185
  for fname in filenames:
135
186
  p = dp / fname
136
- if p.is_file() and not p.is_symlink():
187
+ if p.is_file() and not p.is_symlink() and not _is_transient_file(p):
137
188
  collected.append(p)
189
+ _prune(dp, dirnames)
138
190
  if is_catalogue_root and dp == d:
139
- dirnames[:] = [
140
- dn for dn in dirnames
141
- if not dn.startswith("_") and not (dp / dn).is_symlink()
142
- ]
143
- else:
144
- dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
191
+ # Reserved authoring dirs, at the catalogue root only.
192
+ dirnames[:] = [dn for dn in dirnames if not dn.startswith("_")]
145
193
  else:
146
194
  for dir_parts in _DEFAULT_INCLUDE_DIRS:
147
195
  d = root.joinpath(*dir_parts)
@@ -152,16 +200,12 @@ def _scan_content(root: Path, pack_include: list[str] | None = None) -> list[Pat
152
200
  dp = Path(dirpath)
153
201
  for fname in filenames:
154
202
  p = dp / fname
155
- if p.is_file() and not p.is_symlink():
203
+ if p.is_file() and not p.is_symlink() and not _is_transient_file(p):
156
204
  collected.append(p)
157
- # At packs/ and profiles/ root level, exclude reserved authoring dirs.
205
+ _prune(dp, dirnames)
158
206
  if is_catalogue_root and dp == d:
159
- dirnames[:] = [
160
- dn for dn in dirnames
161
- if not dn.startswith("_") and not (dp / dn).is_symlink()
162
- ]
163
- else:
164
- dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
207
+ # Reserved authoring dirs, at the catalogue root only.
208
+ dirnames[:] = [dn for dn in dirnames if not dn.startswith("_")]
165
209
 
166
210
  for fname in _DEFAULT_INCLUDE_ROOT_FILES:
167
211
  p = root / fname
@@ -226,17 +270,27 @@ def _validate_content(root: Path, content_paths: list[Path]) -> str | None:
226
270
  if candidate.exists() and candidate.is_symlink():
227
271
  return f"error: symlink not allowed: {candidate}"
228
272
 
229
- # 4. Symlink walk inside allowlisted dirs
273
+ # 4. Symlink walk inside allowlisted dirs.
274
+ # Scoped to what the archive actually collects. Build residue is pruned
275
+ # the same way `_scan_content` prunes it — otherwise a real `node_modules`
276
+ # (whose `.bin/` is always symlinks) or a virtualenv aborts packaging for
277
+ # files that were never going to ship.
230
278
  for dir_parts in _DEFAULT_INCLUDE_DIRS:
231
279
  d = root.joinpath(*dir_parts)
232
280
  if not d.is_dir() or d.is_symlink():
233
281
  continue
234
282
  for dirpath, dirnames, filenames in os.walk(str(d), followlinks=False):
235
283
  dp = Path(dirpath)
284
+ # Check *before* pruning: `_prune` drops symlinked directories, and
285
+ # a symlinked directory in authored content is precisely what this
286
+ # step exists to reject. Only build residue is skipped.
236
287
  for entry in list(dirnames) + list(filenames):
237
288
  full = dp / entry
289
+ if entry in _TRANSIENT_DIRS or _is_transient_file(full):
290
+ continue
238
291
  if full.is_symlink():
239
292
  return f"error: symlink not allowed: {full}"
293
+ _prune(dp, dirnames)
240
294
 
241
295
  # 5. Hard-link detection (POSIX only)
242
296
  for p in content_paths:
@@ -260,6 +314,8 @@ def _validate_content(root: Path, content_paths: list[Path]) -> str | None:
260
314
  continue
261
315
  if pack_dir.name.startswith("_"):
262
316
  continue
317
+ if pack_dir.name in _TRANSIENT_DIRS:
318
+ continue # build residue, not a pack — and not in the archive
263
319
  pack_toml_path = pack_dir / "pack.toml"
264
320
  try:
265
321
  pack_data = load_pack_toml(pack_toml_path)
@@ -771,10 +827,10 @@ def package_source_flavour(
771
827
  if d.is_dir() and not d.is_symlink():
772
828
  for dirpath, dirnames, filenames in os.walk(str(d), followlinks=False):
773
829
  dp = Path(dirpath)
774
- dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
830
+ _prune(dp, dirnames)
775
831
  for fname in filenames:
776
832
  fp = dp / fname
777
- if fp.is_file() and not fp.is_symlink():
833
+ if fp.is_file() and not fp.is_symlink() and not _is_transient_file(fp):
778
834
  collected.append(fp)
779
835
 
780
836
  # guides/_shared/
@@ -782,10 +838,10 @@ def package_source_flavour(
782
838
  if guides_shared.is_dir() and not guides_shared.is_symlink():
783
839
  for dirpath, dirnames, filenames in os.walk(str(guides_shared), followlinks=False):
784
840
  dp = Path(dirpath)
785
- dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
841
+ _prune(dp, dirnames)
786
842
  for fname in filenames:
787
843
  fp = dp / fname
788
- if fp.is_file() and not fp.is_symlink():
844
+ if fp.is_file() and not fp.is_symlink() and not _is_transient_file(fp):
789
845
  collected.append(fp)
790
846
 
791
847
  # .claude-plugin/marketplace.json
@@ -84,16 +84,27 @@ def run_windows_compat(root: Path) -> int:
84
84
  [py, "-m", "pytest", str(root / "packs" / "core" / "tests" / "hooks")],
85
85
  root,
86
86
  ),
87
- # Atlassian SSO suites (asyncio + SSL-context wiring is platform-sensitive)
87
+ # Atlassian SSO suites (asyncio + SSL-context wiring is platform-sensitive).
88
+ # Pack tests live outside the runtime payload (ADR-0071).
89
+ #
90
+ # Probe the dependencies first. Both trios `importorskip("credbroker")` at
91
+ # module scope, and `_step` below judges a step by its return code alone —
92
+ # so without this, a machine missing credbroker skips both suites entirely
93
+ # and the step reports pass.
94
+ (
95
+ "atlassian SSO dependency probe",
96
+ [py, "-c", "import credbroker, httpx"],
97
+ root,
98
+ ),
88
99
  (
89
100
  "jira SSO suites (atlassian-sso-cookie)",
90
101
  [py, "-m", "pytest", "test_sso_config.py", "test_sso_client.py", "test_setup_sso.py"],
91
- root / "packs" / "atlassian" / ".apm" / "skills" / "jira" / "scripts",
102
+ root / "packs" / "atlassian" / "tests" / "skills" / "jira",
92
103
  ),
93
104
  (
94
105
  "confluence-crawler SSO suites (atlassian-sso-cookie)",
95
106
  [py, "-m", "pytest", "test_sso_config.py", "test_sso_client.py", "test_setup_sso.py"],
96
- root / "packs" / "atlassian" / ".apm" / "skills" / "confluence-crawler" / "scripts",
107
+ root / "packs" / "atlassian" / "tests" / "skills" / "confluence-crawler",
97
108
  ),
98
109
  # Experience agnosticism lint (proves `python` portability, not `python3`)
99
110
  (
@@ -14,7 +14,7 @@ import tomllib
14
14
  from importlib.resources import files
15
15
  from pathlib import Path
16
16
 
17
- CLI_VERSION = "0.29.4"
17
+ CLI_VERSION = "0.29.5"
18
18
 
19
19
  _HERE = Path(__file__).resolve().parent
20
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.29.4
3
+ Version: 0.29.5
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: Apache-2.0 OR MIT
@@ -156,6 +156,13 @@ Produces a deterministic, reproducible gzip archive (versioned) and a mutable ch
156
156
  descriptor JSON (`stable.json`), ready to upload to Artifactory. Identical inputs
157
157
  produce byte-identical archives (honors `SOURCE_DATE_EPOCH`).
158
158
 
159
+ Build residue is excluded, so it does not matter whether you packaged a working
160
+ tree you had just tested or npm-installed in. Pruned at every level of a pack:
161
+ `__pycache__`, `.pytest_cache`, `.mypy_cache`, `.ruff_cache`, `.tox`,
162
+ `.hypothesis`, `htmlcov`, `node_modules`, `.venv`, `venv` — plus `*.pyc`,
163
+ `*.pyo`, `.DS_Store`, `coverage.xml` and `.coverage*` shards. The drop is
164
+ silent, so do not name a directory you mean to ship after one of those.
165
+
159
166
  **Source distribution for air-gapped or self-hosted catalogues:**
160
167
 
161
168
  ```bash
@@ -167,7 +174,7 @@ agentbundle catalogue package \
167
174
  --output dist/
168
175
  ```
169
176
 
170
- Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files). Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
177
+ Produces a `catalogue-source-<release>.tar.gz` from a positive allowlist (packs, profiles, guides, marketplace manifest, legal files), with the same build-residue exclusions as the default flavour. Includes a `self-hosted-source-manifest.json` with per-file SHA-256 digests and provenance fields. `agentbundle install` refuses to install a source archive, preventing accidental misuse.
171
178
 
172
179
  **Org bootstrap — ship the default channel in your fork:**
173
180
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agentbundle"
7
- version = "0.29.4"
7
+ version = "0.29.5"
8
8
  description = "npm for your coding agent. Install packs of skills, subagents, and hooks into any repo, for every major agent."
9
9
  requires-python = ">=3.11"
10
10
  dependencies = []
File without changes