<?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: Erik Koo</title>
    <description>The latest articles on DEV Community by Erik Koo (@erik_koo_de6ffb7e6aaff446).</description>
    <link>https://dev.to/erik_koo_de6ffb7e6aaff446</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3828394%2F79922557-82c6-4dd6-9323-321c9c197efb.JPG</url>
      <title>DEV Community: Erik Koo</title>
      <link>https://dev.to/erik_koo_de6ffb7e6aaff446</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/erik_koo_de6ffb7e6aaff446"/>
    <language>en</language>
    <item>
      <title>I got tired of repackaging the same AI context, so I built a Go CLI</title>
      <dc:creator>Erik Koo</dc:creator>
      <pubDate>Tue, 17 Mar 2026 02:44:02 +0000</pubDate>
      <link>https://dev.to/erik_koo_de6ffb7e6aaff446/i-got-tired-of-repackaging-the-same-ai-context-so-i-built-a-go-cli-4njk</link>
      <guid>https://dev.to/erik_koo_de6ffb7e6aaff446/i-got-tired-of-repackaging-the-same-ai-context-so-i-built-a-go-cli-4njk</guid>
      <description>&lt;p&gt;I didn’t build &lt;code&gt;prtr&lt;/code&gt; because I wanted “an AI coding product.”&lt;/p&gt;

&lt;p&gt;I built it because I got tired of doing the same annoying glue work over and over again.&lt;/p&gt;

&lt;p&gt;A test would fail.&lt;br&gt;
I’d copy the logs.&lt;br&gt;
Then I’d open Claude or ChatGPT or Gemini.&lt;br&gt;
Then I’d explain the problem again.&lt;br&gt;
Then I’d try a second model.&lt;br&gt;
Then I’d take the answer and manually turn it into the next step.&lt;/p&gt;

&lt;p&gt;The first prompt was rarely the hard part. &lt;strong&gt;The hard part was everything around it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That repeated context-packing started to feel like its own task, and I realized I was spending too much energy moving information between tools instead of actually thinking about the problem.&lt;/p&gt;

&lt;p&gt;So I started building a small CLI to make that loop cheaper.&lt;/p&gt;

&lt;p&gt;That tool became &lt;strong&gt;&lt;code&gt;prtr&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  The problem I wanted to solve
&lt;/h2&gt;

&lt;p&gt;I wasn’t trying to replace IDEs.&lt;br&gt;
I wasn’t trying to build a full autonomous agent.&lt;br&gt;
And I wasn’t trying to invent another chat UI.&lt;/p&gt;

&lt;p&gt;I just wanted a tool that could help with this kind of loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Take intent&lt;/strong&gt; from me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take logs&lt;/strong&gt; from &lt;code&gt;stdin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add lightweight repo context&lt;/strong&gt; automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepare the next useful prompt&lt;/strong&gt; without me thinking about formatting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let me compare another model&lt;/strong&gt; without rebuilding everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Turn the answer into the next action.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;A lot of AI tooling feels like it wants to own the whole workflow. I wanted something smaller than that. Something terminal-native. Something that fit into the way I already work.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I chose Go
&lt;/h2&gt;

&lt;p&gt;This felt like a Go project pretty quickly.&lt;/p&gt;

&lt;p&gt;I wanted a compiled CLI that would stay fast, portable, and "boring" in the best way. Go made handling command structures, &lt;code&gt;stdin&lt;/code&gt;, clipboard, and cross-platform behavior feel incredibly straightforward.&lt;/p&gt;

&lt;p&gt;It was also a nice way to keep myself honest. If the idea only worked when wrapped in a giant framework, it probably wasn’t the right tool shape.&lt;/p&gt;
&lt;h2&gt;
  
  
  What &lt;code&gt;prtr&lt;/code&gt; looks like now
&lt;/h2&gt;

&lt;p&gt;The core loop ended up being four simple verbs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;go&lt;/code&gt;: Build the first useful prompt from intent + stdin + repo context.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;swap&lt;/code&gt;: Resend the same run to another AI app (compare results!).&lt;/li&gt;
&lt;li&gt; &lt;code&gt;take&lt;/code&gt;: Turn a copied answer into the next action (like a patch).&lt;/li&gt;
&lt;li&gt; &lt;code&gt;learn&lt;/code&gt;: Keep repo-local memory and protected terms.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;take --deep&lt;/code&gt;: Run a more structured multi-step pipeline before delivery, so bigger changes come with more analysis, risk checking, and test planning.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The "Happy Path":&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Pipe an error, ask for a fix&lt;/span&gt;
npm &lt;span class="nb"&gt;test &lt;/span&gt;2&amp;gt;&amp;amp;1 | prtr go fix &lt;span class="s2"&gt;"Why is this failing?"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Not satisfied? Swap to codex instantly&lt;/span&gt;
prtr swap codex

&lt;span class="c"&gt;# 3. Apply the suggested patch&lt;/span&gt;
prtr take patch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Going deeper with &lt;code&gt;take --deep&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;take&lt;/code&gt; is the fast path.&lt;br&gt;
&lt;code&gt;take --deep&lt;/code&gt; is the careful path.&lt;/p&gt;

