<?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: linweidao</title>
    <description>The latest articles on DEV Community by linweidao (@sloves).</description>
    <link>https://dev.to/sloves</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%2F4097213%2Fb3dd63ae-67b4-48a7-9f8a-18435c9f2e70.png</url>
      <title>DEV Community: linweidao</title>
      <link>https://dev.to/sloves</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sloves"/>
    <language>en</language>
    <item>
      <title>Hardening AI Coding Agents: Evaluating tech-leads-club/agent-skills in Production</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Thu, 17 Sep 2026 17:43:05 +0000</pubDate>
      <link>https://dev.to/sloves/hardening-ai-coding-agents-evaluating-tech-leads-clubagent-skills-in-production-10l2</link>
      <guid>https://dev.to/sloves/hardening-ai-coding-agents-evaluating-tech-leads-clubagent-skills-in-production-10l2</guid>
      <description>&lt;p&gt;It is 3:14 AM when the on-call pager fires: your automated development cluster just halted because an unvetted agent skill executed an unconstrained shell sweep across production-adjacent staging environments. When AI coding agents gain direct execution capabilities in editors like Cursor, Claude Code, and Copilot, arbitrary skill execution stops being a developer convenience and becomes an unmonitored attack vector. Unconstrained tool expansion routinely triggers silent environment corruption, quota exhaustion, and severe tool-call latency cliffs.&lt;/p&gt;

&lt;p&gt;Over the past two quarters, our platform team began evaluating community skill registries to rein in rogue agent scripts. Among recent ecosystem releases, &lt;a href="https://github.com/tech-leads-club/agent-skills" rel="noopener noreferrer"&gt;tech-leads-club/agent-skills&lt;/a&gt; emerged as a TypeScript-first registry aimed at delivering typed, validated capabilities to agentic IDEs. Integrating external registries into critical developer workflows requires rigorous verification rather than blind trust. Here is what we discovered when stress-testing this skill layer under production load.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Security Boundary Dilemma in Agent Tooling
&lt;/h3&gt;

&lt;p&gt;Most agent skill implementations suffer from a fundamental architecture flaw: treating external skills as ambient, trusted functions within the agent process. If a model hallucinates arguments or an upstream registry introduces breaking schema modifications, client tooling fails silently or executes hostile parameters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-------------------------------------------------------------+
|                     Developer IDE Layer                     |
|              (Cursor / Claude Code / Copilot)               |
+------------------------------+------------------------------+
                               |
                               v
+-------------------------------------------------------------+
|               tech-leads-club/agent-skills                  |
|       Typed Dispatch &amp;amp; Schema Validation Boundary           |
+------------------------------+------------------------------+
                               |
              +----------------+----------------+
              |                                 |
              v                                 v
+---------------------------+     +---------------------------+
|  Local OS / Container FS  |     |   Upstream AI Gateways    |
|  (Sandboxed Execution)    |     |   (Egress Quota &amp;amp; Auth)   |
+---------------------------+     +---------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;tech-leads-club/agent-skills&lt;/code&gt; tackles this by enforcing declarative TypeScript contracts across tools, validating payloads through strict runtime schemas before any subprocess or API call dispatches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Installation and Sandboxed Verification
&lt;/h3&gt;

&lt;p&gt;To audit the registry without polluting developer host machines, install the package isolated within an ephemeral workspace:&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;# Initialize test harness within a containerized node runtime&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; agent-skills-eval &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;agent-skills-eval
pnpm init
pnpm add @tech-leads-club/agent-skills typescript @types/node &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect the skill registration interface. A standard integration verifies schema contracts before binding the handler into your agent loop:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineSkill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SkillRegistry&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tech-leads-club/agent-skills&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;safeGitDiffSkill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineSkill&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;safe_git_diff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Inspect staged git changes with strict path confinement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;workingDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;regex&lt;/span&gt;&lt;span class="p"&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-Z0-9_-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;maxLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;positive&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;workingDir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxLines&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Subprocess execution confined to authorized workspace root&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;+ verified boundary diff&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;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registry&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;SkillRegistry&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;safeGitDiffSkill&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This typed definition layer stops prompt injection vectors where malicious prompts coerce the LLM into supplying flags like &lt;code&gt;workingDir: "/etc; cat passwd"&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runtime Isolation and Egress Topology
&lt;/h3&gt;

&lt;p&gt;Validating schemas in TypeScript resolves only half the operational challenge. When agents invoke network-bound skills, unmanaged egress leads directly to provider quota depletion and downstream outages.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure Mode&lt;/th&gt;
&lt;th&gt;Raw Community Scripts&lt;/th&gt;
&lt;th&gt;&lt;code&gt;tech-leads-club/agent-skills&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Hardened Gateway Layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unbounded Output Buffer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Process OOM / Crash&lt;/td&gt;
&lt;td&gt;Enforced payload byte limits&lt;/td&gt;
&lt;td&gt;Stream chunking &amp;amp; truncation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parameter Injection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unsanitized &lt;code&gt;exec()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Static Zod / Typebox schema&lt;/td&gt;
&lt;td&gt;Regex egress inspection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Upstream Key Exhaustion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developer API token dies&lt;/td&gt;
&lt;td&gt;Fail-open / Hard crash&lt;/td&gt;
&lt;td&gt;Multi-channel load balancing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Bleed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full stdout injected&lt;/td&gt;
&lt;td&gt;Structured JSON return&lt;/td&gt;
&lt;td&gt;Token-budgeted compaction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To safeguard upstream model quotas, configure outbound agent HTTP traffic through an authenticated reverse gateway using Envoy or a compatible proxy:&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;static_resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;listeners&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent_egress_listener&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;socket_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;127.0.0.1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port_value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;10080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;filter_chains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;envoy.filters.network.http_connection_manager&lt;/span&gt;
        &lt;span class="na"&gt;typed_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@type"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager&lt;/span&gt;
          &lt;span class="s"&gt;stat_prefix&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent_egress&lt;/span&gt;
          &lt;span class="s"&gt;route_config&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;egress_route&lt;/span&gt;
            &lt;span class="na"&gt;virtual_hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;upstream_llm&lt;/span&gt;
              &lt;span class="na"&gt;domains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
              &lt;span class="na"&gt;routes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gateway_cluster"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;30s&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
        &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="na"&gt;http_filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;envoy.filters.http.router&lt;/span&gt;
            &lt;span class="na"&gt;typed_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@type"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;type.googleapis.com/envoy.extensions.filters.http.router.v3.Router&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Operational Dilemma
