Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
96ce560
chore(lessons): capture the npm propagation and stuck runner rules
serhiizhabskiy Sep 24, 2026
fe12d01
chore(lessons): capture the packs containment and symlinked SKILL.md …
serhiizhabskiy Sep 24, 2026
f2cfb0f
chore(lessons): capture the private advisory rule for security findings
serhiizhabskiy Sep 24, 2026
00e6337
fix(install): refuse pack folders that resolve outside the project
serhiizhabskiy Sep 24, 2026
ddb6e53
chore(lessons): capture the pre-flight boundary check rule
serhiizhabskiy Sep 24, 2026
2b483cc
fix(lessons): refuse a lessons folder that resolves outside the project
serhiizhabskiy Sep 24, 2026
bc52f89
chore(lessons): capture the one-file-per-recall rule
serhiizhabskiy Sep 24, 2026
1b6e186
fix(init): stop instead of setting up an overwrite of unimported config
serhiizhabskiy Sep 24, 2026
6fba555
chore(lessons): capture the init import-or-stop rule
serhiizhabskiy Sep 24, 2026
7a8aea3
fix(skills): skip a SKILL.md that is a symlink
serhiizhabskiy Sep 24, 2026
96a723a
chore(lessons): capture the canonical symlink reader rule
serhiizhabskiy Sep 24, 2026
8b51999
fix(rules): keep one root rule so packs and extends cannot replace yours
serhiizhabskiy Sep 24, 2026
fa0796d
chore(lessons): capture the merge-order root rule
serhiizhabskiy Sep 24, 2026
e61d957
fix(import): keep permissions, ignore and MCP servers across imports
serhiizhabskiy Sep 24, 2026
44a947c
chore(lessons): capture the import settings merge rule
serhiizhabskiy Sep 24, 2026
982f61d
fix(init): keep both same-name rules, commands and agents on --yes
serhiizhabskiy Sep 24, 2026
c7f63cf
chore(lessons): capture the init same-name rule
serhiizhabskiy Sep 24, 2026
b4ba0fa
fix(mcp): keep install and uninstall notices off stdout
serhiizhabskiy Sep 24, 2026
f7a5e11
fix(mcp): keep a body that starts with --- as body text
serhiizhabskiy Sep 24, 2026
e66d8df
fix(mcp): run tool calls one at a time so parallel writes keep every …
serhiizhabskiy Sep 24, 2026
0878dcd
fix(generate): keep lock sources when --targets skips an enabled target
serhiizhabskiy Sep 24, 2026
75daebd
fix(claude-code): map rule paths to globs and write them back as paths
serhiizhabskiy Sep 24, 2026
f23984f
fix(generate): record targets a filtered run left stale instead of ho…
serhiizhabskiy Sep 24, 2026
1dc629f
fix(generate): rebase relative links in a root file two targets share
serhiizhabskiy Sep 24, 2026
aaeeabe
fix(codex-cli): restore nested AGENTS.md rules to their canonical fil…
serhiizhabskiy Sep 24, 2026
ad0a72b
fix(lessons): migrate every legacy rule, keep journal.md, never migra…
serhiizhabskiy Sep 24, 2026
ea1f7c4
test(install): cover the default uninstall adapter
serhiizhabskiy Sep 24, 2026
9a60bf3
chore(lessons): capture the filtered-lock, nested-entry and claude pa…
serhiizhabskiy Sep 24, 2026
543b348
fix(windsurf): write a scoped rule once, as its own glob rule
serhiizhabskiy Sep 24, 2026
24961aa
chore(lessons): capture the output-eviction, cache-walk and generated…
serhiizhabskiy Sep 24, 2026
bacd901
fix(windsurf): write rule scope as globs, the field Windsurf reads
serhiizhabskiy Sep 24, 2026
734db3f
chore(lessons): capture the zsh path, windsurf parser and globs quoti…
serhiizhabskiy Sep 24, 2026
f65a95d
refactor: cut helpers and test boilerplate the unpushed fixes left be…
serhiizhabskiy Sep 24, 2026
d7b42b4
chore(lessons): capture the scripted-rename rule
serhiizhabskiy Sep 24, 2026
6abd853
fix(generate): rebase only Markdown links in a root file two targets …
serhiizhabskiy Sep 24, 2026
62e7484
chore(generate): refresh target artifacts
serhiizhabskiy Sep 24, 2026
c921385
chore(release): add 0.42.0 upgrade notes
serhiizhabskiy Sep 24, 2026
1b5a828
chore(lessons): capture the pre-release generate-check rule
serhiizhabskiy Sep 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .agentsmesh/.lock
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Auto-generated. DO NOT EDIT MANUALLY.
# Tracks the state of all config files for team conflict resolution.

