[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f2p4uc9yh2ahry":3},{"_id":4,"slug":5,"title":6,"subtitle":7,"kind":8,"cards":9,"tags":57,"categories":59,"source":61,"lang":64,"author":65,"audioState":68,"stats":69,"publishedAt":72,"renderer":73},"6abc6810ca21c797c7e9eb2d","one-feature-three-repos-a-walkthrough-2e65abf4","One feature, three repos: a walkthrough","A field that crosses three repos","news",[10,12,17,22,27,32,37,42,47,52],{"headline":6,"body":7,"imageUrl":11,"sourceImageUrl":11},"https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fivar.run%2Fblog%2Fone-feature-across-multiple-repos%2Fopengraph-image%2Fone-feature-across-multiple-repos",{"headline":13,"body":14,"imageUrl":15,"images":16},"You need to add a currency to invoices","You need to add a currency to invoices. The API has to store and return it, the web app has to show it, and somewhere in between a shared types package describes what an invoice looks like. Three repositories, one change.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F1.webp",{"local":15},{"headline":18,"body":19,"imageUrl":20,"images":21},"Why a single agent session across repos matters","Why a single agent session across repos matters is covered in the context problem nobody solved. This post is the practical side: the commands, in order, for one feature that touches all three. Register the three repositories in the hall:","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F2.webp",{"local":20},{"headline":23,"body":24,"imageUrl":25,"images":26},"Each one lands in ivar.json under repos. That","Each one lands in ivar.json under repos. That file is the hall's manifest: which repos exist, where they come from, which harnesses and MCP servers every session gets. Nothing is promoted yet, so every repo sits on its default branch, read-only. One feature, two repos to start Create the feature and promote the two repos you know you need:","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F3.webp",{"local":25},{"headline":28,"body":29,"imageUrl":30,"images":31},"Promoting a repo cuts a billing-currency branch in","Promoting a repo cuts a billing-currency branch in it and gives it a worktree the feature can write to. types stays on its default branch as read-only context.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F4.webp",{"local":30},{"headline":33,"body":34,"imageUrl":35,"images":36},"One session sees both promoted repos side by","One session sees both promoted repos side by side, plus types as read-only. The agent can change the API handler and the web component in the same conversation, and it can read the shared types to see what an invoice looks like today.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F5.webp",{"local":35},{"headline":38,"body":39,"imageUrl":40,"images":41},"Halfway through, the agent reports the obvious: the","Halfway through, the agent reports the obvious: the invoice type lives in types, and both the API and the web app import it. The currency field has to go there first, or the other two changes won't compile against each other. You don't need to stop the session or start over. From another terminal, promote the third repo:","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F6.webp",{"local":40},{"headline":43,"body":44,"imageUrl":45,"images":46},"types gets its own billing-currency branch and worktree","types gets its own billing-currency branch and worktree, and the session can now write to it. The agent adds the field to the shared type and carries on with the API and the web app. The features guide covers promotion in more detail. Three repos, one branch name, each based on its own main. No list of branches to keep in your head. When the work is done, preview the delivery:","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F7.webp",{"local":45},{"headline":48,"body":49,"imageUrl":50,"images":51},"The preview writes nothing. For each promoted repo","The preview writes nothing. For each promoted repo it reads the branch, the remote, the base and any existing pull request, then computes one fingerprint over all three. If any repo changes after you read the preview, the fingerprint no longer matches and apply refuses. Apply it with the fingerprint the preview printed:","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F8.webp",{"local":50},{"headline":53,"body":54,"imageUrl":55,"images":56},"That pushes the billing-currency branch in each repo","That pushes the billing-currency branch in each repo and opens the three pull requests together, each with a comment linking its siblings, so a reviewer on the web PR can find the API and types PRs.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-feature-three-repos-a-walkthrough-2e65abf4\u002F9.webp",{"local":55},[58],"dev",[60],"Technology",{"name":62,"url":63},"Dev.to","https:\u002F\u002Fdev.to\u002Fmnzs\u002Fone-feature-three-repos-a-walkthrough-1e3l","en",{"handle":66,"displayName":67},"spots","Spots","queued",{"views":70,"likes":71,"saves":71,"shares":71,"completions":71,"opens":71,"skips":71,"depthSum":71},1,0,"2026-09-30T01:38:24.164Z","local"]