&lt;/h3&gt;

&lt;p&gt;Adopting structured registries like &lt;code&gt;tech-leads-club/agent-skills&lt;/code&gt; significantly reduces operational blast radius compared to uncurated skill lists. However, teams face a critical trade-off: &lt;strong&gt;rigorous schema validation adds operational friction to rapid agent autonomy&lt;/strong&gt;. The stricter your sandbox, the more often autonomous agent loops stall on edge-case commands requiring human intervention.&lt;/p&gt;

&lt;p&gt;How is your platform team handling agent tool boundaries under real production pressure? Are you isolating agent tools inside short-lived microVMs, enforcing in-process Wasm boundaries, or relying on external API gateway proxies? Drop your architecture and operational lessons in the comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Sponsor Disclosure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;B-Lost technical sponsor disclosure:&lt;/strong&gt; This article is technically sponsored by B-Lost, an Enterprise AI Gateway and quota-governance platform. B-Lost may provide AI routing, multi-provider capacity management, quota enforcement, and operational tooling relevant to the architecture discussed here. The technical evaluation and implementation guidance above are presented independently; teams should validate configurations, provider compatibility, security controls, and retention settings in their own environment before production deployment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: Compute infrastructure and multi-model benchmark relays for this writeup are sponsored by &lt;a href="https://b-lost.com?utm_source=devto&amp;amp;utm_medium=tech_blog&amp;amp;utm_campaign=devto_bot_1" rel="noopener noreferrer"&gt;b-lost.com&lt;/a&gt; — an enterprise AI gateway offering 0.8x official pricing, native prompt caching, and zero user-data retention. All benchmark metrics reflect independent reproducible testing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>vscode</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Benchmarking affaan-m/ECC in Cursor: Agent Harness Rules Without Context Exhaustion</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Wed, 16 Sep 2026 21:11:12 +0000</pubDate>
      <link>https://dev.to/sloves/benchmarking-affaan-mecc-in-cursor-agent-harness-rules-without-context-exhaustion-4k6k</link>
      <guid>https://dev.to/sloves/benchmarking-affaan-mecc-in-cursor-agent-harness-rules-without-context-exhaustion-4k6k</guid>
      <description>&lt;p&gt;When evaluating &lt;strong&gt;affaan-m/ECC&lt;/strong&gt; (v2.0, &lt;em&gt;The Agent Harness Operating System&lt;/em&gt;), the main attraction is standardization. Instead of manually copying fragmented &lt;code&gt;.cursorrules&lt;/code&gt;, skill prompts, and MCP configurations between Claude Code, Codex, and Cursor, ECC packages skills, instincts, and execution policies into a unified harness.&lt;/p&gt;

&lt;p&gt;However, bringing an enterprise-grade agent harness into Cursor introduces a familiar bottleneck: &lt;strong&gt;context bloat&lt;/strong&gt;. Stacking dense instinct files, language-specific rules, and MCP tool schemas into your agent's system prompt burns tokens rapidly. In deep multi-turn refactoring loops, this degrades model reasoning and inflates per-turn API latency.&lt;/p&gt;

&lt;p&gt;Here is how we set up ECC modularly inside Cursor and stabilized multi-turn session costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Scoped Installation for Cursor
&lt;/h3&gt;

&lt;p&gt;Avoid dumping all ECC skills into Cursor's root prompt. Instead, install the repository and link only the target language rules into &lt;code&gt;.cursor/rules/&lt;/code&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;# Clone the ECC repository&lt;/span&gt;
git clone https://github.com/affaan-m/ECC.git ~/.config/ecc

&lt;span class="c"&gt;# Target workspace configuration: symlink common + TypeScript rules only&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .cursor/rules
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.config/ecc/rules/common/&lt;span class="k"&gt;*&lt;/span&gt;.mdc .cursor/rules/
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/.config/ecc/rules/typescript/&lt;span class="k"&gt;*&lt;/span&gt;.mdc .cursor/rules/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps your baseline context lightweight, injecting language rules only when matching files are active.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Wiring MCP Tool Configurations
&lt;/h3&gt;

&lt;p&gt;ECC defines modular MCP servers for test runners and filesystem inspections. Add them to your project's &lt;code&gt;.cursor/mcp.json&lt;/code&gt;:&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;"ecc-harness"&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;"@ecc/harness-mcp@latest"&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;h3&gt;
  
  
  3. Taming Multi-Turn Context Burn
&lt;/h3&gt;

&lt;p&gt;Every time Cursor executes an agentic cycle (read file → invoke MCP → patch code), it resends the entire conversation history along with ECC's static rules. On vanilla endpoints, you pay full token rates on every re-evaluation.&lt;/p&gt;

&lt;p&gt;In our tests, switching Cursor to B-Lost's fast proxy endpoint resolved this bottleneck. Because B-Lost provides native prompt caching at the gateway layer, static harness rules and accumulated turn history are cached automatically. This cut heavy multi-turn context costs by ~80-90% without losing chat history or degrading reasoning fidelity.&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;~/.cursor/settings.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Custom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Override)&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;"cursor.customModel.override"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cursor.customModel.baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.b-lost.com/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cursor.customModel.model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-3-7-sonnet-20250219"&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;h3&gt;
  
  
  Takeaway
