agentbundle 0.22.0__tar.gz → 0.22.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 (165) hide show
  1. {agentbundle-0.22.0 → agentbundle-0.22.1}/PKG-INFO +1 -1
  2. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/catalogue.schema.json +3 -3
  3. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/config.py +0 -9
  4. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/package.py +82 -35
  5. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/version.py +1 -1
  6. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle.egg-info/PKG-INFO +1 -1
  7. {agentbundle-0.22.0 → agentbundle-0.22.1}/pyproject.toml +1 -1
  8. {agentbundle-0.22.0 → agentbundle-0.22.1}/README-pypi.md +0 -0
  9. {agentbundle-0.22.0 → agentbundle-0.22.1}/README.md +0 -0
  10. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/__init__.py +0 -0
  11. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/__main__.py +0 -0
  12. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/adapter.schema.json +0 -0
  13. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/adapter.toml +0 -0
  14. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/install-defaults.toml +0 -0
  15. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/install-marker.py +0 -0
  16. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/pack.schema.json +0 -0
  17. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  18. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  19. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/_data/profile.schema.json +0 -0
  20. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/__init__.py +0 -0
  21. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/__main__.py +0 -0
  22. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapter_root_bins.py +0 -0
  23. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/__init__.py +0 -0
  24. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/claude_code.py +0 -0
  25. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/codex.py +0 -0
  26. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/copilot.py +0 -0
  27. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/cursor.py +0 -0
  28. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/gemini.py +0 -0
  29. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/kiro.py +0 -0
  30. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
  31. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/adapters/kiro_ide.py +0 -0
  32. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/contract.py +0 -0
  33. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/lint_packs.py +0 -0
  34. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/main.py +0 -0
  35. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/phase_order.py +0 -0
  36. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/__init__.py +0 -0
  37. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  38. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  39. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  40. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/direct_directory.py +0 -0
  41. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  42. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/hook_id.py +0 -0
  43. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  44. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  45. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/merge_json.py +0 -0
  46. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/projections/user_merge_json.py +0 -0
  47. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  48. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  49. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/recipes/marketplace.toml +0 -0
  50. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  51. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  52. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  53. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/recipes/self-host.toml +0 -0
  54. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/scope_rails.py +0 -0
  55. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/self_host.py +0 -0
  56. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/shared_libs.py +0 -0
  57. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/target_resolver.py +0 -0
  58. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/__init__.py +0 -0
  59. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_claude_code.py +0 -0
  60. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_codex.py +0 -0
  61. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_copilot.py +0 -0
  62. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_cursor.py +0 -0
  63. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_gemini.py +0 -0
  64. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_kiro.py +0 -0
  65. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_kiro_alias.py +0 -0
  66. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_kiro_cli.py +0 -0
  67. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_kiro_ide.py +0 -0
  68. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_adapter_root_bins_projection.py +0 -0
  69. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_architect_design_reviewer_projection.py +0 -0
  70. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_architect_design_reviewer_rubric_parity.py +0 -0
  71. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_build_ships_seeds.py +0 -0
  72. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_contract.py +0 -0
  73. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_contract_scope.py +0 -0
  74. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_contract_v07.py +0 -0
  75. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_contract_v08.py +0 -0
  76. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_direct_directory_cleanup.py +0 -0
  77. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_end_to_end_build.py +0 -0
  78. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_lint_agents_md_diataxis_block.py +0 -0
  79. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_lint_agents_md_legacy_block.py +0 -0
  80. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_lint_agents_md_risk_block.py +0 -0
  81. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_lint_packs.py +0 -0
  82. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_load_pack_hook_wiring_safely.py +0 -0
  83. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_pack_schema.py +0 -0
  84. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_pack_schema_allowed_adapters.py +0 -0
  85. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_pack_schema_install.py +0 -0
  86. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_pipeline.py +0 -0
  87. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_plugin_manifest_schema.py +0 -0
  88. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_projectable_subset.py +0 -0
  89. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_projections_merge_json.py +0 -0
  90. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_scope_rails.py +0 -0
  91. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_security.py +0 -0
  92. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_self_host_check.py +0 -0
  93. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_self_host_fixture_guard.py +0 -0
  94. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_self_host_recipe_config.py +0 -0
  95. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_shared_libs_projection.py +0 -0
  96. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_shared_prefix_contract.py +0 -0
  97. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_shipped_packs_v07_declarations.py +0 -0
  98. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_shipped_packs_v08_declarations.py +0 -0
  99. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_user_libs_projection.py +0 -0
  100. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_validate.py +0 -0
  101. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/tests/test_writers_emit_lf.py +0 -0
  102. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/user_libs.py +0 -0
  103. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/build/validate.py +0 -0
  104. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue.py +0 -0
  105. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
  106. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/archive.py +0 -0
  107. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/build.py +0 -0
  108. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
  109. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
  110. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/lint.py +0 -0
  111. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/results.py +0 -0
  112. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
  113. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  114. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/catalogue_tooling/verify.py +0 -0
  115. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/categories.py +0 -0
  116. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/cli.py +0 -0
  117. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/__init__.py +0 -0
  118. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/_common.py +0 -0
  119. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/_drop_warning.py +0 -0
  120. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/adapt.py +0 -0
  121. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/catalogue_build.py +0 -0
  122. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/catalogue_lint.py +0 -0
  123. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/catalogue_package.py +0 -0
  124. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/catalogue_self_host.py +0 -0
  125. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  126. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  127. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/catalogue_verify.py +0 -0
  128. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/config.py +0 -0
  129. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/diff.py +0 -0
  130. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/docs.py +0 -0
  131. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/init_state.py +0 -0
  132. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/install.py +0 -0
  133. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/list_installed.py +0 -0
  134. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/list_packs.py +0 -0
  135. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/list_profiles.py +0 -0
  136. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/list_targets.py +0 -0
  137. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/oplog_cmd.py +0 -0
  138. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/pack_config_cmd.py +0 -0
  139. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/pack_evals.py +0 -0
  140. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/package_catalogue.py +0 -0
  141. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/profile.py +0 -0
  142. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/reconcile.py +0 -0
  143. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/render.py +0 -0
  144. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/scaffold.py +0 -0
  145. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/show.py +0 -0
  146. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/uninstall.py +0 -0
  147. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/upgrade.py +0 -0
  148. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/commands/validate.py +0 -0
  149. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/config.py +0 -0
  150. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/https_catalogue.py +0 -0
  151. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/oplog.py +0 -0
  152. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/pack_inventory.py +0 -0
  153. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/render.py +0 -0
  154. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/safety.py +0 -0
  155. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/scope.py +0 -0
  156. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/source_defaults.py +0 -0
  157. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/statelock.py +0 -0
  158. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle/user_config.py +0 -0
  159. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle.egg-info/SOURCES.txt +0 -0
  160. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle.egg-info/dependency_links.txt +0 -0
  161. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle.egg-info/entry_points.txt +0 -0
  162. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle.egg-info/requires.txt +0 -0
  163. {agentbundle-0.22.0 → agentbundle-0.22.1}/agentbundle.egg-info/top_level.txt +0 -0
  164. {agentbundle-0.22.0 → agentbundle-0.22.1}/setup.cfg +0 -0
  165. {agentbundle-0.22.0 → agentbundle-0.22.1}/tests/test_linear_primitive.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.22.0
