<?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>DEV Community: AI Workspace Builder</title>
    <description>The latest articles on DEV Community by AI Workspace Builder (@aiworkspacebuilder).</description>
    <link>https://dev.to/aiworkspacebuilder</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193440%2F5d9fc72b-a1ce-45c9-b7e9-b5f7da94d65b.png</url>
      <title>DEV Community: AI Workspace Builder</title>
      <link>https://dev.to/aiworkspacebuilder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aiworkspacebuilder"/>
    <language>en</language>
    <item>
      <title>Subagents and the iron triangle: when fanning out costs more than it saves</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Tue, 03 Nov 2026 14:02:23 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/subagents-and-the-iron-triangle-when-fanning-out-costs-more-than-it-saves-3803</link>
      <guid>https://dev.to/aiworkspacebuilder/subagents-and-the-iron-triangle-when-fanning-out-costs-more-than-it-saves-3803</guid>
      <description>&lt;p&gt;Spawning subagents is the feature everyone wants to show off. Hand the model a big task, split it into five, run them at once, done in a fifth of the time. On a demo it looks like free speed.&lt;/p&gt;

&lt;p&gt;It is not free. It is the old project triangle — &lt;strong&gt;speed, cost, quality: pick two&lt;/strong&gt; — wearing new clothes. Subagents buy you speed. The bill lands on the other two corners, and whether the trade is worth it depends entirely on one property of the work: does it share state.&lt;/p&gt;

&lt;h2&gt;
  
  
  What fan-out actually costs
&lt;/h2&gt;

&lt;p&gt;Run five agents instead of one and you pay in two places that do not show up until later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost.&lt;/strong&gt; Each agent carries its own context and burns its own tokens. Five agents reading the same repo is roughly five times the input, not one fifth. For a short task the speed is worth the spend; for a long one you can quietly multiply your bill without multiplying the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality.&lt;/strong&gt; This is the corner people miss. Agents running in parallel cannot see each other's work. Each one knows less than a single agent would, because the single agent accumulates everything it learns and the parallel ones each start cold. When their outputs have to fit together, nobody was holding the whole picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The line that decides it: shared state
&lt;/h2&gt;

&lt;p&gt;The honest rule is not "subagents good" or "subagents bad." It is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fan out for reads. Stay single for writes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reads fan out cleanly.&lt;/strong&gt; Searching a large codebase, running independent reviews from different angles, recon across many sources, summarising a pile of documents — the outputs do not touch each other. Five agents search five areas, you merge five answers. The triangle still charges you cost, but quality holds, because nothing collides. This is where parallel agents genuinely earn their keep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writes do not.&lt;/strong&gt; The moment two agents edit related files, the collisions start. One rewrites a helper the other was depending on. Both touch the same config and the second silently clobbers the first. Commit and signing steps race each other and you end up with unsigned or conflicting commits on the branch. Each agent, missing what the others did, makes a locally sensible change that is globally wrong. We have watched a batch of parallel builders do exactly this — faster to the first commit, slower to a working result, because the time saved up front came back as untangling afterwards.&lt;/p&gt;

&lt;p&gt;A missed review is slow. A bad parallel write is wrong, and it reports success while being wrong, which is the more expensive failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encode it where the agent reads it
&lt;/h2&gt;

&lt;p&gt;A mental model only helps if it is written down where the work happens. For a team, that is CLAUDE.md. One rule keeps everyone — human or agent — on the right side of the triangle:&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="gu"&gt;## Fan out for reads, stay single for writes&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Subagents are for read-only work: search, independent review, recon,
  summarising many sources. Their outputs are merged, never written back
  in parallel.
&lt;span class="p"&gt;-&lt;/span&gt; Build, edit and commit work runs in ONE agent in the main session —
  one change at a time. No parallel writers to shared files or the same
  branch.
&lt;span class="p"&gt;-&lt;/span&gt; "Do them all" / "in parallel" means sequential in one session, not
  fanned out.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now "do it in parallel" stops meaning "spawn five writers" and starts meaning "go fast, one thing at a time" — and the next person on the repo reads the same rule you did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The triangle does not bend
&lt;/h2&gt;

&lt;p&gt;Subagents are a throughput tool for independent reads, not a shortcut for shared-state writes. Fan out to search and review, and you get real speed at a fair price. Fan out to build, and you pay for the speed twice: once in tokens, once in untangling the mess. Pick the two corners you actually want before you spawn.&lt;/p&gt;

&lt;p&gt;If your team runs Claude Code, the rule above is one paste into your CLAUDE.md. &lt;a href="https://aiworkspacebuilder.ai" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; turns the way your team already works into that file — and the agent configs around it — so decisions like this one live in the repo instead of in one person's head.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How we build AI Workspace Builder with Claude Code</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Tue, 03 Nov 2026 07:08:55 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/how-we-build-ai-workspace-builder-with-claude-code-3l2m</link>
      <guid>https://dev.to/aiworkspacebuilder/how-we-build-ai-workspace-builder-with-claude-code-3l2m</guid>
      <description>&lt;p&gt;AI Workspace Builder has no engineering team. It has a Claude Code workspace. Its repository has more than 100 commits since the first one in April 2026, and all but 3 are co-authored by Claude Code: the web app, the sign-in and billing, the generator, the command-line installer and this blog.&lt;/p&gt;

&lt;p&gt;That doesn't mean the agent runs the company. It means the decisions, the rules and the review process are written down where the agent reads them. This post shows how that's set up, using our own repository as the example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three instruction files, one per area
&lt;/h2&gt;

&lt;p&gt;The repository has three CLAUDE.md files, 325 lines in total:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The root file (115 lines)&lt;/strong&gt; says what the product is, how the repository is laid out, the tech stack, how to build it, and the business context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The web app's file&lt;/strong&gt; covers the Next.js app: its stack, directory structure, authentication model, API routes and key conventions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The installer's file&lt;/strong&gt; covers the command-line tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude Code loads the root file in every session and each folder's file when it works in that folder, so a change to the web app doesn't carry the installer's rules around with it.&lt;/p&gt;

&lt;p&gt;The business context is the part most teams leave out, and it changes the agent's decisions more than any coding rule. Our root file lists the gates the product has to pass and the top risks to keep in mind. One of them reads: "never tie architecture solely to CLAUDE.md format; core value is doc reading + structured extraction." An agent that has read that line doesn't hard-code one output format into the generator, even when that would be quicker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every change goes through a council
&lt;/h2&gt;

&lt;p&gt;The root file has a section called "Mandatory council review". It says every change, whether a feature, bug fix, refactor or deployment script, goes to role profiles for review before it is implemented:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State the change and why.&lt;/li&gt;
&lt;li&gt;Pick the relevant profiles for that kind of change.&lt;/li&gt;
&lt;li&gt;Run each profile and record its concerns in its own words.&lt;/li&gt;
&lt;li&gt;When profiles disagree, name the trade-off.&lt;/li&gt;
&lt;li&gt;A CTO profile reviews everything and approves, modifies or blocks.&lt;/li&gt;
&lt;li&gt;Implement only after approval.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which profiles review depends on the change. A web page gets the frontend engineer and the product designer. Anything touching credentials gets the security analyst and the architect. A pricing change gets the revenue and finance profiles. Every completed build gets QA and a penetration tester. Critical findings block deployment.&lt;/p&gt;

&lt;p&gt;Each profile is a folder with a description of the role, a prompt to run it as an agent, and a review checklist. They stay project-neutral; the change being reviewed is filled in each time. This is the same idea we sell: a profile for each role, installed into the workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nothing is done until it's verified live
&lt;/h2&gt;

&lt;p&gt;The rule that matters most isn't about code. It's that the agent never reports something as done until it has checked the result where users see it.&lt;/p&gt;

&lt;p&gt;This week is a good example. Our analytics showed that blog readers were arriving but almost none reached the product: in one week, about 20 visitors read a post, one opened the builder, and nobody clicked the call to action. Every route into the product ended at a sign-up page before the visitor had seen any output.&lt;/p&gt;

&lt;p&gt;The change: let visitors fill in the questionnaire and download their CLAUDE.md without an account, with an optional "sign up to save" step afterward. The agent built it and deployed it. Then it opened the live site in a signed-out browser at phone width and walked the whole path: from a blog post, through the questionnaire, to a downloaded file named CLAUDE.md, to the sign-up link, checking that the answers were kept for later. Only then was it reported as done, along with the one part it couldn't test without a real new account.&lt;/p&gt;

&lt;p&gt;That last line is the habit we care about most: saying exactly what was verified and what wasn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corrections become rules
&lt;/h2&gt;

&lt;p&gt;When the agent gets something wrong and is corrected, the correction is written down. If the same correction comes up twice, it becomes a standing rule in an instruction file, with a short note on why it exists. Most of the rules in our files started that way: build one change at a time instead of running agents in parallel, never guess a fact that can be checked, measure a fix before calling it fixed.&lt;/p&gt;

&lt;p&gt;The rules keep the agent from repeating a mistake. The notes on why keep a future reader from deleting a rule that looks unnecessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a person still does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decides what to build.&lt;/strong&gt; The agent proposes; a person picks what matters to customers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approves anything that can't be undone.&lt;/strong&gt; Releases, pricing, anything a customer will see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reads the results.&lt;/strong&gt; The analytics, the review findings, the live site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent supplies the speed. The written workspace carries a person's judgment into every session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on your own team
&lt;/h2&gt;

&lt;p&gt;The slow part of this was never the agent. It was writing the workspace: the instruction files, the business context, the role profiles. Most teams already have that knowledge in READMEs, onboarding guides and wiki pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiworkspacebuilder.ai" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; turns it into a workspace. Upload the docs your team already has, and it generates the CLAUDE.md, a profile for each role, and an install script in 15 to 30 seconds, using your own Anthropic API key. No docs yet? &lt;a href="https://aiworkspacebuilder.ai/generate?mode=wizard" rel="noopener noreferrer"&gt;Answer a short questionnaire&lt;/a&gt; and download a starter CLAUDE.md, no signup needed.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Claude Code in GitHub Actions: a team setup that stays under control</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Fri, 30 Oct 2026 07:08:23 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/claude-code-in-github-actions-a-team-setup-that-stays-under-control-2mon</link>
      <guid>https://dev.to/aiworkspacebuilder/claude-code-in-github-actions-a-team-setup-that-stays-under-control-2mon</guid>
      <description>&lt;p&gt;Claude Code on a laptop helps one developer. Claude Code in GitHub Actions helps the whole team at once: anyone with write access can mention &lt;code&gt;@claude&lt;/code&gt; in an issue or a pull request, and Claude Code works on the repository inside a workflow run, then answers in the thread.&lt;/p&gt;