generated_at: 2026-09-23T06:16:28.822Z
generated_at: 2026-09-24T18:28:00.436Z
generated_by: serhii
lib_version: 0.40.0
lib_version: 0.41.0
checksums:
agents/code-debugger.md: sha256:33452bf839256a119a602cd10d085bff3cdb8f537ded76e60053bb9d8e5d33bc
agents/code-documenter.md: sha256:89b4ebd27718bcd50a7283c95ea1ff9cad153b1112cf695f9f1fc22d90ec85ec
Expand Down Expand Up @@ -138,7 +138,7 @@ packs:
njengah-claude-code-cheat-sheet-agents: sha256:6b0a573bc4a725d0a5d38d323d19382f7a24bd948885d3555b94cbca47a05cbf
outputs:
CLAUDE.md: sha256:6e15d36c45aa9caf6ec5e321f7d65d215dca31c6d8632858155d452be320e1a7
.claude/rules/typescript.md: sha256:8ffe7a805c52aa22c070c4efcb9fd5de1c946197712582629f156c195a90709c
.claude/rules/typescript.md: sha256:157a99004dac3a3d42928971c2f090b4f5b076a48f0e7c23089b4fa6b4787c46
AGENTS.md: sha256:e31197bb6b816ca06bc248d16b224afbdb349860eaf29c2b268f171f63f1c3ad
.cursor/rules/general.mdc: sha256:db24c27174b45c1ad17f1faffe8406fe57a4ae6450a2a03e1b8937a95fb568a3
.cursor/rules/typescript.mdc: sha256:f7e4f54d82fd35d53871bc44d5330c5d1062253cb10b838d4f896a594f1a048c
Expand All @@ -147,8 +147,8 @@ outputs:
.github/instructions/typescript.instructions.md: sha256:e137275142f4613a56292cc04926d1c96a290d1627c4ac0844b059bb7e18a018
GEMINI.md: sha256:a092e6e133dfed9b3331be87dbe60dd0659eb970eb3ae51cb70819d66d6af7c2
.cline/rules/typescript.md: sha256:157a99004dac3a3d42928971c2f090b4f5b076a48f0e7c23089b4fa6b4787c46
src/AGENTS.md: sha256:f417aa9c45ec6da39a74f1911e482347033f7373f86229676a12073620abce84
.windsurf/rules/typescript.md: sha256:49186d6f55329f891c1f3da626b34ffc510dda0692ca321214ccd0f091f463cc
src/AGENTS.md: sha256:1a7613a2089d294597c72c0b09790bae4208db2d02178c4ebf4cef64496b11eb
.windsurf/rules/typescript.md: sha256:9afa2106d00372bf6c203a1f4dce665d859ee07ef54cddb999adbee6dafaecd5
.continue/rules/general.md: sha256:4a90a39588a3662e5ad7e36fe47d4f5861967182117bbb9a567329a96faaa59b
.continue/rules/typescript.md: sha256:8ffe7a805c52aa22c070c4efcb9fd5de1c946197712582629f156c195a90709c
.junie/AGENTS.md: sha256:7e692a46b05f3a963b28463a1b96389524ab42db71bdc3dbdfb301cfcd317afc
Expand Down
588 changes: 577 additions & 11 deletions .agentsmesh/lessons/lessons.json

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions .changeset/check-after-filtered-generate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

`agentsmesh check` no longer passes after `agentsmesh generate --targets …` left other targets out of date. Before, a filtered run recorded the new canonical checksums in `.agentsmesh/.lock` even though the targets it skipped were not regenerated, so the CI gate said "Lock file is in sync." while, for example, `CLAUDE.md` was stale. Now, when the canonical sources changed, the lock lists the enabled targets the run left out under a new `stale_targets` key, and `check` fails and names them (`staleTargets` in `--json`, the MCP `check` tool and the `check()` API) until each is generated again. A full `agentsmesh generate` clears the list, and the lock does not change for projects that never use `--targets`.
5 changes: 5 additions & 0 deletions .changeset/claude-rule-paths.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

