<?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: Shenal Diluksha</title>
    <description>The latest articles on DEV Community by Shenal Diluksha (@shenald).</description>
    <link>https://dev.to/shenald</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%2F4224864%2F22617895-dc4e-4ea0-b3e4-630e17e53efc.png</url>
      <title>DEV Community: Shenal Diluksha</title>
      <link>https://dev.to/shenald</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shenald"/>
    <language>en</language>
    <item>
      <title>We Measured 1,500 Lines of Terminal Bloat Burning $0.20 Per Prompt in Cursor. Here's How We Stripped 97% of It in 2.5ms</title>
      <dc:creator>Shenal Diluksha</dc:creator>
      <pubDate>Tue, 03 Nov 2026 19:00:31 +0000</pubDate>
      <link>https://dev.to/shenald/we-measured-1500-lines-of-terminal-bloat-burning-020-per-prompt-in-cursor-heres-how-we-1a4</link>
      <guid>https://dev.to/shenald/we-measured-1500-lines-of-terminal-bloat-burning-020-per-prompt-in-cursor-heres-how-we-1a4</guid>
      <description>&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%2Fz13qt8e3lejh58h6tjof.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%2Fz13qt8e3lejh58h6tjof.jpg" alt="termlens hero" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are using &lt;strong&gt;Cursor, Claude Code, Aider, Windsurf, or Codex&lt;/strong&gt;, you are likely hemorrhaging tokens—and money—every time your agent touches the command line.&lt;/p&gt;

&lt;p&gt;We recently profiled an autonomous agent workflow during a routine feature iteration. Over 45 minutes, the agent invoked test suites and build scripts 28 times. &lt;/p&gt;

&lt;p&gt;Here is what shocked us: &lt;strong&gt;over 78% of the agent's prompt context was not user code, architecture diagrams, or instructions. It was terminal garbage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Progress spinners, ANSI escape codes, passing test dot-markers, Webpack asset lists, and 40-frame deep &lt;code&gt;node_modules&lt;/code&gt; stack traces were saturating the LLM context window.&lt;/p&gt;

&lt;p&gt;We built &lt;a href="https://github.com/shenald-dev/termlens" rel="noopener noreferrer"&gt;&lt;strong&gt;termlens&lt;/strong&gt;&lt;/a&gt; to solve this: an open-source, zero-token terminal compactor and semantic error lens that intercepts CLI streams, strips 97% of terminal noise in under 2.5ms, and feeds pristine, actionable signals straight into your AI coding agents.&lt;/p&gt;

&lt;p&gt;Here is the data, the architecture, and how we engineered it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Anatomy of a Prompt Tax: 1,482 Lines for 1 Bug
&lt;/h2&gt;

&lt;p&gt;Consider a standard Jest suite of 85 unit tests where 84 pass and 1 fails. &lt;/p&gt;

&lt;p&gt;When your agent runs &lt;code&gt;npm test&lt;/code&gt;, standard terminal output produces &lt;strong&gt;1,482 lines of text&lt;/strong&gt; (~3,840 tokens):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PASS src/math.test.ts (1.2s)
PASS src/string.test.ts (0.8s)
PASS src/auth/hash.test.ts (2.1s)
PASS src/database/client.test.ts (3.4s)
... [84 passing suites with detailed timing info] ...
FAIL src/auth/jwt.test.ts (4.1s)
  ● should reject expired token signature
    Expected: 401, Received: 200
    at Object.&amp;lt;anonymous&amp;gt; (/workspace/src/auth/jwt.test.ts:42:29)
    at Promise.then.completed (/workspace/node_modules/jest-circus/build/utils.js:391:28)
    at new Promise (&amp;lt;anonymous&amp;gt;)
    at callAsyncCircusFn (/workspace/node_modules/jest-circus/build/utils.js:316:16)
    at _callCircusTest (/workspace/node_modules/jest-circus/build/run.js:218:40)
    ... [38 lines of internal runner stack frames] ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What did the AI actually need to fix the bug?
&lt;/h3&gt;

&lt;p&gt;Exactly &lt;strong&gt;4 lines&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FAIL src/auth/jwt.test.ts:42:29
● should reject expired token signature
Expected: 401
Received: 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Silent Cost
&lt;/h3&gt;

&lt;p&gt;Let's calculate the real-world overhead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tokens burned per run:&lt;/strong&gt; ~3,840 tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost on Claude 3.5 Sonnet / GPT-4o:&lt;/strong&gt; ~$0.012 - $0.02 per command&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs per session:&lt;/strong&gt; 30 runs = &lt;strong&gt;$0.36 - $0.60 per coding task&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over 100 developers:&lt;/strong&gt; &lt;strong&gt;$1,000+ every month&lt;/strong&gt; spent streaming passing test dots and internal runner call frames.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Real Danger: "Lost in the Middle"
&lt;/h3&gt;

