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.
- {agentbundle-0.12.1 → agentbundle-0.13.0}/PKG-INFO +97 -2
- {agentbundle-0.12.1 → agentbundle-0.13.0}/README.md +96 -1
- agentbundle-0.13.0/agentbundle/_data/install-defaults.toml +19 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/catalogue.py +13 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/cli.py +81 -10
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/install.py +124 -1
- agentbundle-0.13.0/agentbundle/commands/list_installed.py +540 -0
- agentbundle-0.13.0/agentbundle/commands/package_catalogue.py +461 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/upgrade.py +832 -194
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/config.py +88 -5
- agentbundle-0.13.0/agentbundle/https_catalogue.py +518 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/source_defaults.py +271 -20
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/version.py +1 -1
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/PKG-INFO +97 -2
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/SOURCES.txt +2 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/pyproject.toml +1 -1
- agentbundle-0.12.1/agentbundle/_data/install-defaults.toml +0 -10
- agentbundle-0.12.1/agentbundle/commands/list_installed.py +0 -223
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/__init__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/__main__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/adapter.schema.json +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/adapter.toml +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/install-marker.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/pack.schema.json +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/_data/profile.schema.json +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/__init__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/__main__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapter_root_bins.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/__init__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/claude_code.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/codex.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/copilot.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/cursor.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/gemini.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/kiro.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/adapters/kiro_ide.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/contract.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/lint_packs.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/main.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/phase_order.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/__init__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/codex_agent_toml.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/copilot_agent_md.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/direct_directory.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/hook_id.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/merge_json.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/projections/user_merge_json.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/scope_rails.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/self_host.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/shared_libs.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/target_resolver.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/__init__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_claude_code.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_codex.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_copilot.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_cursor.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_gemini.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro_alias.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro_cli.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_kiro_ide.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_adapter_root_bins_projection.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_architect_design_reviewer_projection.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_architect_design_reviewer_rubric_parity.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_build_ships_seeds.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract_scope.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract_v07.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_contract_v08.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_direct_directory_cleanup.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_end_to_end_build.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_agents_md_diataxis_block.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_agents_md_legacy_block.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_agents_md_risk_block.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_lint_packs.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_load_pack_hook_wiring_safely.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pack_schema.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pack_schema_allowed_adapters.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pack_schema_install.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_pipeline.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_plugin_manifest_schema.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_projectable_subset.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_projections_merge_json.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_scope_rails.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_security.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_self_host_check.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_self_host_fixture_guard.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_self_host_recipe_config.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shared_libs_projection.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shared_prefix_contract.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shipped_packs_v07_declarations.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_shipped_packs_v08_declarations.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_user_libs_projection.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_validate.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/tests/test_writers_emit_lf.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/user_libs.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/build/validate.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/categories.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/__init__.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/_common.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/_drop_warning.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/adapt.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/config.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/diff.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/init_state.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/list_packs.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/list_profiles.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/list_targets.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/profile.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/reconcile.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/render.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/scaffold.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/show.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/uninstall.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/commands/validate.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/pack_inventory.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/render.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/safety.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/scope.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/statelock.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle/user_config.py +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/dependency_links.txt +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/entry_points.txt +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/agentbundle.egg-info/top_level.txt +0 -0
- {agentbundle-0.12.1 → agentbundle-0.13.0}/setup.cfg +0 -0
- {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.
|
|
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
|
|
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
|
|
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
|
|
7
|
-
lists the catalogue's curated single-scope 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
|
|
247
|
-
"
|
|
248
|
-
"
|
|
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
|
-
|
|
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
|
|