&lt;p&gt;When I use &lt;code&gt;--deep&lt;/code&gt;, I’m usually telling &lt;code&gt;prtr&lt;/code&gt; that the next step needs more than a quick follow-up prompt. It should add more structure around analysis, risk, testing, and delivery.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prtr take patch &lt;span class="nt"&gt;--deep&lt;/span&gt;
prtr take debug &lt;span class="nt"&gt;--deep&lt;/span&gt;
prtr take refactor &lt;span class="nt"&gt;--deep&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;patch --deep: for implementation changes that need better risk and test framing&lt;br&gt;
debug --deep: for bug-hunting flows where root cause matters more than a quick guess&lt;br&gt;
refactor --deep: for larger structural changes that need tighter scope and safer handoff&lt;/p&gt;

&lt;p&gt;That example captures the real annoyance I wanted to reduce: &lt;strong&gt;the handoff work between steps.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Trying it without friction
&lt;/h2&gt;

&lt;p&gt;I didn’t want the first experience to be “configure five things before you can tell if this is useful.” So there’s a setup-light path to see how it works:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prtr demo
prtr go &lt;span class="s2"&gt;"explain this error"&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  What I’m still unsure about
&lt;/h2&gt;

&lt;p&gt;I’m still figuring out the "product boundary." &lt;/p&gt;

&lt;p&gt;There’s a version of this that stays a small CLI forever. There’s another version that grows into too much machinery. I’m trying to stay on the right side of that line.&lt;/p&gt;

&lt;p&gt;That’s why I’m especially interested in feedback from people who build CLIs, live in terminals, or already have strong habits around AI-assisted coding.&lt;/p&gt;
&lt;h2&gt;
  
  
  If you want to take a look
&lt;/h2&gt;

&lt;p&gt;I've open-sourced the project on GitHub. If you read this and think “this is useful,” “this is overbuilt,” or “this solves the wrong problem,” I’d genuinely like to hear that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/helloprtr/poly-prompt" rel="noopener noreferrer"&gt;https://github.com/helloprtr/poly-prompt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/helloprtr" rel="noopener noreferrer"&gt;
        helloprtr
      &lt;/a&gt; / &lt;a href="https://github.com/helloprtr/poly-prompt" rel="noopener noreferrer"&gt;
        poly-prompt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The command layer for AI work. Turn logs, diffs, and intent into the next AI action across Claude, Codex, and Gemini.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;poly-prompt&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://helloprtr.github.io/poly-prompt/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fcacb9103418d51fbd238a58971b05d05fa9d3fbca88c96311bda9425410c1d4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f70726f6a656374253230736974652d6c6976652d6666376131613f7374796c653d666c61742d737175617265" alt="Project Site"&gt;&lt;/a&gt;
&lt;a href="https://helloprtr.github.io/poly-prompt/docs/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6a359fe257027601c3c8d6f8cc3f8418dfa2efd9510b61de0c4d13dbe5566627/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f63732d70616765732d3538663263353f7374796c653d666c61742d737175617265" alt="Docs Hub"&gt;&lt;/a&gt;
&lt;a href="https://github.com/helloprtr/poly-prompt/releases/tag/v1.0.2" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/abb3fb7cf85d9b279611edef8e03f5db3f82e74765c7447ded4901f623a4377b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72656c656173652d76312e302e322d3162326334393f7374796c653d666c61742d737175617265" alt="Latest Release"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/helloprtr/poly-prompt/README.md" rel="noopener noreferrer"&gt;English README&lt;/a&gt; · &lt;a href="https://github.com/helloprtr/poly-prompt/README.ko.md" rel="noopener noreferrer"&gt;한국어 README&lt;/a&gt; · &lt;a href="https://helloprtr.github.io/poly-prompt/docs/" rel="nofollow noopener noreferrer"&gt;Docs Hub&lt;/a&gt; · &lt;a href="https://github.com/helloprtr/poly-prompt/releases" rel="noopener noreferrer"&gt;Releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/helloprtr/poly-prompt/images/prtr-banner.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhelloprtr%2Fpoly-prompt%2Fimages%2Fprtr-banner.png" alt="prtr banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One line:&lt;/strong&gt; &lt;code&gt;prtr&lt;/code&gt; is the AI Work Session Manager — start a focused work session, let Claude drive, checkpoint your progress, and hand off cleanly to Gemini or Codex.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prtr&lt;/code&gt; keeps track of what you are doing across the entire AI loop. Instead of rebuilding context by hand every time you switch tools or pick up where you left off, prtr holds your task goal, the files you care about, your progress notes, and the git diff — and builds the right prompt when you need it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install in 60 Seconds&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;macOS with Homebrew:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;brew tap helloprtr/homebrew-tap
brew install prtr
prtr doctor        &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; verify setup&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Linux and Windows — download the right archive from &lt;a href="https://github.com/helloprtr/poly-prompt/releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;, put &lt;code&gt;prtr&lt;/code&gt; on your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Core Idea: Sessions&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;A &lt;strong&gt;session&lt;/strong&gt; is a focused work block tied to a git repository…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/helloprtr/poly-prompt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;It's not perfect, but that kind of feedback is more useful to me right now than praise. What are you using to manage the "messy loop" of AI coding? Let's chat in the comments! 👇&lt;/p&gt;

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