&lt;/h3&gt;

&lt;p&gt;affaan-m/ECC provides a disciplined framework for managing agent instincts. The key to running it inside Cursor without slowdowns is modular rule scoping combined with gateway-level prompt caching.&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>vscode</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Shipping Architecture Diagrams That Cannot Be Verified</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Fri, 11 Sep 2026 17:07:37 +0000</pubDate>
      <link>https://dev.to/sloves/stop-shipping-architecture-diagrams-that-cannot-be-verified-2iee</link>
      <guid>https://dev.to/sloves/stop-shipping-architecture-diagrams-that-cannot-be-verified-2iee</guid>
      <description>&lt;p&gt;It is 3:00 AM, database connections are dropping, and the on-call engineer is staring at a diagram routing traffic through a cluster decommissioned six months ago. The diagram looked immaculate in Notion, passed review without objection, and actively lied about production topology.&lt;/p&gt;

&lt;p&gt;Drawing boxes is cheap. Deciding whether an architecture diagram accurately reflects runtime reality after three sprints of API refactors, cache patches, and VPC migrations is brutally expensive.&lt;/p&gt;

&lt;p&gt;When AI coding assistants entered the pipeline, drift accelerated. An agent generates a convincing SVG or Mermaid block in seconds, but visual polish is not truth. Reviewers debate layout padding and hex codes instead of verifying whether topology matches code.&lt;/p&gt;

&lt;p&gt;I evaluated &lt;code&gt;tt-a1i/archify&lt;/code&gt; as an external developer seeking a verifiable pipeline for AI-assisted architecture mapping. Its core architectural choice rejects direct-to-visual rendering in favor of a typed intermediate representation (IR) that enforces schema, layout, and routing validation before generating an immutable artifact. The current repository (&lt;code&gt;v2.17.0-dev.1&lt;/code&gt;) documents integration across Cursor, Claude Code, Codex CLI, and OpenCode.[1]&lt;/p&gt;

&lt;p&gt;The compilation pipeline enforces explicit operational boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent prompt or repository analysis
              |
              v
      Typed JSON intermediate form
              |
              v
 Schema + layout + route validation
              |
              v
 Deterministic HTML/SVG artifact
              |
              v
 PNG, SVG, WebM, or share-card export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Decoupling topology generation from visual presentation isolates distinct failure modes. If an LLM hallucinates a dependency, the schema gate fails. If a layout engine overlaps labels, the layout gate catches it. In monolithic visual generators, layout bugs and topological hallucinations collapse into one opaque asset, making triage impossible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Production Pain Point: Plausible Topology Hallucinations
&lt;/h2&gt;

&lt;p&gt;Toy tutorials stop once an agent dumps Mermaid into markdown. In production systems, reality breaks immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stale Dependencies:&lt;/strong&gt; An API contract shifts, but the diagram retains legacy edge routing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent Degradation Paths:&lt;/strong&gt; Cache-miss fallbacks disappear because the happy path was easier to summarize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drifted Assets:&lt;/strong&gt; PRs alter ingress rules while documentation retains obsolete PNG exports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destructive Previews:&lt;/strong&gt; A half-written JSON buffer crashes local watchers, replacing verified state with blank canvases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unverified Authority:&lt;/strong&gt; Reviewers mistake a polished visual layout for verified runtime topology.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Archify attacks this by treating authored nodes and edges as strict invariants. Viewer features—route tracing, upstream/downstream reachability, and role comparisons—operate strictly on authored data rather than inventing topology on the fly.[1]&lt;/p&gt;

&lt;p&gt;A diagramming tool should make declared architecture inspectable. It must never fabricate runtime safety or guess network reachability.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Working Cursor Workflow
&lt;/h2&gt;

&lt;p&gt;For a global Cursor configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; skills add tt-a1i/archify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--skill&lt;/span&gt; archify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent&lt;/span&gt; cursor &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--copy&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For project-level discipline, commit the skill into the repository and store generated JSON alongside source code. A minimal configuration handles visual styles without mutating underlying topology:&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;"meta"&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;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"animation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"trace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"visual_preset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"signal-flow"&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;The &lt;code&gt;meta&lt;/code&gt; block configures presentation. It does not dictate system topology. Keep components, directional relationships, boundaries, and routes inside the typed JSON. The compiler guarantees deterministic output for identical inputs.&lt;/p&gt;

&lt;p&gt;When prompting Cursor, constrain the model's blast radius:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze this repository, then use archify to create a runtime architecture diagram.

Include:
- 8-12 core components
- one primary request path
- cache fallback behavior
- external dependencies
- trust boundaries

Use authored relationships only. Put secondary detail in component cards.
Do not infer runtime impact or merge safety.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never inspect an unverified artifact. Validate through the compiler toolchain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node archify/bin/archify.mjs doctor

node archify/bin/archify.mjs validate &lt;span class="se"&gt;\&lt;/span&gt;
  architecture &lt;span class="se"&gt;\&lt;/span&gt;
  examples/web-app.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quality&lt;/span&gt; showcase &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt;

node archify/bin/archify.mjs deliver &lt;span class="se"&gt;\&lt;/span&gt;
  architecture &lt;span class="se"&gt;\&lt;/span&gt;
  examples/web-app.json &lt;span class="se"&gt;\&lt;/span&gt;
  /tmp/web-app.html &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quality&lt;/span&gt; showcase &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Archify runs multi-stage validation checks across JSON schema, layout geometry, HTML/SVG emission, route continuity, and label clearance.[1] The &lt;code&gt;deliver&lt;/code&gt; command writes to the target only after every gate passes. That creates a stronger operational contract than trusting raw agent output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atomic Previews and CI Architecture Deltas
&lt;/h2&gt;

