agentsmesh 0.32.0 → 0.33.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,320 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.33.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 3eeadbc: **Four capability gaps closed, all verified against each tool's own docs or source.**
8
+
9
+ **opencode: `ignore` is now generated (both scopes).** Canonical ignore patterns become `permission.read` / `permission.edit` path deny rules in `opencode.json`. The obvious-looking key, `watcher.ignore`, is deliberately _not_ used — it scopes the filesystem watcher and never blocks a read, so mapping ignore there would have advertised exclusion that does not exist and left `.env` fully readable. No `"*"` catch-all is written, because user rules append after opencode's built-in defaults under last-match-wins, so a generated blanket allow would silently undo opencode's own `.env` protection. Per-pattern rules do carry both actions: a gitignore negation (`!pattern`) becomes an `allow` rule and round-trips back to `!pattern` on import. `grep`/`glob` rules are left alone since they match the search string rather than the file path; the lint warning now names that residual gap instead of claiming ignore is unsupported.
10
+
11
+ **crush: global `ignore` is now generated.** `~/.config/crush/ignore` — extensionless and without a leading dot, matching what Crush's `internal/fsext/ls.go` actually reads. Generate, import and reference-rewriting all cover the global scope now.
12
+
13
+ **augment-code: project `permissions` are now generated.** Augment documents `.augment/settings.json` as repo-level settings committed to the project, carrying the same `toolPermissions` shape as the user file, so a team can check a tool policy into the repo. Honored by the Auggie CLI and Cosmos cloud agents, not the IDE extension.
14
+
15
+ **deepagents-cli: global `permissions` are now generated (embedded).** Canonical allow entries map onto `shell.allow_list` in `~/.deepagents/config.toml`, merged key-scoped so unrelated settings in that shared file survive. The mapping is lossy by nature — dcode has no deny rules, no ask rules and no per-tool patterns — so `deny` and `ask` entries now raise a lint warning naming what was dropped instead of disappearing silently.
16
+
17
+ - 4602b6f: **Eleven capability gaps closed across Continue, Amazon Q and Warp — plus three defects found along the way that were losing user data.**
18
+
19
+ **Continue: agents and hooks are now generated at both scopes.** Agents are `.continue/agents/<name>.md` — Markdown with `name`/`description`/`model`/`tools` frontmatter, where `tools` and `rules` are comma-separated strings because upstream types them as `z.string()` and rejects the whole file on a YAML list. Hooks are the `hooks` key of `.continue/settings.json`, reusing the Claude Code serializer since Continue's loader documents the same 17 event names and the same file shape. `.continue/agents/*.yaml` assistant profiles are treated as user-owned: never written, never imported, never deleted.
20
+
21
+ **Amazon Q: ignore and global rules now reach the agent.** Ignore patterns become `toolsSettings.fs_read.deniedPaths` / `fs_write.deniedPaths` in the agent JSON — Q CLI has no ignore file anywhere. Global rule files are still written to `~/.aws/amazonq/rules/`, but Q CLI never reads that directory on its own (`paths.rs` `mod global` has no rules constant), so the generated agent JSON now carries a `file://~/.aws/amazonq/rules/**/*.md` glob in its `resources` array — that entry is what makes the files reachable. `rules` at global scope is therefore honestly `embedded` rather than `native`.
22
+
23
+ **Warp: project ignore, global rules and global permissions.** `.warpindexingignore`, `~/.agents/AGENTS.md`, and the four `[agents.profiles]` keys in `~/.warp/settings.toml`, merged key-scoped so unrelated settings survive.
24
+
25
+ Three fixes to behaviour that was already shipping:
26
+ - **Every generated Amazon Q agent was silently dropping your project rules.** Q's `Agent` struct declares `resources` with `#[serde(default)]`, so a custom agent inherits nothing from the built-in default agent — including its `.amazonq/rules/**/*.md` glob and the `AGENTS.md` / `README.md` / `AmazonQ.md` documentation resources. Running `q chat --agent <name>` saw none of them. Generated agents now carry full default-agent parity.
27
+ - **Warp permission revocation was a no-op.** Removing an entry from `permissions.yaml` left the old allowlist in `settings.toml`, so a revoked `Bash(curl:*)` kept auto-running. agentsmesh now owns those four keys outright and rewrites them on every emit.
28
+ - **Warp's regexes were being escaped into dead literals.** Warp's allow/denylists are regexes, so `import --global` followed by `generate --global` turned a user's `rm -rf .*` deny rule into `rm -rf \.\*`, which matches nothing. Payloads now round-trip verbatim; allowlist entries are anchored `^…$` and denylist entries left unanchored, each taking the narrower reading of Warp's undocumented match semantics so no rule can come back weaker.
29
+
30
+ Amazon Q's embedded features (hooks, permissions, ignore) are now gated on their own `features` entries via `emitScopedSettings`, so disabling a feature no longer leaks it into the agent JSON. Amazon Q import merges into `.agentsmesh/ignore` instead of overwriting it, preserving comments and `!` negations that Q cannot express, and Warp import preserves canonical `ask` plus entries Warp has no key for.
31
+
32
+ - 00d58e3: **Twelve capability gaps closed across Zed and Antigravity — and a bug that deleted your Zed editor config.**
33
+
34
+ **Zed.** Global rules now write `~/.config/zed/AGENTS.md`, the real file that replaced the database-backed Rules Library in v1.4.0, with secondary rules folded into it. Ignore projects onto `file_scan_exclusions` and `private_files` in `settings.json` at both scopes — `file_scan_exclusions` is a splicing list, so the `"..."` entry is appended to preserve Zed's own defaults, while `private_files` extends and must not carry it. Global permissions write `agent.tool_permissions`, mapped onto the five Zed tools that accept patterns, with `case_sensitive: true` so Zed's case-insensitive default cannot widen a grant. Commands ride the skills surface through the existing `supportsConversion` mechanism, emitting byte-identical output to codex-cli so the two dedupe instead of colliding. Project permissions are now correctly `none`: `.zed/settings.json` is parsed as `ProjectSettingsContent`, which has no `agent` field at all, so anything written there was discarded.
35
+
36
+ **Antigravity.** Project MCP is generated again — it had been deliberately suppressed, so every developer re-added their servers by hand in each repo — along with project and global agents, and `.antigravityignore`. Global permissions write `~/.gemini/antigravity-cli/settings.json`. The MCP config files (`.agents/mcp_config.json` project, `~/.gemini/config/mcp_config.json` global) are merged per server key, so the Antigravity-only `disabled`, `disabledTools`, `cwd`, `oauth` and `authProviderType` keys survive regeneration.
37
+
38
+ Three fixes to behaviour that was already shipping:
39
+ - **`agentsmesh generate` could delete your entire Zed editor config.** `.zed/settings.json` was listed in `managedOutputs.files`, so any run that produced no MCP servers treated it as a stale artifact and removed it. Neither Zed settings file is a managed output any more.
40
+ - **Zed generation overwrote hand-written permission rules.** Merging was per-tool whole-list replace. Ownership is now per pattern, decided by whether a rule decodes cleanly back to canonical — so `^cargo\s+(build|test)$`, `^sudo` and anything malformed survive every run, while agentsmesh's own grants are still revoked when removed from canonical.
41
+ - **Zed and Antigravity imports overwrote canonical files.** Importing merges now: ignore entries match by glob rather than line text, so `dist/` is recognised in `**/dist` instead of churning, and canonical entries the target cannot express are preserved rather than dropped.
42
+
43
+ Zed reads `settings.json` as JSONC and its default file is mostly comments, which `JSON.stringify` would destroy. agentsmesh now leaves a non-strict-JSON settings file completely untouched rather than rewriting it without the user's comments — safer than the previous behaviour, which replaced it with `{}`.
44
+
45
+ - bf88aaa: **The last nine capability gaps closed across six targets — and four fixes to config-destroying behaviour.**
46
+
47
+ **kiro** — permissions at both scopes. Global writes `~/.kiro/settings/permissions.yaml` with canonical allow/deny/ask mapping straight onto Kiro's `effect`. Project embeds into the `.kiro/agents/<name>.md` frontmatter agentsmesh already writes, because Kiro stores workspace rules outside the repository and a cloned repo cannot inject permissions. Lint says so, and says that embedded rules apply only while that agent is active.
48
+
49
+ **pi-agent** — permissions at both scopes via `defaultTools` in `.pi/settings.json` and `~/.pi/agent/settings.json`. The mapping is deliberately narrow: Pi has an allow-list over eight built-in tools and no deny, ask, path or command matching, so every canonical entry that cannot be expressed is named in a lint warning.
50
+
51
+ **aider** — hooks at both scopes via `.aider.conf.yml`. Three canonical events map onto command keys — `PostToolUse` with an edit-tool matcher to `lint-cmd`, `PostToolUse` with a wildcard matcher to `test-cmd`, and `Notification` to `notifications-command` — with `auto-lint` / `auto-test` written alongside the first two. Canonical hooks that fit none of those shapes are warned about rather than faked.
52
+
53
+ **goose** — project MCP via `.agents/plugins/agentsmesh/.mcp.json`. **replit-agent** — commands and agents project onto the repo-committed `.agents/skills/` surface, byte-identical to codex-cli's output so the two dedupe rather than collide.
54
+
55
+ **trae** — global permissions were investigated and left at `partial`, not raised. Trae's `~/.trae/permission/global.json` is real, but canonical allow/deny/ask does not map onto its `resourceAuthorization` / `commandRules` split faithfully enough to call native. The gap stays open and visible in the audit rather than being closed dishonestly.
56
+
57
+ Four fixes to behaviour that was already shipping:
58
+ - **Goose project MCP erased `cwd` and any hand-added server key.** MCP went through the one emission path that passes no merge callback, so the file was rewritten wholesale. Both scopes now route through merge-capable paths; `cwd`, `timeout`, `$schema` and unknown keys survive.
59
+ - **Deleting pi-agent permissions silently widened access.** Removing `defaultTools` handed every built-in back, including `bash` and `write`. A canonical file whose entries project onto no Pi built-in — only scoped `Bash(...)` patterns, say, or only deny/ask rules — now writes `defaultTools: []`, which fails closed. An _empty_ canonical permissions file still writes nothing at all: it is not a claim that no tool is approved. Revoking a previously written array is handled separately, by `revokePiAgentPermissions` through `scopeExtras`.
60
+ - **Kiro generation overwrote hand-written permission rules.** Ownership is now per rule: a rule is agentsmesh's only when its keys are a subset of `{capability, match, effect}` and it projects back onto canonical, so `exclude` protections and unknown capabilities survive with their comments.
61
+ - **`.aider.conf.yml` had two writers competing.** It now has one, and every key agentsmesh owns carries a generated-by marker comment — so an `auto-lint: false` you set by hand is never flipped, and only marked keys are removed when they leave the projection.
62
+
63
+ Kiro and pi-agent imports also stopped overwriting canonical: silence about `deny` is no longer read as revocation of `deny`, so a Kiro file holding only allow rules can no longer drop `Read(./.env)` from canonical and cross-contaminate every other target.
64
+
65
+ - 08240d8: Recall now carries a session correlator on every path, so repeated recalls stop re-delivering rules the agent has already been shown. Field telemetry from a long-running project measured **58.7% of all delivered rule-tokens as intra-session repeats** — dedup existed but nothing supplied it with a session id outside hook-driven recall.
66
+
67
+ `agentsmesh lessons query` accepts `--session auto`, which resolves to `AGENTSMESH_SESSION_ID` when exported and otherwise to a project-scoped day key — so a prose-driven (non-hook) agent gets dedup within a working session. The scaffolded recall ritual and the `lessons` skill now pass `--session auto` on both the per-action and task-start queries; re-run `agentsmesh init --lessons` (or regenerate) to pick up the new wording.
68
+
69
+ Suppression is only safe while the agent that saw a rule still has it in context, so it is bounded on three sides. On a hook-capable target, `SessionStart` now resets dedup for every source except `resume`: `startup` means a new chat, `compact`/`clear` mean the context was summarized or wiped, and an unrecognized source resets too. The reset clears both the harness session's set and the CLI/MCP correlator stores, which are separate files — previously a compaction cleared only the first, leaving an agent's own `--session auto` recalls suppressed against a context that no longer held those rules. Without a hook there is no such signal, so a 30-minute idle gap resets the whole session and every entry expires one hour after delivery. `--no-dedup` re-shows everything for one call, covering the residual case of a new chat opened immediately after the last one on a target with no hook.
70
+
71
+ **Behavior change:** the MCP `lessons_query` tool now deduplicates by default. The correlator is `AGENTSMESH_SESSION_ID` when set, otherwise the server process, and a lesson already delivered in that session is withheld and counted in the new `suppressed` field. Pass `no_dedup: true` to re-show everything (for example after the client compacts its context), or `session` to control the scope explicitly. Agents that re-query the same file repeatedly will now receive empty result sets where they previously received the same rules again — `suppressed` distinguishes "already shown" from "nothing applies". Because the server never observes the client compacting its context, MCP suppression is bounded by the same windows as `--session auto` — a 30-minute idle reset and a one-hour ceiling per entry — so a rule that was summarized away always comes back rather than staying hidden for the server's lifetime.
72
+
73
+ `agentsmesh lessons stats` is now self-diagnosing. When the numbers match a known pathology it appends an `advice` line naming the cause and the fix (also an `advice` key in `--json`): high intra-session redundancy on recalls that carry no session id means dedup is inert and the ritual should pass `--session auto`; a no-match rate dominated by command-only recalls against a graph with few `command_pattern` triggers means command-shaped lessons need `--trigger-cmd`. Silence is the default.
74
+
75
+ The capture-on-failure nudge now pre-fills a concrete command trigger. Instead of a `<regex matching the command>` placeholder it derives the failed command's class (`--trigger-cmd 'git commit'`), regex-escaped, falling back to the placeholder when no safe class can be derived — command-shaped lessons were starving because authors skipped the fill-in-the-blank. Each nudge also states the rule shape that makes a lesson worth reading: cite the symptom, and say why the obvious fix is wrong.
76
+
77
+ Command recalls that cannot possibly match now exit early. The recall hook fires on every shell command, but most command-only recalls match nothing (over 80% in the field), so a temp-dir cache of the active command-reachable trigger patterns — stamped against the lessons graph and refreshed automatically — lets a provable no-match skip the full graph load. The cached verdict is computed with the same matcher the full recall path uses, and any doubt (missing, stale, or unreadable cache) falls back to the full path, so the worst case is no speedup rather than a skipped recall.
78
+
79
+ - 1a5254f: **Three new targets: OpenHands, Kimi Code CLI and Codebuff.** agentsmesh now supports 33 tools.
80
+
81
+ **OpenHands** (`openhands`) — the open-source autonomous coding agent. Rules to `AGENTS.md`, path-scoped rules and skills to `.agents/skills/`, subagents to `.agents/agents/`, commands and MCP into a `.agents/plugins/agentsmesh/` bundle, and hooks to `.openhands/hooks.json`. Hooks are the one surface that did _not_ move to `.agents/`, and its `HookConfig` forbids unknown keys outright, so only verified snake_case events are emitted. `AGENTS.md` is written with no frontmatter because OpenHands injects that file verbatim into the prompt.
82
+
83
+ **Kimi Code CLI** (`kimi-code`) — Moonshot AI's terminal agent. Rules to `AGENTS.md`, subagents to `.kimi-code/agents/`, skills to `.kimi-code/skills/`, MCP to `.kimi-code/mcp.json` (a genuine project-scope MCP file, which is rare), and hooks plus permissions into `~/.kimi-code/config.toml`. Those last two are user-scope only — Kimi Code has no project config file. That TOML also holds provider API keys in plain text, so agentsmesh merges key-scoped and never rewrites the file.
84
+
85
+ **Codebuff** (`codebuff`) — the multi-agent terminal CLI. Rules to `AGENTS.md` including nested per-directory files, skills to `.agents/skills/`, MCP to `.agents/mcp.json`, and ignore to `.codebuffignore`. Agents and permissions stay `partial`: Codebuff agents are executable TypeScript modules, and agentsmesh generates config, not code.
86
+
87
+ OpenHands and Codebuff both read `.agents/skills/`, which `codex-cli` owns, so each emits byte-identical skill content and is registered as a native `.agents/` writer — without that, `generate --global` alongside Claude Code threw `Conflicting generated outputs`. Kimi Code writes its own `.kimi-code/skills/` at both scopes and is not part of that set.
88
+
89
+ Two behaviours worth knowing before you run this:
90
+ - **Kimi Code concatenates every instruction file it finds** rather than picking the first, so a `.kimi-code/AGENTS.md` left over from a previous setup would double your rules in the prompt. It is now a managed output and `agentsmesh generate` removes it; the root `AGENTS.md` carries the merged content.
91
+ - **Codebuff's scope precedence is inverted** relative to every other target: it searches `[cwd/.agents, cwd/../.agents, ~/.agents]` last-write-wins, so a global file overrides the project one. It also has a middle scope (the parent directory, for monorepos) that agentsmesh cannot express.
92
+
93
+ - e629741: **Amazon Q Developer: commands are now native.** The Q CLI reads saved prompts as flat `<name>.md` files from `.amazonq/prompts/` (workspace) and `~/.aws/amazonq/prompts/` (user), invoked as `/prompts`. AgentsMesh now generates and imports both scopes. Q reads the file body verbatim, so no frontmatter is emitted; a lint warning reports `description` / `allowed-tools` metadata that the format cannot carry, and names outside `^[a-zA-Z0-9_-]{1,50}$` (including `:`-namespaced commands, which Q cannot nest) are rewritten with a warning naming the resulting file.
94
+
95
+ **Claude Code: global hooks now actually load.** `agentsmesh generate --global` wrote hooks to `~/.claude/hooks.json` — a file Claude Code never reads. Its documented hook locations are `~/.claude/settings.json`, `.claude/settings.json`, `.claude/settings.local.json`, managed policy, and plugin/skill/subagent frontmatter; there is no standalone `hooks.json`. Global hooks now merge into `~/.claude/settings.json` under `hooks`, matching project scope, and the stale `~/.claude/hooks.json` is removed on the next `generate`. Import still reads the old file so existing setups migrate.
96
+
97
+ **Gemini CLI: permissions are no longer written into the project.** Gemini's policy engine documents its Workspace tier (`<repo>/.gemini/policies/`) as non-functional, so the `permissions.toml` AgentsMesh generated there was a security policy the tool silently ignored — deny rules that never applied. Permissions now emit only at global scope (`~/.gemini/policies/permissions.toml`, unchanged) via `globalSupport.scopeExtras`, and a project-scope lint warning points users at `agentsmesh generate --global`. The stale project file is left in place: `.gemini/policies/permissions.toml` is a `coOwnedFiles` entry at both scopes, which stale cleanup never deletes, because a user may have added their own `[[rule]]` blocks to it since. Delete it by hand if you want it gone.
98
+
99
+ ### Patch Changes
100
+
101
+ - 20ff933: **Disabling a feature no longer deletes the user config file that feature wrote into.**
102
+
103
+ `cleanupStaleGeneratedOutputs` treated every entry in a target's `managedOutputs.files` as agentsmesh-owned: any path the current run did not emit was `rm -rf`'d. A run with `mcp` turned off emits nothing for `.codex/config.toml`, so the file — the user's own Codex model, provider and trust config — was deleted outright, and the CLI reported "Nothing changed."
104
+
105
+ `TargetManagedOutputs` now has a second list:
106
+ - `files` — agentsmesh owns the file outright; a run that stops emitting it deletes it (this is how revocation works).
107
+ - `coOwnedFiles` — agentsmesh writes into the file but the user owns it too. Never deleted; the descriptor's `mergeGeneratedOutputContent` hook keeps the user's content on the runs that do write it.
108
+
109
+ 31 paths across 17 targets moved from `files` to `coOwnedFiles`: `.codex/config.toml`, `.mcp.json` / `~/.claude.json`, `.claude/settings.json`, `.vscode/mcp.json`, `.vscode/settings.json`, `.gemini/settings.json`, `.qwen/settings.json`, `crush.json`, `opencode.json`, `kilo.jsonc`, `.amp/settings.json`, `.augment/settings.json`, `.agents/mcp_config.json`, `.openhands/hooks.json`, `.deepagents/.mcp.json`, `.junie/config.json`, `.rovodev/config.yml`, `~/.config/goose/permission.yaml` and their global counterparts.
110
+
111
+ Stale cleanup reads `files` only, and skips `coOwnedFiles` during the directory sweep too — a co-owned file living inside a managed directory was otherwise still deleted.
112
+
113
+ A repo-wide invariant test now fails the build if any registered descriptor — builtin or plugin — lists a co-owned path in `managedOutputs.files`. Co-ownership is recognised through all three mechanisms agentsmesh actually uses: a descriptor `mergeGeneratedOutputContent` hook, the `SETTINGS_JSON_PATHS` fallback in `mergeOutputContent`, and a `scopeExtras` generator that reads the existing file and merges internally. The last two are why `.claude/settings.json` (the user's model, env and hook config) and goose's `permission.yaml` (which holds goose's own `smart_approve` cache) were still being deleted after the first pass — neither has a descriptor hook. Exceptions are an explicit, commented allowlist.
114
+
115
+ **Behaviour change:** emptying `hooks.yaml` no longer removes `.openhands/hooks.json`. That file is user-authored and holds `HookType.AGENT` handlers canonical cannot express; a feature-disable run and an empty-canonical run are indistinguishable at cleanup time, so the file is kept. Revocation is still event-scoped — rewriting `hooks.yaml` drops the handlers agentsmesh no longer emits.
116
+
117
+ **Known gap:** `agentsmesh uninstall` relied on stale cleanup deleting these files, so agentsmesh's own `mcpServers` / `[mcp_servers.*]` blocks now survive an uninstall in a co-owned file instead of going with it. The same applies to disabling a feature. Leaving a stale server behind is the safer failure than deleting the user's model and auth config, but it is not the end state: revoking owned keys on disable needs an explicit clear-owned-keys pass across all 31 paths (`src/targets/pi-agent/permissions-revoke.ts` is the existing precedent) and is not in this change.
118
+
119
+ **Plugin authors:** `coOwnedFiles` is optional and additive. Any path your `mergeGeneratedOutputContent` claims belongs there rather than in `files`; the schema rejects a path listed in both.
120
+
121
+ - 5ca7d7b: **A comment in your config no longer costs you the whole file.**
122
+
123
+ Six mergers parsed the user's file with `JSON.parse` and coerced an unparsable base to `{}` before serialising their own keys over the top. One `//` line was enough to lose everything else in the file:
124
+
125
+ ```jsonc
126
+ // before
127
+ {
128
+ // my editor prefs
129
+ "editor.fontSize": 14,
130
+ "files.exclude": { "**/.git": true }
131
+ }
132
+
133
+ // after `agentsmesh generate` with roo-code enabled
134
+ {
135
+ "roo-cline.allowedCommands": ["Bash(ls)"]
136
+ }
137
+ ```
138
+
139
+ This was live on files that are comment-legal by design: `.vscode/settings.json` (VS Code ships its own settings commented), `kilo.jsonc` (the format's name is JSON-with-comments), `.qwen/settings.json`, and the shared `.claude/settings.json` / `.gemini/settings.json` / `crush.json` mergers.
140
+
141
+ All six now preserve a base they cannot parse, via one shared guard (`preservedUnparsableBase`). That is the rule `mergeOwnedJsonKeys` already followed — these sites simply never routed through it.
142
+
143
+ The trade-off is unchanged and deliberate: on a commented file, agentsmesh writes nothing and reports the path as `unchanged`, so generated content is silently not applied there. Preserving a file we cannot safely rewrite beats destroying it, but the run gives no warning yet.
144
+
145
+ Eleven existing tests asserted the old behaviour — names like "falls back to `{}` when the base JSON is invalid" and "replaces invalid existing settings.json". They encoded the data loss as intended behaviour and were rewritten to the new contract rather than removed.
146
+
147
+ - 0c775e1: **`generate` no longer deletes files inside a managed directory that agentsmesh never wrote.**
148
+
149
+ `managedOutputs.dirs` was swept recursively and every file found that the current run did not emit was `rm -rf`'d. Those directories are shared: Kiro's Agent Hooks UI writes `.kiro/hooks/*.kiro.hook`, Cursor's rule generator writes `.cursor/rules/*.mdc`, users hand-author `~/.claude/skills/**`, and `.agents/skills` is the cross-tool skills convention. A single `generate` removed all of them — on a fresh project, the very first run did it before any lock existed.
150
+
151
+ This is the same ownership bug `coOwnedFiles` fixed for `managedOutputs.files`. Directories could not be fixed the same way because their contents are dynamic (one file per rule, command, agent, skill), so no descriptor can enumerate them. The lock's `outputs` map is the missing record: cleanup runs before the lock is rewritten, so the map on disk is still the previous run's list of everything agentsmesh generated.
152
+
153
+ A file discovered by the directory sweep is now deleted only when the previous run's lock says agentsmesh wrote it. Renaming a rule still evicts its old output. `managedOutputs.files` and `coOwnedFiles` are unchanged.
154
+
155
+ Two related fixes:
156
+ - **No provenance means no directory deletions.** A first run, a lock written before the `outputs` map existed, or a lock lost to `agentsmesh merge` leaves the sweep with nothing to go on, so it deletes nothing that run. Be aware this is not a one-run window: the lock a run writes records only what that run generated, so a file agentsmesh wrote earlier and no longer emits is never re-recorded and stays on disk indefinitely. Removing such an orphan is a manual step. That is the deliberate trade: an unwanted file that lingers is recoverable, a deleted one is not.
157
+ - **A filtered run (`--targets x`) leaves a configured-but-inactive target's directories alone.** `.agents/skills` is managed by amp, zed, goose, codex-cli and others, so `generate --targets zed` used to delete amp's generated skills. Provenance cannot tell them apart — agentsmesh did write them — so the guard is ownership: a directory another configured target also manages is skipped until the next unfiltered run.
158
+ - An empty run no longer wipes the lock's `outputs` map, which would have made everything already on disk permanently unevictable.
159
+
160
+ **`agentsmesh check` reports these files as a notice, not as drift.** Because `generate` no longer removes them, reporting them as stale generated output would exit 1 with no remedy — neither `agentsmesh merge` nor `generate --force` can clear a file agentsmesh does not own. They now appear under a new `outputsUntracked` list that is deliberately excluded from `outputDrift` and `inSync`:
161
+
162
+ ```
163
+ ✓ Lock file is in sync.
164
+ 1 file(s) in managed directories were not written by agentsmesh (left untouched):
165
+ .kiro/hooks/my-hook.kiro.hook
166
+ ```
167
+
168
+ The signal is kept — a rule hand-added straight into `.claude/rules` instead of canonical still shows up — without turning a tool doing its job into a failed build. Four tests asserted the old exit-1 behaviour and were updated to the new contract rather than removed.
169
+
170
+ - c233472: **`agentsmesh merge` no longer strands generated files forever.**
171
+
172
+ `resolveLockConflict` wrote the resolved `.agentsmesh/.lock` with no `outputs` key. That map is the provenance the managed-directory sweep gates on — a discovered file is deleted only when the previous lock says agentsmesh wrote it — so after a merge the sweep had nothing to go on and deleted nothing it found.
173
+
174
+ That was not a one-run deferral. A full `generate` **replaces** the outputs map with only what that run emitted, so a file generated before the merge and no longer emitted could never appear in any future map. It was never evicted, and `agentsmesh check` listed it indefinitely.
175
+
176
+ The map now carries forward as the union of both conflict sides. It records only paths agentsmesh itself wrote, so widening it can never make a foreign file deletable — it can only restore paths that were already ours. Where both sides claim the same path, ours wins; the hashes may be stale until the next generate rewrites them, which is the same state a filtered run already leaves behind and which `check` reports.
177
+
178
+ A lock with no `outputs` on either side stays without one, so an old-format lock is not silently upgraded to an empty map — `readLock` distinguishes the two and `check` relies on it.
179
+
180
+ - 779c89e: **`.roomodes` is no longer replaced wholesale — your hand-written Roo Code project modes survive.**
181
+
182
+ `.roomodes` is Roo Code's own project custom-modes store: Roo writes it whenever you create a mode at Project scope. `generateAgents` emitted the entire file from canonical, and the mode-scoped merger claimed only the Global twin (`~/.roo/settings/custom_modes.yaml`), so `.roomodes` fell through to whole-file replacement. Every mode you authored was deleted, and modes that shared a slug with a canonical agent lost `whenToUse`, `customInstructions`, `iconName` and the tuple group form (`- - edit` / `fileRegex`).
183
+
184
+ `.roomodes` was also in `project.managedOutputs.files`, the stale-cleanup delete list, so turning the `agents` feature off deleted the file outright.
185
+
186
+ `mergeRooCustomModesYaml` now claims both paths, and `.roomodes` moved to `coOwnedFiles`. Ownership is per mode, recorded by the `# agentsmesh:` marker comment the merger writes — the same convention `.aider.conf.yml` uses:
187
+ - a marked mode, or one whose slug canonical still owns, is agentsmesh's and is re-emitted;
188
+ - everything else is yours and is kept verbatim;
189
+ - within a re-emitted mode, fields canonical cannot express are carried over.
190
+
191
+ Only one path resolves per run — the global layout suppresses `.roomodes` and emits the settings file from `scopeExtras` — so claiming both scopes in one merger cannot collide.
192
+
193
+ **Also fixes a marker bug that affected the global file too.** Re-parsing the YAML moves the comment above the _first_ sequence item onto the sequence node itself, so the first generated mode read back as unmarked. It was treated as the user's and never revoked — deleting that agent left its mode behind permanently. The merger now reads the marker from where the parser actually puts it. This was live in `~/.roo/settings/custom_modes.yaml` since the global merge shipped.
194
+
195
+ Two limits worth knowing:
196
+ - Deleting **every** agent leaves the last generated modes in place. `generateAgents` returns nothing for empty canonical, so the merger never runs — the same revocation-to-empty gap documented for the other co-owned files.
197
+ - A `.roomodes` that is not a YAML mapping is returned verbatim rather than rewritten, so generated modes are silently not applied to it.
198
+
199
+ - 6e7b06f: **Global-scope generation no longer replaces user config files it only partly owns.**
200
+
201
+ `scopeExtras` — the hook targets use for global-only outputs — pushed its results straight onto the result list, bypassing the shared merge policy that every other emission path goes through. Six paths were rewritten from canonical alone:
202
+ - `~/.continue/config.yaml` — Continue's personal assistant config. The first `generate --global` erased the user's `models` blocks (**including `apiKey` / `apiBase`**), `context` providers, `docs`, hand-written rules and prompts, and overwrote the assistant `name` with the literal `agentsmesh`.
203
+ - `~/.continue/permissions.yaml` — the approval cache Continue writes when the user picks "always allow" / "always ask" / "exclude".
204
+ - `~/.copilot/mcp-config.json` — servers registered with `copilot mcp add`.
205
+ - `~/.gemini/policies/permissions.toml`
206
+ - `~/.deepagents/hooks.json`
207
+ - `~/.roo/settings/custom_modes.yaml`
208
+
209
+ `scopeExtras` results now route through the same `mergeOutputContent` policy as the feature loop, with pending-result dedup. Targets whose file needed key-scoped ownership gained a `mergeGeneratedOutputContent` hook; the affected paths moved to `managedOutputs.coOwnedFiles` so stale cleanup cannot delete them either.
210
+
211
+ Reading the existing file is not the same as merging it. `~/.copilot/mcp-config.json` was read on every run — but only to decide whether to report "created" or "updated", never as a merge base. Any audit of this class has to check whether the existing content reaches the emitted content, not whether the file was opened.
212
+
213
+ Two related merge fixes, each its own silent data loss:
214
+ - `mergeSettingsJson` now merges _inside_ `permissions`, so the user's `defaultMode` and `additionalDirectories` survive a write instead of being dropped every time agentsmesh wrote allow/deny/ask.
215
+ - `mergeCrushConfigJson` now merges inside `permissions` and `options`, so `options.debug` survives.
216
+
217
+ **`agentsmesh init` no longer scaffolds `allow: []` / `deny: []` / `ask: []`.** Those keys are commented-out examples now. An explicit empty list is a real instruction — "grant nothing" — not a placeholder, and targets that project permissions into a shared config file apply it. A user adopting agentsmesh with existing permissions in `.claude/settings.json` would have had them cleared. Absent keys mean "agentsmesh manages nothing here yet", which is what a fresh init actually means.
218
+
219
+ **Known gap, unchanged by this release:** emptying a canonical list still does not revoke what a previous run wrote into a co-owned file. Co-owned files are never deleted (that is deliberate — deleting them is what destroyed real user configs), so an emptied `allow` leaves the previously written grant live. Per-entry revocation works; only revocation-to-empty does not. A first attempt at this was withdrawn before release: without a record of what agentsmesh previously wrote, revocation cannot distinguish its own output from the user's, and it cleared permissions the user had authored by hand. Doing it properly needs provenance tracking.
220
+
221
+ - 6dbe626: **`generate` no longer replaces shared config files it only partly owns.**
222
+
223
+ `generateFeature` — the emission path for rules, commands, agents, skills, MCP and ignore — was the only one that never received a merge callback, so those six features wrote whole files. Where a target's MCP output lands in a config file the user also owns, generation replaced everything else in it.
224
+
225
+ The merge policy now lives in one module (`src/core/generate/merge-policy.ts`) used by every emission path, including the `mirrorGlobalPath` branch that previously pushed raw content with no merge at all. Key-scoped mergers were added for the files that had none:
226
+ - **codex-cli** `.codex/config.toml` — `model`, `model_providers`, `shell_environment_policy` and `projects` trust survive; only `[mcp_servers.*]` is rewritten. The merge is text-preserving, so comments and formatting are kept.
227
+ - **claude-code** `.mcp.json` and global `.claude.json` — agentsmesh owns `mcpServers`; the account, project and history state in `~/.claude.json` is left alone.
228
+ - **copilot** `.vscode/mcp.json` — owns `servers`, so the `inputs` array holding secret prompts survives.
229
+ - **deepagents-cli** `.mcp.json` — the same owned-key set as claude-code, which writes the same path.
230
+
231
+ Servers removed from canonical are still revoked: owned keys are replaced wholesale, never deep-merged.
232
+
233
+ Two safety rules came out of this and are now enforced by tests:
234
+ - **A file we cannot parse is preserved, not replaced.** A `.vscode/mcp.json` or `.qwen/settings.json` containing comments is left untouched rather than rewritten without them — the rule `src/targets/zed/layout.ts` already documented. Note the run reports this as "unchanged", so generated servers are silently not applied to a JSONC file.
235
+ - **Targets sharing an output path must own identical keys.** claude-code and deepagents-cli both write `.mcp.json`; when only one merged, `resolveOutputCollisions` failed the entire run for anyone with both enabled.
236
+
237
+ Also fixed: a TOML table header whose quoted key contains a bracket — `[projects."/Users/me/[wo]rk"]`, a legal path — was not recognised as a header, so it stayed inside the dropped `[mcp_servers.*]` region and was deleted along with its `trust_level`.
238
+
239
+ **Follow-up, shipped alongside this:** stale cleanup used to delete these same files whenever a run stopped emitting them. `managedOutputs.coOwnedFiles` now separates "agentsmesh owns this, delete it when stale" from "the user owns this too, never delete it" — see the co-owned managed-outputs entry.
240
+
241
+ - 9ef7c44: Bumped the `tar` production dependency to 7.5.22, clearing three advisories that ship to anyone installing agentsmesh: GHSA-23hp-3jrh-7fpw (critical — decompression/parse denial of service), GHSA-8x88-c5mf-7j5w (high — negative entry size infinite loop), and GHSA-r292-9mhp-454m (high — uncontrolled recursion in `mapHas`/`filesFilter`). `tar` backs `agentsmesh install` pack extraction.
242
+
243
+ Also pinned repo-local resolutions for two high-severity transitives of `@modelcontextprotocol/sdk` — `fast-uri` to `^3.1.5` (GHSA-7p8r-x3mc-p8w7, host confusion via backslash) and `ip-address` to `^10.3.1` (GHSA-mwp4-54f8-5fhr, leading-zero octet decoding). These are pnpm `overrides`, so they harden this repo's own builds and CI; consumers resolve those transitives through their own package manager and are not affected by the override.
244
+
245
+ - 4d79310: Stop replacing and deleting the config files the AI tools write themselves
246
+
247
+ Twenty-two generated paths were written from canonical alone AND listed in
248
+ `managedOutputs.files`, the stale-cleanup delete list. Every run replaced the
249
+ whole document — losing every key the tool or the user had put there — and any
250
+ run that stopped emitting the path deleted the file outright.
251
+
252
+ Confirmed end to end: a `~/.codeium/windsurf/mcp_config.json` holding a server
253
+ added in Windsurf's MCP UI plus an unrelated top-level key came back with both
254
+ gone.
255
+
256
+ Each path now has a key-scoped merge hook and moved to
257
+ `managedOutputs.coOwnedFiles`, which cleanup never reads:
258
+ - **MCP configs** (`mcpServers` and the canonical per-server fields owned;
259
+ `disabled`, `autoApprove`, `timeout`, `cwd` and every other top-level key
260
+ carried over): amazon-q `.amazonq/mcp.json` + `~/.aws/amazonq/mcp.json`,
261
+ cline `.cline/mcp.json`, codebuff `.agents/mcp.json`, cursor
262
+ `.cursor/mcp.json`, factory-droid `.factory/mcp.json`, junie
263
+ `.junie/mcp/mcp.json`, kilo-code `.kilo/mcp.json`, kimi-code
264
+ `.kimi-code/mcp.json`, kiro `.kiro/settings/mcp.json`, roo-code
265
+ `.roo/mcp.json`, rovodev `~/.rovodev/mcp_config.json`, trae `.trae/mcp.json`,
266
+ warp `.warp/.mcp.json`, windsurf `~/.codeium/windsurf/mcp_config.json`.
267
+ - **Hooks configs**: antigravity `.agents/hooks.json` +
268
+ `~/.gemini/config/hooks.json` (keyed by user-chosen handler names, so the
269
+ user's handlers now survive), codex-cli `.codex/hooks.json` (keeps the
270
+ top-level `description`), cursor `.cursor/hooks.json`, factory-droid
271
+ `.factory/hooks.json`, trae `.trae/hooks.json` + `~/.trae-cn/hooks.json`,
272
+ windsurf `.windsurf/hooks.json` + `~/.codeium/windsurf/hooks.json`.
273
+ - **Permissions and settings**: cursor `.cursor/cli.json` /
274
+ `~/.cursor/cli-config.json` (keeps `version`, `editor`, `network`),
275
+ factory-droid `.factory/settings.json` (agentsmesh owns only
276
+ `commandAllowlist` / `commandDenylist`), junie `~/.junie/allowlist.json`
277
+ (agentsmesh owns only `rules.executables`, so "Always allow" approvals in the
278
+ other categories, plus `defaultBehavior` and `allowReadonlyCommands`,
279
+ survive).
280
+ - **Agents manifest**: cline `.cline/agents.yaml`, merged on the `agents` key.
281
+
282
+ A new repo-wide invariant makes the class impossible to reintroduce silently:
283
+ any structured config document (JSON/JSONC/TOML/YAML) left in
284
+ `managedOutputs.files` must be named in an explicit, justified allowlist of the
285
+ outputs agentsmesh owns outright. It runs over registered plugin descriptors as
286
+ well as builtins.
287
+
288
+ Paths deliberately unchanged because agentsmesh owns them end to end:
289
+ `.continue/mcpServers/agentsmesh.json`, `.github/hooks/agentsmesh.json`,
290
+ `.agents/plugins/agentsmesh/**`, `~/mcp_settings.json` (roo-code),
291
+ `.windsurf/mcp_config.example.json`, `~/.claude/hooks.json` (eviction entry) and
292
+ `.rovodev/prompts.yml`.
293
+
294
+ **Two fixes made while verifying this sweep.**
295
+
296
+ `mergeMcpServersJson` replaced the whole file when it could not parse the base,
297
+ so a comment in an MCP config destroyed it — the same fail-open that
298
+ `preservedUnparsableBase` was written to close, in a helper that never routed
299
+ through it. It now preserves an unparsable base, and this sweep would otherwise
300
+ have applied the destructive path to roughly twenty more files.
301
+
302
+ `.rovodev/prompts.yml` had been classified as agentsmesh-owned. It is not: the
303
+ importer reads it (`src/targets/rovodev/importer.ts`), which is the proof the
304
+ user authors prompts there. It now merges per entry by the same marker
305
+ convention Roo Code's custom modes use, and the marker algorithm — including
306
+ the fix for the first list entry, whose comment YAML reattaches to the sequence
307
+ node on re-parse — now lives once in `src/core/generate/yaml-list-merge.ts`
308
+ instead of being duplicated per target.
309
+
310
+ **Known gaps, unchanged by this release.** Managed _directories_ have the same
311
+ problem `managedOutputs.files` had: the sweep deletes every file under a managed
312
+ dir that the run did not emit, so a hook or prompt file the tool or user created
313
+ in `.kiro/hooks`, `.cline/hooks` or `.rovodev/commands` is still removed. And a
314
+ server you added in a tool's own UI and never imported is still revoked, because
315
+ agentsmesh owns the whole `mcpServers` key and cannot tell your server from one
316
+ it wrote itself.
317
+
3
318
  ## 0.32.0
4
319
 
5
320
  ### Minor Changes
package/README.md CHANGED
@@ -56,7 +56,8 @@ Every install method ships the same CLI (`agentsmesh`, plus the shorter `amsh` a
56
56
  brew tap samplexbro/agentsmesh
57
57
  brew install agentsmesh
58
58
 
59
- # Standalone binary (Linux / macOS / Windows) — no Node.js required
59
+ # Standalone binary (Linux / macOS) — no Node.js required
60
+ # Windows: download agentsmesh-windows-x64.exe from GitHub Releases
60
61
  curl -fsSL https://github.com/sampleXbro/agentsmesh/releases/latest/download/install.sh | sh
61
62
 
62
63
  # npm / pnpm / yarn — requires Node.js 20+
@@ -140,7 +141,7 @@ This is the part no other config-sync tool has. Lessons give your AI agents a **
140
141
 
141
142
  The memory is one git-tracked file, `.agentsmesh/lessons/lessons.json`, and every agent talks to it through two commands:
142
143
 
143
- - **Recall** — before an edit or a state-changing command, the agent runs `agentsmesh lessons query --file <path> --cmd <command>` and follows the rules that match.
144
+ - **Recall** — before an edit or a state-changing command, the agent runs `agentsmesh lessons query --file <path> --cmd <command> --session auto` and follows the rules that match (`--session auto` suppresses rules already shown this session; `--no-dedup` re-shows them).
144
145
  - **Capture** — right after a failure (red test, lint error, review comment, wrong assumption), it saves the rule with `agentsmesh lessons add "<rule>" --topic <id> --trigger-file <glob>`.
145
146
 
146
147
  Rules can be **scoped** (fire only on a matching file, command, or keyword) or **always-on** (`--scope always`) for universal standards that apply to every task — delivered on each task automatically, no trigger needed.
@@ -174,8 +175,8 @@ Full walkthrough: [Teach your AI agents with lessons](https://samplexbro.github.
174
175
  - **Agents that learn** — the optional [lessons memory](#teach-your-agents-lessons) recalls past-mistake rules before each edit and captures new ones after each failure, shared across every tool and teammate.
175
176
  - **Safe adoption** — already have `.cursor/`, `.claude/`, or `.github/copilot-instructions.md`? Run `import` → `diff` → `generate` → `check`; nothing is overwritten blind. [Existing-project guide →](https://samplexbro.github.io/agentsmesh/guides/existing-project/)
176
177
  - **Migrate between tools** — `convert --from <a> --to <b>` rewrites one tool's config directly into another's native format. [convert →](https://samplexbro.github.io/agentsmesh/cli/convert/)
177
- - **Global mode** — `~/.agentsmesh/` syncs your personal config to `~/.claude/`, `~/.cursor/`, `~/.codex/`, and more. Every command accepts `--global`. [Global paths →](https://samplexbro.github.io/agentsmesh/reference/supported-tools/#global-mode)
178
- - **Team-safe and CI-ready** — `check` is a drift gate against `.agentsmesh/.lock`, `diff` previews changes, `merge` rebuilds the lock after a 3-way Git conflict, and `lock_features` + per-feature `strategy` prevent accidental overrides. `lint` adds cross-target warnings (`silent-drop-guard`, `hook-script-references`, `rule-scope-inversion`) for content a tool would silently mishandle. [check →](https://samplexbro.github.io/agentsmesh/cli/check/) · [lint →](https://samplexbro.github.io/agentsmesh/cli/lint/)
178
+ - **Global mode** — `~/.agentsmesh/` syncs your personal config to `~/.claude/`, `~/.cursor/`, `~/.codex/`, and more. Every config command accepts `--global`. [Global paths →](https://samplexbro.github.io/agentsmesh/reference/supported-tools/#global-mode)
179
+ - **Team-safe and CI-ready** — `check` is a drift gate against `.agentsmesh/.lock`, `diff` previews changes, `merge` rebuilds the lock after a 3-way Git conflict, and `collaboration.strategy: lock` + `lock_features` prevent accidental overrides. `lint` adds cross-target warnings (`silent-drop-guard`, `hook-script-references`, `rule-scope-inversion`) for content a tool would silently mishandle. [check →](https://samplexbro.github.io/agentsmesh/cli/check/) · [lint →](https://samplexbro.github.io/agentsmesh/cli/lint/)
179
180
  - **Community packs and `extends`** — install shared rules, skills, agents, and commands from any git repo (`install`, `--sync`, `refresh`, remote `extends`); a multi-signal classifier auto-detects Anthropic-style skill packs. Elevated artifacts (hooks, permissions, MCP) from remote sources are stripped unless you opt in — with `--accept-*` on `install`, or `accept:` on a remote `extends` entry. [Install reference →](https://samplexbro.github.io/agentsmesh/cli/install/)
180
181
  - **Plugins — add a tool without waiting for a release** — ship support for a new AI tool as a standalone npm package, with full parity to built-in targets (project + global, conversions, lint hooks, hook post-processing). When a tool ships or changes its format, you don't file an issue and wait on the maintainer — you publish a plugin. [Build a plugin →](https://samplexbro.github.io/agentsmesh/guides/building-plugins/)
181
182
  - **Schema-validated configs** — each config ships a JSON Schema, so editors give you autocomplete and validation out of the box. [JSON schemas →](https://samplexbro.github.io/agentsmesh/reference/json-schemas/)
@@ -213,14 +214,14 @@ Full walkthrough: [Teach your AI agents with lessons](https://samplexbro.github.
213
214
  | `lessons` | Query and capture agent memory (recall / capture) |
214
215
  | `mcp` | Start the AgentsMesh MCP server (stdio) |
215
216
 
216
- Every command accepts `--global` (operate on `~/.agentsmesh/`) and `--json` (machine-readable output). Run `agentsmesh <command> --help` for flags, or see the [CLI reference](https://samplexbro.github.io/agentsmesh/cli/).
217
+ Every command accepts `--json` (machine-readable output). The config commands also accept `--global` (operate on `~/.agentsmesh/`); `lessons` rejects it — lessons live in the project tree — and `mcp`, `plugin` and `target` have no scope of their own. Run `agentsmesh <command> --help` for flags, or see the [CLI reference](https://samplexbro.github.io/agentsmesh/cli/).
217
218
 
218
219
  ## Supported tools
219
220
 
220
221
  AgentsMesh generates native config for every major AI coding assistant — plus plugin targets you can ship as standalone npm packages. Native vs. embedded support per feature is tracked in the [supported-tools matrix](https://samplexbro.github.io/agentsmesh/reference/supported-tools/).
221
222
 
222
223
  <!-- agentsmesh:tool-list -->
223
- - **CLI agents:** [Aider](https://aider.chat), [Amp](https://ampcode.com), [Claude Code](https://www.anthropic.com/claude-code), [Codex CLI](https://github.com/openai/codex), [Crush](https://github.com/charmbracelet/crush), [Deep Agents CLI](https://github.com/langchain-ai/deepagents), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Goose](https://block.github.io/goose), [OpenCode](https://opencode.ai), [Pi Agent](https://github.com/earendil-works/pi), [Qwen Code](https://github.com/QwenLM/qwen-code), [Rovo Dev](https://www.atlassian.com/solutions/devops/rovo-dev), [Warp](https://www.warp.dev).
224
+ - **CLI agents:** [Aider](https://aider.chat), [Amp](https://ampcode.com), [Claude Code](https://www.anthropic.com/claude-code), [Codebuff](https://github.com/CodebuffAI/freebuff), [Codex CLI](https://github.com/openai/codex), [Crush](https://github.com/charmbracelet/crush), [Deep Agents CLI](https://github.com/langchain-ai/deepagents), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Goose](https://block.github.io/goose), [Kimi Code CLI](https://moonshotai.github.io/kimi-code/en/), [OpenCode](https://opencode.ai), [OpenHands](https://docs.openhands.dev), [Pi Agent](https://github.com/earendil-works/pi), [Qwen Code](https://github.com/QwenLM/qwen-code), [Rovo Dev](https://www.atlassian.com/solutions/devops/rovo-dev), [Warp](https://www.warp.dev).
224
225
  - **IDE integrations:** [Amazon Q Developer](https://aws.amazon.com/q/developer), [Antigravity](https://antigravity.google), [Augment Code](https://www.augmentcode.com), [Cline](https://cline.bot), [Continue](https://continue.dev), [GitHub Copilot](https://github.com/features/copilot), [Cursor](https://cursor.com), [Junie](https://www.jetbrains.com/junie), [Kilo Code](https://kilocode.ai), [Kiro](https://kiro.dev), [Roo Code](https://roocode.com), [Trae](https://www.trae.ai), [Windsurf](https://windsurf.com), [Zed](https://zed.dev).
225
226
  - **Cloud agent platforms:** [Factory Droid](https://www.factory.ai), [Jules](https://jules.google), [Replit Agent](https://replit.com).
226
227
  <!-- /agentsmesh:tool-list -->
@@ -228,33 +229,33 @@ AgentsMesh generates native config for every major AI coding assistant — plus
228
229
  ### Project scope (`agentsmesh generate`)
229
230
 
230
231
  <!-- agentsmesh:support-matrix:project -->
231
- | Feature | Aider | Amazon Q Developer | Amp | Antigravity | Augment Code | Claude Code | Cline | Codex CLI | Continue | GitHub Copilot | Crush | Cursor | Deep Agents CLI | Factory Droid | Gemini CLI | Goose | Jules | Junie | Kilo Code | Kiro | OpenCode | Pi Agent | Qwen Code | Replit Agent | Roo Code | Rovo Dev | Trae | Warp | Windsurf | Zed |
232
- |---|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
233
- | Rules | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native |
234
- | Additional Rules | Embedded | Native | Embedded | Native | Native | Native | Native | Native | Native | Native | Embedded | Native | Embedded | Embedded | Embedded | Embedded | Embedded | Native | Native | Native | Native | Embedded | Native | Embedded | Native | Embedded | Native | Embedded | Native | Embedded |
235
- | Commands | — | | Embedded | Native (workflows) | Native | Native | Native (workflows) | Embedded | Native | Native | Embedded | Native | Embedded | Native | Native | Embedded | Partial | Native | Native | Embedded | Native | Native | Native | | Native | Native | Native | Embedded | Native (workflows) | |
236
- | Agents | — | Native | Embedded | | Native | Native | Native | Native | | Native | — | Native | Native | Native | Native | Embedded | — | Native | Native | Native | Native | | Native | — | Native | Embedded | Native | — | Embedded | — |
237
- | Skills | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native |
238
- | MCP Servers | Partial | Native | Native | | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Partial | Partial | Native | Native | Native | Native | — | Native | Partial | Native | Partial | Native | Native | Partial | Native |
239
- | Hooks | Partial | Embedded | Partial | Native | Native | Native | Native | Native | | Native | Native | Native | — | Native | Native | Native | Partial | Partial | Partial | Native | Partial | Partial | Native | Partial | — | — | Native | Partial | Native | — |
240
- | Ignore | Native | | Partial | | Native | Native | Native | — | Native | — | Native | Native | Partial | Partial | Native (settings-embedded) | Native | Partial | Native | Native | Native | Partial | Partial | Native | Partial | Native | Partial | Native | Partial | Native | Partial |
241
- | Permissions | Partial | Embedded | Partial | Partial | | Native | Partial | Native | — | — | Native | Native | Partial | Native | Partial | Partial | Partial | Partial | Native | Partial | Native | Partial | Native | Partial | Native | — | — | Partial | Partial | Partial |
232
+ | Feature | Aider | Amazon Q Developer | Amp | Antigravity | Augment Code | Claude Code | Cline | Codebuff | Codex CLI | Continue | GitHub Copilot | Crush | Cursor | Deep Agents CLI | Factory Droid | Gemini CLI | Goose | Jules | Junie | Kilo Code | Kimi Code CLI | Kiro | OpenCode | OpenHands | Pi Agent | Qwen Code | Replit Agent | Roo Code | Rovo Dev | Trae | Warp | Windsurf | Zed |
233
+ |---|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
234
+ | Rules | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native |
235
+ | Additional Rules | Embedded | Native | Embedded | Native | Native | Native | Native | Native | Native | Native | Native | Embedded | Native | Embedded | Embedded | Embedded | Embedded | Embedded | Native | Native | Embedded | Native | Native | Native | Embedded | Native | Embedded | Native | Embedded | Native | Embedded | Native | Embedded |
236
+ | Commands | — | Native | Embedded | Native (workflows) | Native | Native | Native (workflows) | Embedded | Embedded | Native | Native | Embedded | Native | Embedded | Native | Native | Embedded | Partial | Native | Native | Embedded | Embedded | Native | Native | Native | Native | Embedded | Native | Native | Native | Embedded | Native (workflows) | Embedded |
237
+ | Agents | — | Native | Embedded | Native | Native | Native | Native | Partial | Native | Native | Native | — | Native | Native | Native | Native | Embedded | — | Native | Native | Native | Native | Native | Native | — | Native | Embedded | Native | Embedded | Native | — | Embedded | — |
238
+ | Skills | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native |
239
+ | MCP Servers | Partial | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Partial | Native | Native | Native | Native | Native | Native | — | Native | Partial | Native | Partial | Native | Native | Partial | Native |
240
+ | Hooks | Native | Embedded | Partial | Native | Native | Native | Native | Partial | Native | Native | Native | Native | Native | — | Native | Native | Native | Partial | Partial | Partial | Partial | Native | Partial | Native | Partial | Native | Partial | — | — | Native | Partial | Native | — |
241
+ | Ignore | Native | Embedded | Partial | Native | Native | Native | Native | Native | — | Native | — | Native | Native | Partial | Partial | Native (settings-embedded) | Native | Partial | Native | Native | — | Native | Embedded | — | Partial | Native | Partial | Native | Partial | Native | Native | Native | Embedded |
242
+ | Permissions | Partial | Embedded | Partial | Partial | Native | Native | Partial | Partial | Native | — | — | Native | Native | Partial | Native | Partial | Partial | Partial | Partial | Native | Partial | Embedded | Native | Partial | Native | Native | Partial | Native | — | — | Partial | Partial | |
242
243
  <!-- /agentsmesh:support-matrix:project -->
243
244
 
244
245
  ### Global scope (`agentsmesh generate --global`)
245
246
 
246
247
  <!-- agentsmesh:support-matrix:global -->
247
- | Feature | Aider | Amazon Q Developer | Amp | Antigravity | Augment Code | Claude Code | Cline | Codex CLI | Continue | GitHub Copilot | Crush | Cursor | Deep Agents CLI | Factory Droid | Gemini CLI | Goose | Jules | Junie | Kilo Code | Kiro | OpenCode | Pi Agent | Qwen Code | Replit Agent | Roo Code | Rovo Dev | Trae | Warp | Windsurf | Zed |
248
- |---|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
249
- | Rules | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | | Native | |
250
- | Additional Rules | Embedded | | Embedded | Embedded | Native | Native | Native | Embedded | Native | Embedded | Embedded | Native | Embedded | Embedded | Embedded | Embedded | — | Embedded | Native | Native | Native | Embedded | Native | — | Native | Embedded | Native | | Embedded | |
251
- | Commands | — | | Embedded | Native (workflows) | Native | Native | Native (workflows) | Embedded | Native | — | Embedded | Native | Embedded | Native | Native | Embedded | — | Native | Native | Embedded | Native | Native | Native | — | Native | Native | Native | Embedded | Native (workflows) | |
252
- | Agents | — | Native | Embedded | | Native | Native | — | Native | | Native | — | Native | Native | Native | Native | Embedded | — | Native | Native | Native | Native | — | Native | — | Partial | Embedded | Native | — | Embedded | — |
253
- | Skills | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native |
254
- | MCP Servers | Partial | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | — | Native | — | Partial | Native | Native | Native | Native | Native |
255
- | Hooks | Partial | Embedded | Partial | Native | Native | Native | Native | Native | | Native | Native | Native | Native | Native | Native | Native | — | Embedded | Partial | Partial | Partial | Partial | Native | — | — | Native | Native | Partial | Native | — |
256
- | Ignore | Native | | Partial | — | — | Native | — | — | Native | — | | Native | Partial | Partial | — | Native | — | — | — | Native | Partial | Partial | — | — | — | Partial | — | Partial | Native | Partial |
257
- | Permissions | Partial | Embedded | Partial | Partial | Native | Native | Partial | Native | Native | Partial | Native | Native | Partial | Native | Native | Native | — | Native | Native | Partial | Native | Partial | Native | — | Partial | Native | | Partial | Partial | Partial |
248
+ | Feature | Aider | Amazon Q Developer | Amp | Antigravity | Augment Code | Claude Code | Cline | Codebuff | Codex CLI | Continue | GitHub Copilot | Crush | Cursor | Deep Agents CLI | Factory Droid | Gemini CLI | Goose | Jules | Junie | Kilo Code | Kimi Code CLI | Kiro | OpenCode | OpenHands | Pi Agent | Qwen Code | Replit Agent | Roo Code | Rovo Dev | Trae | Warp | Windsurf | Zed |
249
+ |---|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
250
+ | Rules | Native | Embedded | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native |
251
+ | Additional Rules | Embedded | Embedded | Embedded | Embedded | Native | Native | Native | Embedded | Embedded | Native | Embedded | Embedded | Native | Embedded | Embedded | Embedded | Embedded | — | Embedded | Native | Embedded | Native | Native | Native | Embedded | Native | — | Native | Embedded | Native | Embedded | Embedded | Embedded |
252
+ | Commands | — | Native | Embedded | Native (workflows) | Native | Native | Native (workflows) | Embedded | Embedded | Native | — | Embedded | Native | Embedded | Native | Native | Embedded | — | Native | Native | Embedded | Embedded | Native | Native | Native | Native | — | Native | Native | Native | Embedded | Native (workflows) | Embedded |
253
+ | Agents | — | Native | Embedded | Native | Native | Native | — | Partial | Native | Native | Native | — | Native | Native | Native | Native | Embedded | — | Native | Native | Native | Native | Native | Native | — | Native | — | Partial | Embedded | Native | — | Embedded | — |
254
+ | Skills | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native |
255
+ | MCP Servers | Partial | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Native | Native | Native | Native | Native | Native | — | Native | — | Partial | Native | Native | Native | Native | Native |
256
+ | Hooks | Native | Embedded | Partial | Native | Native | Native | Native | Partial | Native | Native | Native | Native | Native | Native | Native | Native | Native | — | Embedded | Partial | Native | Partial | Partial | Native | Partial | Native | — | — | Native | Native | Partial | Native | — |
257
+ | Ignore | Native | Embedded | Partial | — | — | Native | — | — | — | Native | — | Native | Native | Partial | Partial | — | Native | — | — | — | — | Native | Embedded | — | Partial | — | — | — | Partial | — | Partial | Native | Embedded |
258
+ | Permissions | Partial | Embedded | Partial | Native | Native | Native | Partial | Partial | Native | Native | Partial | Native | Native | Embedded | Native | Native | Native | — | Native | Native | Native | Native | Native | Partial | Native | Native | — | Partial | Native | Partial | Native | Partial | Native |
258
259
  <!-- /agentsmesh:support-matrix:global -->
259
260
 
260
261
  See the [full feature matrix](https://samplexbro.github.io/agentsmesh/reference/supported-tools/) for native vs. embedded details and per-tool global paths.
@@ -1,5 +1,5 @@
1
- import { b as CanonicalFiles, V as ValidatedConfig } from './schema-CH_JJep8.js';
2
- export { C as CanonicalAgent, a as CanonicalCommand, c as CanonicalRule, d as CanonicalSkill, H as HookEntry, e as Hooks, I as IgnorePatterns, M as McpConfig, f as McpServer, P as Permissions, S as SkillSupportingFile, g as StdioMcpServer, U as UrlMcpServer } from './schema-CH_JJep8.js';
1
+ import { b as CanonicalFiles, V as ValidatedConfig } from './schema-BbywZEB9.js';
2
+ export { C as CanonicalAgent, a as CanonicalCommand, c as CanonicalRule, d as CanonicalSkill, H as HookEntry, e as Hooks, I as IgnorePatterns, M as McpConfig, f as McpServer, P as Permissions, S as SkillSupportingFile, g as StdioMcpServer, U as UrlMcpServer } from './schema-BbywZEB9.js';
3
3
  import 'zod';
4
4
 
5
5
  interface UnrecognizedFormatsWarningOptions {