3
+ Version: 0.22.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: Apache-2.0 OR MIT
@@ -108,17 +108,17 @@
108
108
  "package": {
109
109
  "type": "object",
110
110
  "additionalProperties": false,
111
- "required": ["include", "required"],
111
+ "required": ["include"],
112
112
  "properties": {
113
113
  "include": {
114
114
  "type": "array",
115
115
  "items": { "type": "string" },
116
- "description": "Pack paths to include in a packaged archive."
116
+ "description": "Pack paths to include in a packaged archive. Empty list means include all packs."
117
117
  },
118
118
  "required": {
119
119
  "type": "array",
120
120
  "items": { "type": "string" },
121
- "description": "Pack paths that must be present (subset of include)."
121
+ "description": "Required root-level file paths. Overrides the default LICENSE-APACHE / LICENSE-MIT constraint when set. Absent or empty means use the default requirement."
122
122
  }
123
123
  }
124
124
  }
@@ -373,15 +373,6 @@ def load_catalogue_config(root: Path) -> CatalogueConfig | None:
373
373
  include = pkg_raw.get("include", [])
374
374
  required = pkg_raw.get("required", [])
375
375
 
376
- include_set = set(include)
377
- required_set = set(required)
378
- not_in_include = required_set - include_set
379
- if not_in_include:
380
- raise CatalogueConfigError(
381
- f"catalogue.toml: package.required entries not in package.include: "
382
- f"{sorted(not_in_include)}"
383
- )
384
-
385
376
  package = CataloguePackage(include=include, required=required)
