agentbundle 0.2.0__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. agentbundle-0.3.1/PKG-INFO +81 -0
  2. agentbundle-0.3.1/README.md +63 -0
  3. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/_data/adapter.schema.json +15 -4
  4. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/_data/adapter.toml +318 -37
  5. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/adapter_root_bins.py +54 -0
  6. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/adapters/__init__.py +5 -1
  7. agentbundle-0.3.1/agentbundle/build/adapters/copilot.py +112 -0
  8. agentbundle-0.3.1/agentbundle/build/adapters/cursor.py +436 -0
  9. agentbundle-0.3.1/agentbundle/build/adapters/gemini.py +484 -0
  10. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/codex_agent_toml.py +126 -24
  11. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/copilot_agent_md.py +14 -9
  12. agentbundle-0.3.1/agentbundle/build/projections/gemini_command_toml.py +230 -0
  13. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/self_host.py +41 -36
  14. agentbundle-0.3.1/agentbundle/build/shared_libs.py +66 -0
  15. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_codex.py +34 -0
  16. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_copilot.py +34 -5
  17. agentbundle-0.3.1/agentbundle/build/tests/test_adapter_cursor.py +410 -0
  18. agentbundle-0.3.1/agentbundle/build/tests/test_adapter_gemini.py +613 -0
  19. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_kiro_ide.py +5 -4
  20. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_root_bins_projection.py +61 -0
  21. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_contract.py +59 -23
  22. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_contract_scope.py +7 -7
  23. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_contract_v07.py +5 -5
  24. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_contract_v08.py +36 -0
  25. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_self_host_check.py +84 -16
  26. agentbundle-0.3.1/agentbundle/build/tests/test_shared_libs_projection.py +217 -0
  27. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_shipped_packs_v07_declarations.py +17 -8
  28. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_shipped_packs_v08_declarations.py +6 -4
  29. agentbundle-0.3.1/agentbundle/build/tests/test_user_libs_projection.py +285 -0
  30. agentbundle-0.3.1/agentbundle/build/user_libs.py +255 -0
  31. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/catalogue.py +3 -2
  32. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/cli.py +20 -0
  33. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/_common.py +72 -1
  34. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/install.py +297 -13
  35. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/upgrade.py +84 -1
  36. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/config.py +1 -1
  37. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/safety.py +8 -7
  38. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/scope.py +25 -0
  39. agentbundle-0.3.1/agentbundle.egg-info/PKG-INFO +81 -0
  40. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle.egg-info/SOURCES.txt +7 -0
  41. {agentbundle-0.2.0 → agentbundle-0.3.1}/pyproject.toml +2 -2
  42. agentbundle-0.2.0/PKG-INFO +0 -37
  43. agentbundle-0.2.0/README.md +0 -19
  44. agentbundle-0.2.0/agentbundle/build/adapters/copilot.py +0 -149
  45. agentbundle-0.2.0/agentbundle/build/shared_libs.py +0 -309
  46. agentbundle-0.2.0/agentbundle/build/tests/test_shared_libs_projection.py +0 -415
  47. agentbundle-0.2.0/agentbundle.egg-info/PKG-INFO +0 -37
  48. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/__init__.py +0 -0
  49. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/__main__.py +0 -0
  50. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/_data/install-marker.py +0 -0
  51. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/_data/pack.schema.json +0 -0
  52. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  53. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  54. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/__init__.py +0 -0
  55. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/__main__.py +0 -0
  56. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/adapters/claude_code.py +0 -0
  57. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/adapters/codex.py +0 -0
  58. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/adapters/kiro.py +0 -0
  59. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
  60. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/adapters/kiro_ide.py +0 -0
  61. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/contract.py +0 -0
  62. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/lint_packs.py +0 -0
  63. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/main.py +0 -0
  64. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/phase_order.py +0 -0
  65. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/__init__.py +0 -0
  66. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  67. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/direct_directory.py +0 -0
  68. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/hook_id.py +0 -0
  69. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  70. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  71. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/merge_json.py +0 -0
  72. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/projections/user_merge_json.py +0 -0
  73. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/scope_rails.py +0 -0
  74. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/target_resolver.py +0 -0
  75. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/__init__.py +0 -0
  76. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_claude_code.py +0 -0
  77. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_kiro.py +0 -0
  78. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_kiro_alias.py +0 -0
  79. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_adapter_kiro_cli.py +0 -0
  80. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_build_ships_seeds.py +0 -0
  81. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_direct_directory_cleanup.py +0 -0
  82. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_end_to_end_build.py +0 -0
  83. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_lint_agents_md_legacy_block.py +0 -0
  84. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_lint_agents_md_risk_block.py +0 -0
  85. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_lint_packs.py +0 -0
  86. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_load_pack_hook_wiring_safely.py +0 -0
  87. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_pack_schema.py +0 -0
  88. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_pack_schema_allowed_adapters.py +0 -0
  89. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_pack_schema_install.py +0 -0
  90. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_pipeline.py +0 -0
  91. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_plugin_manifest_schema.py +0 -0
  92. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_projections_merge_json.py +0 -0
  93. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_scope_rails.py +0 -0
  94. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_security.py +0 -0
  95. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/tests/test_validate.py +0 -0
  96. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/build/validate.py +0 -0
  97. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/__init__.py +0 -0
  98. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/_drop_warning.py +0 -0
  99. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/adapt.py +0 -0
  100. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/config.py +0 -0
  101. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/diff.py +0 -0
  102. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/init_state.py +0 -0
  103. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/list_packs.py +0 -0
  104. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/list_targets.py +0 -0
  105. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/reconcile.py +0 -0
  106. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/render.py +0 -0
  107. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/scaffold.py +0 -0
  108. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/uninstall.py +0 -0
  109. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/commands/validate.py +0 -0
  110. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/render.py +0 -0
  111. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/user_config.py +0 -0
  112. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle/version.py +0 -0
  113. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle.egg-info/dependency_links.txt +0 -0
  114. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle.egg-info/entry_points.txt +0 -0
  115. {agentbundle-0.2.0 → agentbundle-0.3.1}/agentbundle.egg-info/top_level.txt +0 -0
  116. {agentbundle-0.2.0 → agentbundle-0.3.1}/setup.cfg +0 -0
