<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lukas Wolfsteiner</title>
    <description>The latest articles on Forem by Lukas Wolfsteiner (@dotwee).</description>
    <link>https://forem.com/dotwee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2459323%2F435ec410-c8a0-4442-8103-c2b8bdf8f6e2.jpg</url>
      <title>Forem: Lukas Wolfsteiner</title>
      <link>https://forem.com/dotwee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dotwee"/>
    <language>en</language>
    <item>
      <title>One MCP Configuration for Codex, Claude, Cursor, and Copilot with chezmoi</title>
      <dc:creator>Lukas Wolfsteiner</dc:creator>
      <pubDate>Sat, 07 Mar 2026 21:11:08 +0000</pubDate>
      <link>https://forem.com/dotwee/one-mcp-configuration-for-codex-claude-cursor-and-copilot-with-chezmoi-925</link>
      <guid>https://forem.com/dotwee/one-mcp-configuration-for-codex-claude-cursor-and-copilot-with-chezmoi-925</guid>
      <description>&lt;p&gt;If you use multiple coding agents across multiple machines, MCP configuration drift is unavoidable unless you make one file the source of truth.&lt;/p&gt;

&lt;p&gt;This guide shows a practical setup for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codex&lt;/li&gt;
&lt;li&gt;Claude Code&lt;/li&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;GitHub Copilot (including VS Code and Copilot coding agent scenarios)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep one canonical MCP manifest in your chezmoi source state.&lt;/li&gt;
&lt;li&gt;Generate each tool's native config format from that manifest.&lt;/li&gt;
&lt;li&gt;Let chezmoi manage symlinks/templates and machine-specific values.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why this works
&lt;/h2&gt;

&lt;p&gt;All four tools model MCP servers with the same conceptual fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server name&lt;/li&gt;
&lt;li&gt;Transport type (&lt;code&gt;stdio&lt;/code&gt; vs remote HTTP/SSE-like)&lt;/li&gt;
&lt;li&gt;Command + args + env for local servers&lt;/li&gt;
&lt;li&gt;URL + headers/auth for remote servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What differs is file location and schema shape.&lt;/p&gt;

&lt;p&gt;So instead of manually editing four formats, you maintain one normalized model and project it into each target file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each tool expects today
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Codex
&lt;/h2&gt;

&lt;p&gt;Codex stores MCP inside &lt;code&gt;config.toml&lt;/code&gt;, typically at &lt;code&gt;~/.codex/config.toml&lt;/code&gt;, with optional project overrides in &lt;code&gt;.codex/config.toml&lt;/code&gt; for trusted projects.&lt;/p&gt;

&lt;p&gt;MCP entries are under &lt;code&gt;[mcp_servers.&amp;lt;name&amp;gt;]&lt;/code&gt; and support both local command servers and remote URL servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code
&lt;/h2&gt;

&lt;p&gt;Claude settings are split across &lt;code&gt;~/.claude/settings.json&lt;/code&gt;, &lt;code&gt;.claude/settings.json&lt;/code&gt;, and &lt;code&gt;.claude/settings.local.json&lt;/code&gt;, but MCP server configuration is associated with &lt;code&gt;~/.claude.json&lt;/code&gt; for user/local scope and &lt;code&gt;.mcp.json&lt;/code&gt; for project scope.&lt;/p&gt;

&lt;p&gt;In practice, you can treat &lt;code&gt;.mcp.json&lt;/code&gt; as the repository-shareable MCP surface and keep secrets/user-only material outside repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor
&lt;/h2&gt;

&lt;p&gt;Cursor uses JSON with &lt;code&gt;mcpServers&lt;/code&gt; and supports command- and URL-based MCP installations.&lt;/p&gt;

&lt;p&gt;The official docs page confirms MCP as a first-class feature and transport diversity; path specifics (&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;, &lt;code&gt;.cursor/mcp.json&lt;/code&gt;) are consistent with the validated storage map you linked.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Copilot / VS Code
&lt;/h2&gt;