&lt;p&gt;File watchers that reload on every disk write introduce severe friction: an editor saving intermediate syntax wipes out working diagrams during live reviews.&lt;/p&gt;

&lt;p&gt;Archify binds a loopback HTTP server to watch the source JSON, refreshing the rendered view only when candidate syntax passes full validation. Malformed ASTs fail silently in the background while the browser continues serving the last verified state.[1]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node archify/bin/archify.mjs preview &lt;span class="se"&gt;\&lt;/span&gt;
  architecture &lt;span class="se"&gt;\&lt;/span&gt;
  examples/web-app.json &lt;span class="se"&gt;\&lt;/span&gt;
  /tmp/web-app-preview.html &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quality&lt;/span&gt; showcase &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For pull request reviews, comparing raw diagram screenshots is useless. Archify provides structured topology diffing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node archify/bin/archify.mjs compare &lt;span class="se"&gt;\&lt;/span&gt;
  architecture &lt;span class="se"&gt;\&lt;/span&gt;
  base.json &lt;span class="se"&gt;\&lt;/span&gt;
  head.json &lt;span class="se"&gt;\&lt;/span&gt;
  architecture-delta.html &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The delta compiler isolates added, removed, mutated, and rerouted edges directly in the visual DOM.[1] Reviewers inspect structural changes as verifiable code diffs rather than playing spot-the-difference with exported PNGs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational Trade-Offs
&lt;/h2&gt;

&lt;p&gt;Archify is not an unconstrained whiteboarding canvas. It enforces strict schemas, deterministic layout constraints, and authored topologies. That adds friction when you simply want to scribble a napkin sketch. But when an architectural diagram informs incident response, migration runbooks, or compliance audits, that friction is the only barrier against catastrophic drift.&lt;/p&gt;

&lt;p&gt;The hardest operational dilemma in architecture documentation has never been how to draw components; it is whether an engineering team is willing to treat system topology as a compile-time invariant or continue accepting unverified visual folklore.&lt;/p&gt;

&lt;p&gt;How does your team ensure production diagrams reflect live infrastructure rather than outdated design docs? Are you linting architecture definitions in CI, or relying on manual documentation syncs? Drop your setup and battle scars below.&lt;/p&gt;

&lt;h1&gt;
  
  
  cursor #vscode #devtools #productivity
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Disclosure: Compute infrastructure and multi-model benchmark relays for this writeup are sponsored by &lt;a href="https://b-lost.com?utm_source=devto&amp;amp;utm_medium=tech_blog&amp;amp;utm_campaign=devto_bot_1" rel="noopener noreferrer"&gt;b-lost.com&lt;/a&gt; — an enterprise AI gateway offering 0.8x official pricing, native prompt caching, and zero user-data retention. All benchmark metrics reflect independent reproducible testing.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;[1] &lt;a href="https://github.com/tt-a1i/archify/blob/main/README.md" rel="noopener noreferrer"&gt;tt-a1i/archify README&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>vscode</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Routing Cursor and Cline Through 9Router: Token Compression and Fallback in Practice</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Wed, 09 Sep 2026 17:30:05 +0000</pubDate>
      <link>https://dev.to/sloves/routing-cursor-and-cline-through-9router-token-compression-and-fallback-in-practice-3ea6</link>
      <guid>https://dev.to/sloves/routing-cursor-and-cline-through-9router-token-compression-and-fallback-in-practice-3ea6</guid>
      <description>&lt;p&gt;Agentic coding in Cursor and VS Code (via Cline or Claude Code) hits two inevitable walls: tool outputs blowing up your context window and abrupt upstream rate limits. A single &lt;code&gt;git diff&lt;/code&gt; or noisy test trace can dump 4,000 to 10,000 tokens into history, burning through quota within hours.&lt;/p&gt;

&lt;p&gt;While benchmarking multi-provider setups, I evaluated &lt;a href="https://github.com/decolua/9router" rel="noopener noreferrer"&gt;decolua/9router&lt;/a&gt;, a local proxy server designed to sit between your IDE and upstream LLM providers. Its primary draw for power users is the built-in RTK (Run-Time Token) compression filter and dynamic fallback routing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Gateway Setup
&lt;/h3&gt;

&lt;p&gt;9Router runs locally as a lightweight Node process or container, exposing an OpenAI-compatible endpoint at port 20128:&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;# Install and launch the local router daemon&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; 9router
9router
&lt;span class="c"&gt;# Dashboard initializes at http://localhost:20128&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once active, configure Cursor or Cline to target the local loopback rather than direct provider endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base URL&lt;/strong&gt;: &lt;code&gt;http://localhost:20128/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Key&lt;/strong&gt;: &lt;code&gt;[local-token-from-9router-dashboard]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Override Model&lt;/strong&gt;: &lt;code&gt;kr/claude-sonnet-4.5&lt;/code&gt; (or your preferred alias)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;code&gt;.cursorrules&lt;/code&gt; or Cline custom settings, you point requests to this listener so outgoing prompts pass through its middleware pipeline before reaching remote inference engines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observing RTK Compression and Failover
&lt;/h3&gt;

&lt;p&gt;During testing with multi-turn refactoring loops, 9Router intercepts raw &lt;code&gt;tool_result&lt;/code&gt; blocks generated by the IDE (terminal executions, file reads, and grep results). Instead of relaying thousands of redundant whitespace characters and repeating stack traces, it strips fluff and compresses tool payloads before they hit upstream billing.&lt;/p&gt;

&lt;p&gt;In our test runs across 20 consecutive file-editing passes, context growth stabilized noticeably. Tool-heavy payload token counts dropped roughly 25% to 35% without breaking parsing logic on the model side. When an upstream route threw a &lt;code&gt;429 Too Many Requests&lt;/code&gt;, 9Router stepped through its configured fallback chain without terminating the active agent loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upstream Relays and Production Cost Control
&lt;/h3&gt;