@@ -0,0 +1,81 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentbundle
3
+ Version: 0.3.1
4
+ Summary: npm for your coding agent. Install packs of skills, subagents, and hooks into any repo, for every major agent.
5
+ Author-email: eugenelim <eugenelim@users.noreply.github.com>
6
+ License: Apache-2.0 OR MIT
7
+ Project-URL: Homepage, https://github.com/eugenelim/agent-ready-repo
8
+ Project-URL: Source, https://github.com/eugenelim/agent-ready-repo
9
+ Project-URL: Documentation, https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/how-to/install-agentbundle-from-clone.md
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: License :: OSI Approved :: Apache Software License
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Requires-Python: >=3.11
17
+ Description-Content-Type: text/markdown
18
+
19
+ # agentbundle
20
+
21
+ [![PyPI](https://img.shields.io/pypi/v/agentbundle)](https://pypi.org/project/agentbundle/)
22
+ [![Python](https://img.shields.io/pypi/pyversions/agentbundle)](https://pypi.org/project/agentbundle/)
23
+ [![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue)](https://github.com/eugenelim/agent-ready-repo#license)
24
+
25
+ **The installer for [agent-ready-repo](https://github.com/eugenelim/agent-ready-repo).** Think npm, but for the skills, subagents, and hooks your coding agent runs on.
26
+
27
+ `agentbundle` installs packs of agent primitives into your repo or your home directory. It projects each primitive into the layout every agent expects. One pack. One command. Every major agent.
28
+
29
+ ```bash
30
+ pip install agentbundle
31
+ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo
32
+ ```
33
+
34
+ That lands `core`, the flagship pack and the loop itself, in your repo. Claude Code, Codex, Cursor, Copilot, Gemini, and Kiro all read it.
35
+
36
+ ## Common commands
37
+
38
+ ```bash
39
+ # See what's in a catalogue
40
+ agentbundle list-packs git+https://github.com/eugenelim/agent-ready-repo
41
+
42
+ # Install the flagship loop into this repo
43
+ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo
44
+
45
+ # Install a pack at user scope, so it follows you across every project
46
+ agentbundle install --pack research git+https://github.com/eugenelim/agent-ready-repo --scope user
47
+
48
+ # Preview an install without writing a file
49
+ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo --dry-run
50
+
51
+ # Upgrade a pack; it reports the .upstream files you need to reconcile
52
+ agentbundle upgrade --pack core --to 0.4.0 git+https://github.com/eugenelim/agent-ready-repo
53
+ ```
54
+
55
+ A catalogue is a git URL or a local path. Installs auto-detect your agent; pass `--adapter` to override.
56
+
57
+ ## Build your own catalogue
58
+
59
+ `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:
60
+
61
+ ```text
62
+ my-pack/
63
+ pack.toml # name, version, adapter-contract, install scope
64
+ .apm/
65
+ skills/<name>/SKILL.md # one folder per skill
66
+ agents/<name>.md # subagents
67
+ hooks/<name>.py # lifecycle hooks
68
+ seeds/ # files scaffolded into the adopter repo
69
+ ```
70
+
71
+ 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.
72
+
73
+ 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/how-to/author-a-skill.md).
74
+
75
+ ## Credentials
76
+
77
+ `agentbundle` doesn't resolve secrets. Credentialed skills use [`credbroker`](https://pypi.org/project/credbroker/), a standalone resolver that keeps cleartext out of the model's reach.
78
+
79
+ ## Learn more
80
+
81
+ The full story — the loop, the reviewers, the pack catalogue — is in the [agent-ready-repo README](https://github.com/eugenelim/agent-ready-repo#readme).
@@ -0,0 +1,63 @@
1
+ # agentbundle
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/agentbundle)](https://pypi.org/project/agentbundle/)
4
+ [![Python](https://img.shields.io/pypi/pyversions/agentbundle)](https://pypi.org/project/agentbundle/)
5
+ [![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue)](https://github.com/eugenelim/agent-ready-repo#license)
6
+
7
+ **The installer for [agent-ready-repo](https://github.com/eugenelim/agent-ready-repo).** Think npm, but for the skills, subagents, and hooks your coding agent runs on.
8
+
9
+ `agentbundle` installs packs of agent primitives into your repo or your home directory. It projects each primitive into the layout every agent expects. One pack. One command. Every major agent.
10
+
11
+ ```bash
12
+ pip install agentbundle
13
+ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo
14
+ ```
15
+
16
+ That lands `core`, the flagship pack and the loop itself, in your repo. Claude Code, Codex, Cursor, Copilot, Gemini, and Kiro all read it.
17
+
18
+ ## Common commands
19
+
20
+ ```bash
21
+ # See what's in a catalogue
22
+ agentbundle list-packs git+https://github.com/eugenelim/agent-ready-repo
23
+
24
+ # Install the flagship loop into this repo
25
+ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo
26
+
27
+ # Install a pack at user scope, so it follows you across every project
28
+ agentbundle install --pack research git+https://github.com/eugenelim/agent-ready-repo --scope user
29
+
30
+ # Preview an install without writing a file
31
+ agentbundle install --pack core git+https://github.com/eugenelim/agent-ready-repo --dry-run
32
+
33
+ # Upgrade a pack; it reports the .upstream files you need to reconcile
34
+ agentbundle upgrade --pack core --to 0.4.0 git+https://github.com/eugenelim/agent-ready-repo
35
+ ```
36
+
37
+ A catalogue is a git URL or a local path. Installs auto-detect your agent; pass `--adapter` to override.
38
+
39
+ ## Build your own catalogue
40
+
41
+ `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:
42
+
43
+ ```text
44
+ my-pack/
45
+ pack.toml # name, version, adapter-contract, install scope
46
+ .apm/
47
+ skills/<name>/SKILL.md # one folder per skill
48
+ agents/<name>.md # subagents
49
+ hooks/<name>.py # lifecycle hooks
50
+ seeds/ # files scaffolded into the adopter repo
51
+ ```
52
+
53
+ 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.
54
+
55
+ 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/how-to/author-a-skill.md).
56
+
57
+ ## Credentials
58
+
59
+ `agentbundle` doesn't resolve secrets. Credentialed skills use [`credbroker`](https://pypi.org/project/credbroker/), a standalone resolver that keeps cleartext out of the model's reach.
60
+
61
+ ## Learn more
62
+
63
+ The full story — the loop, the reviewers, the pack catalogue — is in the [agent-ready-repo README](https://github.com/eugenelim/agent-ready-repo#readme).
@@ -49,7 +49,8 @@
49
49
  "dropped",
50
50
  "codex-agent-toml",
51
51
  "copilot-agent-md",
52
- "copilot-hooks-json"
52
+ "copilot-hooks-json",
53
+ "gemini-command-toml"
53
54
  ]
54
55
  },
55
56
  "target-path": {"type": "string"},
@@ -93,7 +94,8 @@
93
94
  "dropped",
94
95
  "codex-agent-toml",
95
96
  "copilot-agent-md",
96
- "copilot-hooks-json"
97
+ "copilot-hooks-json",
98
+ "gemini-command-toml"
97
99
  ]
98
100
  },
99
101
  "else": {
@@ -113,7 +115,8 @@
113
115
  "dropped",
114
116
  "codex-agent-toml",
115
117
  "copilot-agent-md",
116
- "copilot-hooks-json"
118
+ "copilot-hooks-json",
119
+ "gemini-command-toml"
117
120
  ]
118
121
  },
119
122
  "user": {
@@ -129,7 +132,8 @@
129
132
  "dropped",
130
133
  "codex-agent-toml",
131
134
  "copilot-agent-md",
132
- "copilot-hooks-json"
135
+ "copilot-hooks-json",
136
+ "gemini-command-toml"
133
137
  ]
134
138
  }
