<?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: fujibee</title>
    <description>The latest articles on DEV Community by fujibee (@fujibee).</description>
    <link>https://dev.to/fujibee</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%2F3955254%2F65578a72-abd1-42c0-b15d-47413c1be981.png</url>
      <title>DEV Community: fujibee</title>
      <link>https://dev.to/fujibee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fujibee"/>
    <language>en</language>
    <item>
      <title>One instruction, four AI agents, one working app</title>
      <dc:creator>fujibee</dc:creator>
      <pubDate>Wed, 08 Jul 2026 23:39:46 +0000</pubDate>
      <link>https://dev.to/fujibee/one-instruction-four-ai-agents-one-working-app-2nak</link>
      <guid>https://dev.to/fujibee/one-instruction-four-ai-agents-one-working-app-2nak</guid>
      <description>&lt;p&gt;Last week I typed one message to Fable 5 and walked away. This is what came back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkzl12202qfqzfy6fkowy.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkzl12202qfqzfy6fkowy.jpeg" alt="AI Constellation — a 3D map of what X is talking about" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a 3D constellation map of what X is talking about right now. Each AI model is a constellation, each topic is a star, and clicking a star shows you the actual posts behind it. You can try it in your browser: &lt;a href="https://fujibee.github.io/agmsg-demo-fable5-x-constellation/" rel="noopener noreferrer"&gt;https://fujibee.github.io/agmsg-demo-fable5-x-constellation/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No human touched it after the first message. Here is the whole run:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqf6rycgbsl4qo8xz29mk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqf6rycgbsl4qo8xz29mk.png" alt="The whole run: one human instruction, then agents coordinating on their own" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The instruction was: build a 3D constellation map of what X is saying about AI models. You only do the design.&lt;/p&gt;

&lt;p&gt;Fable 5 wrote a 21,283-character design document. Layout, star glow, cluster placement algorithm, JSON schema, implementation structure, all of it. Then it delegated: Grok collected live topic data from X, Opus 4.8 implemented the whole thing as a single HTML file, Codex polished the rendering and the feel.&lt;/p&gt;

&lt;p&gt;Two moments in the run stood out to me.&lt;/p&gt;

&lt;p&gt;First, Grok delivered the data and Fable inspected it before passing it on. 13 of the 25 topics only had one example post each, and the contract said 2 to 4. Fable sent it back. Grok fixed it, Fable re-checked and approved. Nobody told it to do quality control on a teammate.&lt;/p&gt;

&lt;p&gt;Second, the review. When Codex finished polishing, Fable opened the app in a browser and measured actual screen pixels. The background was rendering about 10x brighter than its spec because of a color-space double conversion in a shader. Fable identified the root cause, wrote the exact fix, and set an acceptance criterion in RGB values. Codex fixed it, Fable re-measured, approved, delivered. 121 fps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh1p27ea95hecpgljftyl.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh1p27ea95hecpgljftyl.jpeg" alt="Star detail: click any star to read the real posts behind it" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full unedited team conversation is public, in the same repo as the app: &lt;a href="https://github.com/fujibee/agmsg-demo-fable5-x-constellation" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg-demo-fable5-x-constellation&lt;/a&gt; (&lt;a href="https://github.com/fujibee/agmsg-demo-fable5-x-constellation/blob/main/TRANSCRIPT.md" rel="noopener noreferrer"&gt;TRANSCRIPT.md&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the roles are split this way
&lt;/h2&gt;

&lt;p&gt;Fable 5 is the strongest model I have access to, and the most expensive. It's scheduled to leave subscription plans and move to usage credits (Anthropic just extended the deadline to July 12). Running it hands-on for everything doesn't make sense.&lt;/p&gt;

&lt;p&gt;So it only did the two things that need its visual reasoning: the design and the final review. Catching a shader color bug by measuring pixels is exactly the kind of work you want the expensive model on. Everything hands-on went to cheaper teammates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool underneath
&lt;/h2&gt;

&lt;p&gt;The run happened inside the agmsg desktop app, which we shipped this week.&lt;/p&gt;

&lt;p&gt;agmsg is a small open-source messaging layer for CLI agents. Claude Code, Codex, Grok, Cursor, Gemini, any of them, talking to each other through a shared SQLite file. No daemon, no cloud. It's at about 970 stars on GitHub now.&lt;/p&gt;

&lt;p&gt;The desktop app puts that on one screen. Every agent runs as a real terminal inside the app, and you can watch the team conversation flow in real time. The part I care about most is that when a message arrives for an agent, the app wakes that agent up.&lt;/p&gt;

&lt;p&gt;That wake-up problem is harder than it sounds. Claude Code ships with a stable monitor hook, which is great. Codex has nothing like it, so we had been poking it awake through a half-hack that worked but broke easily. Grok is updated almost daily and its terminal behavior is still rough. Every agent type needed its own hand-built wake-up mechanism, and most types had none.&lt;/p&gt;

&lt;p&gt;The app changes that. Since every agent is just a terminal inside the app, delivering a message means typing into that terminal. The app doesn't need to know anything about what's running inside. Any CLI agent gets the same treatment. Watching four different vendors' agents all wake each other up in one window was the moment this project felt done to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;People who use AI heavily but don't want to live in a terminal. That's who I built the app for. Pick a team, click an agent, it opens as a pane. When a message comes in the agent wakes up, and you can jump in yourself as a member of the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;macOS: download the .dmg from &lt;a href="https://github.com/fujibee/agmsg/releases/tag/app-latest" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg/releases/tag/app-latest&lt;/a&gt; (signed and notarized), or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew tap fujibee/agmsg &amp;amp;&amp;amp; brew trust fujibee/agmsg
brew install --cask agmsg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows: .msi / .exe from the same page. Honestly still rough, macOS is the smoother experience right now. Bug reports very welcome.&lt;/p&gt;

&lt;p&gt;If you already use agmsg, update the core to 1.1.5 or later first (the app can do this for you, or update from the CLI).&lt;/p&gt;