&lt;p&gt;That reach is also why it needs a little more care than a local setup. This post covers how to set it up, who can trigger it, the two ways it runs, and the settings that keep cost and scope under control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup in one command
&lt;/h2&gt;

&lt;p&gt;The quickest path is to open &lt;code&gt;claude&lt;/code&gt; in the repository and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/install-github-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code installs the Claude GitHub App, adds the authentication secret to the repository, pushes a branch with the workflow files you choose and opens GitHub with a pull request ready to create. Merge that pull request and &lt;code&gt;@claude&lt;/code&gt; works in the repository.&lt;/p&gt;

&lt;p&gt;Two details from the docs worth knowing before you start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The command works only with github.com repositories. GitLab has its own CI/CD integration.&lt;/li&gt;
&lt;li&gt;If you would rather do it by hand, install the app, add an &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; secret, and copy &lt;code&gt;examples/claude.yml&lt;/code&gt; from the &lt;code&gt;anthropics/claude-code-action&lt;/code&gt; repository into &lt;code&gt;.github/workflows/&lt;/code&gt;. The docs note that this file is a working workflow, not just an example.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A trimmed version of that workflow looks like this:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Claude Code&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;issue_comment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;created&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request_review_comment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;created&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;claude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contains(github.event.comment.body, '@claude')&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;issues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v6&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;anthropics/claude-code-action@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;anthropic_api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.ANTHROPIC_API_KEY }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;if&lt;/code&gt; line keeps runners from starting on comments that don't mention &lt;code&gt;@claude&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two modes: mentions and prompts
&lt;/h2&gt;

&lt;p&gt;The action decides how to run from your workflow file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive mode.&lt;/strong&gt; With no &lt;code&gt;prompt&lt;/code&gt; input, Claude waits for the trigger phrase, &lt;code&gt;@claude&lt;/code&gt; by default, in a comment, a review or a new issue, and replies in that issue or pull request. Requests look like "&lt;a class="mentioned-user" href="https://dev.to/claude"&gt;@claude&lt;/a&gt; fix the TypeError in the user dashboard component."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation mode.&lt;/strong&gt; With a &lt;code&gt;prompt&lt;/code&gt; input, Claude runs on any GitHub event without waiting for a mention, including a schedule. Results go to the workflow run log unless the prompt tells Claude to post and it has a tool that can.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with interactive mode. A human asks, Claude answers in the thread, and a human reviews the result. Automated prompts are useful later for recurring jobs, such as a daily summary of commits and open issues, but they run without anyone asking, so add them once the team trusts the setup.&lt;/p&gt;

&lt;p&gt;One detail matters for automated runs: with a plain-text prompt, Claude has no shell or GitHub API access until you grant the tools it needs, through &lt;code&gt;--allowedTools&lt;/code&gt; in &lt;code&gt;claude_args&lt;/code&gt; or a &lt;code&gt;permissions.allow&lt;/code&gt; rule in the &lt;code&gt;settings&lt;/code&gt; input. That is a good default. Grant what the job needs and nothing more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who can trigger a run
&lt;/h2&gt;

&lt;p&gt;The action checks the triggering actor before Claude starts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write access.&lt;/strong&gt; On issue and pull request events, the person who triggered the run must have write access to the repository. A drive-by commenter on a public repository cannot start a run. You can allow specific users without write access with &lt;code&gt;allowed_non_write_users&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human actor.&lt;/strong&gt; Bots are rejected unless you list them in &lt;code&gt;allowed_bots&lt;/code&gt;, which keeps bots from triggering Claude in a loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most teams the defaults are right. Change them only for a specific, named reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  The team rules come from CLAUDE.md
&lt;/h2&gt;

&lt;p&gt;In CI there is no developer sitting next to Claude to explain the project's habits. The docs' first best practice is a &lt;code&gt;CLAUDE.md&lt;/code&gt; file in the repository root: a Markdown file Claude Code reads at the start of every session, with the code style, review criteria, project rules and preferred patterns. Claude follows it when it opens pull requests and answers requests.&lt;/p&gt;

&lt;p&gt;This is where the local setup and the CI setup meet. The same committed file guides a developer's session on their laptop and the &lt;code&gt;@claude&lt;/code&gt; run on GitHub, so the answers are consistent wherever the work happens. The docs add one more reason to keep it short: Claude reads it on every run, so a long file costs tokens every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep cost and scope under control
&lt;/h2&gt;

&lt;p&gt;Each run uses GitHub Actions minutes and API tokens. The docs list the levers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write specific &lt;code&gt;@claude&lt;/code&gt; requests, so Claude needs fewer turns.&lt;/li&gt;
&lt;li&gt;Use issue templates so the context is there up front.&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;CLAUDE.md&lt;/code&gt; concise.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;--max-turns&lt;/code&gt; in &lt;code&gt;claude_args&lt;/code&gt; to cap how long a run can go on.&lt;/li&gt;
&lt;li&gt;Set workflow-level timeouts so a stuck job ends.&lt;/li&gt;
&lt;li&gt;Use GitHub's concurrency controls to limit parallel runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A sensible starting point for a team is a turn cap and a timeout on every Claude workflow, so no single request can run far past what the team expects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that trip teams up
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The API key in the wrong place.&lt;/strong&gt; Never commit an API key or OAuth token. Store it as a GitHub secret and reference it, as in &lt;code&gt;anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}&lt;/code&gt;. Grant the workflow only the permissions it needs, and review Claude's changes before merging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI not running on Claude's commits.&lt;/strong&gt; GitHub doesn't start workflows on commits made with the default &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;. If your workflow passes &lt;code&gt;github_token: ${{ secrets.GITHUB_TOKEN }}&lt;/code&gt; to the action, remove it so the action authenticates as the Claude GitHub App, or pass a custom app token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude not answering.&lt;/strong&gt; Check that the app is installed, workflows are enabled, the secret is set, the commenter has write access, and the comment says &lt;code&gt;@claude&lt;/code&gt; as a whole word, not &lt;code&gt;/claude&lt;/code&gt; or &lt;code&gt;@claude-bot&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;Install it with &lt;code&gt;/install-github-app&lt;/code&gt;, keep interactive mode only for the first weeks, add &lt;code&gt;--max-turns&lt;/code&gt; and a timeout, and try it on a few small issues: a failing test, a missing validation, a docs fix. Review every pull request it opens like any other.&lt;/p&gt;

&lt;p&gt;The quality of those pull requests depends on the &lt;code&gt;CLAUDE.md&lt;/code&gt; it reads. &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; generates one from the docs your team already has, along with a profile for each role and an install script, using your own Anthropic API key. No docs yet? &lt;a href="https://aiworkspacebuilder.ai/generate?mode=wizard&amp;amp;utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Answer a short questionnaire&lt;/a&gt; and download a starter CLAUDE.md, no signup needed.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>github</category>
      <category>devops</category>
    </item>
    <item>
      <title>Claude Code subagents for teams: three reviewers worth committing</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Wed, 28 Oct 2026 07:57:34 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/claude-code-subagents-for-teams-three-reviewers-worth-committing-496e</link>
      <guid>https://dev.to/aiworkspacebuilder/claude-code-subagents-for-teams-three-reviewers-worth-committing-496e</guid>
      <description>&lt;p&gt;Most teams that use Claude Code start with one shared file: a CLAUDE.md with the build commands, the conventions and the things nobody should do. That covers what every session needs. It doesn't cover the specialist jobs, such as reviewing a change against the team's standards, running the test suite until it passes, or checking a diff for leaked secrets.&lt;/p&gt;

&lt;p&gt;Those jobs are what subagents are for. This post covers what a subagent is, where a team should keep them, and three worth committing to your repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a subagent is
&lt;/h2&gt;

&lt;p&gt;A subagent is a Markdown file with a short header. The header names it, says when Claude should use it and which tools it may use. The body is its instructions.&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code-reviewer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reviews&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;changes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;against&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;team's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;conventions.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;proactively&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;after&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;any&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;change."&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You review code changes in this repository...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference from a normal prompt is isolation. In the docs' words, each subagent "runs in its own context window with a custom system prompt, specific tool access, and independent permissions." It does its work, such as reading forty files or a long test log, and hands back only a summary. Your main session stays short and focused.&lt;/p&gt;

&lt;p&gt;A subagent still reads your CLAUDE.md files when it starts, so it follows the same team rules as the main session. You don't have to repeat them in every subagent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commit them where the team gets them
&lt;/h2&gt;

&lt;p&gt;Subagents live in one of two places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.claude/agents/&lt;/code&gt; in the repository, for the whole team. The docs recommend checking these into version control "so your team can use and improve them collaboratively."&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.claude/agents/&lt;/code&gt; in your home folder, for personal ones that follow you across projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If both define a subagent with the same name, the project one wins. That is the behavior a team wants: the shared reviewer is the reviewer, and a personal file with the same name doesn't quietly replace it.&lt;/p&gt;

&lt;p&gt;Treat changes to &lt;code&gt;.claude/agents/&lt;/code&gt; like code. A subagent with write access and a vague prompt can do as much damage as a bad script, so put the folder under CODEOWNERS and review edits in pull requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limit what each one can do
&lt;/h2&gt;

&lt;p&gt;Without a &lt;code&gt;tools&lt;/code&gt; line, a subagent inherits the tools of the main session. For a team file, be explicit. Two fields do the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tools&lt;/code&gt; is an allowlist. A reviewer that only needs to read gets &lt;code&gt;Read, Grep, Glob&lt;/code&gt;, and nothing that edits files.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disallowedTools&lt;/code&gt; removes tools from what it would otherwise inherit, for example &lt;code&gt;disallowedTools: Write, Edit&lt;/code&gt; for a subagent that should look but never touch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read-only reviewers are the safest place to start, as long as the tool list really is read-only. Leave &lt;code&gt;Bash&lt;/code&gt; out: with it, "do not edit files" is only a sentence in the prompt, and a command such as &lt;code&gt;sed -i&lt;/code&gt; can still change files. Permission modes don't close that gap either. When the main session runs in &lt;code&gt;acceptEdits&lt;/code&gt;, &lt;code&gt;auto&lt;/code&gt; or &lt;code&gt;bypassPermissions&lt;/code&gt;, the docs say the subagent runs in that same mode and the &lt;code&gt;permissionMode&lt;/code&gt; in its own file is ignored. If a reviewer needs a few shell commands, such as &lt;code&gt;git diff&lt;/code&gt;, keep &lt;code&gt;Bash&lt;/code&gt; and add a &lt;code&gt;PreToolUse&lt;/code&gt; hook that blocks everything else. The docs show this pattern for a read-only database subagent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write descriptions Claude acts on
&lt;/h2&gt;