&lt;p&gt;Financial cost is only half the problem. When an LLM's context is flooded with 3,000 tokens of noisy terminal logs, it triggers &lt;strong&gt;Context Distraction&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Research on transformer attention mechanisms repeatedly demonstrates that needle-in-a-haystack recall degrades significantly when prompt windows are polluted with repetitive semi-structured logs. Agents overlook critical architectural constraints in the system prompt because their attention weights are drowned out by ANSI escape codes.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why &lt;code&gt;grep&lt;/code&gt; and Naive Pipes Fail
&lt;/h2&gt;

&lt;p&gt;The immediate developer reaction is: &lt;em&gt;"Why not just run &lt;code&gt;npm test | grep FAIL&lt;/code&gt;?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We tested this. In production, naive piping breaks in three distinct ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;TTY Stripping:&lt;/strong&gt; PTY-aware tools (Jest, Vite, Docker) detect non-interactive pipes. They either deactivate color output, disable progress updates, or silently hang waiting for input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Annihilation:&lt;/strong&gt; &lt;code&gt;grep -i error&lt;/code&gt; gives you the word "error", but drops the preceding filename, line number, and the assertion diff (&lt;code&gt;Expected&lt;/code&gt; vs &lt;code&gt;Received&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chunk Splitting &amp;amp; ANSI Interleaving:&lt;/strong&gt; Terminal streams arrive in asynchronous TCP/PTY chunks. ANSI escape codes split across chunk boundaries (e.g., &lt;code&gt;\x1b[3&lt;/code&gt; in chunk 1, &lt;code&gt;1mFAIL&lt;/code&gt; in chunk 2), destroying naive regex matching and leaving garbled escape artifacts.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. Architecture: How termlens Achieves 97% Compression in &amp;lt;2.5ms
&lt;/h2&gt;

&lt;p&gt;We engineered &lt;code&gt;termlens&lt;/code&gt; in TypeScript with strict performance constraints: &lt;strong&gt;zero heavy native dependencies, constant memory allocation, and sub-3ms latency.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────┐
│                   termlens Pipeline                    │
├────────────────────────────────────────────────────────┤
│                                                        │
│  [ Raw CLI Command ] (npm test, tsc, pytest, docker)   │
│            │                                           │
│            ▼                                           │
│  ┌─────────────────────────────────┐                   │
│  │  1. PTY Stream Interceptor      │ (Preserves exit   │
│  │     &amp;amp; Linear ANSI Stripper      │  codes &amp;amp; TTY)     │
│  └─────────────────┬───────────────┘                   │
│                    ▼                                   │
│  ┌─────────────────────────────────┐                   │
│  │  2. Bounded Ring Buffer         │ (O(1) memory,     │
│  │     (Fixed 1,000 FIFO slots)    │  prevents OOM)    │
│  └─────────────────┬───────────────┘                   │
│                    ▼                                   │
│  ┌─────────────────────────────────┐                   │
│  │  3. Framework Semantic Lenses   │ (Jest, Pytest,    │
│  │     (Heuristic Pattern Decoders)│  TSC, Docker...)  │
│  └─────────────────┬───────────────┘                   │
│                    ▼                                   │
│  ┌─────────────────────────────────┐                   │
│  │  4. Adaptive Density Formatters │                   │
│  │     [ Human ] [ Agent ] [ CI ]  │                   │
│  └─────────────────┬───────────────┘                   │
│                    ▼                                   │
│       Clean, Actionable Signal                         │
│    (&amp;lt;100 tokens, 100% precision)                       │
└────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A. Linear-Time ANSI Sanitization
&lt;/h3&gt;