&lt;p&gt;The constellation demo, design doc, data, transcript and review screenshots are all in one repo: &lt;a href="https://github.com/fujibee/agmsg-demo-fable5-x-constellation" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg-demo-fable5-x-constellation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it and something breaks or feels wrong, tell me.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Get X into Claude Code, no API and no browser (agmsg 1.1.1)</title>
      <dc:creator>fujibee</dc:creator>
      <pubDate>Thu, 25 Jun 2026 19:26:43 +0000</pubDate>
      <link>https://dev.to/fujibee/get-x-into-claude-code-no-api-and-no-browser-agmsg-111-427d</link>
      <guid>https://dev.to/fujibee/get-x-into-claude-code-no-api-and-no-browser-agmsg-111-427d</guid>
      <description>&lt;p&gt;Pulling X data into a coding agent has been awkward. You can point an agent at a browser and scrape, but that is against X's terms, a gray area. The official X API is there, but it costs enough to make automation a hassle. Scraping is gray, the API is expensive, so X automation mostly sat in between.&lt;/p&gt;

&lt;p&gt;Grok Build changed that. The model has an "X Search" tool call wired straight to X's data. Because it is an xAI model, this is not scraping and it is not the paid API. The model pulls X directly. The clean path finally showed up, so I wired Grok Build into agmsg in 1.1.1.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you are new here: agmsg is a small open-source tool that lets CLI coding agents like Claude Code, Codex and Gemini message each other over a local file, so they work as a team instead of you copy-pasting between them. 1.1.1 lets you pull a Grok Build agent into that team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I had wanted live X inside my coding workflow for a while. The routes were gray or expensive, so it sat. When X Search landed, the path was clean, and I put it in.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3q4it1x090fpdmr9j9cc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3q4it1x090fpdmr9j9cc.jpg" alt="From Claude Code, a Grok Build teammate runs an X search and hands back a ranked list" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From Claude Code, I ask a Grok Build teammate to find something specific: developers on X over roughly the last two weeks who run several coding agents side by side and are frustrated that the agents cannot coordinate, with no shared inbox between them. Skip the promos and the official announcements, real developer voices only, ranked by engagement, the top few with a handle, a link, and a one-line summary.&lt;/p&gt;

&lt;p&gt;A Grok Build agent on the same agmsg team runs it and hands back exactly that: a short, ranked, de-noised list. No browser, no copy-paste, a few moves. A real run, not a mockup.&lt;/p&gt;

&lt;p&gt;And what came back is the case for the tool. People are building their own glue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://x.com/shannholmberg/status/2067328943351529568" rel="noopener noreferrer"&gt;@shannholmberg&lt;/a&gt; wired bidirectional skills for an "LLM council": Codex drives the loops, Claude Opus reviews plans and deliveries and sends feedback back to the main agent.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://x.com/bibryam/status/2065918635709763627" rel="noopener noreferrer"&gt;@bibryam&lt;/a&gt; built a Git-based append-only log so Claude Code and Codex agents can exchange tasks and context in real time, with a full audit trail.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://x.com/PawelHuryn/status/2066052757895749891" rel="noopener noreferrer"&gt;@PawelHuryn&lt;/a&gt; shared a setup to treat Codex as a peer instead of a tool: a shared AGENTS.md, skills mirrored with a sync hook, the same MCPs imported into both runtimes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://x.com/0xidanlevin/status/2069675386531684375" rel="noopener noreferrer"&gt;@0xidanlevin&lt;/a&gt; said it plainly: when Claude Code spins up a Codex agent it "deliberately screws it up," and the visibility into what Codex is doing is "really lame."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the high-engagement posts are workarounds. They prove there is no native cross-agent coordination or shared state. That gap is what agmsg fills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Grok Build
&lt;/h2&gt;

&lt;p&gt;First, the access wall is gone. Scraping is gray, the API is expensive, and X Search sidesteps both because the xAI model is wired to X directly. That is the big one.&lt;/p&gt;

&lt;p&gt;Here is the part that matters most. Putting Grok Build on your agmsg team is not like calling a search API. It runs as an agent. So instead of a plain fetch, it searches, reads, filters, shapes, and decides what to hand back, in one move. In the demo, "skip the promos," "rank by engagement," "one-line summary," and "in English" all got assembled by the agent without me spelling out each step. A plain fetch does not do that.&lt;/p&gt;

&lt;p&gt;The practical wins come along for free. No browser automation in the loop, so it is fast. You get a structured answer back, not raw page text to parse and de-noise first.&lt;/p&gt;

