<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Dante De Ruwe</title><description>Blog posts by Dante De Ruwe</description><link>https://dantederuwe.com/</link><language>en-us</language><item><title>How to create a local gitignore file</title><link>https://dantederuwe.com/blog/how-to-create-a-local-gitignore-file/</link><guid isPermaLink="true">https://dantederuwe.com/blog/how-to-create-a-local-gitignore-file/</guid><description>In stead of carefully avoiding to stage some experimental files, we can let git ignore them locally without changing the repo&apos;s gitignore!</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dante De Ruwe • 2 min read&lt;/p&gt;
&lt;h1&gt;How to create a local gitignore file&lt;/h1&gt;
&lt;p&gt;Sometimes, you want to experiment and tinker with stuff locally without git tracking your files. Think about experimenting with AI agents, local scripts, or even leaving yourself todo notes in every repo.&lt;/p&gt;
&lt;p&gt;In stead of carefully avoiding to stage and commit these files, we can let git ignore them without changing the repo&apos;s &lt;code&gt;.gitignore&lt;/code&gt;!&lt;/p&gt;
&lt;h2&gt;Additional gitignore files&lt;/h2&gt;
&lt;p&gt;Did you know you can create additional gitignore files? These can extend your main gitignore file.&lt;/p&gt;
&lt;p&gt;You can let git know it should treat an extra gitignore file with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --local core.excludesfile &quot;&amp;lt;my-gitignore-path&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This way, you can add your experimental files or folders that you&apos;re not ready for the world to see, away from the allseeing eye of git 👀&lt;/p&gt;
&lt;h2&gt;Keeping your gitignore file local&lt;/h2&gt;
&lt;p&gt;We don&apos;t want this gitignore to be added to the repo! So we&apos;ll have to set it up to be local.&lt;/p&gt;
&lt;p&gt;We&apos;re going to do this as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a local gitignore file (call it e.g. &lt;code&gt;.local.gitignore&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add it to the git config as shown above:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --local core.excludesfile &quot;&amp;lt;full-path-to-.local.gitignore&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a reference to the local gitignore file in the local gitignore file itself&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;i.e. the first line of &lt;code&gt;.local.gitignore&lt;/code&gt; will be &lt;code&gt;.local.gitignore&lt;/code&gt;
(or even &lt;code&gt;.local.*&lt;/code&gt; if you want to use this pattern for other files too)&lt;/li&gt;
&lt;li&gt;this way, the file will ignore itself!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;div class=&quot;bg-slate-800 rounded-xl mt-8 px-6 py-1&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🚀 Terminal oneliners for quick setup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run this in the root folder of your git repository.&lt;/p&gt;
&lt;p&gt;Bash (Linux or Git Bash):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;.local.gitignore&quot; &amp;gt; .local.gitignore &amp;amp;&amp;amp; git config --local core.excludesfile &quot;$(pwd)/.local.gitignore&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Powershell (Windows):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-Content .local.gitignore &quot;.local.gitignore&quot;; git config --local core.excludesfile &quot;$PWD\.local.gitignore&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;Tips&lt;/h2&gt;
&lt;p&gt;The contents of my local gitignore are mostly as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.local.*
.local/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This ignores all files starting with &lt;code&gt;.local.&lt;/code&gt; (such as &lt;code&gt;.local.gitignore&lt;/code&gt; itself!),
and also ignores a &lt;code&gt;.local&lt;/code&gt; folder where you can keep your super secret files with whatever names you wish.&lt;/p&gt;
</content:encoded></item><item><title>How I Set Up Shared Agent Config for Our Team with APM</title><link>https://dantederuwe.com/blog/shared-team-agent-config-with-apm/</link><guid isPermaLink="true">https://dantederuwe.com/blog/shared-team-agent-config-with-apm/</guid><description>I set up a shared Git repo of reusable AI agent skills, instructions, and hooks for my team. APM distributes them to every project in one command.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dante De Ruwe • 12 min read&lt;/p&gt;
&lt;h1&gt;How I Set Up Shared Agent Config for Our Team with APM&lt;/h1&gt;
&lt;p&gt;I set up a shared Git repo for our team to maintain reusable AI agent packages: skills, instructions, coding standards, custom agents. We use &lt;a href=&quot;https://microsoft.github.io/apm&quot;&gt;APM&lt;/a&gt; (Agent Package Manager) to distribute them to every project in one command. Think &lt;code&gt;npm&lt;/code&gt;, but for agent config.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Four problems I kept running into&lt;/h2&gt;
&lt;p&gt;If you&apos;ve been working with AI coding agents (Copilot, Claude, Cursor, Codex), you&apos;ve run into a few of these.&lt;/p&gt;
&lt;h3&gt;Configuration drift&lt;/h3&gt;
&lt;p&gt;You spend time crafting instructions, coding standards, and skills for your project. It works well. Then you start a new project, and you copy-paste it all over. And again. A few months later, you&apos;ve got a bunch of repos with their own subtly different versions of the same agent configuration. You improve the frontend guidelines in repo A, but repos B through N never get the update. Nobody notices until something breaks.&lt;/p&gt;
&lt;h3&gt;Tool lock-in&lt;/h3&gt;
&lt;p&gt;Each AI tool wants its config in a different place. Copilot reads from &lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.copilot/&lt;/code&gt;, or &lt;code&gt;.agents/&lt;/code&gt; depending on where you put your config, Claude wants &lt;code&gt;.claude/&lt;/code&gt;, Cursor has &lt;code&gt;.cursor/&lt;/code&gt; and so on. If you want to support multiple tools, or keep your options open, you end up maintaining the same knowledge in multiple formats and keeping all of those in sync.&lt;/p&gt;
&lt;h3&gt;No source of truth in the repo&lt;/h3&gt;
&lt;p&gt;One way to avoid tool lock-in is to not commit those tool-specific folders at all. But then a new team member clones a repo and gets zero agent setup. They build their own from scratch, copy files from a colleague, or grab what they can from a shared location. Everyone ends up with a different setup, and nobody knows which one is &quot;right&quot; for that project.&lt;/p&gt;
&lt;h3&gt;Shared and project-specific config blur together&lt;/h3&gt;
&lt;p&gt;Skills that apply to every repo live next to skills that only make sense for one project. If you store agent config in your user directory, it follows you to every repo whether it belongs there or not. If you try to share a setup with a teammate, you&apos;re handing over a flat pile of files with no indication of what&apos;s generic and what&apos;s project-specific. Copying setups between repos drags along things that don&apos;t belong.&lt;/p&gt;
&lt;p&gt;I was dealing with all of these. It was getting out of hand.&lt;/p&gt;
&lt;h2&gt;Finding the right tool&lt;/h2&gt;
&lt;p&gt;I wanted a way to manage agent configuration as dependencies: declarative, versioned, and shareable across repos. Two tools stood out.&lt;/p&gt;
&lt;h3&gt;skills.sh&lt;/h3&gt;
&lt;p&gt;If you&apos;ve looked into sharing agent capabilities before, you may have come across &lt;a href=&quot;https://skills.sh&quot;&gt;skills.sh&lt;/a&gt; (or its &lt;code&gt;npx skills add&lt;/code&gt; CLI), built by &lt;a href=&quot;https://github.com/vercel-labs/agent-skills&quot;&gt;Vercel&lt;/a&gt;. It&apos;s a solid tool for installing community skills into your project with a single command.&lt;/p&gt;
&lt;p&gt;I started there, but ran into its limits. skills.sh focuses on skills[^1], which are only one of the primitives you might want to share. I also needed to distribute instructions (coding standards, conventions), custom agent definitions, hooks, and prompt templates.&lt;/p&gt;
&lt;p&gt;skills.sh is a good fit if you want to grab a few community skills. I needed something that manages a full stack of agent configuration across teams and projects.&lt;/p&gt;
&lt;h3&gt;APM: a package manager for agent configuration&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://microsoft.github.io/apm&quot;&gt;APM&lt;/a&gt;, or &lt;strong&gt;Agent Package Manager&lt;/strong&gt;, is a tool by Microsoft that does for AI agent setup what &lt;code&gt;npm&lt;/code&gt; does for JavaScript dependencies. You declare what agent packages you need in an &lt;code&gt;apm.yml&lt;/code&gt; file, run &lt;code&gt;apm install&lt;/code&gt;, and it pulls everything in, lockfile included.&lt;/p&gt;
&lt;p&gt;APM supports instructions, skills, hooks, agents, prompts, and MCP server configuration as first-class primitives[^2]. It also handles transitive dependencies, lockfiles, and deploying to multiple tools at once.&lt;/p&gt;
&lt;p&gt;APM is &lt;strong&gt;tool-agnostic&lt;/strong&gt;. It detects what tools your project uses and deploys the right files to the right places. Write your agent config once, deploy it to Copilot, Claude, Cursor, or any other supported tool.&lt;/p&gt;
&lt;p&gt;There&apos;s no central registry. Packages are Git repos, resolved over SSH or HTTPS. That means private repos work out of the box if you have Git access to them (APM reuses your existing Git credentials[^3]). If you stop using APM, your deployed files still work in their native format. &lt;a href=&quot;https://news.ycombinator.com/item?id=47454448&quot;&gt;The APM creator&apos;s HN post&lt;/a&gt; explains the reasoning: each tool vendor governs its own ecosystem, so a cross-tool dependency manager shouldn&apos;t introduce yet another walled garden[^4].&lt;/p&gt;
&lt;p&gt;Dependencies can point to an entire repo, a subfolder inside a repo, or a single file. You can reference GitHub repos with shorthand (&lt;code&gt;owner/repo&lt;/code&gt;), use full HTTPS or SSH URLs for any Git host (GitLab, Bitbucket, Azure DevOps, self-hosted), or point to local paths for monorepo setups[^2]. This flexibility is what makes the shared repo pattern work: one Git repo, multiple installable packages as subfolders.&lt;/p&gt;
&lt;h2&gt;One shared repo, many consuming projects&lt;/h2&gt;
&lt;p&gt;I took this further. Instead of maintaining agent config per project, I created a &lt;strong&gt;central Git repository&lt;/strong&gt; that acts as a catalog of reusable APM packages.&lt;/p&gt;
&lt;p&gt;APM&apos;s &lt;a href=&quot;https://microsoft.github.io/apm/guides/org-packages/&quot;&gt;org packages guide&lt;/a&gt; suggests creating separate repos per concern: one for security baselines, one for coding standards. I tried a different approach: one repo with multiple packages as subfolders, connected through internal dependencies. Same composability, less overhead. One repo to manage, one place to review changes. Packages still stay independent and focused.&lt;/p&gt;
&lt;p&gt;The structure organizes packages by concern, and each project pulls in what it needs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;agents-repo/
├─ general/             → guidance for ALL projects
├─ development/
│  ├─ _shared/          → shared building blocks (internal dependency)
│  ├─ backend-dotnet/   → .NET-specific guidance
│  └─ frontend-angular/ → Angular-specific guidance
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each folder is its own installable package with its own &lt;code&gt;apm.yml&lt;/code&gt;. An Angular frontend project pulls in &lt;code&gt;general&lt;/code&gt; and &lt;code&gt;development/frontend-angular&lt;/code&gt;. A .NET API project grabs &lt;code&gt;general&lt;/code&gt; and &lt;code&gt;development/backend-dotnet&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Why this modularity matters&lt;/h3&gt;
&lt;p&gt;The packages form a dependency graph.&lt;/p&gt;
&lt;p&gt;Both &lt;code&gt;backend-dotnet&lt;/code&gt; and &lt;code&gt;frontend-angular&lt;/code&gt; declare &lt;code&gt;_shared&lt;/code&gt; as a dependency in their own &lt;code&gt;apm.yml&lt;/code&gt;. &lt;code&gt;_shared&lt;/code&gt; contains things that apply to &lt;em&gt;all&lt;/em&gt; development work but not to non-development uses of the agent. Think instructions on how to write commit messages, a skill for addressing PR review comments, conventions around branching and code review. The stack-specific packages build on top of it. &lt;code&gt;backend-dotnet&lt;/code&gt; adds .NET conventions like solution structure, API design patterns, unit and integration testing practices, validation steps for builds and formatting. &lt;code&gt;frontend-angular&lt;/code&gt; adds things like component architecture guidelines, styling conventions, and its own validation flow for linting and builds.&lt;/p&gt;
&lt;p&gt;The underscore-prefixed &lt;code&gt;_shared&lt;/code&gt; folder is an internal dependency by convention. Other packages in the repo depend on it, but consuming projects don&apos;t reference it. They get it transitively.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;general&lt;/code&gt; package sits outside the &lt;code&gt;development/&lt;/code&gt; tree. It holds things that apply to &lt;em&gt;any&lt;/em&gt; project, no matter the tech stack: community skills like &lt;code&gt;skill-creator&lt;/code&gt;[^7] and &lt;code&gt;grill-me&lt;/code&gt;[^8], and connections to tools the whole organization uses. Non-developers like functional analysts can pull in &lt;code&gt;general&lt;/code&gt; on its own, without any of the development packages.&lt;/p&gt;
&lt;p&gt;For an Angular project, the dependency graph could look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;consuming project&apos;s apm.yml
├─ general                         (non-technical guidance, community skills)
└─ development/frontend-angular    (or backend-dotnet)
   └─ development/_shared          (transitive: shared dev tooling and skills)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A consuming project needs two lines in its &lt;code&gt;apm.yml&lt;/code&gt;. APM resolves the rest, and &lt;code&gt;_shared&lt;/code&gt; comes along because &lt;code&gt;frontend-angular&lt;/code&gt; depends on it.&lt;/p&gt;
&lt;p&gt;I update the PR review skill in &lt;code&gt;_shared&lt;/code&gt;, and every frontend and backend project picks up the change. I tighten the Angular coding standards, and only Angular projects are affected.&lt;/p&gt;
&lt;h2&gt;How a project consumes shared packages&lt;/h2&gt;
&lt;p&gt;In any project repo, you reference the shared packages in your &lt;code&gt;apm.yml&lt;/code&gt;. In this example, the shared config lives in a repo called &lt;code&gt;agents&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dependencies:
  apm:
    - git: your-git-host.com/your-org/agents
      path: development/frontend-angular
      ref: main

    - git: your-git-host.com/your-org/agents
      path: general
      ref: main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;APM resolves all dependencies, including transitive ones, and deploys the instructions, skills, and hooks into the right tool-specific folders (&lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, etc.). You don&apos;t need to commit these generated files to source control, because &lt;code&gt;apm install&lt;/code&gt; can regenerate them at any time.&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;--target &amp;lt;tool&amp;gt;&lt;/code&gt; (e.g. &lt;code&gt;--target claude&lt;/code&gt;) to deploy for a specific tool only. Add &lt;code&gt;--update&lt;/code&gt; to pull the latest versions of all dependencies before installing. You can combine both:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apm install --target claude --update
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Pulling in community-built skills&lt;/h3&gt;
&lt;p&gt;APM also supports pulling in packages from public GitHub repos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dependencies:
  apm:
    - anthropics/skills/skills/skill-creator
    - mattpocock/skills/productivity/grill-me
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The community around shared skills is growing. You can mix community-built skills with your own organization&apos;s standards. Found a good skill on GitHub? Add it as a dependency!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Side note: these two specific skills are fantastic. Anthropic&apos;s skill-creator[^7] helps you build, test, and iterate on new skills with evals baked in. Matt Pocock&apos;s grill-me[^8] interviews you about a plan or design until the gaps surface. I added both to my default setup and I can&apos;t imagine working without them now.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Local overrides with &lt;code&gt;.apm/&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Some projects have quirks that don&apos;t belong in a shared package. For these, you can place project-specific instructions, skills, or hooks in a local &lt;code&gt;.apm/&lt;/code&gt; folder right inside your project repo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-project/
├─ apm.yml
├─ apm.lock.yaml
└─ .apm/
   ├─ instructions/
   │  └─ local-conventions.instructions.md
   └─ skills/
       └─ my-project-skill/
           └─ SKILL.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you run &lt;code&gt;apm install&lt;/code&gt;, APM picks up this local content and deploys it alongside your shared dependencies. No extra config in &lt;code&gt;apm.yml&lt;/code&gt; needed.&lt;/p&gt;
&lt;p&gt;I&apos;m a bit proud of this one, because this feature &lt;a href=&quot;https://github.com/microsoft/apm/issues/626&quot;&gt;started as a feature request I filed&lt;/a&gt; on the APM repo. Before v0.8.12, the &lt;code&gt;.apm/&lt;/code&gt; folder in your own project wasn&apos;t treated the same way as content from installed packages. You had to use workarounds like &lt;code&gt;apm install ./.apm/skills/skill-name&lt;/code&gt; to get local skills deployed. That felt inconsistent. The &lt;code&gt;.apm/&lt;/code&gt; folder is the natural place for project-local APM content, so it should work out of the box.&lt;/p&gt;
&lt;p&gt;I filed the issue, another user independently confirmed the gap, and the APM team shipped the fix within two days. That kind of responsiveness from an open-source project is refreshing, and it shows APM is still in active development with a team that listens.&lt;/p&gt;
&lt;h2&gt;What you get from this setup&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;DRY, for real.&lt;/strong&gt; Write your coding standards once. Share them across projects. When you improve a skill or update an instruction, consuming projects get the update on their next &lt;code&gt;apm install --update&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool independence.&lt;/strong&gt; I don&apos;t want to commit to a single AI tool while this space evolves this fast. APM lets the same package of instructions and skills target Copilot, Claude, Cursor, or any other supported tool. If you switch tools next month, your agent knowledge comes with you.&lt;/p&gt;
&lt;p&gt;Different team members can even prefer different tools. Each person runs &lt;code&gt;apm install&lt;/code&gt;, and they get the config deployed for &lt;em&gt;their&lt;/em&gt; tool of choice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Easy updates.&lt;/strong&gt; Updating is a one-liner: &lt;code&gt;apm install --update&lt;/code&gt;. You can also pin to specific branches, tags, or commits for stability. Pin to &lt;code&gt;v1.2&lt;/code&gt; for a production project, or follow &lt;code&gt;main&lt;/code&gt; if you want the latest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Smooth team sharing.&lt;/strong&gt; A new team member runs &lt;code&gt;apm install&lt;/code&gt; and has the same agent setup as the rest of the team. The config lives in a repo, versioned and reviewable in pull requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Composability.&lt;/strong&gt; A consuming project picks the packages it needs. No Angular project inherits .NET conventions. No .NET project pulls in frontend linting instructions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supply-chain security.&lt;/strong&gt; Agent instructions have direct access to your codebase and terminal. That makes them a vector worth scanning. APM ships with &lt;code&gt;apm audit&lt;/code&gt;, which checks installed packages for hidden Unicode characters, bidi marks, and prompt-injection payloads. It outputs SARIF, so you can plug it into your existing code scanning pipeline[^5].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD integration.&lt;/strong&gt; The lockfile (&lt;code&gt;apm.lock.yaml&lt;/code&gt;) pins every dependency to an exact commit SHA, so &lt;code&gt;apm install&lt;/code&gt; in a CI pipeline produces the same agent setup as on your local machine. There&apos;s also an official &lt;a href=&quot;https://github.com/microsoft/apm-action&quot;&gt;GitHub Action&lt;/a&gt; if you want to automate installs and audits on every PR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Offline support.&lt;/strong&gt; &lt;code&gt;apm pack&lt;/code&gt; bundles your resolved dependencies into a portable archive. &lt;code&gt;apm unpack&lt;/code&gt; restores them on a machine without Git access. Useful if you work in environments with restricted internet connectivity, or if you want to ship a self-contained agent setup to someone who can&apos;t reach your Git host.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Local overrides.&lt;/strong&gt; Projects with specific quirks can add instructions, skills, or hooks in a local &lt;code&gt;.apm/&lt;/code&gt; folder without touching the shared packages.&lt;/p&gt;
&lt;h2&gt;Advice if you&apos;re doing this too&lt;/h2&gt;
&lt;h3&gt;Keep packages narrow&lt;/h3&gt;
&lt;p&gt;It&apos;s tempting to create one mega-package with all your standards, skills, and hooks bundled together. Resist that. Smaller, composable packages are easier to maintain. They let consuming projects pick up frontend guidance without also inheriting backend conventions they don&apos;t need. If two packages share common ground, extract that into a &lt;code&gt;_shared&lt;/code&gt; dependency rather than duplicating it.&lt;/p&gt;
&lt;h3&gt;Only share what&apos;s reusable&lt;/h3&gt;
&lt;p&gt;If guidance applies to one project, keep it local in that project&apos;s &lt;code&gt;.apm/&lt;/code&gt; folder. The shared repo is for patterns that apply across projects and teams. Putting single-project quirks in a shared package adds noise for consumers who don&apos;t need them, and creates maintenance burden when that project&apos;s needs change.&lt;/p&gt;
&lt;h3&gt;Treat it like code&lt;/h3&gt;
&lt;p&gt;Use pull requests, reviews, and meaningful commit messages. Your agent configuration shapes how AI tools behave across your entire organization. A bad instruction can propagate to dozens of repos on the next update. Give changes the same review rigor you&apos;d give production code.&lt;/p&gt;
&lt;h3&gt;Consider not committing generated files&lt;/h3&gt;
&lt;p&gt;APM&apos;s own docs suggest committing the tool-specific folders (&lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, &lt;code&gt;.cursor/&lt;/code&gt;, etc.)[^6], and there are valid reasons to do so: cloud agents may need config present in the repo, and committed files give contributors instant context before they run &lt;code&gt;apm install&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I chose not to, for now. My reasoning: these files can be regenerated from &lt;code&gt;apm install&lt;/code&gt; at any time, committing them repeats content that already lives in the shared packages, and I don&apos;t want the repo to prescribe which AI tool developers should use. If the generated config lives in &lt;code&gt;.gitignore&lt;/code&gt;, each developer runs &lt;code&gt;apm install&lt;/code&gt; and gets the output for their tool.&lt;/p&gt;
&lt;p&gt;I&apos;m not 100% sure this is the right call long-term, but it follows a principle I like: if code is generated from source, don&apos;t commit the output.&lt;/p&gt;
&lt;h2&gt;Try it yourself&lt;/h2&gt;
&lt;p&gt;If you&apos;re managing AI agents across multiple projects and you&apos;re still copy-pasting instructions between repos, this setup is worth an afternoon of your time.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install APM: &lt;code&gt;irm https://aka.ms/apm-windows | iex&lt;/code&gt; (Windows) or &lt;code&gt;curl -sSL https://aka.ms/apm-unix | sh&lt;/code&gt; (Mac/Linux)&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;apm init&lt;/code&gt; in a project&lt;/li&gt;
&lt;li&gt;Add a dependency and run &lt;code&gt;apm install&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;a href=&quot;https://microsoft.github.io/apm&quot;&gt;APM docs&lt;/a&gt; walk through each step. The &lt;a href=&quot;https://microsoft.github.io/apm/guides/org-packages/&quot;&gt;org packages guide&lt;/a&gt; covers the shared repo pattern in detail.&lt;/p&gt;
&lt;p&gt;If you do set this up, I&apos;d be curious to hear how it works for your team.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;[^1]: &lt;a href=&quot;https://skills.sh&quot;&gt;skills.sh&lt;/a&gt; focuses on installing skills (folders with a &lt;code&gt;SKILL.md&lt;/code&gt;) from GitHub repos.&lt;/p&gt;
&lt;p&gt;[^2]: APM supports instructions, prompts, agents, skills, hooks, chat modes, and MCP server configuration as first-class primitives. Dependencies can be entire repos, subfolders, or single files from any Git host. See the &lt;a href=&quot;https://microsoft.github.io/apm/guides/dependencies/&quot;&gt;APM dependencies guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[^3]: APM resolves authentication through environment variables, &lt;code&gt;gh auth login&lt;/code&gt;, or your system&apos;s Git credential helper. Private repos on GitHub, GitLab, Bitbucket, and Azure DevOps all work. See the &lt;a href=&quot;https://microsoft.github.io/apm/getting-started/authentication/&quot;&gt;APM authentication guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[^4]: From the &lt;a href=&quot;https://news.ycombinator.com/item?id=47454448&quot;&gt;APM creator&apos;s Show HN post&lt;/a&gt;: &quot;Why this won&apos;t come from plugin vendors: each tool governs its own ecosystem. [...] Nobody governs across tools, resolves cross-plugin dependencies, or gives consumers a lock file for what they actually installed.&quot;&lt;/p&gt;
&lt;p&gt;[^5]: Marcel Lupo wrote a good &lt;a href=&quot;https://dev.to/pwd9000/agent-package-manager-apm-a-devops-guide-to-reproducible-ai-agents-4c25&quot;&gt;DevOps-focused walkthrough of APM&lt;/a&gt; that covers the security and CI angles in more detail.&lt;/p&gt;
&lt;p&gt;[^6]: See the &quot;What to commit&quot; section in the &lt;a href=&quot;https://microsoft.github.io/apm/getting-started/quick-start/&quot;&gt;APM quick start guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[^7]: &lt;a href=&quot;https://github.com/anthropics/skills/tree/main/skills/skill-creator&quot;&gt;skill-creator&lt;/a&gt; by Anthropic. Helps you create, test, and optimize skills with built-in evals.&lt;/p&gt;
&lt;p&gt;[^8]: &lt;a href=&quot;https://github.com/mattpocock/skills/tree/main/skills/productivity/grill-me&quot;&gt;grill-me&lt;/a&gt; by Matt Pocock. Stress-tests your plans and designs through relentless questioning.&lt;/p&gt;
</content:encoded></item></channel></rss>