Claude Code rules keep their file scope. Claude Code scopes a rule in `.claude/rules/*.md` with `paths:`, the only field it reads from a rule. `agentsmesh import --from claude-code` ignored `paths` (the canonical rule got `globs: []`), and `agentsmesh generate` wrote a canonical rule's `globs` as `globs:`, which Claude Code ignores, so scoped rules applied to every file. Now import reads `paths` (a YAML list or a comma-separated string) into `globs`, older generated files with `globs:` still import, and generate writes `paths:`.
5 changes: 5 additions & 0 deletions .changeset/codex-nested-rules-roundtrip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

Importing generated Codex CLI or Codebuff output back no longer adds duplicate rules. A scoped rule, for example `globs: ["src/**/*.ts"]`, is written to a nested `src/AGENTS.md`. `agentsmesh import --from codex-cli` (or `codebuff` or `windsurf`) read that file as a new rule `.agentsmesh/rules/src.md`, and each import and generate cycle then repeated the rule text in `src/AGENTS.md` and copied it to every other target. Now each rule in a nested `AGENTS.md` is written as an `agentsmesh:embedded-rule` entry that names its canonical source, so import restores the original rule (with its globs and Codex instruction variant) and only hand-written text becomes a directory rule. If an earlier cycle already created such a rule, such as `.agentsmesh/rules/src.md`, delete it once.
5 changes: 5 additions & 0 deletions .changeset/import-keeps-settings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

Importing a second tool no longer drops the settings the first one brought in. Before, `agentsmesh import --from cursor` after `agentsmesh import --from claude-code` replaced `.agentsmesh/permissions.yaml` and `.agentsmesh/ignore` with Cursor's values, so Claude Code `deny` rules that protect secrets were lost without a word, and the next `generate` removed them from `.claude/settings.json`. Some importers (Gemini CLI, Cline, Windsurf, Crush) also replaced `.agentsmesh/mcp.json`. Now each import adds its permissions (`allow`, `deny`, `ask`), ignore patterns and MCP servers to the canonical files and keeps the ones already there; for an MCP server with the same name, the later import wins. This works the same for `import`, `init --yes`, the `importFrom()` API, the MCP `import` tool, and plugin targets. Import never removes an entry from these files; to drop one, edit the canonical file.
5 changes: 5 additions & 0 deletions .changeset/init-refuses-unimported-config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

`agentsmesh init` no longer sets up a silent overwrite of your existing tool config. In a script or CI shell (no wizard) and without `--yes`, `init` used to find existing config, print only a hint to import it, and still enable that tool, so the next `agentsmesh generate` replaced it: in `--global` mode your `~/.claude/CLAUDE.md` and the MCP servers in `~/.claude.json`, which git cannot restore. Now `init` stops with exit code 1 and writes nothing when a tool it would enable already has config. Run `agentsmesh init --yes` to import that config first, or pass `--targets` to leave the tool out. The interactive wizard is unchanged.
5 changes: 5 additions & 0 deletions .changeset/init-same-name-kept.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

`agentsmesh init --yes` no longer loses a rule, command or agent when two tools have one with the same name. Before, the later tool's file replaced the earlier one in `.agentsmesh/`, with the earlier file's frontmatter mixed in, and the next `generate` wrote that text over the first tool's own file. Now, if both texts are the same, one canonical file is kept. If they differ, the first tool's file keeps its name, and the later tool's version is saved as `<name>-<tool>.md` (for example `.agentsmesh/rules/typescript-cursor.md`), each with only its own frontmatter. Init prints a warning for each copy, and `init --json` lists them in `sameNameCopies`. The interactive wizard works the same way. Separate `agentsmesh import --from` runs stay last-import-wins.
5 changes: 5 additions & 0 deletions .changeset/legacy-lessons-lossless.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

