@kuznai/inception-engine 0.18.0 → 0.20.0

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 (109) hide show
  1. package/README.md +72 -43
  2. package/dist/{config → src/config}/agents.js +174 -24
  3. package/dist/src/core/adapters/agent-definitions.d.ts +8 -0
  4. package/dist/src/core/adapters/agent-definitions.js +162 -0
  5. package/dist/{core → src/core}/adapters/frontmatter.d.ts +10 -0
  6. package/dist/{core → src/core}/adapters/frontmatter.js +23 -6
  7. package/dist/{core → src/core}/adapters/index.d.ts +1 -1
  8. package/dist/{core → src/core}/adapters/index.js +4 -4
  9. package/dist/{core → src/core}/adapters/mcp.d.ts +2 -2
  10. package/dist/{core → src/core}/adapters/mcp.js +21 -24
  11. package/dist/{core → src/core}/adapters/permissions.js +16 -20
  12. package/dist/{core → src/core}/adapters/rules.d.ts +2 -2
  13. package/dist/src/core/adapters/rules.js +126 -0
  14. package/dist/src/core/capabilities.d.ts +47 -0
  15. package/dist/src/core/capabilities.js +280 -0
  16. package/dist/{core → src/core}/deploy.d.ts +1 -1
  17. package/dist/{core → src/core}/deploy.js +273 -92
  18. package/dist/{core → src/core}/init.js +126 -52
  19. package/dist/src/core/merge-patch.d.ts +4 -0
  20. package/dist/src/core/merge-patch.js +46 -0
  21. package/dist/{core → src/core}/ownership.d.ts +2 -2
  22. package/dist/{core → src/core}/ownership.js +13 -0
  23. package/dist/{core → src/core}/preflight.d.ts +1 -1
  24. package/dist/src/core/preflight.js +280 -0
  25. package/dist/{core → src/core}/resolve.d.ts +1 -1
  26. package/dist/{core → src/core}/resolve.js +7 -4
  27. package/dist/{core → src/core}/revert.js +95 -33
  28. package/dist/{core → src/core}/runtime-paths.d.ts +2 -1
  29. package/dist/{core → src/core}/runtime-paths.js +30 -23
  30. package/dist/{core → src/core}/validation.d.ts +10 -1
  31. package/dist/{core → src/core}/validation.js +75 -0
  32. package/dist/src/formatters.d.ts +5 -0
  33. package/dist/src/formatters.js +58 -0
  34. package/dist/{index.js → src/index.js} +8 -24
  35. package/dist/src/logger.js +62 -0
  36. package/dist/{schemas → src/schemas}/manifest.d.ts +22 -0
  37. package/dist/{schemas → src/schemas}/manifest.js +19 -5
  38. package/dist/{schemas → src/schemas}/registry.d.ts +74 -0
  39. package/dist/{schemas → src/schemas}/registry.js +18 -3
  40. package/dist/{types.d.ts → src/types.d.ts} +60 -0
  41. package/dist/test/helpers/fs.d.ts +2 -0
  42. package/dist/test/helpers/fs.js +17 -0
  43. package/dist/test/helpers/path.d.ts +10 -0
  44. package/dist/test/helpers/path.js +15 -0
  45. package/dist/test/helpers/skill-dir-scenarios.d.ts +7 -0
  46. package/dist/test/helpers/skill-dir-scenarios.js +206 -0
  47. package/dist/test/helpers/skill-dir.d.ts +7 -0
  48. package/dist/test/helpers/skill-dir.js +46 -0
  49. package/dist/test/os/cross-platform/cross-platform.test.d.ts +1 -0
  50. package/dist/test/os/cross-platform/cross-platform.test.js +328 -0
  51. package/dist/test/os/posix/skill-dir.test.d.ts +1 -0
  52. package/dist/test/os/posix/skill-dir.test.js +19 -0
  53. package/dist/test/os/windows/revert-integration.test.d.ts +1 -0
  54. package/dist/test/os/windows/revert-integration.test.js +72 -0
  55. package/dist/test/os/windows/skill-dir.test.d.ts +1 -0
  56. package/dist/test/os/windows/skill-dir.test.js +19 -0
  57. package/dist/test/unit/adapters.test.d.ts +1 -0
  58. package/dist/test/unit/adapters.test.js +947 -0
  59. package/dist/test/unit/capabilities.test.d.ts +1 -0
  60. package/dist/test/unit/capabilities.test.js +71 -0
  61. package/dist/test/unit/cli.test.d.ts +1 -0
  62. package/dist/test/unit/cli.test.js +834 -0
  63. package/dist/test/unit/deploy.test.d.ts +1 -0
  64. package/dist/test/unit/deploy.test.js +2481 -0
  65. package/dist/test/unit/detect.test.d.ts +1 -0
  66. package/dist/test/unit/detect.test.js +192 -0
  67. package/dist/test/unit/enterprise.test.d.ts +1 -0
  68. package/dist/test/unit/enterprise.test.js +106 -0
  69. package/dist/test/unit/frontmatter.test.d.ts +1 -0
  70. package/dist/test/unit/frontmatter.test.js +102 -0
  71. package/dist/test/unit/gemini-north-star.test.d.ts +1 -0
  72. package/dist/test/unit/gemini-north-star.test.js +243 -0
  73. package/dist/test/unit/manifest.test.d.ts +1 -0
  74. package/dist/test/unit/manifest.test.js +737 -0
  75. package/dist/test/unit/migration-golden.test.d.ts +1 -0
  76. package/dist/test/unit/migration-golden.test.js +197 -0
  77. package/dist/test/unit/ownership.test.d.ts +1 -0
  78. package/dist/test/unit/ownership.test.js +587 -0
  79. package/dist/test/unit/preflight.test.d.ts +1 -0
  80. package/dist/test/unit/preflight.test.js +501 -0
  81. package/dist/test/unit/resolve.test.d.ts +1 -0
  82. package/dist/test/unit/resolve.test.js +119 -0
  83. package/dist/test/unit/revert.test.d.ts +1 -0
  84. package/dist/test/unit/revert.test.js +1004 -0
  85. package/dist/test/unit/toml.test.d.ts +1 -0
  86. package/dist/test/unit/toml.test.js +55 -0
  87. package/package.json +1 -1
  88. package/dist/core/adapters/agent-definitions.d.ts +0 -20
  89. package/dist/core/adapters/agent-definitions.js +0 -90
  90. package/dist/core/adapters/rules.js +0 -103
  91. package/dist/core/preflight.js +0 -98
  92. package/dist/logger.js +0 -61
  93. /package/dist/{config → src/config}/agents.d.ts +0 -0
  94. /package/dist/{config → src/config}/manifest.d.ts +0 -0
  95. /package/dist/{config → src/config}/manifest.js +0 -0
  96. /package/dist/{core → src/core}/adapters/permissions.d.ts +0 -0
  97. /package/dist/{core → src/core}/adapters/toml.d.ts +0 -0
  98. /package/dist/{core → src/core}/adapters/toml.js +0 -0
  99. /package/dist/{core → src/core}/detect.d.ts +0 -0
  100. /package/dist/{core → src/core}/detect.js +0 -0
  101. /package/dist/{core → src/core}/init.d.ts +0 -0
  102. /package/dist/{core → src/core}/revert.d.ts +0 -0
  103. /package/dist/{errors.d.ts → src/errors.d.ts} +0 -0
  104. /package/dist/{errors.js → src/errors.js} +0 -0
  105. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  106. /package/dist/{logger.d.ts → src/logger.d.ts} +0 -0
  107. /package/dist/{schemas → src/schemas}/errors.d.ts +0 -0
  108. /package/dist/{schemas → src/schemas}/errors.js +0 -0
  109. /package/dist/{types.js → src/types.js} +0 -0