386
377
 
387
378
  # --- [distribution.agentbundle] ---
@@ -92,26 +92,60 @@ def _validate_flag_value(flag: str, value: str) -> str | None:
92
92
  # ---------------------------------------------------------------------------
93
93
 
94
94
 
95
- def _scan_content(root: Path) -> list[Path]:
95
+ def _scan_content(root: Path, pack_include: list[str] | None = None) -> list[Path]:
96
96
  """Return sorted list of regular (non-symlink) files from the content allowlist.
97
97
 
98
- Uses _DEFAULT_INCLUDE_DIRS and _DEFAULT_INCLUDE_ROOT_FILES; applies
99
- _IMPLICIT_DENY_DIRS to skip denied top-level directories even if they appear
100
- inside an allowed dir (unlikely but defensive).
98
+ When pack_include is non-empty, only the listed pack directories are walked;
99
+ non-pack dirs (profiles/, contracts/, .claude-plugin/) are always included.
100
+ An empty or absent pack_include includes all packs (default behavior).
101
101
  """
102
102
  collected: list[Path] = []
103
103
 
104
- for dir_parts in _DEFAULT_INCLUDE_DIRS:
105
- d = root.joinpath(*dir_parts)
106
- if not d.is_dir() or d.is_symlink():
107
- continue
108
- for dirpath, dirnames, filenames in os.walk(str(d), followlinks=False):
109
- dp = Path(dirpath)
110
- for fname in filenames:
111
- p = dp / fname
112
- if p.is_file() and not p.is_symlink():
113
- collected.append(p)
114
- dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
104
+ if pack_include:
105
+ for entry in pack_include:
106
+ parts = Path(entry).parts
107
+ if not entry.startswith("packs/") or ".." in parts:
108
+ raise ValueError(
109
+ f"pack_include entry {entry!r} must start with 'packs/' and must not "
110
+ f"contain path traversal components"
111
+ )
112
+ d = root / entry
113
+ if not d.is_dir():
114
+ raise ValueError(
115
+ f"pack_include entry {entry!r} does not exist on disk at {d}"
116
+ )
117
+ for dirpath, dirnames, filenames in os.walk(str(d), followlinks=False):
118
+ dp = Path(dirpath)
119
+ for fname in filenames:
120
+ p = dp / fname
121
+ if p.is_file() and not p.is_symlink():
122
+ collected.append(p)
123
+ dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
124
+ for dir_parts in _DEFAULT_INCLUDE_DIRS:
125
+ if dir_parts[0] == "packs":
126
+ continue
127
+ d = root.joinpath(*dir_parts)
128
+ if not d.is_dir() or d.is_symlink():
129
+ continue
130
+ for dirpath, dirnames, filenames in os.walk(str(d), followlinks=False):
131
+ dp = Path(dirpath)
132
+ for fname in filenames:
133
+ p = dp / fname
134
+ if p.is_file() and not p.is_symlink():
135
+ collected.append(p)
136
+ dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
137
+ else:
138
+ for dir_parts in _DEFAULT_INCLUDE_DIRS:
139
+ d = root.joinpath(*dir_parts)
140
+ if not d.is_dir() or d.is_symlink():
141
+ continue
142
+ for dirpath, dirnames, filenames in os.walk(str(d), followlinks=False):
143
+ dp = Path(dirpath)
144
+ for fname in filenames:
145
+ p = dp / fname
146
+ if p.is_file() and not p.is_symlink():
147
+ collected.append(p)
148
+ dirnames[:] = [dn for dn in dirnames if not (dp / dn).is_symlink()]
115
149
 