The one-time migration of the old lessons store (`index.yaml` + `topics/*.md` + `journal.md`, used up to 0.22) no longer loses lessons. Before, it kept only single-line numbered rules under a `## Rules` heading, dropped bullet rules, rules under other headings and the rest of wrapped rules, never read `journal.md`, and then deleted all the old files, even when started silently by the recall hook. Now every list item under a `## Rules` or `## Lessons` heading becomes a lesson, numbered or bullet, with the lines that wrap onto it, and rules with the same number in two sections are both kept. If a topic file has a list item under any other heading, the migration stops, names the file and line, and changes nothing. `journal.md` is kept for you to review, and the recall hook never migrates: the first `lessons` command you run does, and says so.
5 changes: 5 additions & 0 deletions .changeset/mcp-calls-in-order.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

The MCP server no longer loses changes when a client sends several write calls at once. Each write tool reads a file, changes it and writes it back, so parallel calls such as three `add_mcp_server`, `update_permissions` (append), `update_ignore` (append) or `update_config` calls kept only one change while all of them reported success. `agentsmesh mcp` now runs tool calls one at a time, in the order they arrive.
5 changes: 5 additions & 0 deletions .changeset/mcp-create-body-frontmatter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

The MCP `create_*` and `update_*` tools for rules, commands and skills now store the body exactly as sent. Before, with empty `frontmatter`, a body that started with a `---` block was saved so that the block became the file's frontmatter. `get_*` then returned different metadata, and body text could set fields such as `root: true`, `allowed-tools` or `name` for `generate`. Now an empty frontmatter block is written before such a body, and the MCP server reads files with the same frontmatter rules as the canonical loader.
5 changes: 5 additions & 0 deletions .changeset/mcp-install-stdout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

The MCP `install` and `uninstall` tools no longer write plain-text notices into the JSON-RPC stream. When an installed skill had a broken link, or an uninstalled pack had locally changed files, `agentsmesh mcp` printed those notices on stdout, which stricter MCP clients cannot parse. They now go to stderr like every other message from the server. With `--json`, the CLI no longer prints them into the JSON output either.
7 changes: 7 additions & 0 deletions .changeset/pack-folder-containment.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'agentsmesh': patch
---

`install` (including `install --sync` and `refresh`) and `uninstall` now refuse a `.agentsmesh/packs` folder, or a single pack folder, that resolves outside the project, for example through a symlink committed to the repository. Before, they followed the link and could write, replace or delete a folder outside the project. The check runs before anything is read or written, also under `--dry-run`, and the error names where the path really points. The MCP `install` and `uninstall` tools get the same protection.

Lessons get the same protection: when `.agentsmesh/lessons` (or `.agentsmesh`) resolves outside the project, `lessons add` and every other lessons write, `init --lessons` and the MCP lessons tools refuse with a clear error instead of writing `lessons.json`, its lock or its logs there. The recall hook keeps working and simply skips its logs. A link to a folder inside the project still works.
5 changes: 5 additions & 0 deletions .changeset/root-rule-precedence.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

An installed pack or an extended source can no longer replace your root instructions. Before, a pack rule with `root: true` (under any name other than `_root.md`) silently became the root rule, so `CLAUDE.md`, `AGENTS.md` and Cursor's root rule showed only the pack's text, and `check` still passed. This worked even for remote packs, whose hooks, MCP servers and permissions are stripped as untrusted. Now there is exactly one root rule: your own, else an installed pack's, else an extended source's. Any other `root: true` rule is used as a normal rule, and `generate` prints a warning naming it.
5 changes: 5 additions & 0 deletions .changeset/shared-root-links.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

`agentsmesh generate` no longer fails when the root rule links to another rule and two enabled targets write the same `AGENTS.md` (for example Codex CLI and Cursor, Codex CLI and Gemini CLI, or Cursor and Windsurf). The shared `AGENTS.md` keeps canonical references so both copies stay the same, but a relative link such as `[TS rule](./typescript.md)` was left unchanged and pointed to nothing, so the broken-link check stopped the run. Now such Markdown links point to the canonical file (`.agentsmesh/rules/typescript.md`); every other path in the shared file stays exactly as written.
5 changes: 5 additions & 0 deletions .changeset/skill-md-symlink.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