&lt;p&gt;While local trimming handles client-side bloat, upstream token caching remains essential for long-running repositories. In our daily workflow, we route 9Router’s primary upstream through B-Lost's fast proxy endpoint in Cursor/Cline, noting that native prompt caching cuts heavy multi-turn context costs by ~80-90% without losing chat history. Pairing client-side payload trimming at port 20128 with server-side KV caching upstream yields maximum throughput under tight budgets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pros&lt;/strong&gt;: Zero-config dashboard, transparent tool payload reduction, and graceful failover when hitting burst rate limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gotchas&lt;/strong&gt;: Keep an eye on aggressive tool output stripping if your workflow relies on fine-grained diff whitespace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run heavy agent loops inside Cursor or VS Code, dropping 9Router into your local stack is an effective operational layer to keep agent sessions alive and token burn predictable.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: Compute infrastructure and multi-model benchmark relays for this writeup are sponsored by &lt;a href="https://b-lost.com" rel="noopener noreferrer"&gt;b-lost.com&lt;/a&gt; — an enterprise AI gateway offering 0.8x official pricing, native prompt caching, and zero user-data retention. All benchmark metrics reflect independent reproducible testing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>vscode</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Useful Parts of everything-claude-code Start Where the Copy-Paste Ends</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Sat, 05 Sep 2026 13:12:20 +0000</pubDate>
      <link>https://dev.to/sloves/the-useful-parts-of-everything-claude-code-start-where-the-copy-paste-ends-1f13</link>
      <guid>https://dev.to/sloves/the-useful-parts-of-everything-claude-code-start-where-the-copy-paste-ends-1f13</guid>
      <description>&lt;p&gt;I opened &lt;code&gt;WorldFlowAI/everything-claude-code&lt;/code&gt; during a short coding break after seeing the repository pick up 87 stars in a day. The idea is appealing: a ready-made collection of Claude Code agents, commands, skills, rules, and hooks that can turn a blank setup into a more opinionated development environment.&lt;/p&gt;

&lt;p&gt;My first impression was practical rather than magical. The repository is valuable as a library of working patterns, especially if you spend most of the day in VS Code or Cursor and want repeatable prompts instead of rebuilding them from scratch.&lt;/p&gt;

&lt;p&gt;The first friction point appeared immediately: this is not a normal JavaScript package that you install with &lt;code&gt;npm install&lt;/code&gt;. Copying the files into a project gives you commands and skills, but hooks remain inactive unless they are also registered in Claude Code settings. That distinction is easy to miss because the directory structure looks self-explanatory.&lt;/p&gt;

&lt;p&gt;I started with a project-local install so I could inspect the behavior without changing my global configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/WorldFlowAI/everything-claude-code.git
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; ../everything-claude-code/&lt;span class="o"&gt;{&lt;/span&gt;agents,commands,skills,rules,hooks&lt;span class="o"&gt;}&lt;/span&gt; .claude/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I checked the hook definitions before enabling anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find .claude/hooks &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 2 &lt;span class="nt"&gt;-print&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a hook that should run after a tool event, the relevant entry belongs in &lt;code&gt;.claude/settings.json&lt;/code&gt;, not merely in the &lt;code&gt;hooks&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PostToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash .claude/hooks/example.sh"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lesson is simple: treat this project as a curated configuration toolkit, not a turnkey framework. Before adopting it globally, review every rule and hook, confirm executable permissions, and test in a disposable repository. The real productivity gain comes from selecting a small set of useful conventions—not enabling the entire star count at once.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>javascript</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Stress-Testing Claude’s Community Plugin Marketplace: Git Latency, Plugin Drift, and Editor Friction</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Sat, 05 Sep 2026 08:43:05 +0000</pubDate>
      <link>https://dev.to/sloves/stress-testing-claudes-community-plugin-marketplace-git-latency-plugin-drift-and-editor-friction-p0i</link>
      <guid>https://dev.to/sloves/stress-testing-claudes-community-plugin-marketplace-git-latency-plugin-drift-and-editor-friction-p0i</guid>
      <description>&lt;p&gt;The frustrating part of extending an AI coding workflow is rarely writing the plugin itself. It is discovering which integrations are usable, current, and compatible with the host tool. &lt;code&gt;anthropics/claude-plugins-community&lt;/code&gt; solves that discovery problem as a read-only marketplace mirror for Claude Cowork and Claude Code.&lt;/p&gt;

&lt;p&gt;The repository has also become a useful community health signal: it gained more than 3,126 stars this month. That does not prove plugin quality, but it makes the repository worth inspecting as an architecture rather than treating it as a random collection of prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;The important design decision is separation of concerns. The GitHub repository is not the submission system and should not be treated as the canonical write interface. It exposes a browsable snapshot of community plugins, while submissions go through the documented plugin-directory flow.&lt;/p&gt;

&lt;p&gt;That makes the repository closer to a package index than a runtime. Claude Code or Cowork consumes individual plugin definitions; the marketplace helps humans locate and evaluate them first. In a Cursor or VS Code workflow, I would keep this distinction explicit: browse here, review manifests and instructions, then install only the plugin needed for the current project.&lt;/p&gt;

&lt;p&gt;The read-only model also reduces accidental repository churn. Contributors do not need to coordinate marketplace metadata edits directly, but freshness becomes the main trade-off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal Inspection Workflow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 https://github.com/anthropics/claude-plugins-community.git
&lt;span class="nb"&gt;cd &lt;/span&gt;claude-plugins-community

&lt;span class="c"&gt;# Find likely plugin manifests and metadata files.&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 4 &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="se"&gt;\(&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"plugin.json"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"manifest.json"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"README.md"&lt;/span&gt; &lt;span class="se"&gt;\)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a local review, I record the plugin name, required tools, hooks, commands, and whether its instructions affect every session or only a specific task. That small checklist prevents “install first, understand later” behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-offs and Stress Notes
&lt;/h2&gt;

