agentbundle 0.12.1__tar.gz → 0.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. {agentbundle-0.12.1 → agentbundle-0.13.0}/PKG-INFO +97 -2
  2. {agentbundle-0.12.1 → agentbundle-0.13.0}/README.md +96 -1
  3. agentbundle-0.13.0/agentbundle/_data/install-defaults.toml +19 -0
  4. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/catalogue.py +13 -0
  5. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/cli.py +81 -10
  6. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/install.py +124 -1
  7. agentbundle-0.13.0/agentbundle/commands/list_installed.py +540 -0
  8. agentbundle-0.13.0/agentbundle/commands/package_catalogue.py +461 -0
  9. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/upgrade.py +832 -194
  10. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/config.py +88 -5
  11. agentbundle-0.13.0/agentbundle/https_catalogue.py +518 -0
  12. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/source_defaults.py +271 -20
  13. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/version.py +1 -1
  14. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/PKG-INFO +97 -2
  15. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/SOURCES.txt +2 -0
  16. {agentbundle-0.12.1 → agentbundle-0.13.0}/pyproject.toml +1 -1
  17. agentbundle-0.12.1/agentbundle/_data/install-defaults.toml +0 -10
  18. agentbundle-0.12.1/agentbundle/commands/list_installed.py +0 -223
  19. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/__init__.py +0 -0
  20. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/__main__.py +0 -0
  21. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/adapter.schema.json +0 -0
  22. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/adapter.toml +0 -0
  23. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/install-marker.py +0 -0
  24. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/pack.schema.json +0 -0
  25. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  26. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  27. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/profile.schema.json +0 -0
  28. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/__init__.py +0 -0
  29. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/__main__.py +0 -0
  30. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapter_root_bins.py +0 -0
  31. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/__init__.py +0 -0
  32. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/claude_code.py +0 -0
  33. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/codex.py +0 -0
  34. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/copilot.py +0 -0
  35. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/cursor.py +0 -0
  36. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/gemini.py +0 -0
  37. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/kiro.py +0 -0
  38. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
  39. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/kiro_ide.py +0 -0
  40. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/contract.py +0 -0
  41. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/lint_packs.py +0 -0
  42. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/main.py +0 -0
  43. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/phase_order.py +0 -0
  44. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/__init__.py +0 -0
  45. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  46. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  47. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  48. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/direct_directory.py +0 -0
  49. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  50. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/hook_id.py +0 -0
  51. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  52. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  53. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/merge_json.py +0 -0
  54. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/user_merge_json.py +0 -0
  55. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/scope_rails.py +0 -0
  56. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/self_host.py +0 -0
  57. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/shared_libs.py +0 -0
  58. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/target_resolver.py +0 -0
  59. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/__init__.py +0 -0
  60. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_claude_code.py +0 -0
  61. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_codex.py +0 -0
  62. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_copilot.py +0 -0
  63. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_cursor.py +0 -0
  64. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_gemini.py +0 -0
  65. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro.py +0 -0
  66. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro_alias.py +0 -0
  67. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro_cli.py +0 -0
  68. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro_ide.py +0 -0
  69. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_root_bins_projection.py +0 -0
  70. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_architect_design_reviewer_projection.py +0 -0
  71. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_architect_design_reviewer_rubric_parity.py +0 -0
  72. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_build_ships_seeds.py +0 -0
  73. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract.py +0 -0
  74. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract_scope.py +0 -0
  75. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract_v07.py +0 -0
  76. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract_v08.py +0 -0
  77. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_direct_directory_cleanup.py +0 -0
  78. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_end_to_end_build.py +0 -0
  79. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_agents_md_diataxis_block.py +0 -0
  80. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_agents_md_legacy_block.py +0 -0
  81. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_agents_md_risk_block.py +0 -0
  82. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_packs.py +0 -0
  83. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_load_pack_hook_wiring_safely.py +0 -0
  84. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pack_schema.py +0 -0
  85. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pack_schema_allowed_adapters.py +0 -0
  86. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pack_schema_install.py +0 -0
  87. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pipeline.py +0 -0
  88. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_plugin_manifest_schema.py +0 -0
  89. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_projectable_subset.py +0 -0
  90. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_projections_merge_json.py +0 -0
  91. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_scope_rails.py +0 -0
  92. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_security.py +0 -0
  93. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_self_host_check.py +0 -0
  94. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_self_host_fixture_guard.py +0 -0
  95. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_self_host_recipe_config.py +0 -0
  96. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shared_libs_projection.py +0 -0
  97. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shared_prefix_contract.py +0 -0
  98. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shipped_packs_v07_declarations.py +0 -0
  99. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shipped_packs_v08_declarations.py +0 -0
  100. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_user_libs_projection.py +0 -0
  101. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_validate.py +0 -0
  102. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_writers_emit_lf.py +0 -0
  103. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/user_libs.py +0 -0
  104. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/validate.py +0 -0
  105. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/categories.py +0 -0
  106. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/__init__.py +0 -0
  107. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/_common.py +0 -0
  108. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/_drop_warning.py +0 -0
  109. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/adapt.py +0 -0
  110. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/config.py +0 -0
  111. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/diff.py +0 -0
  112. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/init_state.py +0 -0
  113. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/list_packs.py +0 -0
  114. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/list_profiles.py +0 -0
  115. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/list_targets.py +0 -0
  116. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/profile.py +0 -0
  117. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/reconcile.py +0 -0
  118. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/render.py +0 -0
  119. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/scaffold.py +0 -0
  120. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/show.py +0 -0
  121. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/uninstall.py +0 -0
  122. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/validate.py +0 -0
  123. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/pack_inventory.py +0 -0
  124. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/render.py +0 -0
  125. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/safety.py +0 -0
  126. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/scope.py +0 -0
  127. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/statelock.py +0 -0
  128. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/user_config.py +0 -0
  129. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/dependency_links.txt +0 -0
  130. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/entry_points.txt +0 -0
  131. {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/top_level.txt +0 -0
  132. {agentbundle-0.12.1 → agentbundle-0.13.0}/setup.cfg +0 -0
  133. {agentbundle-0.12.1 → agentbundle-0.13.0}/tests/test_linear_primitive.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.12.1
3
+ Version: 0.13.0
4
4
  Summary: npm for your coding agent. Install packs of skills, subagents, and hooks into any repo, for every major agent.
5
5
  Author-email: eugenelim <eugenelim@users.noreply.github.com>
6
6
  License: Apache-2.0 OR MIT
@@ -64,6 +64,8 @@ agentbundle show core --format json # stable object for scripts/agents
64
64
  agentbundle list-installed
65
65
  agentbundle list-installed --no-check # skip the catalogue check (offline, fast)
66
66
  agentbundle list-installed --check-drift # also count locally edited files
67
+ agentbundle list-installed --format json # machine-readable JSON (schema_version 1)
68
+ agentbundle list-installed --updates-only # show only rows needing attention
67
69
 
68
70
  # Install a whole curated profile — a single-scope set of packs — in one command
69
71
  agentbundle install --profile inception
@@ -80,7 +82,7 @@ agentbundle uninstall --pack core --dry-run
80
82
  agentbundle uninstall --pack core --yes
81
83
  ```
82
84
 
83
- **`list-installed`** reads your state files (not the catalogue) and reports every installed `(pack, adapter)` at each scope with its version and an `up-to-date` / `upgrade-available` / `unknown` status; it degrades to `unknown` (never an error) when the catalogue can't be resolved, and `--no-check` skips the check entirely.
85
+ **`list-installed`** reads your state files (not the catalogue) and reports every installed `(pack, adapter)` at each scope with its version and a four-value status — `up-to-date`, `upgrade-available`, `ahead` (installed version is newer than catalogue), or `unknown`; it degrades to `unknown` (never an error) when the catalogue can't be resolved, and `--no-check` skips the check entirely. `--format json` emits a stable JSON contract (`schema_version: 1`) to stdout — useful for CI automation of upgrade decisions. `--updates-only` hides `up-to-date` rows.
84
86
 
85
87
  **`show <pack>`** answers "what skills and agents does this pack contain?" by walking the pack's source tree live on each call — so the answer can't drift, and nothing is persisted. `--format json` emits a stable object (`name`, `version`, `description`, `skills`, `agents`, `source`) for scripts and agents. When the catalogue can't be resolved, an *installed* pack still reports its inventory from your state files (marked `source: installed-state`); a not-installed pack errors.
86
88
 
@@ -88,6 +90,90 @@ A **profile** is a catalogue-curated, single-scope set of packs you install in o
88
90
 
89
91
  **Mutating commands ask first.** `uninstall`, the `--force` cleanup, and the upgrade offer all preview what they'll do and confirm before touching anything; `--dry-run` previews without writing, and `--yes` skips the prompt for non-interactive / CI use (where, without it, they refuse rather than hang).
90
92
 
93
+ ## Enterprise distribution
94
+
95
+ For organizations running an internal Artifactory mirror or any static HTTPS server,
96
+ agentbundle's enterprise distribution capabilities handle the full adoption loop —
97
+ from org-wide channel configuration to CI-driven bulk upgrades.
98
+
99
+ **Install from an internal Artifactory channel:**
100
+
101
+ ```bash
102
+ # Point agentbundle at your org's channel descriptor (one-time per machine,
103
+ # or pre-configured in your org fork — see Org bootstrap below)
104
+ agentbundle config set source catalogue+https://artifactory.example.test/agentbundle/catalogues/core/channels/stable.json
105
+
106
+ agentbundle install --pack core
107
+ ```
108
+
109
+ The channel descriptor points to an immutable versioned archive; agentbundle
110
+ fetches, verifies its SHA-256 digest, and installs. Pass a bearer token via
111
+ `AGENTBUNDLE_HTTP_BEARER_TOKEN` — it is never stored in state, never printed, and
112
+ never forwarded to a different host.
113
+
114
+ **JSON output for CI pipelines:**
115
+
116
+ ```bash
117
+ # See what's installed and what needs upgrading — machine-readable
118
+ agentbundle list-installed --format json
119
+ agentbundle list-installed --format json --updates-only
120
+ ```
121
+
122
+ Returns a stable JSON contract (`schema_version` 1) with per-row status
123
+ (`up-to-date` / `upgrade-available` / `ahead` / `unknown`) and machine-readable
124
+ reason codes for unknown rows. Pipe into `jq` or your CI annotation step.
125
+
126
+ **Bulk upgrade in one scoped command:**
127
+
128
+ ```bash
129
+ # Upgrade all installed packs in a scope — preflights before any write
130
+ agentbundle upgrade --all --scope repo --yes
131
+ agentbundle upgrade --all --scope user --format json --yes
132
+ ```
133
+
134
+ Preflights all rows before writing anything; a blocked row stops the run before the
135
+ filesystem is touched. Partial failure is reported honestly — not described as a
136
+ rollback. Never silently downgrades an `ahead` row.
137
+
138
+ **Package your catalogue for Artifactory:**
139
+
140
+ ```bash
141
+ agentbundle package-catalogue \
142
+ --root /path/to/catalogue \
143
+ --bundle my-packs \
144
+ --release 1.0.0 \
145
+ --channel stable \
146
+ --output dist/
147
+ ```
148
+
149
+ Produces a deterministic, reproducible gzip archive (versioned) and a mutable channel
150
+ descriptor JSON (`stable.json`), ready to upload to Artifactory. Identical inputs
151
+ produce byte-identical archives (honors `SOURCE_DATE_EPOCH`).
152
+
153
+ **Org bootstrap — ship the default channel in your fork:**
154
+
155
+ Add an `[organization.artifactory]` block to
156
+ `agentbundle/_data/install-defaults.toml` in your org's agentbundle fork:
157
+
158
+ ```toml
159
+ [organization.artifactory]
160
+ enabled = true
161
+ base-url = "https://artifactory.example.test"
162
+ repository = "agentbundle"
163
+ bundle = "core"
164
+ channel = "stable"
165
+ ```
166
+
167
+ Developers installing from your fork get the internal channel without a manual
168
+ `config set source` step. The block ships `enabled = false` in the public package.
169
+ A malformed `enabled = true` config fails closed — no silent fallback to the public
170
+ source.
171
+
172
+ See the full enterprise adoption guide at
173
+ `docs/guides/_shared/how-to/use-an-artifactory-catalogue.md` for all six flows
174
+ (org bootstrap, repo-scope CI upgrade, user-scope MDM, source-conflict remediation,
175
+ disconnected hosts, and security controls).
176
+
91
177
  ## Build your own catalogue
92
178
 
93
179
  `agentbundle` isn't tied to the agent-ready-repo catalogue. Any repo that lays its packs out the same way can use it. A pack is a directory:
@@ -120,6 +206,15 @@ is deliberately lossy per tool.
120
206
 
121
207
  Point a catalogue URI (a git URL or a local path) at the repo that holds your packs. Then `validate` a pack against the adapter contract, `render` it to preview the projection, and `install` it into a target repo. `scaffold` drops a pack's seeds into a fresh directory to start from. The build pipeline (`agentbundle.build`) is the same engine `make build` runs.
122
208
 
209
+ **Org adapter default:** If your org ships a private `agentbundle` wheel (or a fork pinned to your internal catalogue), you can set a default adapter for all developers without requiring them to run `agentbundle config set` or pass `--adapter` on every install. Add an `[organization]` table to `_data/install-defaults.toml` in your fork:
210
+
211
+ ```toml
212
+ [organization]
213
+ preferred_adapter = "cursor"
214
+ ```
215
+
216
+ The org hint fires after the user-config but before the on-disk IDE probe — so `--adapter`, user-config, and upgrade state-hints all take priority. An invalid value exits 1 before writing anything. See the [`agentbundle` reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/reference/agentbundle.md#org-adapter-default) for the full cascade.
217
+
123
218
  See the [pack layout reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/architecture/pack-layout.md) and [authoring a skill](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/how-to/author-a-skill.md).
124
219
 
125
220
  ## Credentials
@@ -46,6 +46,8 @@ agentbundle show core --format json # stable object for scripts/agents
46
46
  agentbundle list-installed
47
47
  agentbundle list-installed --no-check # skip the catalogue check (offline, fast)
48
48
  agentbundle list-installed --check-drift # also count locally edited files
49
+ agentbundle list-installed --format json # machine-readable JSON (schema_version 1)
50
+ agentbundle list-installed --updates-only # show only rows needing attention
49
51
 
50
52
  # Install a whole curated profile — a single-scope set of packs — in one command
51
53
  agentbundle install --profile inception
@@ -62,7 +64,7 @@ agentbundle uninstall --pack core --dry-run
62
64
  agentbundle uninstall --pack core --yes
63
65
  ```
64
66
 
65
- **`list-installed`** reads your state files (not the catalogue) and reports every installed `(pack, adapter)` at each scope with its version and an `up-to-date` / `upgrade-available` / `unknown` status; it degrades to `unknown` (never an error) when the catalogue can't be resolved, and `--no-check` skips the check entirely.
67
+ **`list-installed`** reads your state files (not the catalogue) and reports every installed `(pack, adapter)` at each scope with its version and a four-value status — `up-to-date`, `upgrade-available`, `ahead` (installed version is newer than catalogue), or `unknown`; it degrades to `unknown` (never an error) when the catalogue can't be resolved, and `--no-check` skips the check entirely. `--format json` emits a stable JSON contract (`schema_version: 1`) to stdout — useful for CI automation of upgrade decisions. `--updates-only` hides `up-to-date` rows.
66
68
 
67
69
  **`show <pack>`** answers "what skills and agents does this pack contain?" by walking the pack's source tree live on each call — so the answer can't drift, and nothing is persisted. `--format json` emits a stable object (`name`, `version`, `description`, `skills`, `agents`, `source`) for scripts and agents. When the catalogue can't be resolved, an *installed* pack still reports its inventory from your state files (marked `source: installed-state`); a not-installed pack errors.
68
70
 
@@ -70,6 +72,90 @@ A **profile** is a catalogue-curated, single-scope set of packs you install in o
70
72
 
71
73
  **Mutating commands ask first.** `uninstall`, the `--force` cleanup, and the upgrade offer all preview what they'll do and confirm before touching anything; `--dry-run` previews without writing, and `--yes` skips the prompt for non-interactive / CI use (where, without it, they refuse rather than hang).
72
74
 
75
+ ## Enterprise distribution
76
+
77
+ For organizations running an internal Artifactory mirror or any static HTTPS server,
78
+ agentbundle's enterprise distribution capabilities handle the full adoption loop —
79
+ from org-wide channel configuration to CI-driven bulk upgrades.
80
+
81
+ **Install from an internal Artifactory channel:**
82
+
83
+ ```bash
84
+ # Point agentbundle at your org's channel descriptor (one-time per machine,
85
+ # or pre-configured in your org fork — see Org bootstrap below)
86
+ agentbundle config set source catalogue+https://artifactory.example.test/agentbundle/catalogues/core/channels/stable.json
87
+
88
+ agentbundle install --pack core
89
+ ```
90
+
91
+ The channel descriptor points to an immutable versioned archive; agentbundle
92
+ fetches, verifies its SHA-256 digest, and installs. Pass a bearer token via
93
+ `AGENTBUNDLE_HTTP_BEARER_TOKEN` — it is never stored in state, never printed, and
94
+ never forwarded to a different host.
95
+
96
+ **JSON output for CI pipelines:**
97
+
98
+ ```bash
99
+ # See what's installed and what needs upgrading — machine-readable
100
+ agentbundle list-installed --format json
101
+ agentbundle list-installed --format json --updates-only
102
+ ```
103
+
104
+ Returns a stable JSON contract (`schema_version` 1) with per-row status
105
+ (`up-to-date` / `upgrade-available` / `ahead` / `unknown`) and machine-readable
106
+ reason codes for unknown rows. Pipe into `jq` or your CI annotation step.
107
+
108
+ **Bulk upgrade in one scoped command:**
109
+
110
+ ```bash
111
+ # Upgrade all installed packs in a scope — preflights before any write
112
+ agentbundle upgrade --all --scope repo --yes
113
+ agentbundle upgrade --all --scope user --format json --yes
114
+ ```
115
+
116
+ Preflights all rows before writing anything; a blocked row stops the run before the
117
+ filesystem is touched. Partial failure is reported honestly — not described as a
118
+ rollback. Never silently downgrades an `ahead` row.
119
+
120
+ **Package your catalogue for Artifactory:**
121
+
122
+ ```bash
123
+ agentbundle package-catalogue \
124
+ --root /path/to/catalogue \
125
+ --bundle my-packs \
126
+ --release 1.0.0 \
127
+ --channel stable \
128
+ --output dist/
129
+ ```
130
+
131
+ Produces a deterministic, reproducible gzip archive (versioned) and a mutable channel
132
+ descriptor JSON (`stable.json`), ready to upload to Artifactory. Identical inputs
133
+ produce byte-identical archives (honors `SOURCE_DATE_EPOCH`).
134
+
135
+ **Org bootstrap — ship the default channel in your fork:**
136
+
137
+ Add an `[organization.artifactory]` block to
138
+ `agentbundle/_data/install-defaults.toml` in your org's agentbundle fork:
139
+
140
+ ```toml
141
+ [organization.artifactory]
142
+ enabled = true
143
+ base-url = "https://artifactory.example.test"
144
+ repository = "agentbundle"
145
+ bundle = "core"
146
+ channel = "stable"
147
+ ```
148
+
149
+ Developers installing from your fork get the internal channel without a manual
150
+ `config set source` step. The block ships `enabled = false` in the public package.
151
+ A malformed `enabled = true` config fails closed — no silent fallback to the public
152
+ source.
153
+
154
+ See the full enterprise adoption guide at
155
+ `docs/guides/_shared/how-to/use-an-artifactory-catalogue.md` for all six flows
156
+ (org bootstrap, repo-scope CI upgrade, user-scope MDM, source-conflict remediation,
157
+ disconnected hosts, and security controls).
158
+
73
159
  ## Build your own catalogue
74
160
 
75
161
  `agentbundle` isn't tied to the agent-ready-repo catalogue. Any repo that lays its packs out the same way can use it. A pack is a directory:
@@ -102,6 +188,15 @@ is deliberately lossy per tool.
102
188
 
103
189
  Point a catalogue URI (a git URL or a local path) at the repo that holds your packs. Then `validate` a pack against the adapter contract, `render` it to preview the projection, and `install` it into a target repo. `scaffold` drops a pack's seeds into a fresh directory to start from. The build pipeline (`agentbundle.build`) is the same engine `make build` runs.
104
190
 
191
+ **Org adapter default:** If your org ships a private `agentbundle` wheel (or a fork pinned to your internal catalogue), you can set a default adapter for all developers without requiring them to run `agentbundle config set` or pass `--adapter` on every install. Add an `[organization]` table to `_data/install-defaults.toml` in your fork:
192
+
193
+ ```toml
194
+ [organization]
195
+ preferred_adapter = "cursor"
196
+ ```
197
+
198
+ The org hint fires after the user-config but before the on-disk IDE probe — so `--adapter`, user-config, and upgrade state-hints all take priority. An invalid value exits 1 before writing anything. See the [`agentbundle` reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/reference/agentbundle.md#org-adapter-default) for the full cascade.
199
+
105
200
  See the [pack layout reference](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/architecture/pack-layout.md) and [authoring a skill](https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/how-to/author-a-skill.md).
106
201
 
107
202
  ## Credentials
@@ -0,0 +1,19 @@
1
+ # Optional organisation Artifactory bootstrap — layer 3 of the catalogue-source
2
+ # resolution chain (RFC-0072 D2 / ADR-0036). When the ``enabled`` boolean is
3
+ # set to ``true``, agentbundle constructs the URL:
4
+ # catalogue+<base-url>/<repository>/catalogues/<bundle>/channels/<channel>.json
5
+ # as the default source for developers installing from this fork.
6
+ # Public default ships ``enabled = false``; no real org endpoints are stored here.
7
+ [organization.artifactory]
8
+ enabled = false
9
+
10
+ # Packaged install default — layer 5 of the catalogue-source resolution chain
11
+ # (RFC-0046 / ADR-0036). When `agentbundle install`/`upgrade` is run with no
12
+ # `catalogue` positional and layers 1–4 (explicit arg, user config, org
13
+ # Artifactory bootstrap, editable detection) yield nothing, this source is used.
14
+ #
15
+ # Private-fork pattern: blank the `source` value below (or delete this file
16
+ # entirely) to disable the packaged GitHub default — layers 1–4 still apply, so
17
+ # an editable clone or a `config set source` still resolves.
18
+ [defaults]
19
+ source = "git+https://github.com/eugenelim/agent-ready-repo"
@@ -65,6 +65,19 @@ def resolve_catalogue(uri: str) -> Path:
65
65
  "SSH git URLs deferred to v1.1; use https or local path."
66
66
  )
67
67
 
68
+ # Explicit reject for http:// variants — layer-1 explicit arg bypasses
69
+ # _is_valid_source, so we must guard here to avoid silent local-path fallback.
70
+ if uri.startswith(("catalogue+http://", "archive+http://")):
71
+ raise CatalogueError(
72
+ "HTTPS-only: catalogue+http:// and archive+http:// are not supported; "
73
+ "use catalogue+https:// or archive+https://"
74
+ )
75
+
76
+ # Dispatch new HTTPS catalogue schemes (RFC-0072)
77
+ if uri.startswith(("catalogue+https://", "archive+https://")):
78
+ from agentbundle.https_catalogue import fetch_catalogue_archive
79
+ return fetch_catalogue_archive(uri)
80
+
68
81
  if uri.startswith(_HTTPS_PREFIX):
69
82
  return _resolve_https(uri)
70
83
 
@@ -3,9 +3,9 @@
3
3
  Subcommand order on the parser matches the canonical install-workflow order
4
4
  from the spec (discovery-first): `list-packs`, `list-profiles`, `list-targets`,
5
5
  `scaffold`, `install`, `validate`, `render`, `adapt`, `diff`, `upgrade`,
6
- `uninstall`, `init-state`, `config`, `reconcile`. `list-profiles` (RFC-0034)
7
- lists the catalogue's curated single-scope install profiles; `install
8
- --profile <name>` installs one.
6
+ `uninstall`, `init-state`, `config`, `reconcile`, `package-catalogue`.
7
+ `list-profiles` (RFC-0034) lists the catalogue's curated single-scope install
8
+ profiles; `install --profile <name>` installs one.
9
9
 
10
10
  Each subcommand's `run(args) -> int` lives under `agentbundle.commands.*`;
11
11
  this module wires `argparse` and prints `--version`. No business logic here.
@@ -243,9 +243,9 @@ def _build_parser() -> argparse.ArgumentParser:
243
243
  nargs="?",
244
244
  default=None,
245
245
  help=(
246
- "Catalogue URI to compare installed versions against. Optional: when "
247
- "omitted, the source is resolved from your config, an editable clone, "
248
- "or the packaged default (RFC-0047). Ignored under --no-check."
246
+ "[Deprecated] Catalogue URI -- now ignored; rows are resolved against "
247
+ "their recorded provenance. Use --no-check to skip catalogue resolution "
248
+ "entirely."
249
249
  ),
250
250
  )
251
251
  sp.add_argument("--root", default=".")
@@ -272,6 +272,21 @@ def _build_parser() -> argparse.ArgumentParser:
272
272
  "install (on-disk SHA differs from the recorded SHA)."
273
273
  ),
274
274
  )
275
+ sp.add_argument(
276
+ "--format",
277
+ choices=["table", "json"],
278
+ default="table",
279
+ help="Output format: table (default) or json.",
280
+ )
281
+ sp.add_argument(
282
+ "--updates-only",
283
+ action="store_true",
284
+ default=False,
285
+ help=(
286
+ "Show only rows needing attention (upgrade-available, ahead, unknown). "
287
+ "Summary counts always reflect the full set. No effect under --no-check."
288
+ ),
289
+ )
275
290
  sp.set_defaults(func=_lazy("list_installed"))
276
291
 
277
292
  # --- show --- (catalogue query; walks a pack's .apm/ tree live)
@@ -491,7 +506,24 @@ def _build_parser() -> argparse.ArgumentParser:
491
506
  "upgrade",
492
507
  help="Upgrade a pack or a single primitive within a pack.",
493
508
  )
494
- sp.add_argument("--pack", required=True)
509
+ # --pack and --all are mutually exclusive; exactly one is required (AC1).
510
+ mode_group = sp.add_mutually_exclusive_group(required=True)
511
+ mode_group.add_argument(
512
+ "--pack",
513
+ help="Upgrade a single named pack (whole-pack or per-primitive).",
514
+ )
515
+ mode_group.add_argument(
516
+ "--all",
517
+ action="store_true",
518
+ dest="all",
519
+ default=False,
520
+ help=(
521
+ "Upgrade all installed packs at the given --scope. "
522
+ "Requires --scope repo|user. Rejects --adapter and positional "
523
+ "<catalogue>. Uses each row's recorded provenance for source "
524
+ "resolution."
525
+ ),
526
+ )
495
527
  # The five per-primitive flags are mutually exclusive: a pack-version
496
528
  # upgrade is for the whole pack or exactly one named primitive, never two
497
529
  # at once. Grouping them lets argparse reject `--skill a --agent b` rather
@@ -509,7 +541,7 @@ def _build_parser() -> argparse.ArgumentParser:
509
541
  help=(
510
542
  "Catalogue URI to fetch the new version from. Optional: when "
511
543
  "omitted, the source is resolved from your config, an editable "
512
- "clone, or the packaged default (RFC-0046)."
544
+ "clone, or the packaged default (RFC-0046). Rejected with --all."
513
545
  ),
514
546
  )
515
547
  sp.add_argument("--root", default=".")
@@ -520,7 +552,18 @@ def _build_parser() -> argparse.ArgumentParser:
520
552
  help=(
521
553
  "Disambiguate when the pack is installed for multiple adapters at "
522
554
  "the resolved scope (RFC-0052). Inferred when the pack has a single "
523
- "adapter row; required when it has more than one."
555
+ "adapter row; required when it has more than one. Rejected with --all."
556
+ ),
557
+ )
558
+ sp.add_argument(
559
+ "--format",
560
+ choices=("table", "json"),
561
+ default="table",
562
+ help=(
563
+ "Output format. 'table' (default) prints a human-readable plan "
564
+ "table. 'json' emits a machine-readable JSON document to stdout "
565
+ "(requires --yes for non-dry-run applies; not yet supported with "
566
+ "--pack)."
524
567
  ),
525
568
  )
526
569
  sp.add_argument(
@@ -529,7 +572,8 @@ def _build_parser() -> argparse.ArgumentParser:
529
572
  help=(
530
573
  "Skip the upgrade confirmation prompt. Required for non-interactive "
531
574
  "use (CI, pipes); without it the upgrade asks before writing, and "
532
- "refuses rather than blocking when stdin is not a TTY."
575
+ "refuses rather than blocking when stdin is not a TTY. Required for "
576
+ "--format json with --all (non-dry-run)."
533
577
  ),
534
578
  )
535
579
  sp.add_argument(
@@ -636,6 +680,33 @@ def _build_parser() -> argparse.ArgumentParser:
636
680
  )
637
681
  sp.set_defaults(func=_lazy("reconcile"))
638
682
 
683
+ # --- package-catalogue --- (maintainer/CI only; RFC-0072 D1/D5)
684
+ sp = subparsers.add_parser(
685
+ "package-catalogue",
686
+ help="Package a catalogue repository into an Artifactory artifact layout (maintainer/CI only).",
687
+ )
688
+ sp.add_argument("--root", required=True, help="Catalogue repository root directory.")
689
+ sp.add_argument("--bundle", required=True, help="Bundle name (e.g. engineering).")
690
+ sp.add_argument("--release", required=True, help="Release tag (e.g. 0.13.0).")
691
+ sp.add_argument("--channel", required=True, help="Channel name (e.g. stable).")
692
+ sp.add_argument("--output", required=True, help="Output root directory.")
693
+ sp.add_argument(
694
+ "--source-revision",
695
+ default=None,
696
+ help="Git commit or tag (CI supplies this; no git shell-out).",
697
+ )
698
+ sp.add_argument(
699
+ "--minimum-agentbundle-version",
700
+ default=None,
701
+ help="Minimum agentbundle version for the channel descriptor.",
702
+ )
703
+ sp.add_argument(
704
+ "--published-at",
705
+ default=None,
706
+ help="Publication timestamp for the channel descriptor (ISO-8601).",
707
+ )
708
+ sp.set_defaults(func=_lazy("package_catalogue"))
709
+
639
710
  return parser
640
711
 
641
712