&lt;p&gt;Claude decides when to delegate from the &lt;code&gt;description&lt;/code&gt; field. Write it as a trigger, not a job title. "Security reviewer" says what it is. "Checks a diff for secrets, unsafe queries and missing auth checks. Use proactively before any commit that touches auth or payments" says when to use it.&lt;/p&gt;

&lt;p&gt;The docs suggest adding phrases like "use proactively" when you want Claude to delegate without being asked. Keep descriptions short too: they all load into context, and Claude Code warns at startup when the combined descriptions pass 15,000 tokens.&lt;/p&gt;

&lt;p&gt;Anyone can also call a subagent by name: "Have the code-reviewer subagent look at my recent changes", or with an @-mention such as &lt;code&gt;@agent-code-reviewer&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three subagents worth committing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. A code reviewer that knows your standards.&lt;/strong&gt; Read-only. Its prompt lists what your team rejects in review: the patterns you moved away from, the error handling you expect, the naming rules. It reads the diff and reports problems with file and line. Human reviewers then spend their time on design rather than on the same five comments.&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code-reviewer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reviews the current diff against this team's conventions. Use proactively after code changes, before a pull request.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Review the diff the main session passes you. For each problem, give the
file, the line and the rule it breaks. Check: error handling, naming,
tests for new behavior, and anything in the "Things to avoid" section of
CLAUDE.md. Report only. Do not edit files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. A test runner that fixes its own failures.&lt;/strong&gt; This one needs to edit, so it gets the edit tools but a narrow job: run the suite, read the failures, fix the code or the test, and run again until it passes or it's stuck. The long test output stays in its context, not yours. Say in the prompt that it must never delete or skip a failing test to get green.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A security check for sensitive paths.&lt;/strong&gt; Read-only, with a description that names the folders that matter: auth, payments, anything that handles personal data. It looks for secrets in the diff, queries built from user input, missing permission checks and new dependencies. It won't replace a security review, but it catches the obvious mistakes before a human sees them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two details that save trouble
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start read-only.&lt;/strong&gt; A reviewer that reports is useful from day one and can't do harm. Give a subagent edit access only when its job requires it, and keep that job narrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One job per subagent.&lt;/strong&gt; A "full-stack expert" with every tool and a long prompt is just the main session again with less context. Small subagents with sharp descriptions get picked for the right tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;Look at your last ten review comments. The ones that repeat are your code reviewer's prompt. Write it, keep it read-only, commit it to &lt;code&gt;.claude/agents/&lt;/code&gt;, and run it on your next change.&lt;/p&gt;

&lt;p&gt;The subagents only work as well as the shared rules underneath them, so the CLAUDE.md comes first. &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; generates one from the docs your team already has, along with a profile for each role and an install script, using your own Anthropic API key. No docs yet? &lt;a href="https://aiworkspacebuilder.ai/generate?mode=wizard&amp;amp;utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Answer a short questionnaire&lt;/a&gt; and download a starter CLAUDE.md, no signup needed.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Claude Code skills for teams: what to move out of CLAUDE.md</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:57:41 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/claude-code-skills-for-teams-what-to-move-out-of-claudemd-4f6o</link>
      <guid>https://dev.to/aiworkspacebuilder/claude-code-skills-for-teams-what-to-move-out-of-claudemd-4f6o</guid>
      <description>&lt;p&gt;A team's CLAUDE.md tends to grow. Someone adds the release checklist, someone else adds the steps for a database migration, then the rules for writing API endpoints. Each addition makes sense. Together they push the file past the point where the agent follows it well.&lt;/p&gt;

&lt;p&gt;The Claude Code docs suggest keeping each CLAUDE.md under 200 lines, because the whole file loads into every session and longer files get followed less reliably. Most of what makes a file long isn't needed in every session. A release checklist matters on release day.&lt;/p&gt;

&lt;p&gt;That is what skills are for. A skill is a set of instructions that loads when it's needed instead of all the time. This post covers how a team should split the two and which skills are worth committing to a shared repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a skill is
&lt;/h2&gt;

&lt;p&gt;A skill is a folder with a &lt;code&gt;SKILL.md&lt;/code&gt; file in it. The file has two parts: frontmatter that says what the skill does and when to use it, and the instructions Claude follows when it runs.&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add-migration&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Creates&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;database&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;migration&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repo.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;change&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;needs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;new&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;table,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;column&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;index."&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="p"&gt;1.&lt;/span&gt; Generate the migration file with &lt;span class="sb"&gt;`npm run db:new -- &amp;lt;name&amp;gt;`&lt;/span&gt;.
&lt;span class="p"&gt;2.&lt;/span&gt; Write the up and down steps. Every up needs a working down.
&lt;span class="p"&gt;3.&lt;/span&gt; Run &lt;span class="sb"&gt;`npm run db:migrate`&lt;/span&gt; and then &lt;span class="sb"&gt;`npm run db:rollback`&lt;/span&gt; to prove both directions.
&lt;span class="p"&gt;4.&lt;/span&gt; Add the schema change to docs/schema.md.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The folder name, or the &lt;code&gt;name&lt;/code&gt; field, becomes a command: anyone on the team can type &lt;code&gt;/add-migration&lt;/code&gt;. Claude can also load it on its own when a request matches the description. Until then, only the description sits in context, not the instructions.&lt;/p&gt;

&lt;p&gt;If your team already has files in &lt;code&gt;.claude/commands/&lt;/code&gt;, they keep working. Custom commands have been merged into skills, and a skill adds a folder for supporting files and more control over who can run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLAUDE.md or a skill?
&lt;/h2&gt;

&lt;p&gt;A simple test: does the agent need this in every session, or only for one kind of task?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Put it in CLAUDE.md&lt;/th&gt;
&lt;th&gt;Put it in a skill&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build and test commands&lt;/td&gt;
&lt;td&gt;The release checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conventions that apply to every change&lt;/td&gt;
&lt;td&gt;Steps for a database migration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What the product is and who it's for&lt;/td&gt;
&lt;td&gt;How to write a new API endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Things you'd reject in any review&lt;/td&gt;
&lt;td&gt;How to debug the payment integration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CLAUDE.md is what everyone needs every day. A skill is a procedure someone needs on a particular day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commit them where the team gets them
&lt;/h2&gt;

&lt;p&gt;Where a skill is saved decides who has it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project:&lt;/strong&gt; &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; in the repository. Commit it and everyone who works there gets it. This is the one teams want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal:&lt;/strong&gt; &lt;code&gt;~/.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; on your own machine, for every project you work on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise:&lt;/strong&gt; deployed through managed settings to everyone in the organization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing to know: when two skills share a name, enterprise beats personal and personal beats project. If a developer has an old personal &lt;code&gt;deploy&lt;/code&gt; skill, typing &lt;code&gt;/deploy&lt;/code&gt; runs theirs, not the one the team committed. Use names specific to the repository, such as &lt;code&gt;deploy-web&lt;/code&gt;, for the shared ones.&lt;/p&gt;

&lt;p&gt;In a monorepo, a package can have its own &lt;code&gt;.claude/skills/&lt;/code&gt; folder. Claude Code loads those skills the first time it reads or edits a file in that package. If the root and &lt;code&gt;apps/web&lt;/code&gt; both have a &lt;code&gt;deploy&lt;/code&gt; skill, both stay available, and &lt;code&gt;/apps/web:deploy&lt;/code&gt; runs the package's one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide who can run each skill
&lt;/h2&gt;

&lt;p&gt;Two frontmatter fields control this, and for a team they matter more than anything else in the file.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frontmatter&lt;/th&gt;
&lt;th&gt;You can run it&lt;/th&gt;
&lt;th&gt;Claude can run it on its own&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(default)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disable-model-invocation: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;user-invocable: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anything with side effects, such as a deploy, a release or a message to a channel, should have &lt;code&gt;disable-model-invocation: true&lt;/code&gt;. The docs put it plainly: you don't want Claude deciding to deploy because your code looks ready. With that field set, the description isn't loaded into context either, so the skill costs nothing until someone types its name.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;user-invocable: false&lt;/code&gt; is for background knowledge, such as how a legacy system works. Claude should know it when relevant, but it isn't a command anyone would type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three skills worth committing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The release.&lt;/strong&gt; The steps your team runs to ship, in order, with the checks between them. Set &lt;code&gt;disable-model-invocation: true&lt;/code&gt; so it only runs when a person asks.&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release-web&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Releases the web app to production.&lt;/span&gt;
&lt;span class="na"&gt;disable-model-invocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="p"&gt;1.&lt;/span&gt; Confirm the branch is main and the working tree is clean.
&lt;span class="p"&gt;2.&lt;/span&gt; Run the full test suite and stop if anything fails.
&lt;span class="p"&gt;3.&lt;/span&gt; Bump the version in package.json and update CHANGELOG.md.
&lt;span class="p"&gt;4.&lt;/span&gt; Tag the release and push the tag.
&lt;span class="p"&gt;5.&lt;/span&gt; Report the tag and the CI run link. Do not mark the release done until CI is green.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. The task everyone gets slightly wrong.&lt;/strong&gt; Every team has one: the migration, the new API endpoint, the feature flag. Write the steps once, including the one people forget. Leave it invocable by Claude so it loads when someone asks for that kind of change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Your conventions for one area.&lt;/strong&gt; API design rules, the error format, how to name events. These are reference content: Claude applies them alongside the work instead of running them as steps. They only matter when someone works in that area, so they don't need to be in CLAUDE.md.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two details that save trouble
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Review &lt;code&gt;allowed-tools&lt;/code&gt; in shared skills.&lt;/strong&gt; A skill can list tools that Claude may use without asking during the turn that runs it. That is useful for a release script, but the docs warn that a skill checked into a repository can grant itself broad access, and the field applies even in a non-interactive run in a folder you've never trusted. Review it in pull requests like any other permission change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep the description sharp and the file short.&lt;/strong&gt; Claude decides when to load a skill from its description, and the skill listing cuts the description off at 1,536 characters, so put the main use case first. The docs suggest keeping &lt;code&gt;SKILL.md&lt;/code&gt; under 500 lines and moving long reference material into separate files in the skill's folder, which load only when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;Read your CLAUDE.md and mark every section that only matters for one kind of task. Each of those is a skill. Move one, commit it, and check that the file the agent reads every session got shorter.&lt;/p&gt;