135
139
  }
@@ -254,6 +258,13 @@
254
258
  "values": {
255
259
  "type": "object",
256
260
  "additionalProperties": {"type": "string"}
261
+ },
262
+ "related-values": {
263
+ "type": "object",
264
+ "additionalProperties": {
265
+ "type": "object",
266
+ "additionalProperties": {"type": "string"}
267
+ }
257
268
  }
258
269
  }
259
270
  }
@@ -30,13 +30,40 @@
30
30
  # `copilot-agent-md` (markdown → `.github/agents/<name>.agent.md`); `hook-wiring`
31
31
  # flips `dropped`→`copilot-hooks-json` (one self-contained `<name>.json` per
32
32
  # source file at `.github/hooks/`); `hook-body` retargets `tools/hooks/`→
33
- # `.github/hooks/`; `skill` gains a user target (`~/.copilot/instructions/`);
33
+ # `.github/hooks/`; `skill` gained a user target (later flipped to
34
+ # `.github/skills/` SKILL.md in v0.11 — see the [contract] note below);
34
35
  # `[adapter.copilot.scope]` gains `user = "~"` + `allowed-prefixes.user`; new
35
36
  # `copilot-agent-frontmatter-v0.10` mapping. `command` stays `dropped`
36
37
  # (copilot-cli#618/#1113). Two-pack bump (research + core), not all-pack.
38
+ # docs/specs/codex-agent-config-projection: corrects the existing codex
39
+ # `codex-agent-frontmatter-v0.8` mapping to preserve `model` and `tools`
40
+ # intent as documented Codex agent config instead of dropping those fields.
41
+ # RFC-0026 / ADR-0015 / docs/specs/cursor-full-parity (v0.11): new native
42
+ # `cursor` full-parity adapter projecting all five primitives to `.cursor/*`
43
+ # at both scopes. NO new projection mode and NO adapter.schema.json change —
44
+ # skill→direct-directory, agent→direct-file (+ `cursor-agent-frontmatter-v0.11`;
45
+ # `tools` dropped + `readonly` derived inline by cursor.py), hook-body→
46
+ # direct-file, hook-wiring→merge-json (aggregated `.cursor/hooks.json`,
47
+ # event-remapped + `version` key via cursor.py's merge helper), command→
48
+ # direct-file (Cursor honours commands). kiro-ide-hook dropped. Same `.cursor/`
49
+ # prefix at both scopes (claude-code/codex pattern; no prefix rewrite).
50
+ # Distribution-only (not in SELF_HOST_ADAPTERS).
37
51
 
38
52
  [contract]