&lt;p&gt;There are two adjacent configuration worlds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code MCP config: &lt;code&gt;mcp.json&lt;/code&gt; (workspace commonly at &lt;code&gt;.vscode/mcp.json&lt;/code&gt;, plus user profile config)&lt;/li&gt;
&lt;li&gt;Copilot coding agent MCP config: JSON with &lt;code&gt;mcpServers&lt;/code&gt; and explicit &lt;code&gt;type&lt;/code&gt; (&lt;code&gt;local&lt;/code&gt;, &lt;code&gt;stdio&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;sse&lt;/code&gt;), and documented reuse from VS Code MCP configuration patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a chezmoi setup, it is practical to generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.vscode/mcp.json&lt;/code&gt; for local editor agent workflows&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.copilot/mcp-config.json&lt;/code&gt; (or equivalent copilot-target file in your model) for coding-agent workflows where needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common ground: a normalized MCP model
&lt;/h2&gt;

&lt;p&gt;Use one canonical data file, for example in chezmoi source state:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dot_config/mcp/servers.yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.githubcopilot.com/mcp/"&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;${GITHUB_TOKEN}"&lt;/span&gt;

  &lt;span class="na"&gt;filesystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stdio&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npx"&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-y"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/Users/lukas"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;NODE_NO_WARNINGS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then render adapters per tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  chezmoi layout that scales
&lt;/h2&gt;

&lt;p&gt;A practical structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.local/share/chezmoi/
  .chezmoitemplates/
    mcp/
      codex-config.toml.tmpl
      claude-mcp.json.tmpl
      cursor-mcp.json.tmpl
      vscode-mcp.json.tmpl
      copilot-mcp-config.json.tmpl
  dot_config/
    mcp/
      servers.yaml
  dot_codex/
    config.toml.tmpl
  dot_claude/
    mcp_servers.json.tmpl
  dot_cursor/
    mcp.json.tmpl
  dot_vscode/
    mcp.json.tmpl
  dot_copilot/
    mcp-config.json.tmpl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;.chezmoitemplates&lt;/code&gt; for reusable snippets and avoid duplicating mapping logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Templating pattern
&lt;/h2&gt;