&lt;p&gt;If you're starting from nothing, the shared part comes first: a CLAUDE.md the whole team agrees on. &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; generates one from the docs your team already has, along with a profile for each role and an install script, using your own Anthropic API key. No docs yet? &lt;a href="https://aiworkspacebuilder.ai/generate?mode=wizard&amp;amp;utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Answer a short questionnaire&lt;/a&gt; and download a starter CLAUDE.md, no signup needed.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Claude Code in a monorepo: how to split CLAUDE.md files across teams</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Mon, 26 Oct 2026 08:29:33 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/claude-code-in-a-monorepo-how-to-split-claudemd-files-across-teams-142m</link>
      <guid>https://dev.to/aiworkspacebuilder/claude-code-in-a-monorepo-how-to-split-claudemd-files-across-teams-142m</guid>
      <description>&lt;p&gt;A single CLAUDE.md file works well for one team in one repository. In a monorepo it slowly turns into a problem. The payments team adds its rules, the frontend team adds theirs, the platform team adds a deployment section, and soon every session starts by loading three hundred lines of instructions, most of which have nothing to do with the task.&lt;/p&gt;

&lt;p&gt;That costs more than context space. The Claude Code documentation recommends keeping each CLAUDE.md under 200 lines, because longer files consume more context and reduce how reliably Claude follows them. It also warns that when two instructions contradict each other, Claude may pick one arbitrarily. A file that four teams edit is where contradictions come from.&lt;/p&gt;

&lt;p&gt;The fix is to stop treating instructions as one file and start treating them like code: split by owner, loaded only where they apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Claude Code finds instruction files
&lt;/h2&gt;

&lt;p&gt;Three loading rules matter for a monorepo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Files above you load at launch.&lt;/strong&gt; Claude Code loads CLAUDE.md (and CLAUDE.local.md) from the directory you start it in and every directory above it. Start a session in &lt;code&gt;services/payments/&lt;/code&gt; and you get &lt;code&gt;services/payments/CLAUDE.md&lt;/code&gt;, &lt;code&gt;services/CLAUDE.md&lt;/code&gt; and the root CLAUDE.md. They are concatenated, not overridden, ordered from the root down, so the most specific file is read last.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Files below you load on demand.&lt;/strong&gt; CLAUDE.md files in subdirectories don't load at launch. Each one loads the first time Claude reads, writes or edits a file in that subdirectory. Start at the root and touch only the frontend, and the payments instructions never enter the session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rules can be scoped to paths.&lt;/strong&gt; Markdown files in &lt;code&gt;.claude/rules/&lt;/code&gt; can carry a &lt;code&gt;paths&lt;/code&gt; field in their frontmatter. A scoped rule loads only when Claude works with a file that matches one of its patterns:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;paths&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;services/payments/**/*.ts"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Payments rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Amounts are integers in minor units. Never use floating point for money.
&lt;span class="p"&gt;-&lt;/span&gt; Every new endpoint needs an idempotency key.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules without a &lt;code&gt;paths&lt;/code&gt; field load at launch like the root CLAUDE.md.&lt;/p&gt;

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

&lt;p&gt;Put that together and a monorepo can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo/
├── CLAUDE.md                     # shared: build, test, git workflow, ownership
├── .claude/
│   ├── settings.json             # shared permissions and hooks
│   └── rules/
│       ├── security.md           # no paths field: always loaded
│       └── migrations.md         # paths: "db/migrations/**"
├── apps/
│   └── web/
│       └── CLAUDE.md             # frontend team: components, styling, state
└── services/
    ├── payments/
    │   └── CLAUDE.md             # payments team: money handling, idempotency
    └── search/
        └── CLAUDE.md             # search team: indexing, query conventions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What goes where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Root CLAUDE.md&lt;/strong&gt;: only what is true everywhere. How to install, build and test. The branch and commit conventions. A short map of the repository and which team owns which directory. Keep it short, because every session loads it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Directory CLAUDE.md files&lt;/strong&gt;: each team's conventions, owned and reviewed by that team. Payments rules load when Claude touches payments code and stay out of the way otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path-scoped rules&lt;/strong&gt;: concerns that cut across directories, such as database migrations, API contracts or test files, which no single team folder owns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unscoped rules&lt;/strong&gt;: the few things that must always be in context, such as security requirements. Use these sparingly; they cost context in every session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add the per-directory files to your CODEOWNERS so each team reviews changes to its own instructions, the same way it reviews its code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Imports: tidy, but not cheaper
&lt;/h2&gt;

&lt;p&gt;A CLAUDE.md can pull in other files with &lt;code&gt;@path/to/file&lt;/code&gt;, for example &lt;code&gt;@docs/git-workflow.md&lt;/code&gt;. Paths are relative to the file that contains the import, and imports can nest up to four levels deep.&lt;/p&gt;

&lt;p&gt;Imports are useful for reusing a document that already exists rather than copying it. But the documentation is explicit that they don't reduce context cost: imported files load at launch along with the file that imports them. If the goal is a smaller session, use directory files and scoped rules, not imports.&lt;/p&gt;

&lt;h2&gt;
  
  
  When other teams' instructions get in the way
&lt;/h2&gt;

&lt;p&gt;Because files above your working directory always load, someone working deep in the tree still gets every ancestor file. If an ancestor file carries instructions that don't apply to your work, the &lt;code&gt;claudeMdExcludes&lt;/code&gt; setting skips files by path or glob pattern:&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;"claudeMdExcludes"&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="s2"&gt;"**/monorepo/CLAUDE.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/home/user/monorepo/other-team/.claude/rules/**"&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;Patterns match absolute paths, which differ from one machine to the next, so the documentation's example puts this in &lt;code&gt;.claude/settings.local.json&lt;/code&gt;, the uncommitted personal settings file. Treat it as a personal escape hatch. If many people are excluding the same file, the real fix is to move that content down into the directory it belongs to.&lt;/p&gt;

&lt;p&gt;One thing can't be excluded: an organization's managed CLAUDE.md, deployed by IT to a fixed system path. Company-wide policy stays in force regardless of individual settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repositories that already have AGENTS.md
&lt;/h2&gt;

&lt;p&gt;Many monorepos already carry an AGENTS.md for other coding tools. Recent versions of Claude Code read AGENTS.md as project instructions, but by default only when there is no CLAUDE.md in your working directory or above it. Once you add a CLAUDE.md, Claude reads that instead.&lt;/p&gt;

&lt;p&gt;If you want one source of truth, the simplest option is a CLAUDE.md that imports it: put &lt;code&gt;@AGENTS.md&lt;/code&gt; in your CLAUDE.md and add any Claude-specific instructions below the import.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping it healthy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check what actually loaded.&lt;/strong&gt; Run &lt;code&gt;/context&lt;/code&gt; in a session; the list under Memory files shows which instruction files are in context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit for drift.&lt;/strong&gt; Newer Claude Code versions include &lt;code&gt;/doctor prompt-audit&lt;/code&gt;, which looks for contradictions, references to files that no longer exist, and outdated instructions across your CLAUDE.md files, rules and skills, and proposes edits without changing anything until you approve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move procedures out.&lt;/strong&gt; A multi-step procedure that only matters sometimes, like cutting a release, belongs in a skill that loads when it is needed, not in a file that loads every session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add rules from real mistakes.&lt;/strong&gt; The documentation's advice for when to add something is practical: when Claude makes the same mistake twice, when code review catches something Claude should have known, or when a new teammate would need the same context.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;One root file for what is true everywhere. One file per team, next to that team's code. Scoped rules for the concerns in between. Each file small enough that its owner can read the whole thing in a minute.&lt;/p&gt;

&lt;p&gt;Most teams already have this knowledge, spread across READMEs, onboarding guides and wiki pages. That is what we built &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; for. You upload the docs your team already has, and it generates the CLAUDE.md, a profile for each role, and an install script in 15 to 30 seconds, using your own Anthropic API key. There's one free trial workspace, no card required, and our &lt;a href="https://aiworkspacebuilder.ai/templates?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;free templates&lt;/a&gt; are a good starting point for the root file.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>monorepo</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Claude Code hooks for teams: four hooks worth committing to your repo</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Sat, 24 Oct 2026 14:17:20 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/claude-code-hooks-for-teams-four-hooks-worth-committing-to-your-repo-1kjp</link>
      <guid>https://dev.to/aiworkspacebuilder/claude-code-hooks-for-teams-four-hooks-worth-committing-to-your-repo-1kjp</guid>
      <description>&lt;p&gt;Most teams start shaping Claude Code with instructions: a CLAUDE.md file that says "run the formatter," "never edit the lockfile," "use our logger." That works most of the time. But an instruction is something the model chooses to follow. On a long session, or a busy day, it sometimes doesn't.&lt;/p&gt;

&lt;p&gt;Hooks close that gap. A hook is a shell command that Claude Code runs automatically at a fixed point, such as after every file edit or before every command. It runs every time, whether or not the model remembers the rule.&lt;/p&gt;

&lt;p&gt;For a team, that changes what you can promise. "The agent should format its code" becomes "the agent's code is always formatted."&lt;/p&gt;

&lt;p&gt;Want to see one fire first? In this two-minute video a hook blocks Claude Code from editing a generated migration, and Claude takes the safe route:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/y97jE56gBuY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Where team hooks live
&lt;/h2&gt;

&lt;p&gt;Hooks go in the same settings files as permissions. For a team, the one that matters is &lt;code&gt;.claude/settings.json&lt;/code&gt; in the repository, committed like any other config. Everyone who clones the repo gets the same hooks.&lt;/p&gt;

&lt;p&gt;Personal hooks belong in &lt;code&gt;~/.claude/settings.json&lt;/code&gt; or the uncommitted &lt;code&gt;.claude/settings.local.json&lt;/code&gt;. Organizations can also set hooks centrally through managed settings.&lt;/p&gt;

&lt;p&gt;Every hook has the same shape: an event, an optional matcher that narrows which tools it applies to, and the command to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Format every file the agent edits
&lt;/h2&gt;

&lt;p&gt;The simplest hook, and the one that removes the most review noise. It runs your formatter after every edit, so formatting never shows up in a code review again.&lt;/p&gt;

&lt;p&gt;This is the example from the Claude Code documentation, using Prettier:&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;"hooks"&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;"PostToolUse"&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="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit|Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&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="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;"command"&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;"jq -r '.tool_input.file_path' | xargs npx prettier --write"&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;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;PostToolUse&lt;/code&gt; fires after a tool runs, and the &lt;code&gt;Edit|Write&lt;/code&gt; matcher limits it to file edits. The hook receives details of the tool call as JSON on standard input, which is where &lt;code&gt;jq&lt;/code&gt; reads the file path. Swap Prettier for whatever your team uses: &lt;code&gt;ruff format&lt;/code&gt;, &lt;code&gt;gofmt&lt;/code&gt;, &lt;code&gt;rustfmt&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Protect files nobody should hand-edit
&lt;/h2&gt;