39
- version = "0.10"
53
+ # v0.12 (docs/specs/copilot-skills-and-web, 2026-06-11): copilot `skill` flips
54
+ # `instruction-file`→`direct-directory` (first-class Agent Skills at
55
+ # `.github/skills/<name>/SKILL.md`); the `copilot-instruction` frontmatter-default
56
+ # is retired. Web correction (RFC-0024 § Errata E1) is docs/comments-only.
57
+ # (Lands atop RFC-0026's cursor v0.11; the two co-bumped — copilot takes v0.12.)
58
+ # RFC-0027 / ADR-0016 / docs/specs/gemini-full-parity (v0.13): new native
59
+ # `gemini` full-parity adapter projecting all five primitives to `.gemini/*` at
60
+ # both scopes. One new projection mode (`gemini-command-toml`); a bespoke
61
+ # `.gemini/settings.json` merge carrying `hooks` (event-remapped, fail-closed) +
62
+ # a static `context.fileName` bridge (from `context-filenames`). agent `tools:`
63
+ # kept and name-mapped; tier-preserving model map. hook-body lands under
64
+ # `.gemini/hooks/` (the cursor model — single prefix at both scopes). kiro-ide-hook
65
+ # dropped. Distribution-only (not in SELF_HOST_ADAPTERS).
66
+ version = "0.13"
40
67
 
41
68
  # Sibling schemas this contract references — pack metadata and the
42
69
  # per-pack Claude-plugin manifest. Defined by spec AC #3 + #4.
@@ -68,12 +95,16 @@ source-path = ".apm/commands/"
68
95
  [primitive."kiro-ide-hook"]
69
96
  source-path = ".apm/kiro-ide-hooks/"
70
97
 
71
- # RFC-0013 § 4c — `shared-libs/` carries Python sibling files that the
72
- # build pipeline projects into every consumer skill declaring
73
- # `metadata.auth: creds`. The projection is cross-cutting (not adapter-
74
- # keyed) and lives in `agentbundle.build.shared_libs`; the declaration
75
- # here documents the source path so future readers see the full
76
- # primitive surface in one place.
98
+ # RFC-0013 § 4c / RFC-0023 — `shared-libs/` carries Python sibling
99
+ # files. The original projection into every `metadata.auth: creds`
100
+ # skill's `scripts/` was RETIRED in RFC-0023 (those consumers resolve
101
+ # via the `credbroker` pip library, imported in-process). What survives
102
+ # in `agentbundle.build.shared_libs` is source enumeration
103
+ # (`collect_sources`): the `adapter-root-bins` companion-shim rail reads
104
+ # this path to locate `credentials_shim.py` for projection into
105
+ # `<scope-root>/.agentbundle/bin/`. The declaration here documents the
106
+ # source path so future readers see the full primitive surface in one
107
+ # place.
77
108
  [primitive."shared-libs"]
78
109
  source-path = ".apm/shared-libs/"
79
110
 
@@ -88,6 +119,16 @@ source-path = ".apm/shared-libs/"
88
119
  [primitive."adapter-root-bins"]
89
120
  source-path = ".apm/adapter-root-bins/"
90
121
 
122
+ # credbroker-user-scope T3 — `user-libs/` carries vendored Python package
123
+ # source projected to the per-scope lib floor (`~/.agentbundle/lib/` at user
124
+ # scope, `<repo>/.agentbundle/lib/` self-host staging) as the lowest-precedence
125
+ # `sys.path` import target. Build-pipeline-only like `adapter-root-bins`: no
126
+ # per-adapter projection rules (the target is `<scope-root>/.agentbundle/lib/`,
127
+ # fenced by `allowed-prefixes.<scope>`, not by per-adapter target paths), so the
128
+ # declaration carries the source path only.
129
+ [primitive."user-libs"]
130
+ source-path = ".apm/user-libs/"
131
+
91
132
  # ---------------------------------------------------------------------------
92
133
  # Claude Code adapter — 5 projections (one per primitive) + v0.3 forks
93
134
  #
@@ -392,12 +433,16 @@ allowed-prefixes.user = [".kiro/", ".agentbundle/"]
392
433
  # Copilot adapter — 5 projections (one per primitive)
393
434
  # ---------------------------------------------------------------------------
394
435
 
436
+ # `skill` projects as first-class Copilot Agent Skills (docs/specs/copilot-skills-and-web,
437
+ # RFC-0024 § Errata E2): `direct-directory` passthrough of our canonical
438
+ # `.apm/skills/<name>/SKILL.md` to `.github/skills/<name>/SKILL.md` (repo) and
439
+ # `~/.copilot/skills/<name>/SKILL.md` (user, via the install rewrite). Copilot
440
+ # accepts our Claude SKILL.md verbatim. Was `instruction-file`→`.github/instructions/`.
395
441
  [[adapter.copilot.projection]]
396
442
  primitive = "skill"
397
- mode = "instruction-file"
398
- target-path = ".github/instructions/"
399
- frontmatter-default = "copilot-instruction"
400
- on-conflict = "prompt-then-overwrite"
443
+ mode = "direct-directory"
444
+ target-path = ".github/skills/"
445
+ on-conflict = "prompt-then-preserve"
401
446
 
402
447
  [[adapter.copilot.projection]]
403
448
  primitive = "agent"
@@ -422,25 +467,26 @@ on-conflict = "prompt-then-preserve"
422
467
  primitive = "command"
423
468
  mode = "dropped"
424
469
 