116
150
  for fname in _DEFAULT_INCLUDE_ROOT_FILES:
117
151
  p = root / fname
@@ -121,10 +155,18 @@ def _scan_content(root: Path) -> list[Path]:
121
155
  return sorted(collected, key=lambda p: p.relative_to(root).as_posix())
122
156
 
123
157
 
124
- def _check_required_files(root: Path, content_paths: list[Path]) -> str | None:
125
- """Return error string if any required path is missing, else None."""
158
+ def _check_required_files(
159
+ root: Path,
160
+ content_paths: list[Path],
161
+ required_override: list[str] | None = None,
162
+ ) -> str | None:
163
+ """Return error string if any required path is missing, else None.
164
+
165
+ When required_override is not None, checks those paths instead of _REQUIRED_PATHS.
166
+ """
167
+ required = required_override if required_override is not None else _REQUIRED_PATHS
126
168
  posix_set = {p.relative_to(root).as_posix() for p in content_paths}
127
- for req in _REQUIRED_PATHS:
169
+ for req in required:
128
170
  if req.endswith("/"):
129
171
  # Directory check
130
172
  if not (root / req.rstrip("/")).is_dir():
@@ -479,10 +521,30 @@ def package_catalogue(
479
521
  )
480
522
  return _err(f"pre-package verify failed: {msgs}")
481
523
 
524
+ # --- Load catalogue.toml for package config ---
525
+ pack_include: list[str] = []
526
+ required_override: list[str] | None = None
527
+ catalogue_name: str | None = None
528
+ catalogue_display_name: str | None = None
529
+ min_version_manifest = minimum_agentbundle_version
530
+ try:
531
+ from agentbundle.catalogue_tooling.config import load_catalogue_config
532
+ config = load_catalogue_config(root)
533
+ if config is not None:
534
+ catalogue_name = config.name
535
+ catalogue_display_name = config.display_name
536
+ if min_version_manifest is None:
537
+ min_version_manifest = config.minimum_agentbundle_version
538
+ pack_include = config.package.include or []
539
+ if config.package.required:
540
+ required_override = config.package.required
541
+ except Exception:
542
+ pass
543
+
482
544
  # --- Scan and validate content ---
483
- content_paths = _scan_content(root)
545
+ content_paths = _scan_content(root, pack_include=pack_include)
484
546
 
485
- req_err = _check_required_files(root, content_paths)
547
+ req_err = _check_required_files(root, content_paths, required_override=required_override)
486
548
  if req_err is not None:
487
549
  return _err(req_err)
488
550
 
@@ -534,21 +596,6 @@ def package_catalogue(
534
596
  if published_at is None:
535
597
  published_at = datetime.now(UTC).replace(microsecond=0).isoformat()
536
598
 
537
- # --- Read catalogue.toml metadata for manifest ---
538
- catalogue_name: str | None = None
539
- catalogue_display_name: str | None = None
540
- min_version_manifest = minimum_agentbundle_version
541
- try:
542
- from agentbundle.catalogue_tooling.config import load_catalogue_config
543
- config = load_catalogue_config(root)
544
- if config is not None:
545
- catalogue_name = config.name
546
- catalogue_display_name = config.display_name
547
- if min_version_manifest is None:
548
- min_version_manifest = config.minimum_agentbundle_version
549
- except Exception:
550
- pass
551
-
552
599
  # --- Compute marketplace_digest ---
553
600
  marketplace_digest: str | None = None
554
601
  marketplace_bytes = file_bytes.get(".claude-plugin/marketplace.json")
@@ -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.22.0"
17
+ CLI_VERSION = "0.22.1"
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.22.0
3
+ Version: 0.22.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: Apache-2.0 OR MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agentbundle"
7
- version = "0.22.0"
7
+ version = "0.22.1"
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
File without changes