&lt;p&gt;A shallow clone keeps the initial download small, but it does not solve marketplace drift. The real maintenance cost is validating plugin compatibility over time. Python may appear in helper scripts or validation tooling, yet each plugin can introduce its own runtime assumptions.&lt;/p&gt;

&lt;p&gt;My practical conclusion: the repository is excellent as a low-friction discovery index, not a guarantee of production readiness. The cleanest workflow is inspect, pin the plugin version or commit when possible, test it in a disposable project, and only then connect it to daily editor automation.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>python</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Freebuff Feels Refreshingly Small—Now Let’s See If the Workflow Holds Up</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Sat, 05 Sep 2026 04:08:11 +0000</pubDate>
      <link>https://dev.to/sloves/freebuff-feels-refreshingly-small-now-lets-see-if-the-workflow-holds-up-4179</link>
      <guid>https://dev.to/sloves/freebuff-feels-refreshingly-small-now-lets-see-if-the-workflow-holds-up-4179</guid>
      <description>&lt;p&gt;Seeing CodebuffAI/freebuff pick up 3,406 stars in a month naturally raises the practical question: is this actually better than the coding agents already built into Cursor, VS Code extensions, or terminal-based assistants?&lt;/p&gt;

&lt;p&gt;My first impression is not “this replaces everything.” It is more useful than that: freebuff appears focused on one job—letting an agent work with your codebase from a lightweight interface—without forcing a large editor workflow around it. That simplicity is refreshing.&lt;/p&gt;

&lt;p&gt;The standard Cursor workflow still wins when I want inline edits, autocomplete, visual diffs, and continuous context while moving between files. VS Code extensions also have a smoother onboarding path for teams already living in the editor.&lt;/p&gt;

&lt;p&gt;Where freebuff has an advantage is separation. I can keep my editor unchanged, launch the agent from the repository root, and review its work as a distinct step. That makes it easier to experiment with prompts, compare plans, and avoid turning every autocomplete suggestion into an accepted change.&lt;/p&gt;

&lt;p&gt;A minimal test looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/CodebuffAI/freebuff.git
&lt;span class="nb"&gt;cd &lt;/span&gt;freebuff
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npx freebuff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a fair comparison, I would use the same task in freebuff and Cursor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect the authentication flow.
First draw the request path as a Mermaid diagram.
Then identify the three highest-risk files.
Do not edit anything until I approve the plan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That prompt tests repository navigation, explanation quality, diagram generation, and edit discipline—not just whether the agent can produce code.&lt;/p&gt;

&lt;p&gt;The main rough edge is ecosystem maturity. A focused CLI may require more manual setup than a polished IDE integration, and the quality of results will depend heavily on the configured model, repository size, and permission boundaries. I would also keep changes inside a branch and review every diff.&lt;/p&gt;

&lt;p&gt;My decision rule is simple: use freebuff if you want a low-overhead coding agent that stays separate from your editor and you enjoy controlling the workflow yourself. Skip it if Cursor or a VS Code agent already gives you reliable inline edits, project context, and review tools in one place.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>cli</category>
      <category>codingagent</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Dissecting Google Skills: A Scoped Instruction Layer for Cursor and VS Code</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Fri, 04 Sep 2026 23:53:34 +0000</pubDate>
      <link>https://dev.to/sloves/dissecting-google-skills-a-scoped-instruction-layer-for-cursor-and-vs-code-43hp</link>
      <guid>https://dev.to/sloves/dissecting-google-skills-a-scoped-instruction-layer-for-cursor-and-vs-code-43hp</guid>
      <description>&lt;p&gt;The friction this repository addresses is familiar: an AI editor can generate a plausible Google Sheets script, Cloud configuration, or API call while quietly using the wrong product assumptions. The problem is rarely raw coding ability. It is missing, product-specific context.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;google/skills&lt;/code&gt; approaches this as an instruction-layer problem. Instead of embedding every Google workflow into one enormous prompt, it organizes reusable guidance into scoped skill directories. Each skill can describe terminology, API patterns, constraints, and recommended workflows for a specific Google technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Clone and inspect the skill boundaries
&lt;/h2&gt;

&lt;p&gt;I start by keeping the repository outside the application code, then inspect the available instruction files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/google/skills.git ~/dev/google-skills
find ~/dev/google-skills &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'SKILL.md'&lt;/span&gt; &lt;span class="nt"&gt;-print&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I do not load the entire repository into Cursor. That creates unnecessary context and makes it harder to understand which guidance influenced an answer.&lt;/p&gt;

&lt;p&gt;Instead, I select the relevant skill and expose it deliberately. For a project-local workflow, I add a small Cursor rule such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Google&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;API&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;implementation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;guidance"&lt;/span&gt;
&lt;span class="na"&gt;alwaysApply&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

When a task involves a Google product, read the matching
&lt;span class="sb"&gt;`SKILL.md`&lt;/span&gt; under &lt;span class="sb"&gt;`~/dev/google-skills`&lt;/span&gt; before proposing code.
Prefer the documented API patterns and call out assumptions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In practice, I also attach the specific &lt;code&gt;SKILL.md&lt;/code&gt; to a prompt when the task is high-risk. This makes the context auditable instead of relying on hidden global instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before vs. After
&lt;/h2&gt;

&lt;p&gt;Before, I spent time correcting generated code that mixed client libraries, authentication models, or product terminology. After adding scoped skills, the first draft is more constrained and easier to review.&lt;/p&gt;

&lt;p&gt;The biggest performance win is context control. Loading one relevant skill is cheaper than injecting every Google product guide into every request. I measure this in the editor’s prompt inspector rather than guessing: fewer irrelevant tokens, clearer citations, and less prompt drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Verdict
&lt;/h2&gt;