425
- # Scope dimension for Copilot (RFC-0024 / ADR-0013 / docs/specs/copilot-full-parity).
426
- # Copilot is now a full-parity, user-scope-capable adapter: the app + CLI
427
- # discover agents/instructions/hooks from `.github/` (repo) and `~/.copilot/`
428
- # (user). The repo-only restriction RFC-0012 recorded is superseded-in-part.
429
- # `skill` keeps its `instruction-file` mode; its user target
430
- # (`~/.copilot/instructions/<name>.instructions.md`) is produced by the install
431
- # handler's copilot user-scope prefix rewrite (`.github/X/`→`.copilot/X/`),
432
- # since the build adapter is scope-agnostic and emits repo-relpaths.
470
+ # Scope dimension for Copilot (RFC-0024 / ADR-0013 / docs/specs/copilot-full-parity,
471
+ # skill surface per docs/specs/copilot-skills-and-web). Copilot is a full-parity,
472
+ # user-scope-capable adapter: the app + CLI discover skills/agents/hooks from
473
+ # `.github/` (repo) and `~/.copilot/` (user). The repo-only restriction RFC-0012
474
+ # recorded is superseded-in-part. `skill` projects as a `direct-directory`
475
+ # `SKILL.md` tree; its user target (`~/.copilot/skills/<name>/SKILL.md`) is
476
+ # produced by the install handler's copilot user-scope prefix rewrite
477
+ # (`.github/X/`→`.copilot/X/`), since the build adapter is scope-agnostic and
478
+ # emits repo-relpaths.
433
479
  [adapter.copilot.scope]
434
480
  repo = "."
435
481
  user = "~"
436
- # RFC-0024: repo-scope agents at `.github/agents/`, instructions at
437
- # `.github/instructions/`, hook wiring + bodies at `.github/hooks/`.
438
- allowed-prefixes.repo = [".github/instructions/", ".github/agents/", ".github/hooks/"]
482
+ # RFC-0024 + copilot-skills-and-web: repo-scope skills at `.github/skills/`,
483
+ # agents at `.github/agents/`, hook wiring + bodies at `.github/hooks/`.
484
+ allowed-prefixes.repo = [".github/skills/", ".github/agents/", ".github/hooks/"]
439
485
  # User-scope home is `~/.copilot/` — the prefix the install rewrite produces
440
486
  # from the adapter's repo-relpaths. `.agentbundle/` carries the install
441
487
  # state file (`~/.agentbundle/state.toml`), same as every other user-scope-
442
488
  # capable adapter (claude-code, codex).
443
- allowed-prefixes.user = [".copilot/agents/", ".copilot/instructions/", ".copilot/hooks/", ".agentbundle/"]
489
+ allowed-prefixes.user = [".copilot/skills/", ".copilot/agents/", ".copilot/hooks/", ".agentbundle/"]
444
490
 
445
491
  # ---------------------------------------------------------------------------
446
492
  # Codex adapter — 5 projections (one per primitive)
@@ -488,6 +534,183 @@ user = "~"
488
534
  allowed-prefixes.repo = [".agents/skills/", ".codex/", ".agentbundle/", "tools/hooks/"]
489
535
  allowed-prefixes.user = [".agents/skills/", ".codex/", ".agentbundle/"]
490
536
 