package/README.md CHANGED
@@ -8,7 +8,7 @@ GitHub Copilot is no longer treated as a separate instruction or skill target in
8
8
 
9
9
  The broader portability layer is the roadmap direction, but this README focuses on what is working now.
10
10
 
11
- `init` is available as a bootstrap command. It scans for directories containing `SKILL.md`, discovers agent-rules Markdown files using the Claude-first portability conventions, and reads `mcp-servers.json` from the repo root to populate `mcpServers`. `files` and `configs` remain empty — `init` emits guidance when it detects a `files/` or `configs/` directory.
11
+ `init` is available as a bootstrap command. It scans for directories containing `SKILL.md`, discovers agent-rules Markdown files using the Claude-first portability conventions, and reads `mcp-servers.json` from the repo root to populate `mcpServers`. Shared surfaces now default to the primary deploy target in generated manifests: for example, `init` emits `claude-code` rather than `github-copilot` for shared Claude-native skills and rules, and emits `gemini-cli` rather than `antigravity` for shared `GEMINI.md` rules surfaces. `files` and `configs` remain empty — `init` emits guidance when it detects a `files/` or `configs/` directory.
12
12
 
13
13
  ## Quick Start
14
14
 
@@ -27,7 +27,7 @@ inception-engine reads a manifest file (`inception.json`) from the target direct
27
27
 
28
28
  Managed skills overwrite their previous version. If a target exists but was not created by inception-engine, deployment refuses to replace it. On POSIX systems, symlinks mean updates to the source repo are reflected immediately.
29
29
 
30
- Before executing, the deploy command runs preflight analysis on instruction files: it warns when the same agent will have both global and repo `agentRules` active simultaneously, when the same source file is deployed to both scopes (duplicate-content risk), and when `agentRules` or `agentDefinitions` source files exceed 50 KB (context-budget risk). Warnings are printed but do not block deployment.
30
+ Before executing, the deploy command runs preflight analysis on instruction files and capability planning inputs. It validates that `agentRules` and `agentDefinitions` for targets requiring specific structure (like `github-copilot` and `antigravity`) include valid YAML frontmatter with `name` and `description` fields. For `github-copilot`, it further ensures either `tools` or `instructions` are defined; for `antigravity`, it validates the shape of any `mcp-servers` or `mcpServers` defined in the frontmatter. It also warns when a manifest targets a surface that is implementation-only, planned, unsupported, or shared through another agent, when the same agent will have multiple `agentRules` scopes active simultaneously, when the same source file is deployed to multiple scopes (duplicate-content risk), when `agentRules` or `agentDefinitions` source files exceed 50 KB (context-budget risk), and when GitHub Copilot appears to be running under enterprise-managed policy that may override local configuration. Warnings are printed but do not block deployment; structural validation failures block deployment for the affected targets.
31
31
 
32
32
  ## Agent Compatibility Matrix
33
33
 
@@ -50,14 +50,14 @@ Before executing, the deploy command runs preflight analysis on instruction file
50
50
  | Skills (SKILL.md) | All agents via manifest and CLI | All agents |
51
51
  | File write | All agents via manifest and CLI | All agents |
52
52
  | Config patch (JSON merge) | All agents via manifest and CLI | All agents |
53
- | MCP Servers | claude-code, gemini-cli, codex, antigravity, opencode; github-copilot repo-scoped surfaces are warned and skipped | claude-code, gemini-cli, codex, antigravity, opencode |
54
- | Global/Repo Rules Files | All agents via `scope: "global"` (home-dir) or `scope: "repo"` (project-root); antigravity always uses repo-local `.agents/rules/`; github-copilot reads CLAUDE.md natively (deploy via claude-code) | All agents |
55
- | Permissions / Approval Config | claude-code (`~/.claude/settings.json`), codex (`~/.codex/config.toml`); other agents are warned and skipped | claude-code, codex |
56
- | Agent Definitions | claude-code (`{repo}/.claude/agents/{name}.md`), gemini-cli (`{repo}/.gemini/agents/{name}.md`), antigravity (`{repo}/.agents/rules/{name}.md`), opencode (`{repo}/.opencode/agents/{name}.md`), github-copilot (`{repo}/.github/agents/{name}.agent.md`); codex is warned and skipped | All supported agents |
57
- | `init` manifest generation | Scans `SKILL.md` directories (`skills`), `.md` files with Claude-first agent mapping (`agentRules`), `mcp-servers.json` (`mcpServers`), and agent-definition Markdown files (`agentDefinitions`); emits hints for `files/` and `configs/` directories | N/A |
58
- | Instruction preflight analysis | Emits `precedence` warnings when an agent has both global and repo `agentRules` active simultaneously (stacking advisory) or the same source file deployed to both scopes (duplicate-content warning); emits `budget` warnings when `agentRules` or `agentDefinitions` source files exceed 50 KB | N/A |
53
+ | MCP Servers | claude-code (`scope: "global"` → `~/.claude.json`; `scope: "repo"` → `{repo}/.claude/mcp.json`; `scope: "workspace"` → `{workspace}/.claude/mcp.json`), gemini-cli, codex, antigravity, opencode; github-copilot with `scope: "repo"` deploys to `{repo}/.vscode/mcp.json` and `scope: "workspace"` deploys to `{workspace}/.vscode/mcp.json`; github-copilot with `scope: "global"` (default) is unsupported and warns | claude-code, gemini-cli, codex, antigravity, opencode, github-copilot |
54
+ | Global/Repo/Workspace Rules Files | `scope: "global"` and `scope: "repo"` are supported on the implemented agent surfaces; `scope: "workspace"` is supported for `claude-code`, `codex`, and `gemini-cli`; `github-copilot` reads Claude-native rules via `claude-code` and has no separate rules deployment target | All supported agents |
55
+ | Permissions / Approval Config | claude-code (`~/.claude/settings.json`), codex (`~/.codex/config.toml`), opencode (`~/.config/opencode/opencode.json` on POSIX, `%APPDATA%\\opencode\\opencode.json` on Windows); other agents are warned and skipped | claude-code, codex, opencode |
56
+ | Agent Definitions | claude-code (`{repo}/.claude/agents/{name}.md`), gemini-cli (`{repo}/.gemini/agents/{name}.md` or `.toml`, plus `scope: "global"` to `~/.gemini/agents/{name}.md` or `.toml`), antigravity (`{repo}/.agents/rules/{name}.md`), opencode (`{repo}/.opencode/agents/{name}.md`, plus `scope: "global"` to the user config dir), github-copilot (`{repo}/.github/copilot/agents/{name}.md`, with migration from legacy `.github/agents/{name}.agent.md`); codex is warned and skipped | All supported agents |
57
+ | `init` manifest generation | Scans `SKILL.md` directories (`skills`), `.md` files with Claude-first agent mapping (`agentRules`), `mcp-servers.json` (`mcpServers`), and agent-definition Markdown files (`agentDefinitions`); shared surfaces default to the primary deploy target instead of shared riders; emits hints for `files/` and `configs/` directories | N/A |
58
+ | Instruction preflight analysis | Emits capability warnings for implementation-only, planned, unsupported, and shared-through surfaces used by the manifest; emits `precedence` warnings when an agent has multiple `agentRules` scopes active simultaneously or the same source file is deployed to multiple scopes; emits `budget` warnings when `agentRules` or `agentDefinitions` source files exceed 50 KB; emits GitHub Copilot enterprise-policy warnings when local configuration may be overridden; emits a `config-authority` warning when Gemini CLI's `settings.json` contains an `instructionFilename` override that differs from the deploy target | N/A |
59
59
 