A skill whose `SKILL.md` is a symlink is now skipped, like every other symlinked canonical file. Before, `install`, `generate` and pack loading followed the link and copied the file it pointed to into `.agentsmesh/packs/` and the generated `.claude/skills/` and `.cursor/skills/` folders, so a skills repository could pull a local file into folders that usually get committed. The other skills in the same source are still installed.
14 changes: 14 additions & 0 deletions .changeset/upgrade-notes-0-42.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
'agentsmesh': minor
---

**Upgrade notes.** This release fixes data loss on import and adoption, three security issues, and several generated formats. Most projects need to do nothing, but check these after you upgrade:

- Run `agentsmesh generate` once. Some generated files change format, so `agentsmesh generate --check` reports drift until you regenerate: Claude Code rules scope files with `paths:` (the field Claude Code reads) instead of `globs:`; Windsurf rules use `globs:` instead of `glob:` and a scoped rule is written once (`generate` removes the old `.windsurf/rules/<dir>.md` copy; you can delete an old `<dir>/AGENTS.md` it wrote for Windsurf only); Codex CLI and Codebuff write each rule in a nested `<dir>/AGENTS.md` with an `agentsmesh:embedded-rule` marker.
- If an earlier `import --from codex-cli`, `codebuff` or `windsurf` cycle created a folder rule such as `.agentsmesh/rules/src.md` that repeats another rule's text, delete it once.
- `agentsmesh init` without `--yes` now stops with exit code 1 when it finds existing config for a tool it would enable, because it would not import that config. Use `agentsmesh init --yes`, or `--targets` to leave that tool out.
- `agentsmesh check` now fails after `agentsmesh generate --targets …` left an enabled target out of date (the lock lists it under `stale_targets`). Run a full `agentsmesh generate`. `check()` and `check --json` report these targets as `staleTargets`.
- Importing a second tool now adds to `.agentsmesh/permissions.yaml`, `.agentsmesh/ignore` and `.agentsmesh/mcp.json` instead of replacing them, and never removes an entry; edit those files to remove one. In one `agentsmesh init --yes` run, two tools' rules, commands or agents with the same name and different text are both kept, the later one as `<name>-<tool>.md` (listed as `sameNameCopies` in `init --json`).
- A `root: true` rule from an installed pack or an `extends` source no longer replaces your own `.agentsmesh/rules/_root.md`; it is used as a normal rule, with a warning.
- The MCP server runs tool calls one at a time, in the order they arrive.
- Old lessons stores (`index.yaml` + `topics/` + `journal.md`, up to 0.22): the migration keeps `journal.md`, never runs from the recall hook, and stops with nothing changed if a topic file has a list item outside a `## Rules` or `## Lessons` section.
5 changes: 5 additions & 0 deletions .changeset/windsurf-globs-field.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

Windsurf rules with a single glob now activate. Windsurf reads a rule's scope from `globs:` (one string, several patterns joined by commas), but `agentsmesh generate` wrote a single pattern as `glob:`, which Windsurf ignores, and several patterns as a YAML list. Now every scoped rule in `.windsurf/rules/*.md` gets `globs: <pattern>` or `globs: <a>,<b>`. `agentsmesh import --from windsurf` also got sturdier: it reads `globs` as a string or a list and still reads the older `glob:`, keeps a brace pattern like `src/**/*.{ts,tsx}` whole, accepts the unquoted form from Windsurf's docs (`globs: **/*.test.ts`), which used to stop the whole import with a YAML error, and skips a rule it still cannot read with a warning instead of failing.
5 changes: 5 additions & 0 deletions .changeset/windsurf-scoped-rule-once.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agentsmesh': patch
---