&lt;p&gt;Keep it if your daily work spans Google APIs and you want repeatable editor guidance without maintaining a giant custom prompt. Stay vanilla for small scripts or projects where the official API documentation already fits comfortably into the task context.&lt;/p&gt;

&lt;p&gt;This is useful infrastructure, not magic. The production gate remains the same: verify generated code against current official documentation, tests, and authentication behavior.&lt;/p&gt;

</description>
      <category>python</category>
      <category>googlecloud</category>
      <category>devtools</category>
      <category>vscode</category>
    </item>
    <item>
      <title>I Spent an Afternoon Making My Logged-In Browser an IDE Tool</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Fri, 04 Sep 2026 19:15:18 +0000</pubDate>
      <link>https://dev.to/sloves/i-spent-an-afternoon-making-my-logged-in-browser-an-ide-tool-f68</link>
      <guid>https://dev.to/sloves/i-spent-an-afternoon-making-my-logged-in-browser-an-ide-tool-f68</guid>
      <description>&lt;p&gt;The recurring friction in my AI-assisted workflow is not generating code. It is everything that happens after the code is written: opening the right browser profile, signing in again, finding the correct tab, and explaining to an agent which page it should use.&lt;/p&gt;

&lt;p&gt;That is where &lt;code&gt;citrolabs/ego-lite&lt;/code&gt; feels refreshingly focused. Its premise is simple: let an AI agent use a browser session that is already logged in, without taking over my normal browsing session. The project has also picked up serious community attention, with more than 7,000 stars added recently, so I wanted to test the workflow rather than judge it from the README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal setup
&lt;/h2&gt;

&lt;p&gt;I started with a local checkout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/citrolabs/ego-lite.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ego-lite
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final command is intentional. It shows the available package scripts instead of assuming a particular development entry point. After launching the documented local command, I kept ego-lite open beside VS Code and used it as a dedicated browser surface for agent tasks.&lt;/p&gt;

&lt;p&gt;The useful part is the lack of a large configuration layer. I did not need to create a browser extension matrix, copy cookies manually, or maintain a separate automation profile. The setup is closer to “start the browser, then let the agent connect” than to a traditional automation stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before and after
&lt;/h2&gt;

&lt;p&gt;Before ego-lite, my Cursor or terminal-agent workflow often paused at authentication. I would either describe the page manually or create temporary scripts just to reach an already-authorized screen.&lt;/p&gt;

&lt;p&gt;Afterward, the browser became another tool in the working loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the required site interactively.&lt;/li&gt;
&lt;li&gt;Keep the session available in ego-lite.&lt;/li&gt;
&lt;li&gt;Ask the agent to inspect, navigate, or complete the narrow task.&lt;/li&gt;
&lt;li&gt;Review the result in the browser.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That removes a surprising amount of context switching. It also makes prompts shorter because I can refer to the visible application state instead of explaining every login and navigation step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical verdict
&lt;/h2&gt;

&lt;p&gt;I would keep ego-lite for local, supervised workflows where speed matters and the browser state is convenient. I would stay with vanilla Playwright or a clean automation profile for repeatable CI, security-sensitive tests, and anything requiring deterministic isolation. The simplicity is the feature—but it also means I would treat it as a focused desktop tool, not a replacement for a full test infrastructure.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>browserautomation</category>
      <category>vscode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Spent an Afternoon Replacing Mermaid Prompts with Hand-Built SVG Diagrams</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Fri, 04 Sep 2026 14:49:33 +0000</pubDate>
      <link>https://dev.to/sloves/i-spent-an-afternoon-replacing-mermaid-prompts-with-hand-built-svg-diagrams-12m0</link>
      <guid>https://dev.to/sloves/i-spent-an-afternoon-replacing-mermaid-prompts-with-hand-built-svg-diagrams-12m0</guid>
      <description>&lt;p&gt;A repository gaining 27,488 stars in a month deserves a skeptical test, so I dropped &lt;code&gt;cathrynlavery/diagram-design&lt;/code&gt; into my usual Cursor and VS Code workflow. The pitch is unusually specific: 38 editorial diagram types for Claude Code, Codex, and Pi, delivered as self-contained HTML and SVG. No shadows, no Mermaid defaults, and no “boxes connected by whatever the renderer decided” look.&lt;/p&gt;

&lt;p&gt;The first friction point is that this is not a conventional diagramming library. There is no runtime, component API, or visual editor to learn. The useful interface is the prompt and the generated artifact. That makes it a good fit for agent-assisted documentation, but less useful if I need interactive diagrams inside an application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it beats Mermaid
&lt;/h2&gt;

&lt;p&gt;Mermaid remains faster for a sequence diagram or a quick architecture sketch:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TD
  Browser --&amp;gt; API
  API --&amp;gt; Database&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;But &lt;code&gt;diagram-design&lt;/code&gt; gives the agent stronger visual constraints. The output is a standalone HTML file containing inline SVG, which means I can open it directly, commit it, preview it in VS Code, or paste the markup into documentation without adding a rendering pipeline.&lt;/p&gt;

&lt;p&gt;A minimal local check looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/cathrynlavery/diagram-design.git
&lt;span class="nb"&gt;cd &lt;/span&gt;diagram-design
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 2 &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I then asked my coding agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read this repository's diagram guidance. Create a self-contained SVG
for a request lifecycle. Use an editorial composition, explicit labels,
no shadows, and no Mermaid. Save it as request-lifecycle.html.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result was more art-directed than my normal generated diagrams, especially around hierarchy, spacing, and annotation. The trade-off is consistency: different agents may interpret the same diagram type differently, and editing generated SVG by hand is still tedious.&lt;/p&gt;

&lt;h2&gt;
  
  
  My decision rule
&lt;/h2&gt;