60
- Features that depend on agent-specific config surfaces are intentionally conservative: if a target path or schema is not implemented with enough confidence, inception-engine warns and skips it rather than guessing.
60
+ Features that depend on agent-specific config surfaces are intentionally conservative: deploy and preflight now classify each surface through the same planner. If a target path or schema is implementation-only, planned, unsupported, or only shared through another agent, inception-engine warns and either routes through the primary surface or skips it rather than guessing.
61
61
 
62
62
  For GitHub Copilot specifically, the portability rule is Claude-first: if Copilot accepts the same Claude-native instruction or skill artifact, inception-engine should not add a separate Copilot deployment feature for it.
63
63
 
@@ -95,6 +95,12 @@ Create an `inception.json` file at the root of your skills directory:
95
95
  "name": "my-server",
96
96
  "agents": ["claude-code", "gemini-cli"],
97
97
  "config": { "command": "npx", "args": ["-y", "my-mcp-server"] }
98
+ },
99
+ {
100
+ "name": "my-server",
101
+ "agents": ["github-copilot"],
102
+ "scope": "repo",
103
+ "config": { "type": "stdio", "command": "npx", "args": ["-y", "my-mcp-server"] }
98
104
  }
99
105
  ],
100
106
  "agentRules": [
@@ -160,35 +166,46 @@ Each **mcpServer** entry registers an MCP server into the agent's config file by
160
166
  - **name** - Unique identifier (same format as skill names); used as the server's key in the config
161
167
  - **agents** - Array of agent IDs to register this server with
162
168
  - **config** - Raw server descriptor object. For the currently supported JSON-backed adapters, inception-engine requires at least one non-empty `command` or `url` field, validates `args` as an array of strings when present, and validates `env` as a string-to-string object when present. Additional keys are passed through verbatim.
169
+ - **scope** - `"global"` (default), `"repo"`, or `"workspace"`. For most agents this field is ignored (they have only a single user-level config path). For `github-copilot`, `scope` selects the target file:
170
+ - `"global"` — unsupported; emits a warning and is skipped
171
+ - `"repo"` — deploys to `{repo}/.vscode/mcp.json` under the `servers` key
172
+ - `"workspace"` — deploys to `{workspace}/.vscode/mcp.json` under the `servers` key
163
173
 
164
- MCP server registration is supported for all agents except GitHub Copilot. Inception-engine automatically uses the correct adapter for each agent's configuration schema:
165
- - **JSON (Merge Patch)**: `claude-code` (`~/.claude.json`), `gemini-cli` (`~/.gemini/settings.json`), and `opencode` (`~/.config/opencode/opencode.json` using the custom `"mcp"` key).
174
+ GitHub Copilot's `.vscode/mcp.json` uses `servers` (not `mcpServers`) as the top-level key and optionally accepts a `type` field (`"stdio"` | `"sse"` | `"http"`) in the server descriptor, which is passed through verbatim.
175
+
176
+ MCP server registration is supported for all agents. Inception-engine automatically uses the correct adapter for each agent's configuration schema:
177
+ - **JSON (Merge Patch)**: `claude-code` (`~/.claude.json` for `scope: "global"`; `{repo}/.claude/mcp.json` for `scope: "repo"`; `{workspace}/.claude/mcp.json` for `scope: "workspace"`), `gemini-cli` (`~/.gemini/settings.json`), `opencode` (`~/.config/opencode/opencode.json` using the custom `"mcp"` key), and `github-copilot` (`{repo}/.vscode/mcp.json` or `{workspace}/.vscode/mcp.json` using the `"servers"` key).
166
178
  - **TOML (Patch)**: `codex` (`~/.codex/config.toml`).
167
179
  - **Markdown Frontmatter (Emit)**: `antigravity` (repo-local `.agents/rules/{name}.md` files).
168
180
 
169
- Revert removes the registered server entry from the respective configuration file. GitHub Copilot, which uses repo-scoped MCP surfaces not yet implemented by inception-engine, continues to emit a schema-aware warning and is skipped.
181
+ For Markdown frontmatter targets, inception-engine now records patch-level provenance for the emitted frontmatter block. Deploy merges only the owned frontmatter keys, preserves unrelated frontmatter and Markdown body content, and `revert` removes only the engine-owned keys instead of deleting the whole file unless inception-engine originally created an otherwise-empty file.
182
+
183
+ Because Antigravity currently reuses `.agents/rules/{name}.md` for both MCP frontmatter emit and agent-definition files, planning now rejects a manifest when an `mcpServers` entry and an `agentDefinitions` entry would resolve to the same Antigravity target.
184
+
185
+ Revert removes the registered server entry from the respective configuration file or frontmatter block.
170
186
 
171
187
  Each **agentRules** entry deploys a Markdown instruction file to an agent's supported instruction file location:
172
188
 
173
189
  - **name** - Unique identifier (same format as skill names)
174
190
  - **path** - Relative path to the source Markdown file within the repo; supported rules adapters require a `.md` or `.markdown` source path
175
191
  - **agents** - Array of agent IDs to deploy this file to
176
- - **scope** - `"global"` (default) or `"repo"`. Controls which instruction surface is targeted:
177
- - `"global"` — deploys to the agent's home-directory instruction file (e.g., `~/.claude/CLAUDE.md` for `claude-code`)
178
- - `"repo"` — deploys to the project-root instruction file inside the deployed repository (e.g., `{repo}/CLAUDE.md` for `claude-code`)
192
+ - **scope** - `"global"` (default), `"repo"`, or `"workspace"`. Controls which instruction surface is targeted:
193
+ - `"global"` — deploys to the agent's home-directory instruction file when that surface is supported (e.g., `~/.claude/CLAUDE.md` for `claude-code`)
194
+ - `"repo"` — deploys to the project-root instruction file inside the deployed repository when that surface is supported (e.g., `{repo}/CLAUDE.md` for `claude-code`)
195
+ - `"workspace"` — deploys to the workspace-root instruction file when an agent exposes one (e.g., `{workspace}/CLAUDE.md` for `claude-code`); when unsupported, deployment is skipped with a warning
179
196
 
180
- Instruction rule deployment is supported for all agents. The target path depends on the agent and the `scope`:
197
+ Instruction rule deployment is supported for implemented global, repo, and workspace surfaces. The target path depends on the agent and the `scope`:
181
198
 
182
- | Agent | `scope: "global"` | `scope: "repo"` |
183
- |---|---|---|
184
- | `claude-code` | `~/.claude/CLAUDE.md` | `{repo}/CLAUDE.md` |
185
- | `codex` | `~/.codex/AGENTS.md` | `{repo}/AGENTS.md` |
186
- | `gemini-cli` | `~/.gemini/GEMINI.md` | `{repo}/GEMINI.md` |
187
- | `antigravity` | `{repo}/.agents/rules/{name}.md` | `{repo}/.agents/rules/{name}.md` |
188
- | `opencode` | `~/.config/opencode/AGENTS.md` | `{repo}/AGENTS.md` |
189
- | `github-copilot` | unsupported reads `CLAUDE.md` natively | unsupported deploy via `claude-code` |
199
+ | Agent | `scope: "global"` | `scope: "repo"` | `scope: "workspace"` |
200
+ |---|---|---|---|
201
+ | `claude-code` | `~/.claude/CLAUDE.md` | `{repo}/CLAUDE.md` | `{workspace}/CLAUDE.md` |
202
+ | `codex` | `~/.codex/AGENTS.md` | `{repo}/AGENTS.md` | `{workspace}/AGENTS.md` |
203
+ | `gemini-cli` | `~/.gemini/GEMINI.md` | `{repo}/GEMINI.md` | `{workspace}/GEMINI.md` |
204
+ | `antigravity` | `~/.gemini/GEMINI.md` | `{repo}/GEMINI.md` | unsupported; warns and skips |
205
+ | `opencode` | `~/.config/opencode/AGENTS.md` | `{repo}/AGENTS.md` | unsupported; warns and skips |
206
+ | `github-copilot` | unsupported / Claude-first | deploy via `claude-code` | unsupported; deploy via `claude-code` with `scope: "workspace"` |
190
207
 
191
- For `antigravity`, both scopes target the same repo-local surface (`{repo}/.agents/rules/{name}.md`) since Antigravity has no global home-directory instruction file. For `github-copilot`, no separate deployment is needed for either scope — target it via the `claude-code` agentRules entry and it reaches Copilot automatically. Revert removes the deployed rules file.
208
+ For `antigravity`, `agentRules` now targets the shared GEMINI.md surface (`~/.gemini/GEMINI.md` for `global`, `{repo}/GEMINI.md` for `repo`) the same paths used by `gemini-cli`. When both agents appear in the same entry, deduplication ensures only one write action is emitted. `workspace` scope is not supported and is skipped with a warning. For `github-copilot`, no separate deployment is needed — target it via the `claude-code` agentRules entry and it reaches Copilot automatically. Revert removes the deployed rules file.
192
209
 
193
210
  Each **permissions** entry deploys execution and safety-oriented configuration to an agent's permission or approval surface:
194
211
 
@@ -231,20 +248,28 @@ Valid `approval_policy` values are `"auto"`, `"manual"`, `"suggest"`, and `"on-f
231
248
 
232
249
  Revert restores the previous config values using the undo patch recorded at deploy time.
233
250
 
234
- Each **agentDefinitions** entry deploys a Markdown agent-definition file to the repo-local agent-definitions directory of each targeted agent:
251
+ Each **agentDefinitions** entry deploys an agent-definition file to the agent-definition directory of each targeted agent. `scope: "repo"` is the default, and some agents also support `scope: "global"`:
235
252
 
236
253
  - **name** - Unique identifier (same format as skill names); used as the definition filename
237
- - **path** - Relative path to the source Markdown file within the repo; must be a `.md` or `.markdown` file
254
+ - **path** - Relative path to the source file within the repo; `.md` or `.markdown` for Markdown definitions, `.toml` for Gemini CLI TOML subagent definitions
238
255
  - **agents** - Array of agent IDs to deploy this definition to
239
256
 
240
- Agent-definition deployment is supported for `claude-code`, `gemini-cli`, `antigravity`, `opencode`, and `github-copilot`. For `codex`, inception-engine emits a warning and skips the entry use `agentRules` to deploy persona instructions to Codex instead.
257
+ Agent-definition deployment is supported for `claude-code`, `gemini-cli`, `antigravity`, `opencode`, and `github-copilot`. For `codex`, inception-engine emits a warning and skips the entry. Gemini CLI and OpenCode also support `scope: "global"` definitions; other supported agents are repo-local only.
258
+
259
+ Gemini CLI supports two definition formats: Markdown (`.md`) files deploy to `{scope}/.gemini/agents/{name}.md`, and TOML (`.toml`) subagent configuration files deploy to `{scope}/.gemini/agents/{name}.toml`. TOML files are deployed verbatim without frontmatter validation. Agents other than `gemini-cli` that do not have a TOML definition surface silently produce no action when a `.toml` source is specified.
241
260
 
242
- All targets are repo-local (they land inside the repository being deployed, not the user's home directory):
261
+ Repo-local targets:
243
262
  - **claude-code**: `{repo}/.claude/agents/{name}.md`
244
- - **gemini-cli**: `{repo}/.gemini/agents/{name}.md`
263
+ - **gemini-cli**: `{repo}/.gemini/agents/{name}.md` (Markdown) or `{repo}/.gemini/agents/{name}.toml` (TOML)
245
264
  - **antigravity**: `{repo}/.agents/rules/{name}.md`
246
265
  - **opencode**: `{repo}/.opencode/agents/{name}.md`
247
- - **github-copilot**: `{repo}/.github/agents/{name}.agent.md` (note the `.agent.md` suffix)
266
+ - **github-copilot**: `{repo}/.github/copilot/agents/{name}.md`
267
+
268
+ Global targets where supported:
269
+ - **gemini-cli**: `~/.gemini/agents/{name}.md` or `~/.gemini/agents/{name}.toml`
270
+ - **opencode**: `~/.config/opencode/agents/{name}.md` on POSIX, `%APPDATA%\\opencode\\agents\\{name}.md` on Windows
271
+
272
+ For GitHub Copilot, deploy also records migration from the legacy `{repo}/.github/agents/{name}.agent.md` path so older installs can be cleaned up safely.
248
273
 
249
274
  Revert removes the deployed agent-definition file.
250
275
 
@@ -275,12 +300,12 @@ Current `init` behavior:
275
300
  - Uses the directory name as the manifest skill name
276
301
  - Applies either the `--agents` list or all currently known agent IDs
277
302
  - Refuses to overwrite an existing `inception.json` unless `--force` is provided
278
- - Supports `--dry-run` so you can inspect the generated manifest before writing it
279
- - Discovers agent-rules Markdown files in the root and conventional subdirectories (`rules/`, `instructions/`, `.github/`, `.agents/rules/`), mapping them to agents using Claude-first portability conventions: `copilot-instructions.md` maps to `claude-code` (Copilot reads `CLAUDE.md` natively), and the fallback for unrecognized files excludes agents whose agentRules surface is unsupported
303
+ - Supports `--plan` so you can inspect the generated manifest before writing it
304
+ - Discovers agent-rules Markdown files in the root and conventional subdirectories (`rules/`, `instructions/`, `.github/`), mapping them to agents using Claude-first portability conventions: `copilot-instructions.md` maps to `claude-code` (Copilot reads `CLAUDE.md` natively), and the fallback for unrecognized files excludes unsupported agents plus shared-surface riders that should default to their primary deploy target
280
305
  - Reads `mcp-servers.json` from the repo root (if present) and generates `mcpServers` entries; invalid entries are warned and skipped
281
306
  - Reads `files-manifest.json` from the repo root (if present) and generates `files` entries; invalid entries are warned and skipped
282
307
  - Reads `configs-manifest.json` from the repo root (if present) and generates `configs` entries; invalid entries are warned and skipped
283
- - Reads `agent-definitions-manifest.json` from the repo root (if present) and generates `agentDefinitions` entries; if absent, auto-discovers agent-definition Markdown files from `.claude/agents/`, `.gemini/agents/`, `.agents/rules/`, `.opencode/agents/`, and `.github/agents/`; invalid entries are warned and skipped
308
+ - Reads `agent-definitions-manifest.json` from the repo root (if present) and generates `agentDefinitions` entries; if absent, auto-discovers agent-definition Markdown files from `.claude/agents/`, `.gemini/agents/`, `.agents/rules/`, `.opencode/agents/`, `.github/copilot/agents/`, and legacy `.github/agents/`; invalid entries are warned and skipped
284
309
  - Emits guidance to create a sidecar manifest when a `files/` or `configs/` directory is detected but the corresponding sidecar file is absent
285
310
 
286
311
  Current `init` limitations:
@@ -342,10 +367,12 @@ Place an `agent-definitions-manifest.json` file at the repo root to have `init`
342
367
  ]
343
368
  ```
344
369
 
345
- If no `agent-definitions-manifest.json` is present, `init` auto-discovers agent-definition Markdown files from five conventional subdirectories: `.claude/agents/`, `.gemini/agents/`, `.agents/rules/`, `.opencode/agents/`, and `.github/agents/`. Each discovered file is mapped to the owning agent(s). GitHub Copilot files named `{name}.agent.md` have the `.agent` infix stripped to derive the manifest name (e.g., `foo.agent.md` name `foo`).
370
+ If no `agent-definitions-manifest.json` is present, `init` auto-discovers agent-definition Markdown files from six conventional subdirectories: `.claude/agents/`, `.gemini/agents/`, `.agents/rules/`, `.opencode/agents/`, `.github/copilot/agents/`, and legacy `.github/agents/`. Each discovered file is mapped to the owning agent(s). GitHub Copilot files named `{name}.agent.md` in the legacy directory have the `.agent` infix stripped to derive the manifest name (e.g., `foo.agent.md` -> name `foo`).
346
371
 
347
372
  Invalid entries are warned and skipped; the rest are written into the generated manifest verbatim.
348
373
 
374
+ For shared surfaces, `init` prefers the primary deploy target instead of emitting both agents. That means generated `skills` entries exclude `github-copilot` in favor of `claude-code`, and generated shared `GEMINI.md` `agentRules` entries exclude `antigravity` in favor of `gemini-cli`. This keeps starter manifests minimal while preserving deploy behavior for explicitly authored shared-rider entries.
375
+
349
376
  ## CLI Reference
350
377
 
351
378
  ```
@@ -366,13 +393,15 @@ inception-engine init <directory> [options]
366
393
 
367
394
  | Option | Description |
368
395
  |---|---|
369
- | `--dry-run` | Show what would be done without making changes |
396
+ | `--plan` | Show what would be done without making changes |
370
397
  | `--agents <list>` | Comma-separated list of agent IDs to target (overrides deploy detection; restricts revert) |
371
398
  | `--force` | `init` only; overwrite an existing `inception.json` |
372
399
  | `--verbose` | Show detailed output including file paths |
373
400
  | `--debug` | Show full error stack traces |
374
401
  | `--help` | Show help message |
375
402
 
403
+ With `--plan`, deploy and revert print a grouped action preview by agent. Each planned change includes the source path when applicable, the resolved target path, and action-specific details such as JSON/TOML patch payloads or emitted frontmatter content.
404
+
376
405
  ### Examples
377
406
 
378
407
  ```bash
@@ -380,7 +409,7 @@ inception-engine init <directory> [options]
380
409
  npx @kuznai/inception-engine ./my-skills-repo
381
410
 
382
411
  # Preview what would be deployed
383
- npx @kuznai/inception-engine ./my-skills-repo --dry-run
412
+ npx @kuznai/inception-engine ./my-skills-repo --plan
384
413
 
385
414
  # Deploy only to Claude Code and Codex
386
415
  npx @kuznai/inception-engine ./my-skills-repo --agents claude-code,codex
@@ -389,13 +418,13 @@ npx @kuznai/inception-engine ./my-skills-repo --agents claude-code,codex
389
418
  npx @kuznai/inception-engine revert ./my-skills-repo
390
419
 
391
420
  # Preview what would be removed
392
- npx @kuznai/inception-engine revert ./my-skills-repo --dry-run
421
+ npx @kuznai/inception-engine revert ./my-skills-repo --plan
393
422
 
394
423
  # Generate a starter manifest from discovered skill folders
395
424
  npx @kuznai/inception-engine init ./my-skills-repo
396
425
 
397
426
  # Preview the generated manifest without writing it
398
- npx @kuznai/inception-engine init ./my-skills-repo --dry-run
427
+ npx @kuznai/inception-engine init ./my-skills-repo --plan
399
428
  ```
400
429
 
401
430
  ## Sample Skills
@@ -405,8 +434,8 @@ The `limbo/` directory contains exceptional sample skills for testing purposes o
405
434
  Try them out:
406
435
 
407
436
  ```bash
408
- npx @kuznai/inception-engine init limbo --dry-run
409
- npx @kuznai/inception-engine limbo --dry-run
437
+ npx @kuznai/inception-engine init limbo --plan
438
+ npx @kuznai/inception-engine limbo --plan
410
439
  ```
411
440
 
412
441
  ## Agent Detection
@@ -430,11 +459,11 @@ Revert targets all agents listed in the manifest by default (regardless of detec
430
459
 
431
460
  ### Ownership Tracking and Safe Revert
432
461
 
433
- inception-engine maintains a centralized deployment registry at `~/.inception-engine/registry.json`. Each deploy records the target path, skill name, agent ID, action-specific provenance (`source`/`method` for skill-dir, `source` for file-write, `patch`/`undoPatch` for config-patch), and timestamp. No files are written to the source repository.
462
+ inception-engine maintains a centralized deployment registry at `~/.inception-engine/registry.json`. Each deploy records the target path, skill name, agent ID, action-specific provenance (`source`/`method` for skill-dir, `source` for file-write, `patch`/`undoPatch` for config-patch, `patch`/`undoPatch` plus frontmatter-shape metadata for frontmatter-emit), and timestamp. Registry entries also carry a stable surface ID so future surface migrations can preserve ownership continuity. No files are written to the source repository.
434
463
 
435
464
  - **Registry-based ownership**: On revert, the registry is checked before removing any target. Only targets with a valid registry entry are removed. On redeploy, unmanaged targets are never replaced.
436
465
 
437
- - **Strong binding**: Each registry entry binds a specific target path to its skill, agent, and action kind. For `skill-dir` and `file-write`, ownership checks also require the recorded `source` to match before an existing target is treated as managed. For `config-patch`, overwrite protection is keyed by target path, kind, skill, and agent; the stored `patch` and `undoPatch` are used for revert bookkeeping rather than deploy-time identity checks.
466
+ - **Strong binding**: Each registry entry binds a specific target path to its skill, agent, and action kind. For `skill-dir` and `file-write`, ownership checks also require the recorded `source` to match before an existing target is treated as managed. For `config-patch` and `frontmatter-emit`, overwrite protection is keyed by target path, kind, skill, and agent; the stored `patch` and `undoPatch` are used for patch-level revert bookkeeping rather than deploy-time identity checks.
438
467
 
439
468
  - **Atomic redeploy**: When overwriting an existing managed `skill-dir` target, the engine renames the old target to a backup, creates the new deployment, and only removes the backup on success. If the new deployment fails, the backup is restored. `file-write` and `config-patch` deployments write directly to the target without this backup/rollback model.
440
469
 
@@ -28,6 +28,22 @@ export const AGENT_REGISTRY = [
28
28
  windows: ["{home}", ".claude.json"],
29
29
  },
30
30
  },
31
+ mcpRepoSupport: {
32
+ status: "supported",
33
+ schemaLabel: "repo-local .claude/mcp.json",
34
+ path: {
35
+ posix: ["{repo}", ".claude", "mcp.json"],
36
+ windows: ["{repo}", ".claude", "mcp.json"],
37
+ },
38
+ },
39
+ mcpWorkspaceSupport: {
40
+ status: "supported",
41
+ schemaLabel: "workspace-local .claude/mcp.json",
42
+ path: {
43
+ posix: ["{workspace}", ".claude", "mcp.json"],
44
+ windows: ["{workspace}", ".claude", "mcp.json"],
45
+ },
46
+ },
31
47
  agentRulesSupport: {
32
48
  status: "supported",
33
49
  schemaLabel: "global Markdown rules file",
@@ -52,7 +68,7 @@ export const AGENT_REGISTRY = [
52
68
  windows: ["{home}", ".claude", "settings.json"],
53
69
  },
54
70
  },
55
- agentDefinitionsSupport: {
71
+ agentDefinitionsRepoSupport: {
56
72
  status: "supported",
57
73
  schemaLabel: "repo-local agent definition Markdown file",
58
74
  path: {
@@ -60,6 +76,14 @@ export const AGENT_REGISTRY = [
60
76
  windows: ["{repo}", ".claude", "agents", "{name}.md"],
61
77
  },
62
78
  },
79
+ agentRulesWorkspaceSupport: {
80
+ status: "supported",
81
+ schemaLabel: "workspace-local CLAUDE.md",
82
+ path: {
83
+ posix: ["{workspace}", "CLAUDE.md"],
84
+ windows: ["{workspace}", "CLAUDE.md"],
85
+ },
86
+ },
63
87
  },
64
88
  {
65
89
  id: "codex",
@@ -112,11 +136,19 @@ export const AGENT_REGISTRY = [
112
136
  windows: ["{home}", ".codex", "config.toml"],
113
137
  },
114
138
  },
115
- agentDefinitionsSupport: {
139
+ agentDefinitionsRepoSupport: {
116
140
  status: "unsupported",
117
141
  schemaLabel: "dedicated agent definition directory",
118
142
  reason: "OpenAI Codex does not expose a documented dedicated per-agent definition directory surface separate from AGENTS.md and config.toml — use agentRules to deploy persona instructions instead",
119
143
  },
144
+ agentRulesWorkspaceSupport: {
145
+ status: "supported",
146
+ schemaLabel: "workspace-local AGENTS.md",
147
+ path: {
148
+ posix: ["{workspace}", "AGENTS.md"],
149
+ windows: ["{workspace}", "AGENTS.md"],
150
+ },
151
+ },
120
152
  },
121
153
  {
122
154
  id: "gemini-cli",
@@ -136,7 +168,7 @@ export const AGENT_REGISTRY = [
136
168
  detectBinary: "documented",
137
169
  mcpConfig: "documented",
138
170
  agentRules: "documented",
139
- agentDefinitions: "implementation-only",
171
+ agentDefinitions: "documented",
140
172
  },
141
173
  mcpSupport: {
142
174
  status: "supported",
@@ -146,6 +178,9 @@ export const AGENT_REGISTRY = [
146
178
  windows: ["{home}", ".gemini", "settings.json"],
147
179
  },
148
180
  },
181
+ // NOTE: Gemini CLI also reads AGENTS.md as a fallback when GEMINI.md is absent.
182
+ // inception-engine intentionally targets GEMINI.md to avoid ownership collisions
183
+ // with codex and opencode, which also write AGENTS.md.
149
184
  agentRulesSupport: {
150
185
  status: "supported",
151
186
  schemaLabel: "global Markdown rules file",
@@ -168,6 +203,14 @@ export const AGENT_REGISTRY = [
168
203
  reason: "Gemini CLI does not expose a documented global per-user permission or approval config surface",
169
204
  },
170
205
  agentDefinitionsSupport: {
206
+ status: "supported",
207
+ schemaLabel: "global agent definition Markdown file",
208
+ path: {
209
+ posix: ["{home}", ".gemini", "agents", "{name}.md"],
210
+ windows: ["{home}", ".gemini", "agents", "{name}.md"],
211
+ },
212
+ },
213
+ agentDefinitionsRepoSupport: {
171
214
  status: "supported",
172
215
  schemaLabel: "repo-local agent definition Markdown file",
173
216
  path: {
@@ -175,6 +218,30 @@ export const AGENT_REGISTRY = [
175
218
  windows: ["{repo}", ".gemini", "agents", "{name}.md"],
176
219
  },
177
220
  },
221
+ agentDefinitionsTomlSupport: {
222
+ status: "supported",
223
+ schemaLabel: "global agent definition TOML file",
224
+ path: {
225
+ posix: ["{home}", ".gemini", "agents", "{name}.toml"],
226
+ windows: ["{home}", ".gemini", "agents", "{name}.toml"],
227
+ },
228
+ },
229
+ agentDefinitionsTomlRepoSupport: {
230
+ status: "supported",
231
+ schemaLabel: "repo-local agent definition TOML file",
232
+ path: {
233
+ posix: ["{repo}", ".gemini", "agents", "{name}.toml"],
234
+ windows: ["{repo}", ".gemini", "agents", "{name}.toml"],
235
+ },
236
+ },
237
+ agentRulesWorkspaceSupport: {
238
+ status: "supported",
239
+ schemaLabel: "workspace-local GEMINI.md",
240
+ path: {
241
+ posix: ["{workspace}", "GEMINI.md"],
242
+ windows: ["{workspace}", "GEMINI.md"],
243
+ },
244
+ },
178
245
  },
179
246
  {
180
247
  id: "antigravity",
@@ -203,20 +270,25 @@ export const AGENT_REGISTRY = [
203
270
  windows: ["{repo}", ".agents", "rules", "{name}.md"],
204
271
  },
205
272
  },
273
+ // Antigravity shares its instruction surfaces with gemini-cli (both target
274
+ // the same GEMINI.md paths). surfaceKind: shared-via drives deduplication
275
+ // when both agents appear in the same agentRules entry.
206
276
  agentRulesSupport: {
207
277
  status: "supported",
208
- schemaLabel: "repo-local Markdown rules file",
278
+ surfaceKind: { kind: "shared-via", via: "gemini-cli" },
279
+ schemaLabel: "global Gemini blueprint instructions file",
209
280
  path: {
210
- posix: ["{repo}", ".agents", "rules", "{name}.md"],
211
- windows: ["{repo}", ".agents", "rules", "{name}.md"],
281
+ posix: ["{home}", ".gemini", "GEMINI.md"],
282
+ windows: ["{home}", ".gemini", "GEMINI.md"],
212
283
  },
213
284
  },
214
285
  agentRulesRepoSupport: {
215
286
  status: "supported",
216
- schemaLabel: "repo-local Markdown rules file",
287
+ surfaceKind: { kind: "shared-via", via: "gemini-cli" },
288
+ schemaLabel: "repo-local GEMINI.md",
217
289
  path: {
218
- posix: ["{repo}", ".agents", "rules", "{name}.md"],
219
- windows: ["{repo}", ".agents", "rules", "{name}.md"],
290
+ posix: ["{repo}", "GEMINI.md"],
291
+ windows: ["{repo}", "GEMINI.md"],
220
292
  },
221
293
  },
222
294
  permissionsSupport: {
@@ -224,7 +296,7 @@ export const AGENT_REGISTRY = [
224
296
  schemaLabel: "global permissions surface",
225
297
  reason: "Antigravity does not expose a documented global per-user permission or approval config surface",
226
298
  },
227
- agentDefinitionsSupport: {
299
+ agentDefinitionsRepoSupport: {
228
300
  status: "supported",
229
301
  schemaLabel: "repo-local agent definition Markdown file",
230
302
  path: {
@@ -232,6 +304,12 @@ export const AGENT_REGISTRY = [
232
304
  windows: ["{repo}", ".agents", "rules", "{name}.md"],
233
305
  },
234
306
  },
307
+ agentRulesWorkspaceSupport: {
308
+ status: "unsupported",
309
+ schemaLabel: "workspace-local instruction surface",
310
+ reason: "Antigravity is natively repo-local and does not expose a separate workspace-local instruction surface",
311
+ },
312
+ instructionFrontmatterRequired: true,
235
313
  },
236
314
  {
237
315
  id: "opencode",
@@ -251,6 +329,7 @@ export const AGENT_REGISTRY = [
251
329
  detectBinary: "documented",
252
330
  agentRules: "documented",
253
331
  agentDefinitions: "documented",
332
+ permissions: "documented",
254
333
  },
255
334
  mcpSupport: {
256
335
  status: "supported",
@@ -278,11 +357,22 @@ export const AGENT_REGISTRY = [
278
357
  },
279
358
  },
280
359
  permissionsSupport: {
281
- status: "unsupported",
282
- schemaLabel: "global permissions surface",
283
- reason: "OpenCode does not expose a documented global per-user permission or approval config surface",
360
+ status: "supported",
361
+ schemaLabel: "opencode.json permissions config",
362
+ path: {
363
+ posix: ["{xdg_config}", "opencode", "opencode.json"],
364
+ windows: ["{appdata}", "opencode", "opencode.json"],
365
+ },
284
366
  },
285
367
  agentDefinitionsSupport: {
368
+ status: "supported",
369
+ schemaLabel: "global agent definition Markdown file",
370
+ path: {
371
+ posix: ["{xdg_config}", "opencode", "agents", "{name}.md"],
372
+ windows: ["{appdata}", "opencode", "agents", "{name}.md"],
373
+ },
374
+ },
375
+ agentDefinitionsRepoSupport: {
286
376
  status: "supported",
287
377
  schemaLabel: "repo-local agent definition Markdown file",
288
378
  path: {
@@ -290,6 +380,11 @@ export const AGENT_REGISTRY = [
290
380
  windows: ["{repo}", ".opencode", "agents", "{name}.md"],
291
381
  },
292
382
  },
383
+ agentRulesWorkspaceSupport: {
384
+ status: "unsupported",
385
+ schemaLabel: "workspace-local AGENTS.md",
386
+ reason: "OpenCode does not expose a documented workspace-local instruction surface distinct from repo-local AGENTS.md",
387
+ },
293
388
  },
294
389
  {
295
390
  id: "github-copilot",
@@ -298,6 +393,7 @@ export const AGENT_REGISTRY = [
298
393
  // from `.claude/skills/` (the same path used by claude-code). Deploying
299
394
  // via the `claude-code` skills target automatically covers Copilot — no
300
395
  // separate `~/.copilot/skills/` path is needed or maintained.
396
+ skillsSurfaceKind: { kind: "shared-via", via: "claude-code" },
301
397
  detectPaths: {
302
398
  posix: ["{home}", ".copilot"],
303
399
  windows: ["{home}", ".copilot"],
@@ -307,37 +403,91 @@ export const AGENT_REGISTRY = [
307
403
  detectPaths: "documented",
308
404
  detectBinary: "documented",
309
405
  agentDefinitions: "documented",
406
+ mcpConfig: "documented",
310
407
  },
311
408
  mcpSupport: {
312
- status: "planned",
313
- schemaLabel: "repo-scoped MCP surfaces",
314
- plannedSurface: "devcontainer (.devcontainer/devcontainer.json) and agent-frontmatter (.github/agents/*.agent.md)",
315
- reason: "GitHub Copilot MCP support will be implemented via repo-scoped devcontainer features and agent-frontmatter mappings — surfaces that are genuinely Copilot-specific and not covered by other agent targets",
409
+ status: "unsupported",
410
+ schemaLabel: "global MCP config",
411
+ reason: 'GitHub Copilot has no user-level MCP config file; use scope: "repo" or scope: "workspace" to target .vscode/mcp.json instead',
316
412
  },
413
+ mcpRepoSupport: {
414
+ status: "supported",
415
+ schemaLabel: "repo-local .vscode/mcp.json",
416
+ mcpPatchKey: "servers",
417
+ path: {
418
+ posix: ["{repo}", ".vscode", "mcp.json"],
419
+ windows: ["{repo}", ".vscode", "mcp.json"],
420
+ },
421
+ },
422
+ mcpWorkspaceSupport: {
423
+ status: "supported",
424
+ schemaLabel: "workspace-local .vscode/mcp.json",
425
+ mcpPatchKey: "servers",
426
+ path: {
427
+ posix: ["{workspace}", ".vscode", "mcp.json"],
428
+ windows: ["{workspace}", ".vscode", "mcp.json"],
429
+ },
430
+ },
431
+ // GitHub Copilot reads Claude-native instruction files (CLAUDE.md) without
432
+ // a separate deploy action. These surfaces are marked shared-via claude-code
433
+ // with requiresPrimary: true so deploy skips emitting a separate action
434
+ // when claude-code is also targeted, and emits a guidance warning when it
435
+ // is not (copilot cannot write to these surfaces independently).
317
436
  agentRulesSupport: {
318
- status: "unsupported",
437
+ status: "supported",
438
+ surfaceKind: {
439
+ kind: "shared-via",
440
+ via: "claude-code",
441
+ requiresPrimary: true,
442
+ },
319
443
  schemaLabel: "Claude-native shared instructions",
320
- reason: 'GitHub Copilot reads CLAUDE.md natively, so deploy via the "claude-code" agentRules target instead of a separate rules surface',
444
+ path: {
445
+ posix: ["{home}", ".claude", "CLAUDE.md"],
446
+ windows: ["{home}", ".claude", "CLAUDE.md"],
447
+ },
321
448
  },
322
449
  agentRulesRepoSupport: {
323
- status: "unsupported",
450
+ status: "supported",
451
+ surfaceKind: {
452
+ kind: "shared-via",
453
+ via: "claude-code",
454
+ requiresPrimary: true,
455
+ },
324
456
  schemaLabel: "repo-local CLAUDE.md",
325
- reason: 'GitHub Copilot reads CLAUDE.md natively, so deploy via the "claude-code" agentRules target with scope: "repo" instead of a separate rules surface',
457
+ path: {
458
+ posix: ["{repo}", "CLAUDE.md"],
459
+ windows: ["{repo}", "CLAUDE.md"],
460
+ },
461
+ },
462
+ agentRulesWorkspaceSupport: {
463
+ status: "supported",
464
+ surfaceKind: {
465
+ kind: "shared-via",
466
+ via: "claude-code",
467
+ requiresPrimary: true,
468
+ },
469
+ schemaLabel: "workspace-local CLAUDE.md",
470
+ path: {
471
+ posix: ["{workspace}", "CLAUDE.md"],
472
+ windows: ["{workspace}", "CLAUDE.md"],
473
+ },
326
474
  },
327
475
  permissionsSupport: {
328
476
  status: "unsupported",
329
477
  schemaLabel: "global permissions surface",
330
478
  reason: "GitHub Copilot permissions are managed via organization policy, not a deployable per-user config surface",
331
479
  },
332
- agentDefinitionsSupport: {
480
+ agentDefinitionsRepoSupport: {
333
481
  status: "supported",
334
482
  schemaLabel: "repo-local agent definition Markdown file",
335
483
  path: {
336
- posix: ["{repo}", ".github", "agents", "{name}.agent.md"],
337
- windows: ["{repo}", ".github", "agents", "{name}.agent.md"],
484
+ posix: ["{repo}", ".github", "copilot", "agents", "{name}.md"],
485
+ windows: ["{repo}", ".github", "copilot", "agents", "{name}.md"],
338
486
  },
339
487
  },
340
488
  policyNote: "Organization policies may override locally deployed configuration. Verify with your GitHub org admin if deployed skills or rules are not active.",
489
+ instructionFrontmatterRequired: true,
490
+ enterprisePolicyDetection: true,
341
491
  },
342
492
  ];
343
493
  export const AGENT_REGISTRY_BY_ID = Object.fromEntries(AGENT_REGISTRY.map((a) => [a.id, a]));
@@ -0,0 +1,8 @@
1
+ import type { AgentDefinitionEntry } from "../../schemas/manifest.ts";
2
+ import type { AgentId, FileWriteDeployAction, FileWriteRevertAction, PlanWarning } from "../../types.ts";
3
+ export interface AgentDefinitionsAdapterResult {
4
+ actions: FileWriteDeployAction[];
5
+ warnings: PlanWarning[];
6
+ }
7
+ export declare function compileAgentDefinitionActions(entry: AgentDefinitionEntry, sourceDir: string, resolvedSourceDir: string, realRoot: string, detectedAgents: AgentId[], home: string, repo?: string, workspace?: string): Promise<AgentDefinitionsAdapterResult>;
8
+ export declare function compileAgentDefinitionReverts(entry: AgentDefinitionEntry, agentFilter: AgentId[] | null, home: string, repo?: string, workspace?: string): FileWriteRevertAction[];