&lt;p&gt;Rather than running complex regular expressions that trigger catastrophic backtracking on 10MB outputs, we implemented an optimized single-pass ANSI scanner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;stripAnsi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Fast-path: skip clean strings&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;x1b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;1b&lt;/span&gt;&lt;span class="se"&gt;\[[&lt;/span&gt;&lt;span class="sr"&gt;0-9;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;a-zA-Z&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  B. Bounded Rolling Ring Buffer
&lt;/h3&gt;

&lt;p&gt;Build logs can produce 500,000 lines. Storing unbounded strings in memory causes V8 heap thrashing and garbage collection spikes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;termlens&lt;/code&gt; uses an in-memory &lt;strong&gt;Circular Ring Buffer&lt;/strong&gt; capped at 1,000 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RingBuffer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="na"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="na"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;capacity&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No matter how large the build log is, memory consumption remains locked at &lt;strong&gt;under 4MB&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  C. Semantic Lenses: Decoupling Framework Logic
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;termlens&lt;/code&gt; introduces the concept of &lt;strong&gt;Semantic Lenses&lt;/strong&gt;. A lens is a specialized parser that understands the structural syntax of a specific tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jest / Vitest Lens:&lt;/strong&gt; Groups failures by test suite, extracts assertion diffs, and strips all &lt;code&gt;node_modules&lt;/code&gt; stack frames, retaining only user-authored source locations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript Lens (&lt;code&gt;tsc&lt;/code&gt;):&lt;/strong&gt; Aggregates 30+ type errors across files, collapses repeated type signature printouts, and maps file paths with line and column numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pytest Lens:&lt;/strong&gt; Strips passing test progress percentages, extracts Python tracebacks, and highlights the exact &lt;code&gt;AssertionError&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Lens:&lt;/strong&gt; Compresses layer cache hits (&lt;code&gt;CACHED&lt;/code&gt;) and extracts only the failing build step and RUN script output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cargo / Clang / Go Lenses:&lt;/strong&gt; Captures compiler diagnostics, warnings, and panic traces.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Empirical Benchmarks: The Hard Numbers
&lt;/h2&gt;

&lt;p&gt;We ran rigorous head-to-head benchmarks measuring line counts, token consumption, and execution overhead across common development workflows.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Toolchain / Command&lt;/th&gt;
&lt;th&gt;Raw Terminal Lines&lt;/th&gt;
&lt;th&gt;termlens Filtered Lines&lt;/th&gt;
&lt;th&gt;Raw Tokens&lt;/th&gt;
&lt;th&gt;termlens Tokens&lt;/th&gt;
&lt;th&gt;Token Reduction&lt;/th&gt;
&lt;th&gt;Overhead Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jest (85 Tests, 1 Failure)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,482 lines&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~3,840&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~74&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-97.3%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+3.2ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript (&lt;code&gt;tsc&lt;/code&gt;, 30 Errors)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;184 lines&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1,220&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~112&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-90.8%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+1.8ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pytest (42 Tests, 1 Failure)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;210 lines&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~680&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~58&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-91.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+1.6ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker (Multi-Stage Build)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;92 lines&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~840&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~95&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-88.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+2.4ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt; &lt;code&gt;termlens&lt;/code&gt; consistently achieves a &lt;strong&gt;90% to 97% reduction in token consumption&lt;/strong&gt; with an average latency overhead of &lt;strong&gt;under 2.5 milliseconds&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Native Model Context Protocol (MCP) Integration
&lt;/h2&gt;

&lt;p&gt;Coding agents shouldn't need custom shell wrappers. That's why &lt;code&gt;termlens&lt;/code&gt; includes a built-in &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; server.&lt;/p&gt;

&lt;p&gt;You can plug &lt;code&gt;termlens&lt;/code&gt; directly into &lt;strong&gt;Claude Desktop, Claude Code, Cursor, or any MCP client&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup in Claude Desktop / Cursor:
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;claude_desktop_config.json&lt;/code&gt; or MCP settings:&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;"mcpServers"&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;"termlens"&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;"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;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"termlens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--mcp"&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;Now, when your agent calls the tool:&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;"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;"npm test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agent"&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;The agent receives a hyper-focused, structured payload ready for immediate reasoning:&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;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;failed&lt;/span&gt;
&lt;span class="na"&gt;exitCode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;failures&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/auth/jwt.test.ts"&lt;/span&gt;
    &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;42&lt;/span&gt;
    &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;29&lt;/span&gt;
    &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;should&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reject&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;expired&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;signature"&lt;/span&gt;
    &lt;span class="na"&gt;expected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;401"&lt;/span&gt;
    &lt;span class="na"&gt;received&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;
    &lt;span class="na"&gt;codeSnippet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expect(response.status).toBe(401)"&lt;/span&gt;
&lt;span class="na"&gt;tokenSavedEstimate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3766&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent fixes the bug in a single turn without wandering through node internal modules.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. How to Use It Right Now
&lt;/h2&gt;

&lt;p&gt;You can run &lt;code&gt;termlens&lt;/code&gt; immediately without installing anything:&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;# Run your test suite with instant compaction&lt;/span&gt;
npx termlens npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# Run TypeScript type check&lt;/span&gt;
npx termlens tsc &lt;span class="nt"&gt;--noEmit&lt;/span&gt;

&lt;span class="c"&gt;# Run Python tests&lt;/span&gt;
npx termlens pytest

&lt;span class="c"&gt;# Run Docker build&lt;/span&gt;
npx termlens docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; termlens
termlens npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Formatter Modes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human View (Default):&lt;/strong&gt; Minimal, high-contrast visual display with clean failure cards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent View (&lt;code&gt;--format agent&lt;/code&gt;):&lt;/strong&gt; Ultra-compact structured output designed for AI token efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI View (&lt;code&gt;--format ci&lt;/code&gt;):&lt;/strong&gt; Strict machine-readable telemetry with zero color artifacts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Open Source &amp;amp; Contributions
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;termlens&lt;/code&gt; is 100% open-source under the MIT license.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/shenald-dev/termlens" rel="noopener noreferrer"&gt;https://github.com/shenald-dev/termlens&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NPM Package:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/termlens" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/termlens&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building AI agents, tooling, or developer infrastructure, try it on your test suite today and see how many tokens you save. We welcome feedback, benchmark results, and new lens contributions!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