537
+ # ---------------------------------------------------------------------------
538
+ # Cursor adapter — full-parity native adapter (RFC-0026 / ADR-0015 /
539
+ # docs/specs/cursor-full-parity, v0.11).
540
+ #
541
+ # Projects all five catalogue primitives to Cursor's native `.cursor/*`
542
+ # discovery paths at both repo and user scope. Cursor's CLI and IDE share one
543
+ # `.cursor/` layout (no RFC-0022-style split). No new projection mode and no
544
+ # adapter.schema.json change: every primitive reuses an already-enumerated
545
+ # mode. The agent uses `direct-file` + a frontmatter mapping (the kiro-ide
546
+ # `.md` shape); because Cursor subagents have no per-agent tool allowlist,
547
+ # cursor.py drops the source `tools` and derives a `readonly` flag for
548
+ # non-mutating agents (documented degradation, the ADR-0013 Copilot shape).
549
+ # hook-wiring is `merge-json` to an aggregated `.cursor/hooks.json`; cursor.py's
550
+ # merge helper remaps source events via `hook-event-map` and adds a `version`
551
+ # key. `command` is first-class (Cursor is the second adapter after claude-code
552
+ # to honour commands). `kiro-ide-hook` is dropped (Kiro-only), declared in the
553
+ # table form since the schema's array `primitive` enum admits only the five
554
+ # standard primitives. Scope prefix is identical at both scopes (the
555
+ # claude-code/codex pattern), so the user-scope home is the generic
556
+ # user-rooting of the repo-relpath — NO Cursor-specific prefix rewrite.
557
+ # Distribution-only: cursor is NOT in SELF_HOST_ADAPTERS.
558
+ # ---------------------------------------------------------------------------
559
+
560
+ [[adapter.cursor.projection]]
561
+ primitive = "skill"
562
+ mode = "direct-directory"
563
+ target-path = ".cursor/skills/"
564
+ on-conflict = "prompt-then-preserve"
565
+
566
+ [[adapter.cursor.projection]]
567
+ primitive = "agent"
568
+ mode = "direct-file"
569
+ target-path = ".cursor/agents/"
570
+ frontmatter-mapping = "cursor-agent-frontmatter-v0.11"
571
+ on-conflict = "prompt-then-preserve"
572
+
573
+ [[adapter.cursor.projection]]
574
+ primitive = "hook-body"
575
+ mode = "direct-file"
576
+ target-path = ".cursor/hooks/"
577
+ on-conflict = "prompt-then-preserve"
578
+
579
+ [[adapter.cursor.projection]]
580
+ primitive = "hook-wiring"
581
+ mode = "merge-json"
582
+ target-path = ".cursor/hooks.json"
583
+ managed-key = "hooks"
584
+ on-conflict = "merge-managed-key-only"
585
+ # Hook-event map (RFC-0026 decision 4). Our hook-wiring source uses Claude-
586
+ # native PascalCase event names (e.g. `[[hooks.SessionStart]]`); Cursor's
587
+ # hooks.json uses camelCase event keys. cursor.py's merge helper reads this
588
+ # table to translate each source event; a source event with no entry here is
589
+ # dropped with a build-time log line (fail-open, the no-silent-caps rule —
590
+ # deliberately unlike copilot-hooks-json's fail-closed map). The map lives in
591
+ # the contract, not the adapter code. (Erratum vs RFC-0026: the RFC spelled the
592
+ # source vocabulary `agentSpawn`/…; the shipped source is Claude PascalCase, so
593
+ # the map keys on PascalCase — target events unchanged. See the spec Changelog.)
594
+ hook-event-map = { SessionStart = "sessionStart", UserPromptSubmit = "beforeSubmitPrompt", PreToolUse = "preToolUse", PostToolUse = "postToolUse", Stop = "stop" }
595
+
596
+ [[adapter.cursor.projection]]
597
+ primitive = "command"
598
+ mode = "direct-file"
599
+ target-path = ".cursor/commands/"
600
+ on-conflict = "prompt-then-preserve"
601
+
602
+ # kiro-ide-hook — dropped (Kiro-only primitive). Declared in the table form,
603
+ # not the projection array, because the schema's array `primitive` enum admits
604
+ # only skill/agent/hook-body/hook-wiring/command (kiro-ide / kiro-cli set the
605
+ # table-form precedent).
606
+ [adapter.cursor.projections.kiro-ide-hook]
607
+ mode = "dropped"
608
+
609
+ # Scope dimension for Cursor (RFC-0026 / ADR-0015). Cursor's `.cursor/` prefix
610
+ # is identical at repo and user scope (the claude-code/codex shape), so the
611
+ # divergent user-scope home is produced by the generic user-root resolution,
612
+ # not a Cursor-specific prefix rewrite. `.agentbundle/` carries the install
613
+ # state file at both scopes (as every scope-capable adapter lists it).
614
+ [adapter.cursor.scope]
615
+ repo = "."
616
+ user = "~"
617
+ allowed-prefixes.repo = [".cursor/", ".agentbundle/"]
618
+ allowed-prefixes.user = [".cursor/", ".agentbundle/"]
619
+
620
+ # ---------------------------------------------------------------------------
621
+ # Gemini adapter — full-parity native adapter (RFC-0027 / ADR-0016 /
622
+ # docs/specs/gemini-full-parity, v0.13).
623
+ #
624
+ # Projects all five catalogue primitives to Gemini CLI's native `.gemini/*`
625
+ # discovery paths at both repo and user scope. Unlike Cursor, gemini KEEPS and
626
+ # name-maps the agent `tools:` allowlist (Gemini has a real per-agent tool
627
+ # allowlist) and applies a tier-preserving `model` map (`gemini-agent-frontmatter`).
628
+ # `command` uses the new `gemini-command-toml` mode (markdown body → TOML `prompt`;
629
+ # fail-closed on multi-injection). `hook-body` lands under `.gemini/hooks/` (the
630
+ # cursor model — a single `.gemini/` prefix at both scopes, no `tools/hooks/`), and
631
+ # the carried hook command is path-rewritten `tools/hooks/`→`.gemini/hooks/` by
632
+ # gemini.py's settings-merge helper. `hook-wiring` is `merge-json` into a shared
633
+ # `.gemini/settings.json`: gemini.py's bespoke `_project_settings_json` helper (the
634
+ # cursor `_project_hooks_json` shape, NOT the generic merge_json module) writes the
635
+ # `hooks` map (event-remapped via `hook-event-map`, FAIL-CLOSED on an unmapped event
636
+ # — the copilot precedent, unlike cursor's fail-open) AND a static `context.fileName`
637
+ # bridge sourced from `context-filenames`, in one managed-merge that preserves
638
+ # adopter keys. SINGLE-WRITER (cursor model): the file is written only when the pack
639
+ # ships hook-wiring — repo-scope install writes merge-json targets whole-file, so a
640
+ # settings.json emitted for every pack would clobber another pack's hooks. The
641
+ # `context` bridge rides in that same write; the base `core` pack ships both the
642
+ # session-start wiring and `AGENTS.md`, so the bridge lands with it. `kiro-ide-hook` is dropped
643
+ # (Kiro-only), declared in the table form. Scope prefix is identical at both scopes
644
+ # (the claude-code/cursor pattern), so the user-scope home is the generic
645
+ # user-rooting of the repo-relpath — NO gemini-specific prefix rewrite.
646
+ # Distribution-only: gemini is NOT in SELF_HOST_ADAPTERS.
647
+ # ---------------------------------------------------------------------------
648
+
649
+ [[adapter.gemini.projection]]
650
+ primitive = "skill"
651
+ mode = "direct-directory"
652
+ target-path = ".gemini/skills/"
653
+ on-conflict = "prompt-then-preserve"
654
+
655
+ [[adapter.gemini.projection]]
656
+ primitive = "agent"
657
+ mode = "direct-file"
658
+ target-path = ".gemini/agents/"
659
+ frontmatter-mapping = "gemini-agent-frontmatter"
660
+ on-conflict = "prompt-then-preserve"
661
+
662
+ [[adapter.gemini.projection]]
663
+ primitive = "hook-body"
664
+ mode = "direct-file"
665
+ target-path = ".gemini/hooks/"
666
+ on-conflict = "prompt-then-preserve"
667
+
668
+ [[adapter.gemini.projection]]
669
+ primitive = "hook-wiring"
670
+ mode = "merge-json"
671
+ target-path = ".gemini/settings.json"
672
+ managed-key = "hooks"
673
+ on-conflict = "merge-managed-key-only"
674
+ # Hook-event map (RFC-0027 decision 6). Our hook-wiring source uses Claude-native
675
+ # PascalCase event names (e.g. `[[hooks.SessionStart]]`); Gemini's settings.json
676
+ # uses its own event vocabulary. gemini.py's settings-merge helper reads this table
677
+ # to translate each source event; a source event with no entry here **fails the
678
+ # build** (fail-closed — the copilot-hooks-json precedent, deliberately unlike
679
+ # cursor's fail-open drop-with-log). The map lives in the contract, not the adapter
680
+ # code.
681
+ hook-event-map = { SessionStart = "SessionStart", SessionEnd = "SessionEnd", UserPromptSubmit = "BeforeAgent", PreToolUse = "BeforeTool", PostToolUse = "AfterTool", Stop = "AfterAgent" }
682
+ # Static `context.fileName` bridge (RFC-0027 decision 5). gemini.py's settings-merge
683
+ # helper emits `context = { fileName = <this list> }` into the same `.gemini/settings.json`
684
+ # so Gemini CLI reads the canonical `AGENTS.md` (and `GEMINI.md` if present). Data
685
+ # lives in the contract, not a literal in code; written in the single hook-wiring
686
+ # settings.json write (core ships both the wiring and AGENTS.md).
687
+ context-filenames = ["AGENTS.md", "GEMINI.md"]
688
+
689
+ [[adapter.gemini.projection]]
690
+ primitive = "command"
691
+ mode = "gemini-command-toml"
692
+ target-path = ".gemini/commands/"
693
+ on-conflict = "prompt-then-preserve"
694
+
695
+ # kiro-ide-hook — dropped (Kiro-only primitive). Declared in the table form, not the
696
+ # projection array, because the schema's array `primitive` enum admits only the five
697
+ # standard primitives (the kiro-ide / kiro-cli / cursor precedent).
698
+ [adapter.gemini.projections.kiro-ide-hook]
699
+ mode = "dropped"
700
+
701
+ # Scope dimension for Gemini (RFC-0027 / ADR-0016). Gemini's `.gemini/` prefix is
702
+ # identical at repo and user scope (the claude-code/cursor shape), so the divergent
703
+ # user-scope home is produced by the generic user-root resolution, not a
704
+ # gemini-specific prefix rewrite. Every projected target (skills, agents, commands,
705
+ # settings.json, AND hook bodies at `.gemini/hooks/`) is under `.gemini/`, so the
706
+ # two allowed-prefix lists are identical. `.agentbundle/` carries the install state
707
+ # file at both scopes.
708
+ [adapter.gemini.scope]
709
+ repo = "."
710
+ user = "~"
711
+ allowed-prefixes.repo = [".gemini/", ".agentbundle/"]
712
+ allowed-prefixes.user = [".gemini/", ".agentbundle/"]
713
+
491
714
  # ---------------------------------------------------------------------------