&lt;p&gt;chezmoi treats files as templates when they have &lt;code&gt;.tmpl&lt;/code&gt; suffix (or live under &lt;code&gt;.chezmoitemplates&lt;/code&gt;), and exposes machine facts like &lt;code&gt;.chezmoi.os&lt;/code&gt; and &lt;code&gt;.chezmoi.hostname&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That lets you do things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different filesystem roots on macOS vs Linux&lt;/li&gt;
&lt;li&gt;Company-only servers on work laptops&lt;/li&gt;
&lt;li&gt;Personal-only servers on home machines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example gate in template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{- if eq .chezmoi.hostname "work-laptop" -}}
# render internal MCP server
{{- end -}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Symlinks and private data
&lt;/h2&gt;

&lt;p&gt;chezmoi source-state attributes are important for this problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;symlink_&lt;/code&gt; to create symlink targets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;private_&lt;/code&gt; for sensitive files/permissions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;encrypted_&lt;/code&gt; + age/gpg encryption for secret-bearing material&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is ideal for MCP because tokens and headers frequently differ by machine/account.&lt;/p&gt;

&lt;p&gt;Recommended split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep server topology in a committed template/data file&lt;/li&gt;
&lt;li&gt;Keep secrets in encrypted/private files or external secret providers&lt;/li&gt;
&lt;li&gt;Render env var references into final tool configs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mapping rules (the critical part)
&lt;/h2&gt;

&lt;p&gt;Define clear transformation rules once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;transport: stdio&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codex: TOML command/args/env under &lt;code&gt;[mcp_servers.&amp;lt;name&amp;gt;]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Claude/Cursor/VSCode/Copilot: JSON object with command args env and tool-specific type field if required&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;transport: http&lt;/code&gt; (or &lt;code&gt;sse&lt;/code&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codex: &lt;code&gt;url&lt;/code&gt; (+ auth/header fields)&lt;/li&gt;
&lt;li&gt;JSON tools: &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;headers&lt;/code&gt;, and possibly &lt;code&gt;type&lt;/code&gt; (&lt;code&gt;http&lt;/code&gt;/&lt;code&gt;sse&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optional per-tool fields&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep them in an &lt;code&gt;overrides&lt;/code&gt; map in canonical YAML if absolutely necessary&lt;/li&gt;
&lt;li&gt;Avoid polluting the base model with vendor-only keys unless needed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Suggested generation flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Edit canonical &lt;code&gt;servers.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;chezmoi apply&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Let templates produce:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~/.codex/config.toml&lt;/code&gt; MCP block&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.claude.json&lt;/code&gt; or project &lt;code&gt;.mcp.json&lt;/code&gt; projection&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.vscode/mcp.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.copilot/mcp-config.json&lt;/code&gt; (if used in your setup)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want strict reproducibility, generate all from templates only and never edit generated targets directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Copilot and Cursor MCP features are evolving quickly; treat adapters as projection layers, not permanent schemas.&lt;/li&gt;
&lt;li&gt;Claude has multiple config surfaces (&lt;code&gt;settings.json&lt;/code&gt;, &lt;code&gt;~/.claude.json&lt;/code&gt;, &lt;code&gt;.mcp.json&lt;/code&gt;), so be explicit about which one your team standardizes on.&lt;/li&gt;
&lt;li&gt;Project-level files (&lt;code&gt;.vscode/mcp.json&lt;/code&gt;, &lt;code&gt;.mcp.json&lt;/code&gt;, &lt;code&gt;.codex/config.toml&lt;/code&gt;) are great for shared defaults; user-level files should hold personal secrets and machine specifics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;The durable strategy is not "pick one tool format."&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One canonical MCP model&lt;/li&gt;
&lt;li&gt;Many generated vendor configs&lt;/li&gt;
&lt;li&gt;chezmoi templates + machine facts + private/encrypted files to keep it safe and portable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives you consistency across Codex, Claude, Cursor, and Copilot without locking yourself to one vendor schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.chezmoi.io" rel="noopener noreferrer"&gt;chezmoi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chezmoi.io/user-guide/templating/" rel="noopener noreferrer"&gt;chezmoi templating guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chezmoi.io/user-guide/manage-machine-to-machine-differences/" rel="noopener noreferrer"&gt;chezmoi machine-to-machine differences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chezmoi.io/reference/source-state-attributes/" rel="noopener noreferrer"&gt;chezmoi source state attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/mcp" rel="noopener noreferrer"&gt;OpenAI Codex MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/config-advanced" rel="noopener noreferrer"&gt;OpenAI Codex advanced config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/claude-code/settings" rel="noopener noreferrer"&gt;Anthropic Claude Code settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/claude-code/mcp" rel="noopener noreferrer"&gt;Anthropic Claude Code MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/docs/mcp" rel="noopener noreferrer"&gt;Cursor MCP docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/customization/mcp-servers" rel="noopener noreferrer"&gt;VS Code MCP docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/extend-copilot-chat-with-mcp" rel="noopener noreferrer"&gt;GitHub Copilot MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/using-github-copilot/coding-agent/extending-copilot-coding-agent-with-mcp" rel="noopener noreferrer"&gt;GitHub Copilot coding agent MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ryanreh99/skills-sync/blob/main/docs/agent-storage-map.md" rel="noopener noreferrer"&gt;skills-sync agent storage map&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotfiles</category>
      <category>claude</category>
      <category>codex</category>
      <category>chezmoi</category>
    </item>
    <item>
      <title>One Skills Brain for Codex, Claude, Cursor, and Copilot with Chezmoi</title>
      <dc:creator>Lukas Wolfsteiner</dc:creator>
      <pubDate>Sat, 07 Mar 2026 21:10:09 +0000</pubDate>
      <link>https://forem.com/dotwee/one-skills-brain-for-codex-claude-cursor-and-copilot-with-chezmoi-2p3k</link>
      <guid>https://forem.com/dotwee/one-skills-brain-for-codex-claude-cursor-and-copilot-with-chezmoi-2p3k</guid>
      <description>&lt;h1&gt;
  
  
  One Skills Brain for Codex, Claude, Cursor, and Copilot with Chezmoi
&lt;/h1&gt;

&lt;p&gt;When you use multiple coding agents across multiple machines, the same prompt often behaves differently for a simple reason: your agent skills and MCP wiring drift over time.&lt;/p&gt;

&lt;p&gt;Typical failure modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a skill is updated in one tool but not the others&lt;/li&gt;
&lt;li&gt;MCP servers are configured differently per machine&lt;/li&gt;
&lt;li&gt;one tool reads user-level config, another reads project-level config, and behavior diverges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The initial problem is not just dotfiles sync. It is maintaining one consistent agent behavior contract across Codex, Claude, Cursor, and Copilot despite different config formats and file locations.&lt;/p&gt;

&lt;p&gt;The solution in this guide is to separate concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one canonical skills directory: &lt;code&gt;~/.agent-skills/skills&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;one canonical MCP intent (shared definitions rendered per tool)&lt;/li&gt;
&lt;li&gt;one dotfiles manager (chezmoi) to materialize tool-native adapters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why this works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;skills stay identical because they live in one place&lt;/li&gt;
&lt;li&gt;each tool keeps its native schema, so updates are compatible with official behavior&lt;/li&gt;
&lt;li&gt;chezmoi templates and symlinks remove manual copy/paste and reduce drift&lt;/li&gt;
&lt;li&gt;path differences are explicit and auditable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All path references below follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ryanreh99/skills-sync/blob/main/docs/agent-storage-map.md" rel="noopener noreferrer"&gt;&lt;code&gt;agent-storage-map.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Path contract (from agent-storage-map)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Codex&lt;br&gt;
User config: &lt;code&gt;~/.codex/config.toml&lt;/code&gt;&lt;br&gt;
Project config: &lt;code&gt;.codex/config.toml&lt;/code&gt;&lt;br&gt;
Skills: &lt;code&gt;.agents/skills&lt;/code&gt; and &lt;code&gt;SKILL.md&lt;/code&gt; folders&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Claude Code&lt;br&gt;
Main MCP config: &lt;code&gt;~/.claude.json&lt;/code&gt;&lt;br&gt;
Dedicated MCP file: &lt;code&gt;~/.claude/mcp_servers.json&lt;/code&gt; (lower precedence than &lt;code&gt;~/.claude.json&lt;/code&gt;)&lt;br&gt;
Settings: &lt;code&gt;~/.claude/settings.json&lt;/code&gt;, &lt;code&gt;.claude/settings.json&lt;/code&gt;, &lt;code&gt;.claude/settings.local.json&lt;/code&gt;&lt;br&gt;
Sub-agents: &lt;code&gt;~/.claude/agents/&lt;/code&gt;, &lt;code&gt;.claude/agents/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cursor&lt;br&gt;
MCP config: &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;, &lt;code&gt;.cursor/mcp.json&lt;/code&gt;&lt;br&gt;
Skills: &lt;code&gt;~/.cursor/skills/&lt;/code&gt;, &lt;code&gt;.cursor/skills/&lt;/code&gt;&lt;br&gt;
Compatibility skills paths include &lt;code&gt;~/.codex/skills/&lt;/code&gt;, &lt;code&gt;~/.claude/skills/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub Copilot&lt;br&gt;
MCP config: &lt;code&gt;~/.copilot/mcp-config.json&lt;/code&gt;&lt;br&gt;
Skills: &lt;code&gt;~/.copilot/skills/&lt;/code&gt;, &lt;code&gt;.copilot/skills/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why symlinks (not hard links)
&lt;/h2&gt;

&lt;p&gt;Use symlinks for shared skills directories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explicit target path (&lt;code&gt;readlink&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;works natively with chezmoi &lt;code&gt;symlink_&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;easier operationally than hard links for directory trees&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chezmoi source tree (concrete)
&lt;/h2&gt;

&lt;p&gt;This is the chezmoi source-state tree (&lt;code&gt;$(chezmoi source-path)&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.local/share/chezmoi/
├── dot_agent-skills/
│   ├── README.md
│   ├── skills/
│   │   ├── commit-style/
│   │   │   └── SKILL.md
│   │   └── test-triage/
│   │       └── SKILL.md
│   └── mcp/
│       ├── codex-mcp.toml.tmpl
│       ├── generic-mcp.json.tmpl
│       └── copilot-mcp.json.tmpl
├── dot_codex/
│   ├── config.toml.tmpl
│   └── symlink_skills.tmpl
├── private_dot_claude.json.tmpl
├── dot_claude/
│   └── settings.json.tmpl
├── dot_cursor/
│   ├── mcp.json.tmpl
│   └── symlink_skills.tmpl
└── dot_copilot/
    ├── mcp-config.json.tmpl
    └── symlink_skills.tmpl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chezmoi attribute reminders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dot_&lt;/code&gt; -&amp;gt; leading dot in target&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;private_&lt;/code&gt; -&amp;gt; stricter permissions in target&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;symlink_&lt;/code&gt; -&amp;gt; create a symlink target&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.tmpl&lt;/code&gt; -&amp;gt; template rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Command set
&lt;/h2&gt;

&lt;h2&gt;
  
  
  First machine
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chezmoi init git@github.com:&amp;lt;you&amp;gt;/&amp;lt;dotfiles&amp;gt;.git
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;chezmoi source-path&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Optional: import existing files&lt;/span&gt;
chezmoi add ~/.codex/config.toml
chezmoi add ~/.claude.json
chezmoi add ~/.claude/settings.json
chezmoi add ~/.cursor/mcp.json
chezmoi add ~/.copilot/mcp-config.json

chezmoi diff
chezmoi apply &lt;span class="nt"&gt;-v&lt;/span&gt;

git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: unify skills and mcp adapters"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional machines
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chezmoi init git@github.com:&amp;lt;you&amp;gt;/&amp;lt;dotfiles&amp;gt;.git
chezmoi update &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Daily flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chezmoi edit ~/.codex/config.toml
chezmoi diff
chezmoi apply &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shared skills content
&lt;/h2&gt;

&lt;p&gt;Create all skills once in &lt;code&gt;dot_agent-skills/skills&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Example &lt;code&gt;dot_agent-skills/skills/commit-style/SKILL.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# commit-style&lt;/span&gt;

&lt;span class="gu"&gt;## Goal&lt;/span&gt;
Create clear conventional commits.

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Keep subject under 50 chars.
&lt;span class="p"&gt;-&lt;/span&gt; Use imperative present tense.
&lt;span class="p"&gt;-&lt;/span&gt; Explain user impact in body.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After apply, this becomes &lt;code&gt;~/.agent-skills/skills/...&lt;/code&gt; and is your canonical skill bank.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shared MCP templates
&lt;/h2&gt;

&lt;p&gt;Keep one MCP intent and render per tool schema.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;dot_agent-skills/mcp/codex-mcp.toml.tmpl&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.filesystem]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"{{ .homeDir }}/.agent-skills/skills"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[mcp_servers.git]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"{{ .homeDir }}/Developer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;dot_agent-skills/mcp/generic-mcp.json.tmpl&lt;/code&gt; (Claude/Cursor style)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/.agent-skills/skills"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/Developer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;dot_agent-skills/mcp/copilot-mcp.json.tmpl&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/.agent-skills/skills"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/Developer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Per-tool templates
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1) Codex
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dot_codex/config.toml.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"gpt-5-codex"&lt;/span&gt;
&lt;span class="py"&gt;approval_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"on-request"&lt;/span&gt;

&lt;span class="nn"&gt;[mcp_servers.filesystem]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"{{ .homeDir }}/.agent-skills/skills"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[mcp_servers.git]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"{{ .homeDir }}/Developer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dot_codex/symlink_skills.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{ .homeDir }}/.agent-skills/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: &lt;code&gt;~/.codex/skills -&amp;gt; ~/.agent-skills/skills&lt;/code&gt;&lt;br&gt;
Use this mainly as a compatibility anchor for tools that read Codex-style skills paths.&lt;br&gt;
For Codex itself, keep project skills in &lt;code&gt;.agents/skills&lt;/code&gt; when you want repository-local behavior.&lt;/p&gt;
&lt;h2&gt;
  
  
  2) Claude Code
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;private_dot_claude.json.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/.agent-skills/skills"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/Developer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dot_claude/settings.json.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For project-level MCP, use &lt;code&gt;.mcp.json&lt;/code&gt; with the same filesystem path.&lt;br&gt;
For agent logic, prefer documented &lt;code&gt;.claude/agents/&lt;/code&gt; over &lt;code&gt;.claude/skills/&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  3) Cursor
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dot_cursor/mcp.json.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/.agent-skills/skills"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/Developer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dot_cursor/symlink_skills.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{ .homeDir }}/.agent-skills/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: &lt;code&gt;~/.cursor/skills -&amp;gt; ~/.agent-skills/skills&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4) GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dot_copilot/mcp-config.json.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/.agent-skills/skills"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{ .homeDir }}/Developer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dot_copilot/symlink_skills.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{ .homeDir }}/.agent-skills/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: &lt;code&gt;~/.copilot/skills -&amp;gt; ~/.agent-skills/skills&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;readlink&lt;/span&gt; ~/.codex/skills
&lt;span class="nb"&gt;readlink&lt;/span&gt; ~/.cursor/skills
&lt;span class="nb"&gt;readlink&lt;/span&gt; ~/.copilot/skills
&lt;span class="nb"&gt;ls&lt;/span&gt; ~/.agent-skills/skills