&lt;p&gt;Lockfiles, generated code, &lt;code&gt;.env&lt;/code&gt; files and anything in &lt;code&gt;.git/&lt;/code&gt; should never be edited by an agent. A &lt;code&gt;PreToolUse&lt;/code&gt; hook runs before the tool does, and if the script exits with code 2, Claude Code blocks the action. The message the script writes to standard error goes back to Claude, so it can adjust its approach instead of just failing.&lt;/p&gt;

&lt;p&gt;Save this as &lt;code&gt;.claude/hooks/protect-files.sh&lt;/code&gt; and make it executable:&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;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.tool_input.file_path // empty'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;PROTECTED_PATTERNS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;".env"&lt;/span&gt; &lt;span class="s2"&gt;"package-lock.json"&lt;/span&gt; &lt;span class="s2"&gt;".git/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;pattern &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROTECTED_PATTERNS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FILE_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;*&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;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Blocked: &lt;/span&gt;&lt;span class="nv"&gt;$FILE_PATH&lt;/span&gt;&lt;span class="s2"&gt; matches protected pattern '&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="nb"&gt;exit &lt;/span&gt;2
  &lt;span class="k"&gt;fi
done

&lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then register it:&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;"hooks"&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;"PreToolUse"&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="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit|Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&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="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;"command"&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;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$CLAUDE_PROJECT_DIR&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;/.claude/hooks/protect-files.sh"&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;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;Because the script is committed in &lt;code&gt;.claude/hooks/&lt;/code&gt;, the list of protected files is reviewed in pull requests like any other code.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Check risky shell commands with your own logic
&lt;/h2&gt;

&lt;p&gt;Permission rules in settings can deny commands by pattern, but they match the command text, and the same command can be written many ways. A &lt;code&gt;PreToolUse&lt;/code&gt; hook on the &lt;code&gt;Bash&lt;/code&gt; tool lets you inspect the full command with real logic before it runs: block &lt;code&gt;rm -rf&lt;/code&gt; outside the build folder, stop pushes to the main branch, refuse anything that touches production config.&lt;/p&gt;

&lt;p&gt;The mechanics are the same as the file guard. Match on &lt;code&gt;Bash&lt;/code&gt;, read &lt;code&gt;.tool_input.command&lt;/code&gt; from the JSON input, and exit with code 2 and a reason to block it. Exit 0 means the hook has no objection; the normal permission rules still decide whether the command runs.&lt;/p&gt;

&lt;p&gt;One caution: a hook that inspects command text is a strong guardrail, not a security boundary. For limits that must hold no matter how a command is written, pair it with Claude Code's sandboxing and with access control (an agent can't touch production if the machine has no production credentials).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Restore key context after compaction
&lt;/h2&gt;

&lt;p&gt;When a session's context fills up, Claude Code compacts it: it summarizes the conversation to free space. Details can get lost in that summary, including the rule you stated an hour ago.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;SessionStart&lt;/code&gt; hook with the &lt;code&gt;compact&lt;/code&gt; matcher runs right after compaction, and whatever the command prints is added to Claude's context. The documentation's example:&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;"hooks"&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;"SessionStart"&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="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&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="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;"command"&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;"echo 'Reminder: use Bun, not npm. Run bun test before committing. Current sprint: auth refactor.'"&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;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;Replace the &lt;code&gt;echo&lt;/code&gt; with a command that prints something dynamic, such as &lt;code&gt;git log --oneline -5&lt;/code&gt; for recent commits. Keep the always-true rules in your CLAUDE.md file; use this hook for the few reminders that matter most after a long session.&lt;/p&gt;

&lt;h2&gt;
  
  
  A hook to be careful with: Stop
&lt;/h2&gt;

&lt;p&gt;It is tempting to add a &lt;code&gt;Stop&lt;/code&gt; hook that runs the test suite and makes Claude keep working until it passes. Know two things first. &lt;code&gt;Stop&lt;/code&gt; fires whenever Claude finishes responding, not only when a task is done, so a slow test suite will run constantly. And Claude Code overrides a Stop hook that blocks eight times in a row, so the script should read the &lt;code&gt;stop_hook_active&lt;/code&gt; field from its input and exit early when it is &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For most teams, running tests in CI and in the pull request checks is simpler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rolling hooks out to a team
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start with the formatter hook. It is low risk and the benefit is visible on the first pull request.&lt;/li&gt;
&lt;li&gt;Add the file guard next, with a short list. Grow it when someone finds a file the agent shouldn't have touched.&lt;/li&gt;
&lt;li&gt;Commit scripts to &lt;code&gt;.claude/hooks/&lt;/code&gt; and register them in &lt;code&gt;.claude/settings.json&lt;/code&gt;, so changes go through review.&lt;/li&gt;
&lt;li&gt;Make sure everyone has the tools the hooks call (&lt;code&gt;jq&lt;/code&gt;, the formatter). For most events, a hook that can't find its command fails as a non-blocking error, so the rule silently stops applying.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;claude --debug&lt;/code&gt; when a hook doesn't seem to run; it logs each hook's execution.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Instructions and hooks together
&lt;/h2&gt;

&lt;p&gt;Hooks are for the rules that must always hold. Everything else, such as how your codebase is organized, which patterns to follow and who owns what, belongs in the instructions the agent reads at the start of each session.&lt;/p&gt;

&lt;p&gt;That is what we built &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; for. You upload the docs your team already has, and it generates the CLAUDE.md, a profile for each role, and an install script in 15 to 30 seconds, using your own Anthropic API key. There's one free trial workspace, no card required. Our &lt;a href="https://aiworkspacebuilder.ai/templates?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;free templates&lt;/a&gt; include a shared settings file you can add these hooks to.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Claude Code permissions for teams: a shared settings.json that is safe by default</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Fri, 23 Oct 2026 10:50:43 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/claude-code-permissions-for-teams-a-shared-settingsjson-that-is-safe-by-default-39ne</link>
      <guid>https://dev.to/aiworkspacebuilder/claude-code-permissions-for-teams-a-shared-settingsjson-that-is-safe-by-default-39ne</guid>
      <description>&lt;p&gt;When one developer uses Claude Code, permissions are a personal habit. They click "yes" on the commands they trust and "no" on the ones they don't, and over a few weeks their setup settles into something that works for them.&lt;/p&gt;

&lt;p&gt;On a team, that habit doesn't scale. Every developer ends up with a different set of approvals, nobody knows what anyone else's agent is allowed to run, and the new hire clicks through prompts on day one without knowing which ones matter.&lt;/p&gt;

&lt;p&gt;The fix is a shared permissions file, committed to the repository, that every developer's Claude Code session starts from.&lt;/p&gt;

&lt;p&gt;This two-minute video commits a shared settings file and a hook to a sample repo, then runs a real Claude Code session against them:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/y97jE56gBuY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The three files that matter
&lt;/h2&gt;

&lt;p&gt;Claude Code reads settings from several places. For a team, three of them matter:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Who it applies to&lt;/th&gt;
&lt;th&gt;Commit it?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Everyone working in the repository&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/settings.local.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One developer, in this repository&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One developer, in every project&lt;/td&gt;
&lt;td&gt;Not in the repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The shared file is where team rules go. The local file is for personal exceptions, so a developer who wants one extra command approved doesn't have to change the team file. When Claude Code creates the local file itself, it keeps it out of git; if someone creates it by hand, they need to add it to &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Organizations that need rules nobody can override can also use managed settings, which sit above all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  What goes in the shared file
&lt;/h2&gt;

&lt;p&gt;A good starting point is short:&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="s2"&gt;"Bash(npm run lint)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(npm run test *)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git status)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git diff *)"&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;"ask"&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="s2"&gt;"Bash(git push *)"&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="s2"&gt;"Read(./.env)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./.env.*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./secrets/**)"&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;Replace the commands with your project's own. The pattern is what matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Allow&lt;/strong&gt; the commands developers run dozens of times a day and that can't do damage: tests, lint, type checks, read-only git. Every prompt you remove here is a prompt nobody learns to click through without reading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask&lt;/strong&gt; for actions that are fine but deserve a human glance: pushing, publishing, running a migration locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deny&lt;/strong&gt; reads of secrets, and any command your team never wants an agent to run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lists from different files are combined, not replaced. A developer's personal allow rules add to the team's list; they don't remove the team's deny rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule order: deny wins
&lt;/h2&gt;

&lt;p&gt;Claude Code checks deny rules first, then ask, then allow. The first match in that order decides, and a more specific rule doesn't change the order.&lt;/p&gt;

&lt;p&gt;That means an allow rule can't carve an exception out of a deny rule. If the team file denies &lt;code&gt;Bash(aws *)&lt;/code&gt;, a developer adding &lt;code&gt;Bash(aws s3 ls)&lt;/code&gt; to their local allow list still gets blocked. This is what makes the shared file safe to rely on: a team deny rule holds no matter what anyone adds locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing rules that match what you mean
&lt;/h2&gt;