492
715
  # Frontmatter mappings — rewrite rules applied when projecting a primitive
493
716
  # ---------------------------------------------------------------------------
@@ -541,15 +764,19 @@ values = { Read = "read", Grep = "grep", Glob = "glob", Edit = "write", Write =
541
764
  rename = "model"
542
765
  values = { opus = "claude-opus-4.6", sonnet = "claude-sonnet-4.5", haiku = "claude-haiku-4.5" }
543
766
 
544
- # Codex agent frontmatter v0.8 (docs/specs/dropped-primitives-coverage):
767
+ # Codex agent frontmatter v0.8 (docs/specs/dropped-primitives-coverage,
768
+ # amended by docs/specs/codex-agent-config-projection):
545
769
  # rewrite rules from claude-code-style markdown agent (YAML frontmatter with
546
770
  # `name`, `description`, optionally `tools`, `model`) to codex's TOML agent
547
- # shape (`name`, `description`, `developer_instructions`). The markdown body
548
- # lands in TOML `developer_instructions` via a mode-level convention in the
549
- # `codex-agent-toml` projection mode, NOT via a rename rule (frontmatter
550
- # mapping is keyed on frontmatter fields; the body is not one). Fields not
551
- # in this mapping (e.g., `tools`, `model`) drop silently codex TOML agent
552
- # format has no equivalent slots; a future RFC can add MCP-server mapping.
771
+ # shape. `model` maps Claude-style aliases to OpenAI model IDs. `tools`
772
+ # maps Claude-style tool names to Codex capability intents; the
773
+ # `codex-agent-toml` projection reduces duplicate intents to documented
774
+ # config keys (`sandbox_mode`, `[features].shell_tool`, `web_search`,
775
+ # `[tools].web_search`) and never emits a generic `tools = [...]` array.
776
+ # The markdown body lands in TOML `developer_instructions` via a
777
+ # mode-level convention in the `codex-agent-toml` projection mode, NOT
778
+ # via a rename rule (frontmatter mapping is keyed on frontmatter fields;
779
+ # the body is not one).
553
780
  [frontmatter-mapping."codex-agent-frontmatter-v0.8"]
554
781
 
555
782
  [frontmatter-mapping."codex-agent-frontmatter-v0.8".name]
@@ -558,6 +785,15 @@ rename = "name"
558
785
  [frontmatter-mapping."codex-agent-frontmatter-v0.8".description]
559
786
  rename = "description"
560
787
 
788
+ [frontmatter-mapping."codex-agent-frontmatter-v0.8".tools]
789
+ normalize = "to-list"
790
+ values = { Read = "read", Grep = "read", Glob = "read", Edit = "write", Write = "write", MultiEdit = "write", Bash = "shell", WebFetch = "web_search", WebSearch = "web_search" }
791
+
792
+ [frontmatter-mapping."codex-agent-frontmatter-v0.8".model]
793
+ rename = "model"
794
+ values = { opus = "gpt-5.5", sonnet = "gpt-5.5", haiku = "gpt-5.4-mini" }
795
+ related-values = { model_reasoning_effort = { opus = "xhigh", sonnet = "medium", haiku = "medium" } }
796
+
561
797
  # Copilot agent frontmatter v0.10 (RFC-0024 / docs/specs/copilot-full-parity):
562
798
  # rewrite rules from claude-code-style markdown agent (YAML frontmatter with
563
799
  # `name`, `description`, optionally `tools`, `model`) to Copilot's `.agent.md`
@@ -575,10 +811,55 @@ rename = "name"
575
811
  [frontmatter-mapping."copilot-agent-frontmatter-v0.10".description]
576
812
  rename = "description"
577
813
 
578
- # ---------------------------------------------------------------------------
579
- # Frontmatter defaults fields injected when a primitive has no frontmatter
580
- # ---------------------------------------------------------------------------
814
+ # Cursor agent frontmatter v0.11 (RFC-0026 / docs/specs/cursor-full-parity):
815
+ # rewrite rules from claude-code-style markdown agent (YAML frontmatter with
816
+ # `name`, `description`, optionally `tools`, `model`) to Cursor's subagent `.md`
817
+ # shape. `name` / `description` / `model` pass through (identity renames; `model`
818
+ # is emitted verbatim — Cursor resolves a known id or falls back to inherit, no
819
+ # alias translation). `tools` is **absent** from this mapping: Cursor subagents
820
+ # have no per-agent tool allowlist, so `cursor.py` drops the source `tools` and
821
+ # derives a `readonly` flag for non-mutating agents (an agent whose declared
822
+ # tool set contains none of Edit/Write/MultiEdit/NotebookEdit). `is_background`
823
+ # is not emitted. This is the documented-degradation shape ADR-0013 accepted for
824
+ # Copilot's tool handling.
825
+ [frontmatter-mapping."cursor-agent-frontmatter-v0.11"]
826
+
827
+ [frontmatter-mapping."cursor-agent-frontmatter-v0.11".name]
828
+ rename = "name"
829
+
830
+ [frontmatter-mapping."cursor-agent-frontmatter-v0.11".description]
831
+ rename = "description"
581
832
 
582
- # Copilot instruction file default: applyTo covers the whole repo.
583
- [frontmatter-default."copilot-instruction"]
584
- applyTo = "**"
833
+ [frontmatter-mapping."cursor-agent-frontmatter-v0.11".model]
834
+ rename = "model"
835
+
836
+ # Gemini agent frontmatter (RFC-0027 / docs/specs/gemini-full-parity, v0.13):
837
+ # rewrite rules from claude-code-style markdown agent (YAML frontmatter with
838
+ # `name`, `description`, optionally `tools`, `model`) to Gemini CLI's subagent `.md`
839
+ # shape. `name` / `description` pass through (identity renames). Unlike Cursor,
840
+ # Gemini has a real per-agent tool allowlist, so `tools` is KEPT and name-mapped to
841
+ # Gemini's built-in tool identifiers (`normalize = "to-list"`, applied per element;
842
+ # duplicates collapse — `Edit`+`MultiEdit`→single `replace` — and an unmapped token
843
+ # drops with a build-time log line). `model` aliases map to Gemini model IDs; a
844
+ # source value not in the map drops, leaving Gemini's default.
845
+ [frontmatter-mapping."gemini-agent-frontmatter"]
846
+
847
+ [frontmatter-mapping."gemini-agent-frontmatter".name]
848
+ rename = "name"
849
+
850
+ [frontmatter-mapping."gemini-agent-frontmatter".description]
851
+ rename = "description"
852
+
853
+ [frontmatter-mapping."gemini-agent-frontmatter".tools]
854
+ normalize = "to-list"
855
+ # Claude Code tool names → Gemini CLI built-in tool identifiers
856
+ # (https://google-gemini.github.io/gemini-cli/docs/tools/). `MultiEdit` maps to
857
+ # `replace` for parity with the codex/claude/kiro maps (collapses onto `Edit`).
858
+ values = { Read = "read_file", Grep = "grep_search", Glob = "glob", Edit = "replace", MultiEdit = "replace", Write = "write_file", Bash = "run_shell_command", WebFetch = "web_fetch", WebSearch = "google_web_search", LS = "list_directory" }
859
+
860
+ [frontmatter-mapping."gemini-agent-frontmatter".model]
861
+ rename = "model"
862
+ # Tier-preserving map to Gemini's stable 2.5 line. opus→pro (most capable),
863
+ # sonnet→flash (balanced), haiku→flash-lite (fastest). A source value not in the
864
+ # map is dropped, leaving Gemini's CLI default.
865
+ values = { opus = "gemini-2.5-pro", sonnet = "gemini-2.5-flash", haiku = "gemini-2.5-flash-lite" }