&lt;p&gt;Use this when you want polished, embeddable diagrams generated from prompts, especially for READMEs, design notes, and architecture reviews.&lt;/p&gt;

&lt;p&gt;Skip it if your team already has a Mermaid convention, needs diagrams generated from structured data, or expects live updates from source code. For my daily VS Code workflow, it complements Mermaid rather than replacing it: Mermaid for disposable structure, this repository for diagrams people will actually read.&lt;/p&gt;

</description>
      <category>html</category>
      <category>svg</category>
      <category>devtools</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Where OpenCode Fits in My Cursor Workflow—and Where It Does Not</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Fri, 04 Sep 2026 12:09:04 +0000</pubDate>
      <link>https://dev.to/sloves/where-opencode-fits-in-my-cursor-workflow-and-where-it-does-not-4emh</link>
      <guid>https://dev.to/sloves/where-opencode-fits-in-my-cursor-workflow-and-where-it-does-not-4emh</guid>
      <description>&lt;p&gt;The friction I kept hitting was not writing code. It was context switching.&lt;/p&gt;

&lt;p&gt;I would leave Cursor to inspect a repository from the terminal, check a few files, run tests, and then return to the editor with a half-formed plan. OpenCode caught my attention after seeing the repository pick up more than 314 stars in a day, so I spent a late-night break testing it as a terminal-first coding agent.&lt;/p&gt;

&lt;p&gt;My first impression: it feels less like “another editor” and more like a focused automation layer beside the editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Minimal Setup
&lt;/h2&gt;

&lt;p&gt;From the repository or its installation instructions, start OpenCode in an existing project:&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="nb"&gt;cd &lt;/span&gt;my-web-app
opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I keep the terminal open next to Cursor and use OpenCode for repository exploration, small multi-file changes, and test-driven fixes. The important setup decision is choosing the model and provider configuration that matches your environment rather than treating the default as magic.&lt;/p&gt;

&lt;p&gt;A project-level configuration can stay intentionally small:&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;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://opencode.ai/config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"provider/model-name"&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;I commit this only when the team agrees on the workflow. Otherwise, I keep personal settings outside the repository so contributors are not forced into my setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before vs After
&lt;/h2&gt;

&lt;p&gt;Before OpenCode, I used Cursor for nearly everything: searching, editing, running commands, and reviewing diffs. That is convenient, but long terminal tasks can make the editor session noisy.&lt;/p&gt;

&lt;p&gt;With OpenCode, I can ask for a quick dependency map, identify the files involved in a bug, or apply a narrowly scoped change while watching the command output directly. The workflow becomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explore and plan in OpenCode.&lt;/li&gt;
&lt;li&gt;Review the diff in Git.&lt;/li&gt;
&lt;li&gt;Open Cursor for visual editing and interactive refinement.&lt;/li&gt;
&lt;li&gt;Run the project’s normal checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gain is mostly ergonomic rather than revolutionary. I spend fewer keystrokes moving context between tools, especially on backend-heavy web tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Verdict
&lt;/h2&gt;

&lt;p&gt;Keep OpenCode if you enjoy terminal workflows, want an open-source coding agent, or regularly perform repository-wide maintenance.&lt;/p&gt;

&lt;p&gt;Stay vanilla with Cursor—or plain shell tools—if your work depends heavily on visual UI editing, inline completion, or a single unified interface. OpenCode is not automatically better; it is useful because it gives terminal automation a dedicated place in the workflow.&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>BrowserSkill Made Browser Automation Feel Surprisingly Normal</title>
      <dc:creator>linweidao</dc:creator>
      <pubDate>Fri, 04 Sep 2026 10:09:35 +0000</pubDate>
      <link>https://dev.to/sloves/browserskill-made-browser-automation-feel-surprisingly-normal-b7i</link>
      <guid>https://dev.to/sloves/browserskill-made-browser-automation-feel-surprisingly-normal-b7i</guid>
      <description>&lt;p&gt;I expected Tencent’s BrowserSkill to feel like another browser automation layer I would configure once and forget. Instead, I was pleasantly surprised by how clean the basic idea is: let an AI agent operate the browser I am already using, with my existing login state, while I continue working normally.&lt;/p&gt;

&lt;p&gt;That distinction matters. Traditional automation often means launching a separate browser profile, copying cookies, or building a fragile authentication flow. BrowserSkill’s CLI-and-extension approach feels much closer to a practical daily tool for Cursor and other shell-capable agents.&lt;/p&gt;

&lt;p&gt;The first step is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Tencent/BrowserSkill.git
&lt;span class="nb"&gt;cd &lt;/span&gt;BrowserSkill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, I would follow the repository’s setup instructions and connect the extension to the local CLI. My preferred workflow is to keep the agent’s browser actions explicit and inspectable:&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;"browserAutomation"&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;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requireConfirmationFor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"form_submit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"file_upload"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"payment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"account_changes"&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;The real productivity win is not “AI can click buttons.” It is that an agent can handle repetitive web tasks inside the environment I already trust: checking dashboards, collecting information from authenticated tools, reproducing UI issues, or filling routine forms without forcing me to abandon my current browser session.&lt;/p&gt;

&lt;p&gt;The extension boundary is also a healthier design choice than handing an agent unrestricted remote-control access. I can see what is happening, stop it, and keep the interaction close to the browser.&lt;/p&gt;

&lt;p&gt;A few things I would watch before using it in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat the active browser session as sensitive. Limit which agents can invoke browser actions and avoid leaving privileged tabs open.&lt;/li&gt;
&lt;li&gt;Add confirmation gates for destructive actions, uploads, purchases, and messages. Fast automation is useful; silent mistakes are not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project’s recent community signal—29 new stars today—makes sense to me. BrowserSkill is not flashy for the sake of it; it solves the awkward gap between AI agents and the logged-in browser we already use. That practical focus is exactly why it feels so promising.&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