&lt;p&gt;This is not a contest over who grabs the very latest post. The point is doing X work, automatically, without going gray, in the same place your agent already lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 1.1.1 adds
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;grok-build agent type (#216):&lt;/strong&gt; agmsg now works from the xAI Grok Build CLI. A Grok Build agent joins a team and exchanges messages like any other member.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;spawn --model (#135):&lt;/strong&gt; choose the model when you spawn a teammate, so you can stand up the right agent for the job, a Grok Build agent for the X part, on demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability fixes:&lt;/strong&gt; watcher teardown scope, clean exit on session death, argument quoting in the monitor path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest part: we found a trap by using it
&lt;/h2&gt;

&lt;p&gt;Getting Grok Build to receive reliably took a fix, and we only found it by running it for real. The first wiring delivered messages through a passive hook, the way the Claude path does. Tests passed. In real use nothing arrived. Worse, messages were marked read on the way through, so they disappeared entirely. Green tests, zero delivery, silent data loss.&lt;/p&gt;

&lt;p&gt;The fix was to use a model the agent already supports: a rules file it reads each turn, so it polls its own inbox and pulls whatever is waiting. After the switch, the handoff above went through end to end. The trap was caught before it could reach anyone.&lt;/p&gt;

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

&lt;p&gt;agmsg keeps the coordination open and in your hands. You pick which agents are on the team. You can see every handoff. Anything from outside loads only after you trust it, the gate added in 1.1.0. There is a lot of energy right now around routing many models behind one closed API. agmsg takes the same underlying bet, that coordinating several agents beats leaning on one monolith, but it does that in the open: you pick what is on the team, on your own machine, and you can watch it work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Install or update with &lt;code&gt;install.sh&lt;/code&gt;, and add the agent type you want with &lt;code&gt;--agent-type&lt;/code&gt;. (Exact one-liner from the 1.1.1 README at publish time.)&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wire in your own agent, or build a type. Grok Build is the newest example of how little it takes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Making agmsg pluggable: one directory per agent type, and a trust gate for external drivers (1.1.0)</title>
      <dc:creator>fujibee</dc:creator>
      <pubDate>Mon, 22 Jun 2026 19:42:46 +0000</pubDate>
      <link>https://dev.to/fujibee/making-agmsg-pluggable-one-directory-per-agent-type-and-a-trust-gate-for-external-drivers-110-2bp7</link>
      <guid>https://dev.to/fujibee/making-agmsg-pluggable-one-directory-per-agent-type-and-a-trust-gate-for-external-drivers-110-2bp7</guid>
      <description>&lt;p&gt;agmsg is a small thing that lets CLI AI agents message each other. Claude Code, Codex, Gemini CLI and the rest join a team and talk directly over a shared local SQLite file. No daemon, no network, nobody relaying copy-paste in the middle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1ewl9qt86k44g9bxq8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1ewl9qt86k44g9bxq8k.png" alt="The agent types agmsg supports, shown as logos: claude-code, codex, gemini, copilot, antigravity, opencode, and hermes" width="800" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More people have been running it lately. It hit #5 Product of the Day on Product Hunt and kept going from there. And the setups people build have gotten ambitious. One pattern I keep seeing: an agent monitors its own progress, and when it gets stuck it consults a second, bigger-picture model to break out of tunnel vision. The whole loop runs with no human decision in the middle. A team of agents, used as a team.&lt;/p&gt;

&lt;p&gt;The more of those show up, the more I hear "I want to mix in &lt;em&gt;this&lt;/em&gt; agent too" and "I want to run &lt;em&gt;that&lt;/em&gt; combination." Good problem to have. But it exposed one that had been quietly growing inside the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.1.0&lt;/strong&gt; is where I went after that problem and rebuilt how agmsg handles extensibility: how easily, and how safely, you can wire in a new agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtpvui0iq9bdgihs8am2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtpvui0iq9bdgihs8am2.png" alt="Diagram of agmsg 1.1.0's pluggable layout: each agent type (claude-code, codex, gemini, cursor, hermes) is a plug, one type per directory, dropping into an agmsg core with no hardcoded type names. An external plugin connects only through a trust gate" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 1.1.0 (not 1.0.7)
&lt;/h2&gt;

&lt;p&gt;Adding a new agent type used to be a chore. The core was littered with branches (&lt;code&gt;if claude-code, do this; if codex, do that&lt;/code&gt;), and one new type meant editing those branches in a dozen places. That's a leaky abstraction: the engine knew the name of every type it served.&lt;/p&gt;

&lt;p&gt;A single feature would have been a patch release. This rebuilt the foundation, so it got a minor bump instead: 1.1.0. Most of the payoff lands later, in the releases built on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  One type, one directory
&lt;/h2&gt;

&lt;p&gt;The change is small to describe. An agent type is now data plus a behavior plug, each in its own directory. Drop a directory under &lt;code&gt;scripts/drivers/types/&lt;/code&gt;, give it a manifest and a few overridable behaviors, and the core picks it up. The core no longer contains a single hardcoded type name. (I called that part engine purification, which is grander than it deserves.)&lt;/p&gt;

&lt;p&gt;Think of it as a socket and a plug. The agmsg core is the socket; each agent type is a plug. You add plugs without rewiring the socket. Before, you couldn't add a plug without opening up the socket's internals.&lt;/p&gt;

&lt;p&gt;Two things got better in practice.&lt;/p&gt;

&lt;p&gt;Adding a type is mostly declarative now. Delivery, for example, became a Template Method: the core owns the flow (&lt;code&gt;apply&lt;/code&gt; / &lt;code&gt;on_enable&lt;/code&gt; / &lt;code&gt;on_disable&lt;/code&gt; / &lt;code&gt;status&lt;/code&gt;), and each type overrides only what's specific to it in its own &lt;code&gt;_delivery.sh&lt;/code&gt;. Data-driven keys in the manifest (&lt;code&gt;delivery_modes&lt;/code&gt;, &lt;code&gt;stop_output&lt;/code&gt;, &lt;code&gt;hook_windows_wrap&lt;/code&gt;) cover most of the per-type variation without touching shared code. The Codex runtime, which used to be sprinkled around, lives under its own &lt;code&gt;types/codex/&lt;/code&gt; now.&lt;/p&gt;

&lt;p&gt;And the core got more maintainable. Pulling hardcoded type names out of shared scripts sounds boring, and it's the part that actually mattered. The engine plays no favorites anymore, so fixing it is easier and adding a type is far less likely to break a neighbor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensible, but on purpose
&lt;/h2&gt;

&lt;p&gt;The plug mechanism has a name in agmsg: a driver. It's the adapter that connects an agent to the core.&lt;/p&gt;

&lt;p&gt;Because of drivers, you can add your own agent type. 1.1.0 ships &lt;strong&gt;Cursor&lt;/strong&gt; as the first real showcase of that. The new layout is what makes a newcomer like Cursor a matter of dropping in a manifest and a plug. There's also &lt;strong&gt;Hermes&lt;/strong&gt;, a community-built type, added as beta (based on a contribution from Fewmanism).&lt;/p&gt;

&lt;p&gt;This is the part I cared about most. Letting people add a type from outside is one short step from letting unknown code run on your machine. A driver is a shell script. It can do anything. So external drivers are opt-in: nothing loads until you explicitly trust it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agmsg plugin list      &lt;span class="c"&gt;# see discovered external drivers (untrusted by default)&lt;/span&gt;
agmsg plugin trust     &lt;span class="c"&gt;# allow a specific, path-pinned driver to load&lt;/span&gt;
agmsg plugin untrust   &lt;span class="c"&gt;# revoke it&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A driver someone dropped into the directory does not run on its own. It loads only after a &lt;code&gt;trust&lt;/code&gt; you issued, pinned to its path. That closes the obvious hole, an unintended drop-in getting executed, without making extension any harder than dropping in a directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is going
&lt;/h2&gt;

&lt;p&gt;What I want from the agmsg ecosystem is plain enough: any agent you use, wired in without much fuss, and safely.&lt;/p&gt;

&lt;p&gt;New AI tools ship basically every week. The goal is that "I wish I could connect this one to agmsg" takes a small, safe amount of effort each time. 1.1.0 is undercarriage work toward that. Types are the first thing to become pluggable; storage and delivery come next on the same driver model (ADR 0001/0002 if you want the design notes).&lt;/p&gt;

&lt;p&gt;One last thing. Big thanks to the contributors whose PRs this builds on: lucian (&lt;a href="https://x.com/lucianlamp" rel="noopener noreferrer"&gt;@lucianlamp&lt;/a&gt;) on the Windows side (1.1.0 also folds in his #186, which drops the PowerShell launcher for a single Git Bash path, plus #187), and Fewmanism on Hermes. agmsg has grown this way the whole time, on the people who use it and the people who put their hands on it.&lt;/p&gt;

&lt;p&gt;It's not done. Hermes is beta, a Grok type is something I'd like to build with the community next, and there's hardening left. If you want to wire in your own agent, build a type, or kick the tires on Hermes, all of it is welcome.&lt;/p&gt;

&lt;p&gt;One more practical note for anyone already on 1.0.x: &lt;code&gt;install.sh --update&lt;/code&gt; now regenerates the Codex monitor wrapper at its new path, so upgrading from 1.0.x to 1.1.0 won't silently break monitor delivery. After updating, restart your agent so the running watcher picks up the new code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx agmsg                       &lt;span class="c"&gt;# install / update&lt;/span&gt;
npm i &lt;span class="nt"&gt;-g&lt;/span&gt; agmsg &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; agmsg &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="c"&gt;# or this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;agmsg on GitHub: &lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>cli</category>
      <category>devtools</category>
    </item>
    <item>
      <title>The claude -p playbook for June 15: rebuilding your AI workflows inside interactive sessions</title>
      <dc:creator>fujibee</dc:creator>
      <pubDate>Fri, 12 Jun 2026 22:08:37 +0000</pubDate>
      <link>https://dev.to/fujibee/the-claude-p-playbook-for-june-15-rebuilding-your-ai-workflows-inside-interactive-sessions-3p41</link>
      <guid>https://dev.to/fujibee/the-claude-p-playbook-for-june-15-rebuilding-your-ai-workflows-inside-interactive-sessions-3p41</guid>
      <description>&lt;p&gt;On June 15, &lt;code&gt;claude -p&lt;/code&gt; (headless mode) and the Agent SDK stop drawing from your Claude subscription and move onto a separate metered credit. I've written a lot of &lt;code&gt;claude -p&lt;/code&gt; scripts over the past few months, so my honest first thought was that a chunk of my setup had just moved onto a meter.&lt;/p&gt;

&lt;p&gt;But it's not really one company's pricing call. The whole industry has been drifting the same way. Copilot moved to AI Credits on June 1 (completions free; Chat, CLI and agents burn credits). Codex pairs a seat with credits plus API usage. And now Claude splits headless and the SDK off on the 15th. The pattern is the same each time: you stay flat-rate while you're driving, and it meters once you step away.&lt;/p&gt;

&lt;p&gt;So for me the question stopped being how to dodge the bill and became which work actually belongs where. A few months of running several agents inside interactive sessions has changed my answer, and the short version is that a lot of my headless scripts never needed to be headless.&lt;/p&gt;

&lt;p&gt;One caveat before the recipes, since someone always asks: yes, several of them also keep this work inside the flat-rate plan. Pricing changes, so check the current terms yourself. My case for doing it is that the in-session setup is a better way to work. Cheaper is a side effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the line landed where it did
&lt;/h2&gt;

&lt;p&gt;If you want the full cost mechanics, &lt;a href="https://dev.to/pat9000/the-flat-fee-era-is-over-how-to-control-your-ai-agent-costs-in-2026-5cof"&gt;The flat-fee era is over&lt;/a&gt; and &lt;a href="https://usagebox.com/articles/tokenpocalypse-ai-coding-usage-billing-2026" rel="noopener noreferrer"&gt;The Tokenpocalypse&lt;/a&gt; both cover it. They land on the same point. Old completion-style usage was short output, so flat-rate worked. Agentic tools broke that. One request now hides a flood of tokens (read the repo, grep around, run the tests, patch, and repeat), and the gap between a light user and a heavy one got wide enough, maybe 10x on real token cost, that unlimited-for-everyone stopped penciling out. It's the same shift cloud made going from renting a server to paying for what you use.&lt;/p&gt;

&lt;p&gt;Look at where each vendor drew its line and you see the same split. Usage with a human at the screen stays flat. Usage where the human stepped away (headless, SDK, CI) gets metered.&lt;/p&gt;

&lt;p&gt;Which makes sense if you think about throughput. A person reads and thinks and types, so one interactive session caps out at human speed. A headless call can run in a loop with nothing to slow it down. So the pricing is partly about what a flat rate can sustain, and partly a signal about which surface the platform wants people on. Either way it points the same way. The interactive session is the stable place to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was your claude -p actually unattended?
&lt;/h2&gt;

&lt;p&gt;Looking back, a lot of what I pushed through &lt;code&gt;claude -p&lt;/code&gt; never needed to run on its own. I wanted a second agent's read while I worked, or a review from a different model, or a refactor running in parallel on something else, and in every case I was sitting right there. There just wasn't a channel between sessions, so I had two options: play copy-paste courier myself, or wrap &lt;code&gt;claude -p&lt;/code&gt; in a script to bridge them.&lt;/p&gt;

&lt;p&gt;This happens a lot while a stack is still coming together: when one piece is missing, whatever sits next to it covers for it. With no way for agents to talk directly, headless calls and glue scripts carried that load. Headless wasn't the wrong tool, just the only channel I had.&lt;/p&gt;

&lt;p&gt;Once that piece exists, you can redraw who does what. June 15 isn't only about budgeting for headless credits (some jobs really do need them, more on that below). It's also a chance to move the borrowed work back where it belongs and leave &lt;code&gt;claude -p&lt;/code&gt; the jobs that actually have to run headless. If agents can talk inside interactive sessions, you don't need the courier or the bridge script.&lt;/p&gt;

&lt;p&gt;The channel I built for that is &lt;strong&gt;agmsg&lt;/strong&gt;. It's &lt;code&gt;bash&lt;/code&gt; plus SQLite and nothing else. Claude Code, Codex, Gemini CLI and Copilot CLI sessions join a team and message each other, with no daemon, no network, and no MCP. Sending and receiving both happen inside your normal interactive sessions through a hook, so there's no &lt;code&gt;claude -p&lt;/code&gt; or SDK anywhere in it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's how the common &lt;code&gt;claude -p&lt;/code&gt; patterns look once you rebuild them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recipe 1: a script that asks an AI → a resident buddy session
&lt;/h2&gt;

&lt;p&gt;A code review or a quick consult, fired off to headless from inside a script. The script isn't interactive, but the AI work inside it is really just a conversation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# review-diff.sh: runs in the dev loop&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail
&lt;span class="nv"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git diff &lt;span class="nt"&gt;--staged&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# headless call, metered after June 15&lt;/span&gt;
&lt;span class="nv"&gt;review&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--print&lt;/span&gt; &lt;span class="s2"&gt;"Review this diff for race conditions and SQL injection. Return JSON &lt;/span&gt;&lt;span class="se"&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;verdict&lt;/span&gt;&lt;span class="se"&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;ok|block&lt;/span&gt;&lt;span class="se"&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;notes&lt;/span&gt;&lt;span class="se"&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;...&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$diff&lt;/span&gt;&lt;span class="s2"&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;$review&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'.verdict == "ok"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&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;$review&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;'.notes'&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;1
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, open a second Claude Code in another terminal and keep it on the team in real-time &lt;code&gt;monitor&lt;/code&gt; mode. The reviewer is just a regular interactive session, covered by your subscription.&lt;/p&gt;

&lt;p&gt;One-time setup in terminal 2 (the reviewer), just this inside the session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/agmsg
# → it asks for team + agent name: answer team: dev / agent: alice
# → pick monitor (real-time) when asked how to receive

# from now on, anything addressed to alice streams into this window live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script side, terminal 1, where &lt;code&gt;claude -p&lt;/code&gt; used to sit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# review-diff.sh: agmsg version&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail
&lt;span class="nv"&gt;TEAM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;span class="nv"&gt;FROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;worker     &lt;span class="c"&gt;# this script's identity&lt;/span&gt;
&lt;span class="nv"&gt;TO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;alice        &lt;span class="c"&gt;# the resident reviewer session&lt;/span&gt;
&lt;span class="c"&gt;# hand the review to the live session; body is plain text,&lt;/span&gt;
&lt;span class="c"&gt;# pass a reference and a short ask, not raw context&lt;/span&gt;
~/.agents/skills/agmsg/scripts/send.sh &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TEAM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FROM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TO&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"Please review the staged diff at &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;. Reply with verdict (ok|block) + notes."&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Waiting for &lt;/span&gt;&lt;span class="nv"&gt;$TO&lt;/span&gt;&lt;span class="s2"&gt;'s verdict..."&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;reply&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;~/.agents/skills/agmsg/scripts/inbox.sh &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TEAM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FROM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$reply&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"verdict: ok"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;0 &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"verdict: block"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&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;$reply&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="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1 &lt;span class="p"&gt;;;&lt;/span&gt;
  &lt;span class="k"&gt;esac&lt;/span&gt;
  &lt;span class="nb"&gt;sleep &lt;/span&gt;5
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reviewer reads the diff, replies with &lt;code&gt;/agmsg send worker "verdict: ok ..."&lt;/code&gt;, and the script picks up where it left off. Nothing called &lt;code&gt;claude -p&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The win is that the buddy stays open instead of being a headless process that vanishes after each call. Context sticks around, so by the second ask, telling it to use the same approach as before just works. It beats a headless call you had to brief from scratch every time.&lt;/p&gt;

&lt;p&gt;It also differs from subagents in a way worth knowing. A subagent inherits the parent's context, so even when you ask it to review something independently, the answer tends to land inside the parent's framing. A separate session starts clean, so the review is genuinely independent. One person moved to agmsg for exactly this, in a data-analysis setup (I'm collecting use cases, there's more there).&lt;/p&gt;

&lt;h2&gt;
  
  
  Recipe 2: an orchestration script → a director agent
&lt;/h2&gt;

&lt;p&gt;A homegrown orchestration script that fans out to a few models in parallel and merges what comes back. Credits drain by the number of workers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# judge-panel.sh: three independent reviews → synthesis&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail
&lt;span class="nv"&gt;problem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c"&gt;# three parallel headless calls, each one metered&lt;/span&gt;
&lt;span class="nv"&gt;analysis_a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$problem&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--print&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &amp;amp;
&lt;span class="nv"&gt;analysis_b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$problem&lt;/span&gt;&lt;span class="s2"&gt; (focus on security)"&lt;/span&gt; &lt;span class="nt"&gt;--print&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &amp;amp;
&lt;span class="nv"&gt;analysis_c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;codex &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;--headless&lt;/span&gt; &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$problem&lt;/span&gt;&lt;span class="s2"&gt; (focus on perf)"&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &amp;amp;
&lt;span class="nb"&gt;wait&lt;/span&gt;
&lt;span class="c"&gt;# synthesis, yet another call&lt;/span&gt;
claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--print&lt;/span&gt; &lt;span class="s2"&gt;"Synthesize these three reviews into one verdict: ..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, stand up one director session and drop the workers (mix models and tools freely) onto the same team. The orchestration logic turns into the director's instructions; fan-out, collection and synthesis all ride on agmsg messages.&lt;/p&gt;

&lt;p&gt;Setup is one &lt;code&gt;/agmsg&lt;/code&gt; per session: the three workers (each in its own terminal, window or IDE pane) and the director (the one you actually work in):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# inside each session
/agmsg
# → answer team: panel / agent: reviewer-a (b, c, director), pick monitor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you just talk to the director:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You (in the director session):
  "Send reviewer-a a correctness review, reviewer-b a security review,
   reviewer-c a performance review, of the staged diff.
   Wait for all three, then synthesize."

director: [sends three agmsg messages, polls inbox, and once all three
           land, writes the synthesis in this same session]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The control flow you used to script is now plain English. No &lt;code&gt;claude -p&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A real one: on Fable 5's release day someone ran a refactor with Fable 5 as the commander, Opus 4.8 as deputy and Sonnet 4.6 as scouts. The day a model ships you can drop it straight into the lineup you already run. That's the point of the transport not caring which model is behind each seat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recipe 3: a background job → a dedicated worker session
&lt;/h2&gt;

&lt;p&gt;Something you want chugging along next to your own work (test scaffolding, a doc update, some research) that you used to kick off with cron or a script plus &lt;code&gt;claude -p&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead, in the morning open one more terminal, start a worker session and leave it on the team (inside the session: &lt;code&gt;/agmsg&lt;/code&gt; → team: dev / agent: worker / pick monitor). When something comes up, message it from your main session. It picks up each inbound and reports back when it's done.&lt;/p&gt;

&lt;p&gt;Kickoff, from your main session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: send worker: "Analyze /tmp/deploy.log for slow queries. Write findings
to /tmp/deploy-findings.md. Ping me when done."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It starts on its next monitor event, does the work, writes the file, and comes back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;worker → me: "deploy-findings.md ready. 3 queries &amp;gt; 500ms, all on the
users table. Top one is the email_lower lookup, index missing."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No orphaned processes the way a backgrounded headless job leaves them. Close the worker terminal and the work stops, which is the upside of running it where you can see it. Dispatch and progress stay automatic; only the execution moved back into the same room as you. When something breaks it's right there in the next terminal, not a cron job that failed quietly at 3am.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recipe 4: a tool-to-tool pipe → a message
&lt;/h2&gt;

&lt;p&gt;A pipe or a temp file plus glue to hand Claude's output to Codex, or the other way around.&lt;/p&gt;

&lt;p&gt;Instead, put both sessions on the same team and let them talk.&lt;/p&gt;

&lt;p&gt;This one runs here every day, so here's a real case. Last week agmsg got a Linux-only bug report (&lt;a href="https://github.com/fujibee/agmsg/issues/95" rel="noopener noreferrer"&gt;issue #95&lt;/a&gt;). The Claude Code that wrote the fix and a separate session that verified it in a Debian container ran the whole exchange over agmsg messages: report, environment details, verification, merge note. It went from report to merge in six hours (&lt;a href="https://github.com/fujibee/agmsg/pull/97" rel="noopener noreferrer"&gt;PR #97&lt;/a&gt;). Both were ordinary interactive sessions, with no glue anywhere.&lt;/p&gt;

&lt;p&gt;Minimum setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Terminal A: Claude Code, joined as "analyst"
#   /agmsg → team: dev / agent: analyst
# Terminal B: Codex, joined as "implementer"
#   $agmsg → team: dev / agent: implementer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then it's just talking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Terminal A (analyst):
You: "send implementer: the settings writer embeds settings.local.json into
     the sqlite3 argv 6x (issue #95). readfile() in the SQL should keep it
     off argv entirely. Patch + tests please."

# Terminal B (implementer): receives the message, writes patch + tests, runs bats:
You: "send analyst: branch fix/delivery-e2big pushed. 3 bats cases at a 25KB
     fixture, all green locally. Ready for review."

# Terminal A: reads the PR, approves inline, then:
You: "send implementer: approving. one ask: verify on Linux too; the pre-fix
     code should fail there with E2BIG."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each hand-off is a sentence and a reference. The receiver does the heavy lifting in its own session against the live filesystem. Nothing gets piped.&lt;/p&gt;

&lt;p&gt;One exception: running the &lt;strong&gt;same prompt across several models in parallel&lt;/strong&gt; for independent takes is still better as a headless pipe. That's a spend-the-credits call, covered in the next section.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to keep it headless
&lt;/h2&gt;

&lt;p&gt;None of this means replacing everything. Some work is genuinely right for headless, and worth budgeting the new credits for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI pipelines, running where no human is by definition. The GitHub Actions integration is on the new credit too.&lt;/li&gt;
&lt;li&gt;Nightly batches and scheduled jobs that are genuinely meant to run unattended.&lt;/li&gt;
&lt;li&gt;SDK usage baked into a product, which should be costed as metered from the start.&lt;/li&gt;
&lt;li&gt;One-shot massive parallelism, like the same input across 50 calls, which is a credit-budget decision rather than a workflow one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test I use is just: when it's running, are you there? If yes, it can move into an interactive session. If no, budget the headless credits and move on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'd do it this way even without the price change
&lt;/h2&gt;

&lt;p&gt;I read June 15 as the platform saying development with a human in the loop gets the structural advantage now.&lt;/p&gt;

&lt;p&gt;But the reason I'd keep the interaction and automate only the coordination isn't really the flat-rate bucket. After a few months of it, what I keep noticing is that work where the judgment stays with a human is faster in the end. The coordination runs itself, and you get pulled in at the branch points and the final call. No copy-paste relay, no 3am cron log to read backward.&lt;/p&gt;

&lt;p&gt;The pricing change just happened to point the same way.&lt;/p&gt;

&lt;p&gt;agmsg is open source, and setup runs about 30 seconds if you've got &lt;code&gt;bash&lt;/code&gt; and &lt;code&gt;sqlite3&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>agmsg</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Lessons from open-sourcing a messaging layer for CLI AI agents (320 stars in a week)</title>
      <dc:creator>fujibee</dc:creator>
      <pubDate>Thu, 04 Jun 2026 00:45:43 +0000</pubDate>
      <link>https://dev.to/fujibee/lessons-from-open-sourcing-a-cli-agent-messaging-layer-320-stars-in-a-week-1b75</link>
      <guid>https://dev.to/fujibee/lessons-from-open-sourcing-a-cli-agent-messaging-layer-320-stars-in-a-week-1b75</guid>
      <description>&lt;p&gt;About a week ago I open-sourced &lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;agmsg&lt;/a&gt;, a ~500-line bash + SQLite tool that lets CLI AI agents message each other directly. I built it for a dumb reason: I was tired of being the human copy-paste relay between Claude Code and Codex — selecting code in one terminal, pasting it into the other, carrying replies back, all day.&lt;/p&gt;

&lt;p&gt;I expected a few stars from friends and nothing else. Instead it went 5 → 320 in a week, picked up forks, derivative projects, and pull requests from people I've never met. That gap between what I expected and what happened is the interesting part, so here's the honest retrospective: the numbers, what worked, what flopped, and what genuinely surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38h4jbkmfhnupqiu0w4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38h4jbkmfhnupqiu0w4x.png" alt=" agmsg GitHub stars over its first week, rising from ~5 to 324, with markers at the launch thread, first outside PR, the actas/drop release, and the Monitor writeup" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In about a week, with no budget and no audience to speak of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub stars: 5 → 320&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forks: 0 → 15&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 derivative projects&lt;/strong&gt; — someone ported the idea to shogi (agmsg-shogi), someone wrapped it as an MCP server (agmsg-mcp), someone rewrote it in Go (agmsg-go)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull requests from outside contributors&lt;/strong&gt; — support for Gemini CLI, Antigravity, and now GitHub Copilot CLI, plus a fix for role-isolation race conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this came from one big spike. It came from a sequence of posts across channels, some of which worked and some of which completely didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What worked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Leading with a video, not an explanation.&lt;/strong&gt; The first post that got traction wasn't a description of the architecture — it was a 23-second clip of two Claude Code instances autonomously playing tic-tac-toe over agmsg, with no human input. People stop scrolling for a moving picture of agents doing something on their own. The text underneath could be short; the video did the work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A relatable problem, stated plainly.&lt;/strong&gt; "I became a copy-paste relay between two AIs" landed because a lot of people are quietly doing exactly that right now. I didn't open with the technical design. I opened with the annoyance. The design was the payoff, not the hook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using a long-form post as the landing pad.&lt;/strong&gt; Timeline posts are good at reach and bad at depth. So the threads pointed to a longer writeup where the design rationale, the trade-offs, and a full reproduction prompt lived. Reach on one channel, depth on another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treating it as a series, not a single launch.&lt;/strong&gt; Instead of one post that had to carry everything, I spread it: the origin narrative first, then the first outside contribution, then a new feature (&lt;code&gt;actas&lt;/code&gt;, multiple agent roles in one workspace), then a deep dive on the underlying mechanism. Each piece re-surfaced the project to a slightly different audience and kept it alive past the first 24 hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My first English post sank.&lt;/strong&gt; The very first English writeup got ~3.6K impressions and basically no conversion. The content was fine; the distribution was nonexistent. I'd posted it cold, with no thread to carry it and nothing leading into it. A good article with no on-ramp is just a file on the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacker News went badly.&lt;/strong&gt; I tried a Show HN, and my first author comment got auto-killed by the spam filter within seconds — too long, too promo-shaped. Then I made it worse by deleting and reposting it, which is apparently the exact trigger that gets the replacement marked dead permanently. Lesson learned the hard way: a first comment should be two or three sentences with no links, and if it gets flagged you leave it alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reddit was a non-starter.&lt;/strong&gt; The high-value subreddits gate new accounts on age and karma, and mine had neither when I needed it. There's no shortcut here; you either have a warm account before you need it, or you don't get to play that day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The surprises
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Derivative projects.&lt;/strong&gt; I genuinely did not expect someone to take the idea and build agmsg-shogi — agents playing shogi over the same messaging layer. Forks I understood; a from-scratch reinterpretation in a different domain was a different signal entirely. That's when it stopped feeling like a repo and started feeling like a small idea other people wanted to build on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributors kept showing up.&lt;/strong&gt; Support for Gemini, Antigravity, and GitHub Copilot CLI was added by people I've never talked to. The project now speaks to five different CLI agents, and most of that breadth came from outside. Keeping the surface area tiny — bash and sqlite3, no daemon, no network, no Python — turned out to be the thing that made it easy to extend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bookmarks predicted stars better than likes.&lt;/strong&gt; On the technical posts, the bookmark-to-like ratio was the signal that tracked GitHub stars. People bookmark "I'll need this later"; that intent converts. Likes are applause; bookmarks are intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I just published the deep dive on the piece that makes all of this feel real-time — Claude Code's underused Monitor tool, and the six design patterns I had to get right to run a watcher in production. That's where the "how does this actually work" answer lives.&lt;/p&gt;

&lt;p&gt;On the roadmap: making the storage layer pluggable so agmsg isn't married to a single SQLite file on one machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reframe
&lt;/h2&gt;

&lt;p&gt;The thing I keep coming back to: a week in, I'm not sure "messaging layer" is even the right description. What people are actually using — and extending — is closer to a &lt;strong&gt;shared blackboard for AI agents&lt;/strong&gt;: a dumb, durable place where independent agents leave notes for each other, and anything that can read and write a file can join. The messaging was just the first thing I needed it for.&lt;/p&gt;

&lt;p&gt;If you're running more than one AI coding agent, it's &lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;. I'd rather hear what breaks than collect another star.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>claude</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I built agmsg so Claude Code and Codex could stop using me as a copy-paste relay</title>
      <dc:creator>fujibee</dc:creator>
      <pubDate>Thu, 28 May 2026 00:00:10 +0000</pubDate>
      <link>https://dev.to/fujibee/i-built-agmsg-so-claude-code-and-codex-could-stop-using-me-as-a-copy-paste-relay-m42</link>
      <guid>https://dev.to/fujibee/i-built-agmsg-so-claude-code-and-codex-could-stop-using-me-as-a-copy-paste-relay-m42</guid>
      <description>&lt;p&gt;My main driver is Claude Code, with Codex bolted on for the hard parts and reviews. The split works surprisingly well. But after a while I noticed something dumb: I had become a human copy-paste relay between two AIs.&lt;/p&gt;

&lt;p&gt;Copy what Claude Code wrote, paste it into Codex for review, copy Codex's feedback, paste it back into Claude Code. Dozens of times a day. It's tedious, it breaks focus, and I'd occasionally paste the wrong thing. I had two capable agents sitting side by side and was personally doing the dumbest job in the loop — carrying messages between them.&lt;/p&gt;

&lt;p&gt;Agents should just be able to message each other directly. So I built &lt;code&gt;agmsg&lt;/code&gt; and put it on GitHub: &lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it first (30 seconds)
&lt;/h2&gt;

&lt;p&gt;You're an engineer; you'd rather run it than read about it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/fujibee/agmsg/main/setup.sh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then restart Claude Code / Codex and run &lt;code&gt;/agmsg&lt;/code&gt; (&lt;code&gt;$agmsg&lt;/code&gt; on Codex). It asks for a team name and an agent name on first use. The README has the full quickstart and copy-paste commands.&lt;/p&gt;

&lt;p&gt;Once two agents join the same "team," they can message each other. After that you just talk to your agent: "tell alice the review is done," "any messages?" — that's it.&lt;/p&gt;

&lt;p&gt;The only dependencies are &lt;strong&gt;bash and sqlite3&lt;/strong&gt;. No daemon, no network, no Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why run two coding agents at all
&lt;/h2&gt;

&lt;p&gt;This started by accident. Claude Code (Opus 4.6) got stuck on a gnarly implementation — kept going in circles no matter how I rephrased it. On a whim I handed the exact same spec to Codex (GPT-5.3), and it produced a correct version almost instantly. That was a quiet shock.&lt;/p&gt;

&lt;p&gt;Since then I've split the roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; — the daily driver. Fast, high volume, follows direction well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt; — reviewer and last resort for hard problems. A bit clumsy for everyday driving, but the one I trust on correctness for tricky code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither is "better" — they have different temperaments, so they're good at different moments. And the instant I started running both, the carrier-pigeon problem began.&lt;/p&gt;

&lt;h2&gt;
  
  
  What agmsg is
&lt;/h2&gt;

&lt;p&gt;In one line: &lt;strong&gt;CLI AI agents message each other through a shared SQLite database.&lt;/strong&gt; Claude Code, Codex, Gemini CLI — any CLI agent works.&lt;/p&gt;

&lt;p&gt;It's built as an &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;Agent Skill&lt;/a&gt;, so you install it as a skill and don't touch the agent itself. It turned out better than I expected, so I open-sourced it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design decisions
&lt;/h2&gt;

&lt;p&gt;The order I went through, and why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I checked the built-ins first.&lt;/strong&gt; I didn't want to reinvent anything, so I looked at Claude Code's team / subagent features. They're designed around short-lived sessions — great for spinning off a one-off subtask, but not for two agents holding an ongoing conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I started with plain text files.&lt;/strong&gt; The built-in team agent was file-based and simple, so I did the same. Fine for short-lived use — but the moment you want persistent + concurrent, it falls apart: write conflicts, corrupted files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So I moved to SQLite (WAL mode).&lt;/strong&gt; Multiple readers + one writer, no conflicts; transactions that survive concurrent access; message history for free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But keep dependencies minimal.&lt;/strong&gt; This is the part I cared about most. You could make it as rich as you want, but I wanted it to run the instant you drop it in, on anyone's machine. The result: it runs anywhere &lt;strong&gt;bash and sqlite3&lt;/strong&gt; run. No daemon of its own (agmsg has no resident process; only &lt;code&gt;monitor&lt;/code&gt; mode piggybacks on Claude Code's built-in Monitor), no network (all local), no Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delivery modes — monitor is what made it usable
&lt;/h2&gt;

&lt;p&gt;There are roughly three ways a message reaches an agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;manual&lt;/strong&gt; — you run &lt;code&gt;/agmsg&lt;/code&gt;, or ask the agent to "check the inbox." Reliable, but you have to remember.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;hook&lt;/strong&gt; — checks between turns (on the Stop hook). Codex defaults to this, since it has no Monitor tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;monitor&lt;/strong&gt; — subscribes to SQLite continuously and interrupts the conversation in real time when a message lands. This is the default on Claude Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, &lt;strong&gt;monitor is what tipped it from toy to useful.&lt;/strong&gt; With manual/hook there's a gap — the other side already replied, but you don't notice until you poke it. With monitor, the conversation just flows.&lt;/p&gt;

&lt;p&gt;The mechanism (riding Claude Code's Monitor on top of a blocking SQLite read) is interesting enough that I want to write it up separately.&lt;/p&gt;

&lt;p&gt;And here's the fun part. Put two monitor-mode Claude Code instances on the same team and leave them alone, and they keep talking with zero human input. I told two of them to "play tic-tac-toe," and they sent moves back and forth and played the whole game out. Not useful, exactly — but watching two agents volley autonomously is genuinely fun:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytadsd2tqrp57nkw4l0p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytadsd2tqrp57nkw4l0p.gif" alt=" " width="600" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Two monitor-mode Claude Code instances playing tic-tac-toe over agmsg, no human in the loop (real game, static gaps trimmed, ~2.5x).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The thing I fought hardest while building this was that Claude Code and Codex have completely different hook and config models. Claude Code has Monitor and rich SessionStart hooks; Codex has neither. Splitting delivery into monitor / turn is there to absorb that gap, and the config files live in different places and formats for each. Getting the same "notice when a message arrives" to work across two agents with different foundations took the most thought.&lt;/p&gt;

&lt;p&gt;How to smooth over those heterogeneous-agent seams — and the monitor internals I mentioned — are what I'll write about next.&lt;/p&gt;

&lt;p&gt;For now: install it and let Claude Code and Codex talk to each other directly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/fujibee/agmsg" rel="noopener noreferrer"&gt;https://github.com/fujibee/agmsg&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