chezmoi status
chezmoi diff
chezmoi verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: all symlinks resolve to &lt;code&gt;~/.agent-skills/skills&lt;/code&gt;, and each MCP file targets that same path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature parity with &lt;code&gt;skills-sync&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I reviewed &lt;code&gt;skills-sync&lt;/code&gt; feature usage and mapped it to chezmoi primitives.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Single source workspace&lt;br&gt;
Chezmoi equivalent: one source state with canonical &lt;code&gt;dot_agent-skills/skills&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Symlink distribution&lt;br&gt;
Chezmoi equivalent: &lt;code&gt;symlink_*.tmpl&lt;/code&gt; entries per tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Profile switching (&lt;code&gt;use &amp;lt;profile&amp;gt;&lt;/code&gt;)&lt;br&gt;
Chezmoi equivalent: &lt;code&gt;.chezmoidata/profiles.yaml&lt;/code&gt; + template conditionals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Runtime materialization (&lt;code&gt;sync&lt;/code&gt;)&lt;br&gt;
Chezmoi equivalent: &lt;code&gt;chezmoi apply -v&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seed content (&lt;code&gt;init --seed&lt;/code&gt;)&lt;br&gt;
Chezmoi equivalent: commit baseline skills/templates in source state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upstream ingestion (&lt;code&gt;add-upstream&lt;/code&gt;, &lt;code&gt;add-skill&lt;/code&gt;)&lt;br&gt;
Chezmoi equivalent: &lt;code&gt;external_&lt;/code&gt; or scripted &lt;code&gt;run_onchange_&lt;/code&gt; sync jobs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drift/inventory (&lt;code&gt;agents drift&lt;/code&gt;, &lt;code&gt;agents inventory&lt;/code&gt;)&lt;br&gt;
Chezmoi equivalent: &lt;code&gt;chezmoi status/diff/verify&lt;/code&gt; plus symlink checks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Profile-aware template example
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;.chezmoidata/profiles.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;active_profile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;personal&lt;/span&gt;
&lt;span class="na"&gt;profiles&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;personal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;dev_root&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;~/Developer"&lt;/span&gt;
  &lt;span class="na"&gt;work&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;dev_root&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;~/Work"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use in template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="err"&gt;{{-&lt;/span&gt; &lt;span class="err"&gt;$p&lt;/span&gt; &lt;span class="py"&gt;:&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;index&lt;/span&gt; &lt;span class="err"&gt;.profiles&lt;/span&gt; &lt;span class="err"&gt;.active_profile&lt;/span&gt; &lt;span class="err"&gt;-}}&lt;/span&gt;
