agentbundle 0.4.0__tar.gz → 0.5.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.4.0 → agentbundle-0.5.0}/PKG-INFO +8 -2
- {agentbundle-0.4.0 → agentbundle-0.5.0}/README.md +7 -1
- agentbundle-0.5.0/agentbundle/_data/profile.schema.json +21 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/scope_rails.py +12 -2
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/cli.py +30 -4
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/install.py +410 -25
- agentbundle-0.5.0/agentbundle/commands/list_profiles.py +63 -0
- agentbundle-0.5.0/agentbundle/commands/profile.py +155 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/uninstall.py +4 -1
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/upgrade.py +21 -6
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/validate.py +16 -5
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/version.py +1 -1
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle.egg-info/PKG-INFO +8 -2
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle.egg-info/SOURCES.txt +3 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/pyproject.toml +1 -1
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/__init__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/__main__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/_data/adapter.schema.json +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/_data/adapter.toml +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/_data/install-marker.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/_data/pack.schema.json +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/__init__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/__main__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapter_root_bins.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/__init__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/claude_code.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/codex.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/copilot.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/cursor.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/gemini.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/kiro.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/adapters/kiro_ide.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/contract.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/lint_packs.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/main.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/phase_order.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/__init__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/codex_agent_toml.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/copilot_agent_md.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/direct_directory.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/hook_id.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/merge_json.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/projections/user_merge_json.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/self_host.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/shared_libs.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/target_resolver.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/__init__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_claude_code.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_codex.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_copilot.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_cursor.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_gemini.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_kiro.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_kiro_alias.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_kiro_cli.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_kiro_ide.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_adapter_root_bins_projection.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_architect_design_reviewer_projection.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_architect_design_reviewer_rubric_parity.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_build_ships_seeds.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_contract.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_contract_scope.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_contract_v07.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_contract_v08.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_direct_directory_cleanup.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_end_to_end_build.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_lint_agents_md_diataxis_block.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_lint_agents_md_legacy_block.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_lint_agents_md_risk_block.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_lint_packs.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_load_pack_hook_wiring_safely.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_pack_schema.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_pack_schema_allowed_adapters.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_pack_schema_install.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_pipeline.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_plugin_manifest_schema.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_projectable_subset.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_projections_merge_json.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_scope_rails.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_security.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_self_host_check.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_shared_libs_projection.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_shipped_packs_v07_declarations.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_shipped_packs_v08_declarations.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_user_libs_projection.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/tests/test_validate.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/user_libs.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/build/validate.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/catalogue.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/categories.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/__init__.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/_common.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/_drop_warning.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/adapt.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/config.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/diff.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/init_state.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/list_packs.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/list_targets.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/reconcile.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/render.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/commands/scaffold.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/config.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/render.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/safety.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/scope.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle/user_config.py +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle.egg-info/dependency_links.txt +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle.egg-info/entry_points.txt +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/agentbundle.egg-info/top_level.txt +0 -0
- {agentbundle-0.4.0 → agentbundle-0.5.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentbundle
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.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
|
|
@@ -39,6 +39,12 @@ That lands `core`, the flagship pack and the loop itself, in your repo. Claude C
|
|
|
39
39
|
# See what's in a catalogue
|
|
40
40
|
agentbundle list-packs git+https://github.com/eugenelim/agent-ready-repo
|
|
41
41
|
|
|
42
|
+
# See the catalogue's curated install profiles
|
|
43
|
+
agentbundle list-profiles git+https://github.com/eugenelim/agent-ready-repo
|
|
44
|
+
|
|
45
|
+
# Install a whole curated profile — a single-scope set of packs — in one command
|
|
46
|
+
agentbundle install --profile inception git+https://github.com/eugenelim/agent-ready-repo
|
|
47
|
+
|
|
42
48
|
# Install the flagship loop into this repo
|
|
43
49
|
agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo
|
|
44
50
|
|
|
@@ -52,7 +58,7 @@ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-rep
|
|
|
52
58
|
agentbundle upgrade --pack core --to 0.4.0 git+https://github.com/eugenelim/agent-ready-repo
|
|
53
59
|
```
|
|
54
60
|
|
|
55
|
-
A catalogue is a git URL or a local path. Installs auto-detect your agent; pass `--adapter` to override.
|
|
61
|
+
A catalogue is a git URL or a local path. Installs auto-detect your agent; pass `--adapter` to override. A **profile** is a catalogue-curated, single-scope set of packs you install in one command — it declares its own scope, so `--scope` doesn't apply.
|
|
56
62
|
|
|
57
63
|
## Build your own catalogue
|
|
58
64
|
|
|
@@ -21,6 +21,12 @@ That lands `core`, the flagship pack and the loop itself, in your repo. Claude C
|
|
|
21
21
|
# See what's in a catalogue
|
|
22
22
|
agentbundle list-packs git+https://github.com/eugenelim/agent-ready-repo
|
|
23
23
|
|
|
24
|
+
# See the catalogue's curated install profiles
|
|
25
|
+
agentbundle list-profiles git+https://github.com/eugenelim/agent-ready-repo
|
|
26
|
+
|
|
27
|
+
# Install a whole curated profile — a single-scope set of packs — in one command
|
|
28
|
+
agentbundle install --profile inception git+https://github.com/eugenelim/agent-ready-repo
|
|
29
|
+
|
|
24
30
|
# Install the flagship loop into this repo
|
|
25
31
|
agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo
|
|
26
32
|
|
|
@@ -34,7 +40,7 @@ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-rep
|
|
|
34
40
|
agentbundle upgrade --pack core --to 0.4.0 git+https://github.com/eugenelim/agent-ready-repo
|
|
35
41
|
```
|
|
36
42
|
|
|
37
|
-
A catalogue is a git URL or a local path. Installs auto-detect your agent; pass `--adapter` to override.
|
|
43
|
+
A catalogue is a git URL or a local path. Installs auto-detect your agent; pass `--adapter` to override. A **profile** is a catalogue-curated, single-scope set of packs you install in one command — it declares its own scope, so `--scope` doesn't apply.
|
|
38
44
|
|
|
39
45
|
## Build your own catalogue
|
|
40
46
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"required": ["scope", "description", "packs"],
|
|
4
|
+
"additionalProperties": false,
|
|
5
|
+
"properties": {
|
|
6
|
+
"scope": {"enum": ["repo", "user"]},
|
|
7
|
+
"description": {"type": "string"},
|
|
8
|
+
"packs": {
|
|
9
|
+
"type": "array",
|
|
10
|
+
"minItems": 1,
|
|
11
|
+
"items": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"required": ["pack"],
|
|
14
|
+
"additionalProperties": false,
|
|
15
|
+
"properties": {
|
|
16
|
+
"pack": {"type": "string"}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -299,6 +299,16 @@ def run_all(
|
|
|
299
299
|
# ---------------------------------------------------------------------------
|
|
300
300
|
|
|
301
301
|
|
|
302
|
+
# Adapters whose hook-wiring projects via `merge-into-agent-json` (a
|
|
303
|
+
# pack-owned `.kiro/agents/<attach-to-agent>.json`): the legacy `kiro`
|
|
304
|
+
# block and the `kiro-cli` adapter. The `attach-to-agent` rails below
|
|
305
|
+
# validate that merge target, so they fire for this family. `kiro-ide`
|
|
306
|
+
# (and the `kiro` *install alias*, which routes to kiro-ide) DROPS
|
|
307
|
+
# hook-wiring and is intentionally absent — there is no merge target to
|
|
308
|
+
# validate. Mirrors install.py's merge dispatch.
|
|
309
|
+
_MERGE_INTO_AGENT_JSON_ADAPTERS = frozenset({"kiro", "kiro-cli"})
|
|
310
|
+
|
|
311
|
+
|
|
302
312
|
def check_kiro_attach_to_agent(
|
|
303
313
|
pack_name: str,
|
|
304
314
|
wiring_tomls: dict[str, dict],
|
|
@@ -325,7 +335,7 @@ def check_kiro_attach_to_agent(
|
|
|
325
335
|
target_adapters: iterable of adapter names the pack is being
|
|
326
336
|
validated against. No-op when ``kiro`` is absent.
|
|
327
337
|
"""
|
|
328
|
-
if
|
|
338
|
+
if not (set(target_adapters or ()) & _MERGE_INTO_AGENT_JSON_ADAPTERS):
|
|
329
339
|
return None
|
|
330
340
|
for wiring_name, body in wiring_tomls.items():
|
|
331
341
|
attach = body.get("attach-to-agent") if isinstance(body, dict) else None
|
|
@@ -485,7 +495,7 @@ def check_kiro_wiring(
|
|
|
485
495
|
would let a pack reach outside its source tree. A wiring TOML that
|
|
486
496
|
fails to parse counts as a refusal on its own.
|
|
487
497
|
"""
|
|
488
|
-
if
|
|
498
|
+
if not (set(target_adapters or ()) & _MERGE_INTO_AGENT_JSON_ADAPTERS):
|
|
489
499
|
return None
|
|
490
500
|
|
|
491
501
|
loaded = _load_pack_hook_wiring_safely(pack_path, pack_name)
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"""`agentbundle` CLI dispatcher — argparse over the eleven F-cli subcommands.
|
|
2
2
|
|
|
3
3
|
Subcommand order on the parser matches the canonical install-workflow order
|
|
4
|
-
from the spec (discovery-first): `list-packs`, `list-
|
|
5
|
-
`install`, `validate`, `render`, `adapt`, `diff`, `upgrade`,
|
|
6
|
-
`init-state`.
|
|
4
|
+
from the spec (discovery-first): `list-packs`, `list-profiles`, `list-targets`,
|
|
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.
|
|
7
9
|
|
|
8
10
|
Each subcommand's `run(args) -> int` lives under `agentbundle.commands.*`;
|
|
9
11
|
this module wires `argparse` and prints `--version`. No business logic here.
|
|
@@ -192,6 +194,14 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
192
194
|
sp.add_argument("catalogue", help="Catalogue URI (local path or git+https://...).")
|
|
193
195
|
sp.set_defaults(func=_lazy("list_packs"))
|
|
194
196
|
|
|
197
|
+
# --- list-profiles --- (catalogue query; profiles declare their own scope)
|
|
198
|
+
sp = subparsers.add_parser(
|
|
199
|
+
"list-profiles",
|
|
200
|
+
help="List curated install profiles available in a catalogue URI.",
|
|
201
|
+
)
|
|
202
|
+
sp.add_argument("catalogue", help="Catalogue URI (local path or git+https://...).")
|
|
203
|
+
sp.set_defaults(func=_lazy("list_profiles"))
|
|
204
|
+
|
|
195
205
|
# --- list-targets --- (--scope as read-only filter)
|
|
196
206
|
sp = subparsers.add_parser(
|
|
197
207
|
"list-targets",
|
|
@@ -215,7 +225,23 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
215
225
|
"install",
|
|
216
226
|
help="Install a pack from a catalogue URI into the adopter repo.",
|
|
217
227
|
)
|
|
218
|
-
|
|
228
|
+
# pack-profiles: `--pack` and `--profile` are a required mutually-exclusive
|
|
229
|
+
# group. `--pack` was a bare `required=True` arg; making it a member of a
|
|
230
|
+
# required mutex group keeps "exactly one of pack/profile" without losing
|
|
231
|
+
# the requiredness. `--scope` with `--profile` is rejected at the handler
|
|
232
|
+
# (a profile declares its own scope); argparse can't express that mutex
|
|
233
|
+
# because `--scope` is valid alongside `--pack`.
|
|
234
|
+
_pack_or_profile = sp.add_mutually_exclusive_group(required=True)
|
|
235
|
+
_pack_or_profile.add_argument("--pack")
|
|
236
|
+
_pack_or_profile.add_argument(
|
|
237
|
+
"--profile",
|
|
238
|
+
help=(
|
|
239
|
+
"Install a curated single-scope set of packs from "
|
|
240
|
+
"<catalogue>/profiles/<name>.toml in one command (RFC-0034). "
|
|
241
|
+
"Mutually exclusive with --pack; --scope is not allowed (the "
|
|
242
|
+
"profile declares its own scope)."
|
|
243
|
+
),
|
|
244
|
+
)
|
|
219
245
|
sp.add_argument("catalogue", help="Catalogue URI (local path or git+https://...).")
|
|
220
246
|
sp.add_argument("--output", default=".")
|
|
221
247
|
sp.add_argument("--scope", choices=("repo", "user"))
|