Windsurf now gets each scoped rule once. For a rule with `globs: ["src/**/*.ts"]`, `agentsmesh generate` wrote `.windsurf/rules/typescript.md`, an identical `.windsurf/rules/src.md`, and `src/AGENTS.md`, so Windsurf loaded the rule several times, `src/AGENTS.md` applied it to every file in `src/`, and `agentsmesh import --from windsurf` added a duplicate `.agentsmesh/rules/src.md`. Now only `.windsurf/rules/typescript.md` (`trigger: glob`) is written; the next `generate` removes the old `.windsurf/rules/src.md`, and import ignores an old `src/AGENTS.md` that holds the same text as a Windsurf rule, so a generate and import round trip no longer adds rules. You can delete such an old `src/AGENTS.md` if no other tool uses it. A nested `AGENTS.md` you wrote yourself is still imported as a folder rule.
2 changes: 1 addition & 1 deletion .claude/rules/typescript.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description: TypeScript-specific coding standards
globs:
paths:
- src/**/*.ts
- tests/**/*.ts
---
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ agentsmesh generate # write each tool's native config from the one source
agentsmesh check # CI drift gate against .agentsmesh/.lock
```

On a terminal, `init` runs a short wizard: pick targets, import detected configs (`.cursor/`, `.claude/`, `.github/copilot-instructions.md`, and more), enable lessons, and optionally generate right away. Nothing is written until you finish. Use `--yes` for the non-interactive default, `--global` for your user-level config under `~/.agentsmesh/`, and `npx agentsmesh` if you installed it as a dev dependency.
On a terminal, `init` runs a short wizard: pick targets, import detected configs (`.cursor/`, `.claude/`, `.github/copilot-instructions.md`, and more), enable lessons, and optionally generate right away. Nothing is written until you finish. Use `--yes` for the non-interactive default (in a script, `init` without `--yes` stops when it finds existing tool config, so `generate` never replaces config you have not imported), `--global` for your user-level config under `~/.agentsmesh/`, and `npx agentsmesh` if you installed it as a dev dependency.

`init` enables the tools you actually use, not all of them: whatever this project already has config for, else whatever is installed on your machine, else a minimal set of Claude Code, Cursor and Copilot. It prints what it picked. Pass `--targets a,b` to choose, or `--all-targets` for everything.

Expand Down Expand Up @@ -145,7 +145,7 @@ Built to be depended on: 12,000+ tests on Linux, macOS, and Windows CI, JSON-Sch

- **Lossless two-way sync.** When a tool has no native slot for a feature, it is embedded with round-trip metadata instead of dropped. [Managed embedding](https://samplexbro.github.io/agentsmesh/reference/managed-embedding/)
- **Automatic link rebasing.** `.agentsmesh/skills/api-gen/template.hbs` becomes `.claude/skills/...` or `.cursor/skills/...` in each generated file. [Generation pipeline](https://samplexbro.github.io/agentsmesh/reference/generation-pipeline/)
- **Safe adoption.** `import`, then `diff`, then `generate`, then `check`; nothing is overwritten blind. When several tools have a root rule, they are merged into one `_root.md` rather than the last one winning. [Existing-project guide](https://samplexbro.github.io/agentsmesh/guides/existing-project/)
- **Safe adoption.** `import`, then `diff`, then `generate`, then `check`; nothing is overwritten blind. When several tools have a root rule, they are merged into one `_root.md` rather than the last one winning, their permissions, ignore patterns and MCP servers add up instead of replacing each other, and `init --yes` keeps both versions of a same-name rule, command or agent. [Existing-project guide](https://samplexbro.github.io/agentsmesh/guides/existing-project/)
- **Output directory safety.** `generate` and `convert` reject output directories that resolve outside the project (or home directory with `--global`), checked before any write and under `--dry-run` too. Stale-file cleanup enforces the same boundary.
- **Safe updates.** Explicitly empty Claude permission, hook, and MCP configurations clear their generated entries. MCP edits preserve untouched server fields and reject malformed files; skill updates validate supporting files before writing.
- **Migrate between tools.** `convert --from <a> --to <b>` rewrites one tool's config directly into another's. [convert](https://samplexbro.github.io/agentsmesh/cli/convert/)
Expand Down
5 changes: 4 additions & 1 deletion src/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<!-- agentsmesh:embedded-rule:start {"source":"rules/typescript.md","description":"TypeScript-specific coding standards","globs":["src/**/*.ts","tests/**/*.ts"],"targets":[]} -->
## TypeScript-specific coding standards
# TypeScript Standards

- Use strict mode
- Prefer `unknown` over `any`
- Use explicit return types for public functions
- Prefer `interface` over `type` for object shapes
- Prefer `interface` over `type` for object shapes
<!-- agentsmesh:embedded-rule:end -->
Loading
Loading