&lt;span class="nn"&gt;[mcp_servers.git]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"@modelcontextprotocol/server-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"--repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"{{ $p.dev_root }}"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switch profile by changing &lt;code&gt;active_profile&lt;/code&gt;, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chezmoi apply &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Upstream sync example
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;run_onchange_after_50-sync-upstream-skills.sh.tmpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-eu&lt;/span&gt;

&lt;span class="nv"&gt;ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.agent-skills/skills/upstream"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ROOT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

sync_repo&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ROOT&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;/.git"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;git &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; pull &lt;span class="nt"&gt;--ff-only&lt;/span&gt;
  &lt;span class="k"&gt;else
    &lt;/span&gt;git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

sync_repo &lt;span class="s2"&gt;"matlab_skills"&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/matlab-deep-learning/llm-agents-with-mcp.git"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chezmoi apply &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Security and portability notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep tokens in env vars, not committed config files.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;private_&lt;/code&gt; for files that may carry sensitive values.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;{{ .homeDir }}&lt;/code&gt; in templates for cross-machine portability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern gives one skill bank, one MCP intent, four adapters, and minimal drift.&lt;/p&gt;

&lt;p&gt;Cheers,&lt;br&gt;
Lukas&lt;/p&gt;

</description>
      <category>dotfiles</category>
      <category>claude</category>
      <category>githubcopilot</category>
      <category>codex</category>
    </item>
  </channel>
</rss>