&lt;p&gt;A few details decide whether a rule does what you expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;*&lt;/code&gt; matches any text in its place.&lt;/strong&gt; &lt;code&gt;Bash(npm run test *)&lt;/code&gt; matches &lt;code&gt;npm run test&lt;/code&gt; with any arguments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The space before a trailing &lt;code&gt;*&lt;/code&gt; matters.&lt;/strong&gt; &lt;code&gt;Bash(ls *)&lt;/code&gt; matches &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;ls -la&lt;/code&gt; but not &lt;code&gt;lsof&lt;/code&gt;. &lt;code&gt;Bash(ls*)&lt;/code&gt; matches &lt;code&gt;lsof&lt;/code&gt; too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compound commands are split.&lt;/strong&gt; An allow rule for &lt;code&gt;Bash(npm run test *)&lt;/code&gt; does not approve &lt;code&gt;npm run test &amp;amp;&amp;amp; rm -rf build&lt;/code&gt;. Each part has to be allowed on its own, and a deny rule applies if any part matches it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File rules use paths.&lt;/strong&gt; &lt;code&gt;Read(./.env)&lt;/code&gt; covers one file; &lt;code&gt;Read(./secrets/**)&lt;/code&gt; covers everything under that folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where permission rules stop
&lt;/h2&gt;

&lt;p&gt;Permission rules shape what the agent does. They are not a security boundary on their own.&lt;/p&gt;

&lt;p&gt;A Bash rule matches the command text the agent writes. The same program run a different way (through a variable, a script, or &lt;code&gt;sh -c&lt;/code&gt;) may not match. The Claude Code documentation is direct about this: rules that try to restrict command arguments, such as limiting &lt;code&gt;curl&lt;/code&gt; to one domain, are fragile.&lt;/p&gt;

&lt;p&gt;For things that must never happen, add a second layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxing&lt;/strong&gt; enforces filesystem and network limits that don't depend on how a command is written.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A PreToolUse hook&lt;/strong&gt; runs your own check on every command before it executes, and can block it. Hooks live in the same shared settings file, so the whole team gets them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real access control&lt;/strong&gt; still applies. If an agent should never touch production, the developer's machine shouldn't hold production credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rolling it out
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start with deny rules for secrets and allow rules for tests and lint. That alone removes most prompts and the riskiest reads.&lt;/li&gt;
&lt;li&gt;Commit the file in a normal PR, so the team reviews it like code.&lt;/li&gt;
&lt;li&gt;Ask developers to note any prompt they approve more than twice in a week. Those are candidates for the shared allow list.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;/status&lt;/code&gt; in Claude Code to confirm the file loaded. It lists the settings sources in use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Review changes to &lt;code&gt;.claude/settings.json&lt;/code&gt; with the same care as changes to CI configuration. It decides what every developer's agent can do without asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting from the docs you already have
&lt;/h2&gt;

&lt;p&gt;Permissions are one part of a team setup. The other part is the instructions: the commands, the conventions and the ownership rules your agent needs to follow. Most teams already have those written down in an onboarding guide or engineering handbook.&lt;/p&gt;

&lt;p&gt;That is what we built &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; for. You upload the docs your team already has, and it generates the CLAUDE.md, a profile for each role, and an install script in 15 to 30 seconds, using your own Anthropic API key. There's one free trial workspace, no card required. If you'd rather start by hand, our &lt;a href="https://aiworkspacebuilder.ai/templates?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;free templates&lt;/a&gt; include a shared settings file.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>security</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why your AI coding agent ignores your team's conventions (and how to fix it)</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Thu, 22 Oct 2026 06:58:23 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/why-your-ai-coding-agent-ignores-your-teams-conventions-and-how-to-fix-it-2p8n</link>
      <guid>https://dev.to/aiworkspacebuilder/why-your-ai-coding-agent-ignores-your-teams-conventions-and-how-to-fix-it-2p8n</guid>
      <description>&lt;p&gt;A pattern shows up in almost every team that adopts a coding agent. The first week is impressive. By the third week, review comments start repeating: "we don't use that logger here," "this should follow the orders service," "don't call the payments API directly." The agent writes good code. It just keeps writing it the way most projects do, not the way yours does.&lt;/p&gt;

&lt;p&gt;That isn't a bug in the model. It is the predictable result of where conventions live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;A model learns its defaults from an enormous amount of public code. It knows how most Python projects name things, how most React apps lay out components, which HTTP client most people reach for.&lt;/p&gt;

&lt;p&gt;Your team's conventions are, almost by definition, the places where you decided to do something different from the default. And those decisions rarely live in the code itself. They live in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;review comments from two years ago&lt;/li&gt;
&lt;li&gt;a wiki page nobody opens&lt;/li&gt;
&lt;li&gt;the head of the engineer who set up the service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a coding agent starts a session, it sees the files it reads and the instructions it loads. If a convention isn't in either, the agent falls back to the average choice. Which is exactly the choice your team decided against.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five fixes, in order of payoff
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Write the rules where the agent reads them
&lt;/h3&gt;

&lt;p&gt;Claude Code loads the repository's &lt;code&gt;CLAUDE.md&lt;/code&gt; file at the start of every session. That file is the single highest-leverage place to put conventions, because every developer's agent reads the same one.&lt;/p&gt;

&lt;p&gt;Write rules as short imperatives:&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="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Log with &lt;span class="sb"&gt;`lib/log`&lt;/span&gt;. Never use &lt;span class="sb"&gt;`console.log`&lt;/span&gt; or the standard logging module.
&lt;span class="p"&gt;-&lt;/span&gt; New endpoints copy the structure of &lt;span class="sb"&gt;`api/orders/`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; Never call the payments API directly. Go through &lt;span class="sb"&gt;`services/billing`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; Schema changes: write the migration and open a PR. Never apply it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A paragraph about your logging philosophy changes nothing. "Log with &lt;code&gt;lib/log&lt;/code&gt;" does.&lt;/p&gt;

&lt;p&gt;If one part of the codebase has its own rules, put a &lt;code&gt;CLAUDE.md&lt;/code&gt; in that folder. Claude Code picks it up when working there, and the root file stays short.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Point to an example instead of describing it
&lt;/h3&gt;

&lt;p&gt;"New endpoints copy the structure of &lt;code&gt;api/orders/&lt;/code&gt;" beats a page describing your architecture. Models copy examples far more reliably than they follow descriptions, and the example stays accurate as the code evolves.&lt;/p&gt;

&lt;p&gt;Pick one reference implementation per kind of thing you build often: an endpoint, a component, a background job. Name it in the rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Name the banned alternatives
&lt;/h3&gt;

&lt;p&gt;The agent's default is the popular choice, so a rule that only says what to use is half a rule. Say what not to use, too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Use &lt;code&gt;httpx&lt;/code&gt;. Not &lt;code&gt;requests&lt;/code&gt;."&lt;/li&gt;
&lt;li&gt;"Dates are stored in UTC. Never store local time."&lt;/li&gt;
&lt;li&gt;"Use the &lt;code&gt;Customer&lt;/code&gt; model. Not &lt;code&gt;Client&lt;/code&gt; or &lt;code&gt;AccountHolder&lt;/code&gt;."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last one matters more than it looks. Without a glossary, an agent will invent its own names for your domain concepts, and the codebase slowly fills with three words for the same thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Enforce what you can mechanically
&lt;/h3&gt;

&lt;p&gt;Anything a linter, formatter, type checker, or architecture test can catch should be caught there, not in review. These checks don't care whether a human or an agent wrote the code, and they don't get tired.&lt;/p&gt;

&lt;p&gt;Claude Code can also run commands automatically after it edits files (hooks, configured in the project's &lt;code&gt;.claude/settings.json&lt;/code&gt;). Running the formatter or linter there means convention problems get fixed before anyone sees the diff.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Treat every repeated correction as a missing line
&lt;/h3&gt;

&lt;p&gt;This is the habit that makes the other four stick. If you correct the agent on the same thing twice, the problem is not the prompt. It is a missing rule.&lt;/p&gt;

&lt;p&gt;Add the line to &lt;code&gt;CLAUDE.md&lt;/code&gt; in the same PR as the fix. Review changes to that file the way you review code, because it shapes every change the agent makes afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  What good looks like
&lt;/h2&gt;

&lt;p&gt;After a few weeks of this, two things change:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review comments shift from conventions ("wrong logger") to substance ("is this the right behavior?").&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;CLAUDE.md&lt;/code&gt; file becomes the most accurate written description of how your team actually works. New hires read it. So does every agent.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Starting from the docs you already have
&lt;/h2&gt;

&lt;p&gt;Most teams already have their conventions written down somewhere: an engineering handbook, an onboarding guide, a style guide, a page about who owns what. The slow part is turning that prose into short rules an agent will follow.&lt;/p&gt;

&lt;p&gt;That is what we built &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; for. You upload the docs your team already has, and it generates the CLAUDE.md, a profile for each role, and an install script in 15 to 30 seconds, using your own Anthropic API key. There's one free trial workspace, no card required.&lt;/p&gt;

&lt;p&gt;Either way, start with the three corrections you made most often this week. Write them down where the agent reads them, and watch how many review comments disappear.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to onboard a new developer to a Claude Code team in one day</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Wed, 21 Oct 2026 07:16:54 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/how-to-onboard-a-new-developer-to-a-claude-code-team-in-one-day-569n</link>
      <guid>https://dev.to/aiworkspacebuilder/how-to-onboard-a-new-developer-to-a-claude-code-team-in-one-day-569n</guid>
      <description>&lt;p&gt;When a team uses Claude Code, a new developer joins twice. The person joins, and so does their agent. The person has weeks to learn how the team works. Their agent starts writing code on day one, and it only knows what the repository tells it.&lt;/p&gt;

&lt;p&gt;That makes onboarding faster if the team's way of working is written down where the agent reads it, and slower if it isn't: the new hire's first PRs arrive quickly, look plausible, and ignore half the team's conventions.&lt;/p&gt;

&lt;p&gt;Here is a one-day plan that gets both of them ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before day one: make the repository explain itself
&lt;/h2&gt;

&lt;p&gt;Most of the work happens before the new developer arrives. Check that the repository carries three things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A shared &lt;code&gt;CLAUDE.md&lt;/code&gt; at the root.&lt;/strong&gt; Claude Code reads it automatically at the start of every session. It should hold the commands (install, run, test, lint), the folder layout, a reference implementation to copy, the ownership of each area, and the handful of rules the team actually enforces. If you don't have one, our &lt;a href="https://aiworkspacebuilder.hashnode.dev/a-claude-md-template-for-teams-copy-it-and-adapt" rel="noopener noreferrer"&gt;CLAUDE.md template for teams&lt;/a&gt; is a starting point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A committed &lt;code&gt;.claude/settings.json&lt;/code&gt;.&lt;/strong&gt; This is where shared permissions live: which commands Claude Code may run without asking, and which it must never run. Committing it means the new hire's agent starts with the same guardrails as everyone else's, instead of whatever they click through in the first hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Folder-level &lt;code&gt;CLAUDE.md&lt;/code&gt; files where the rules differ.&lt;/strong&gt; If the payments service or the data pipeline has its own conventions, put them in a &lt;code&gt;CLAUDE.md&lt;/code&gt; inside that folder. Claude Code picks it up when working there, and the root file stays short.&lt;/p&gt;

&lt;p&gt;A quick test: ask someone who has never seen the repository to open Claude Code and ask "how do I run the tests for one file?" If the answer is wrong, a new hire's agent will get it wrong too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Morning: set up the machine and the personal layer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Install and sign in.&lt;/strong&gt; Install Claude Code, sign in, and clone the repository. Run it once from the repository root so it picks up the shared files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Read the shared &lt;code&gt;CLAUDE.md&lt;/code&gt; together.&lt;/strong&gt; Spend 20 minutes on it with the new developer. This is the fastest overview of the codebase you have, and it is the exact context their agent will work from. Anything they find confusing is probably confusing to the agent too, so fix it on the spot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Set up the personal layer.&lt;/strong&gt; Personal preferences belong in the developer's own &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;, not the shared file: how verbose they like answers, their editor habits, the language they prefer explanations in. Personal permission tweaks go in &lt;code&gt;.claude/settings.local.json&lt;/code&gt;, which stays out of version control. Make the split explicit on day one, so team rules don't get edited to suit one person.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Show the team's commands.&lt;/strong&gt; If the team keeps custom slash commands in &lt;code&gt;.claude/commands/&lt;/code&gt; (for example a &lt;code&gt;/review&lt;/code&gt; or &lt;code&gt;/new-endpoint&lt;/code&gt; command), walk through them. They are the team's habits in runnable form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Midday: a guided first task
&lt;/h2&gt;

&lt;p&gt;Pick a small, real task with a clear finish line: a bug with a reproduction, or a small endpoint that follows an existing pattern. Not a toy, and not anything that crosses team boundaries.&lt;/p&gt;

&lt;p&gt;Have the new developer do it with Claude Code while a teammate watches for 30 minutes. The point is not the code. It is to see how the agent behaves in your repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did it follow the reference implementation, or invent its own structure?&lt;/li&gt;
&lt;li&gt;Did it run the right test command the first time?&lt;/li&gt;
&lt;li&gt;Did it stay inside the files the task needed?&lt;/li&gt;
&lt;li&gt;Did it stop and ask where the rules say to ask (schema changes, auth, billing)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every "no" is a gap in the shared files, not a mistake by the new hire. Write it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Afternoon: the first PR and the first fix to the instructions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Open the PR the normal way.&lt;/strong&gt; Same template, same checks, same reviewers as everyone else. Agent-written code from a new hire gets the review any new hire's code gets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Turn the gaps into edits.&lt;/strong&gt; For each "no" from the guided task, add or fix one line in the right &lt;code&gt;CLAUDE.md&lt;/code&gt;. Let the new developer make the edit and open it as a second small PR.&lt;/p&gt;

&lt;p&gt;This is the most useful thing a new hire can do on day one. They are the only person on the team who sees the repository with fresh eyes, and their agent is the only one that shows exactly what the written instructions are missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  End of day: what to check
&lt;/h2&gt;

&lt;p&gt;By the end of the day the new developer should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code running against the repository with the shared settings&lt;/li&gt;
&lt;li&gt;A personal &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; that holds their preferences, not team rules&lt;/li&gt;
&lt;li&gt;One merged or reviewed PR for a real task&lt;/li&gt;
&lt;li&gt;One PR that improves the team's instructions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If all four are true, their agent now works the way the team works, and the instructions are a little better for the next person.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more as the team grows
&lt;/h2&gt;

&lt;p&gt;On a team of three, conventions live in people's heads and spread in conversation. On a team of thirty, each developer's agent is making hundreds of small choices a day based on whatever the repository says. Onboarding is the moment the gap between "how we work" and "what is written down" is easiest to see, so it is the best moment to close it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting from the docs you already have
&lt;/h2&gt;

&lt;p&gt;The slow part is usually the first version of the shared files. Most of it already exists in your onboarding guide, your engineering handbook, and the page about who owns what. It just isn't in a form the agent reads.&lt;/p&gt;

&lt;p&gt;That is what we built &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; for. You upload the docs your team already has, and it generates the CLAUDE.md, a profile for each role, and an install script in 15 to 30 seconds, using your own Anthropic API key. There's one free trial workspace, no card required.&lt;/p&gt;

&lt;p&gt;Either way, the next new hire is the best test you have. Watch what their agent gets wrong on day one, and write it down.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>A CLAUDE.md template for teams (copy it and adapt)</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Tue, 20 Oct 2026 06:58:40 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/a-claudemd-template-for-teams-copy-it-and-adapt-1m5l</link>
      <guid>https://dev.to/aiworkspacebuilder/a-claudemd-template-for-teams-copy-it-and-adapt-1m5l</guid>
      <description>&lt;p&gt;Most CLAUDE.md examples online are written for one person working on one side project. A team file has a different job: every developer's Claude Code session reads the same file, so it has to encode how the &lt;strong&gt;team&lt;/strong&gt; works, not how one person likes to work.&lt;/p&gt;

&lt;p&gt;Below is a template you can copy into the root of a shared repo. Replace everything in &lt;code&gt;&amp;lt;angle brackets&amp;gt;&lt;/code&gt;, delete what doesn't apply, and keep it short. Notes on each section follow.&lt;/p&gt;

&lt;p&gt;Prefer to start from a questionnaire instead of a blank file? This two-minute video fills one in for a sample project and saves the result as a starter CLAUDE.md:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/apv-rQ-m4Cw" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The template
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# &amp;lt;Project name&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;One&lt;/span&gt; &lt;span class="na"&gt;sentence:&lt;/span&gt; &lt;span class="na"&gt;what&lt;/span&gt; &lt;span class="na"&gt;this&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt; &lt;span class="na"&gt;is&lt;/span&gt; &lt;span class="na"&gt;and&lt;/span&gt; &lt;span class="na"&gt;who&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt; &lt;span class="na"&gt;it.&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="gu"&gt;## Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Install: &lt;span class="sb"&gt;`&amp;lt;command&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run locally: &lt;span class="sb"&gt;`&amp;lt;command&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test (all): &lt;span class="sb"&gt;`&amp;lt;command&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test (one file): &lt;span class="sb"&gt;`&amp;lt;command&amp;gt; &amp;lt;path&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Lint and format: &lt;span class="sb"&gt;`&amp;lt;command&amp;gt;`&lt;/span&gt; (must pass before any commit)
&lt;span class="p"&gt;-&lt;/span&gt; Never run: &lt;span class="sb"&gt;`&amp;lt;command&amp;gt;`&lt;/span&gt; (&lt;span class="nt"&gt;&amp;lt;why:&lt;/span&gt; &lt;span class="na"&gt;e.g.&lt;/span&gt; &lt;span class="na"&gt;resets&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;shared&lt;/span&gt; &lt;span class="na"&gt;dev&lt;/span&gt; &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;)

&lt;span class="gu"&gt;## Layout&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`&amp;lt;folder&amp;gt;/`&lt;/span&gt;: &lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;lives&lt;/span&gt; &lt;span class="na"&gt;here&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`&amp;lt;folder&amp;gt;/`&lt;/span&gt;: &lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;lives&lt;/span&gt; &lt;span class="na"&gt;here&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Reference implementation for new &lt;span class="nt"&gt;&amp;lt;services&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;: &lt;span class="sb"&gt;`&amp;lt;path&amp;gt;`&lt;/span&gt;

&lt;span class="gu"&gt;## Ownership&lt;/span&gt;
| Area | Owner | Reviews required |
|---|---|---|
| &lt;span class="sb"&gt;`&amp;lt;folder&amp;gt;/`&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;team&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;n&amp;gt;&lt;/span&gt;, at least one from &lt;span class="nt"&gt;&amp;lt;team&amp;gt;&lt;/span&gt; |
| &lt;span class="sb"&gt;`&amp;lt;folder&amp;gt;/`&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;team&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;n&amp;gt;&lt;/span&gt; |

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Follow the pattern in &lt;span class="sb"&gt;`&amp;lt;reference path&amp;gt;`&lt;/span&gt; for new &lt;span class="nt"&gt;&amp;lt;things&amp;gt;&lt;/span&gt;. Do not invent a new structure.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;Database&amp;gt;&lt;/span&gt; schema changes: write the migration and open a PR. Never apply it directly.
&lt;span class="p"&gt;-&lt;/span&gt; Anything touching &lt;span class="nt"&gt;&amp;lt;billing&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt; &lt;span class="na"&gt;deletion&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;: stop and ask before writing code.
&lt;span class="p"&gt;-&lt;/span&gt; Dependencies: patch upgrades are fine. Minor or major upgrades need a separate PR.
&lt;span class="p"&gt;-&lt;/span&gt; If you can't verify something (a command, an API, a config value), say "I haven't verified this" and stop.

&lt;span class="gu"&gt;## Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test coverage on new code: &lt;span class="nt"&gt;&amp;lt;n&amp;gt;&lt;/span&gt;% minimum
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;Language&amp;gt;&lt;/span&gt;-specific: &lt;span class="nt"&gt;&amp;lt;e.g.&lt;/span&gt; &lt;span class="na"&gt;no&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;any&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="na"&gt;TypeScript&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt; &lt;span class="na"&gt;hints&lt;/span&gt; &lt;span class="na"&gt;on&lt;/span&gt; &lt;span class="na"&gt;all&lt;/span&gt; &lt;span class="na"&gt;public&lt;/span&gt; &lt;span class="na"&gt;functions&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Commit messages: &lt;span class="nt"&gt;&amp;lt;convention&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;e.g.&lt;/span&gt; &lt;span class="na"&gt;Conventional&lt;/span&gt; &lt;span class="na"&gt;Commits&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; PR size: under &lt;span class="nt"&gt;&amp;lt;n&amp;gt;&lt;/span&gt; lines changed where possible

&lt;span class="gu"&gt;## Glossary&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**&amp;lt;Term&amp;gt;**&lt;/span&gt;: &lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;it&lt;/span&gt; &lt;span class="na"&gt;means&lt;/span&gt; &lt;span class="na"&gt;here&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;. Not "&lt;span class="nt"&gt;&amp;lt;banned&lt;/span&gt; &lt;span class="na"&gt;synonym&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;".
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**&amp;lt;Term&amp;gt;**&lt;/span&gt;: &lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;it&lt;/span&gt; &lt;span class="na"&gt;means&lt;/span&gt; &lt;span class="na"&gt;here&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;.

&lt;span class="gu"&gt;## Definition of done&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Tests pass locally and the linter is clean
&lt;span class="p"&gt;-&lt;/span&gt; The change follows the reference implementation
&lt;span class="p"&gt;-&lt;/span&gt; The PR description explains what changed and why, in plain language
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole file. If yours is much longer, read on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each section is for
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Commands
&lt;/h3&gt;

&lt;p&gt;This is the section that pays off fastest. Without it, Claude Code guesses the commands, and a plausible guess (&lt;code&gt;npm test&lt;/code&gt; in a pnpm monorepo, &lt;code&gt;pytest&lt;/code&gt; without the right flags) wastes time on every task.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;"Never run"&lt;/strong&gt; line matters more than it looks. One destructive command that's easy to type, like a database reset or a deploy script, is worth naming explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layout and the reference implementation
&lt;/h3&gt;

&lt;p&gt;Don't describe the whole folder tree. The agent can read it. Name the folders whose purpose isn't obvious, and point to &lt;strong&gt;one existing file that shows the right way to do things&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;"New endpoints follow the structure of &lt;code&gt;api/orders/&lt;/code&gt;" gets better results than a page describing your architecture. Models copy examples far more reliably than they follow descriptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ownership
&lt;/h3&gt;

&lt;p&gt;In a team repo, the most expensive agent mistake is a change that crosses team boundaries: a refactor that touches three teams' code in one PR. An ownership table lets the agent notice the boundary and split the work, or ask first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rules
&lt;/h3&gt;

&lt;p&gt;Write rules as short imperatives. "Never apply schema changes directly" is followed. "We generally prefer that schema changes go through review" is not.&lt;/p&gt;

&lt;p&gt;Keep the list to the rules that are actually broken. A rule nobody would break anyway is noise that dilutes the ones that matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standards
&lt;/h3&gt;

&lt;p&gt;Numbers beat adjectives. "Clean, well-tested code" changes nothing. "80% coverage on new code" and "no &lt;code&gt;any&lt;/code&gt; types" can be checked, by the agent and by your reviewer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Glossary
&lt;/h3&gt;

&lt;p&gt;This is the section most teams skip and most need. When the agent invents its own names for your domain concepts (a "customer" becomes an "account holder" in one file and a "client" in another), the codebase slowly fills with inconsistent vocabulary. A short glossary, including the synonyms you &lt;strong&gt;don't&lt;/strong&gt; want, stops that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Definition of done
&lt;/h3&gt;

&lt;p&gt;Tell the agent what it has to check before it says it's finished. This turns "done" from a claim into something it verifies: tests ran, the linter passed, the change matches the reference.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to leave out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Things the code already says.&lt;/strong&gt; The agent can read your &lt;code&gt;package.json&lt;/code&gt; and folder structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal preferences.&lt;/strong&gt; Tone, verbosity, editor habits: those belong in each developer's own &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;, not the shared file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules for one folder.&lt;/strong&gt; Put them in a &lt;code&gt;CLAUDE.md&lt;/code&gt; inside that folder. Claude Code picks it up when working there, and the root file stays readable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long prose.&lt;/strong&gt; If a section needs paragraphs, it's documentation. Link to it instead of pasting it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keeping it true
&lt;/h2&gt;

&lt;p&gt;A team CLAUDE.md fails quietly: it says one thing, the codebase moved on, and the agent confidently follows the old rule. Two habits prevent that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Review it like code.&lt;/strong&gt; Changes go through PRs, and any PR that changes a convention updates the file in the same PR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat a bad agent suggestion as a bug report against the file.&lt;/strong&gt; If the agent got something wrong because the rule was missing or stale, fix the file, not just the code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Starting from your team's docs instead
&lt;/h2&gt;

&lt;p&gt;Most of what goes into this template already exists somewhere in your team's documents: the onboarding guide, the engineering handbook, the page about who owns what. Turning that prose into short rules is the slow part.&lt;/p&gt;

&lt;p&gt;That's what we built &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; for. You upload the docs your team already has, and it generates the CLAUDE.md, a profile for each role, and team-level files in 15 to 30 seconds, using your own Anthropic API key. There's a free trial workspace, no card required.&lt;/p&gt;

&lt;p&gt;Either way, start small: commands, one reference implementation, and the three rules your team breaks most often. That alone changes how Claude Code behaves in your repo.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to set up Claude Code for your whole team (not just your own laptop)</title>
      <dc:creator>AI Workspace Builder</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:34:05 +0000</pubDate>
      <link>https://dev.to/aiworkspacebuilder/how-to-set-up-claude-code-for-your-whole-team-not-just-your-own-laptop-e1k</link>
      <guid>https://dev.to/aiworkspacebuilder/how-to-set-up-claude-code-for-your-whole-team-not-just-your-own-laptop-e1k</guid>
      <description>&lt;p&gt;Most developers who try Claude Code start the same way: open a repo, ask for a change, and get something that is almost right. The code compiles, but it uses the wrong logging library, skips the test convention your team agreed on, and opens a PR against the wrong branch.&lt;/p&gt;

&lt;p&gt;The model is not the problem. Context is. Claude Code knows nothing about your team unless you write it down, and the place you write it down is a file called &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This guide covers what goes in that file when a &lt;strong&gt;team&lt;/strong&gt; shares it, not just one person, and the mistakes that make it stop working after a month.&lt;/p&gt;

&lt;p&gt;Already have a handbook or README? This two-minute video turns one into a CLAUDE.md, a profile for each role and skills for the tasks the docs describe:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/TgIVIAutZ60" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What CLAUDE.md actually does
&lt;/h2&gt;

&lt;p&gt;Claude Code reads &lt;code&gt;CLAUDE.md&lt;/code&gt; automatically at the start of every session. You do not paste it, reference it, or remind the agent. If the file is in your project root, it is in context.&lt;/p&gt;

&lt;p&gt;There are three places it can live:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Who edits it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every project on your machine&lt;/td&gt;
&lt;td&gt;You only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;repo&amp;gt;/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Everyone working in this repo&lt;/td&gt;
&lt;td&gt;The team, via PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;repo&amp;gt;/&amp;lt;folder&amp;gt;/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Work inside that folder&lt;/td&gt;
&lt;td&gt;The team that owns the folder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a team, the repo-level file is the one that matters. It is checked in, reviewed like code, and every developer's agent reads the same rules.&lt;/p&gt;

&lt;p&gt;If you have never made one, run &lt;code&gt;/init&lt;/code&gt; inside Claude Code. It scans the repo and writes a starter file. That starter covers the code. It does not cover the team, and that is the part you need to add.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five sections a team CLAUDE.md needs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Who owns what
&lt;/h3&gt;

&lt;p&gt;The agent cannot ask "who reviews payments code?" unless the answer is in the file.&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="gu"&gt;## Ownership&lt;/span&gt;
| Area | Owner | Reviews required |
|---|---|---|
| payments/ | Payments team | 2, one from payments |
| api/ | Platform team | 1 |
| web/ | Frontend team | 1 |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This alone stops a whole class of bad suggestions, like refactoring a module across a team boundary in one PR.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. How decisions escalate
&lt;/h3&gt;

&lt;p&gt;Write down what the agent should do when a task crosses a line: stop and ask, open an issue, or proceed.&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="gu"&gt;## Escalation&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Schema changes: never apply directly. Write the migration, open a PR, tag the platform team.
&lt;span class="p"&gt;-&lt;/span&gt; Anything touching billing: stop and ask before writing code.
&lt;span class="p"&gt;-&lt;/span&gt; Dependency upgrades: allowed for patch versions only.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Short imperatives work better than prose. The agent follows "never apply directly" far more reliably than "we generally prefer that schema changes go through review."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The exact commands
&lt;/h3&gt;

&lt;p&gt;List the build, test, and lint commands character for character. If you do not, the agent invents plausible ones, and plausible is not the same as correct.&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="gu"&gt;## Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Install: &lt;span class="sb"&gt;`pnpm install`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test one package: &lt;span class="sb"&gt;`pnpm --filter &amp;lt;pkg&amp;gt; test`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Lint: &lt;span class="sb"&gt;`pnpm lint`&lt;/span&gt; (must pass before any commit)
&lt;span class="p"&gt;-&lt;/span&gt; Never run: &lt;span class="sb"&gt;`pnpm db:reset`&lt;/span&gt; (wipes the shared dev database)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line has saved more than one team a bad afternoon.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. What "good" means here
&lt;/h3&gt;

&lt;p&gt;Every team has standards that are obvious to them and invisible to an outsider. Write the number down.&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="gu"&gt;## Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test coverage on new code: 80% minimum
&lt;span class="p"&gt;-&lt;/span&gt; API responses: p95 under 300 ms
&lt;span class="p"&gt;-&lt;/span&gt; No new &lt;span class="sb"&gt;`any`&lt;/span&gt; types in TypeScript
&lt;span class="p"&gt;-&lt;/span&gt; Commit messages: Conventional Commits (feat:, fix:, chore:)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. The tools and systems
&lt;/h3&gt;

&lt;p&gt;Which issue tracker, which CI, where logs live, which environments exist. The agent will reference these when it explains what to do next, so they should be real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Per-role profiles: when one file is not enough
&lt;/h2&gt;

&lt;p&gt;A single &lt;code&gt;CLAUDE.md&lt;/code&gt; works until your team has people who need different defaults. A tech lead wants the agent to flag architectural risk. A new joiner wants it to explain conventions. A PM wants it to stay out of the code entirely.&lt;/p&gt;

&lt;p&gt;A pattern that works well: keep the shared rules in &lt;code&gt;CLAUDE.md&lt;/code&gt;, and add a short profile per role that someone loads when they start a session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;profiles/
  tech-lead/profile.md
  backend-engineer/profile.md
  product-manager/profile.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each profile covers how that role thinks, what they prioritize, and what they never compromise on. The shared file stays short. The profiles carry the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four mistakes that make it stop working
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It grows until nobody reads it.&lt;/strong&gt; Past a few screens, the important rules get lost among the trivia. If a section only matters for one folder, move it into that folder's &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It describes, instead of instructing.&lt;/strong&gt; "Our team values clean code" changes nothing. "Functions over 40 lines need a comment explaining why" does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It drifts from reality.&lt;/strong&gt; The file says the tests run with Jest. The repo moved to Vitest in March. Now the agent is confidently wrong. Review the file when you review the code it describes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is written once by one person.&lt;/strong&gt; The best CLAUDE.md files are edited by everyone who catches the agent getting something wrong. Treat a bad agent suggestion as a bug report against the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  A faster way to write the first version
&lt;/h2&gt;

&lt;p&gt;Most of what goes into a team &lt;code&gt;CLAUDE.md&lt;/code&gt; already exists somewhere: an onboarding doc, an engineering handbook, a Notion page about who owns what. The slow part is turning that prose into short, enforceable rules.&lt;/p&gt;

&lt;p&gt;That is the problem we built &lt;a href="https://aiworkspacebuilder.ai?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Workspace Builder&lt;/a&gt; to solve. You upload the docs your team already has (PDFs, markdown, Word files, or a Notion page), and it pulls out roles, processes, metrics, tools, and escalation paths, then generates the &lt;code&gt;CLAUDE.md&lt;/code&gt;, a profile per role, and team-level files. It takes 15 to 30 seconds with your own Anthropic API key, and the free tier gives you one trial workspace with no card required.&lt;/p&gt;

&lt;p&gt;Whether you use it or write the file by hand, the principle is the same: the agent is only as good as what you tell it about your team. Write it down once, keep it short, and keep it true.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What is the one rule in your CLAUDE.md that made the biggest difference? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
