<?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: DogeKing</title>
    <description>The latest articles on DEV Community by DogeKing (@dogeking).</description>
    <link>https://dev.to/dogeking</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%2F2584482%2F8fbdc815-ef87-4ce9-9c22-5ab9d638c21b.jpeg</url>
      <title>DEV Community: DogeKing</title>
      <link>https://dev.to/dogeking</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dogeking"/>
    <language>en</language>
    <item>
      <title>CodeSmith: Out of the Box, from Pi-Style Minimalism to a Full Coding Agent Suite</title>
      <dc:creator>DogeKing</dc:creator>
      <pubDate>Mon, 28 Sep 2026 15:55:30 +0000</pubDate>
      <link>https://dev.to/dogeking/codesmith-out-of-the-box-from-pi-style-minimalism-to-a-full-coding-agent-suite-31n7</link>
      <guid>https://dev.to/dogeking/codesmith-out-of-the-box-from-pi-style-minimalism-to-a-full-coding-agent-suite-31n7</guid>
      <description>&lt;h1&gt;
  
  
  Out of the Box: One Key, from Pi-Style Minimalism to the Full Suite
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Source version of &lt;a href="https://github.com/camilesing/CodeSmith" rel="noopener noreferrer"&gt;CodeSmith&lt;/a&gt;: &lt;code&gt;v0.5.0&lt;/code&gt; (commit &lt;code&gt;3a74c82f&lt;/code&gt;). All paths are relative to the repo root; line numbers refer to this version.&lt;br&gt;
Intended audience: readers who have used coding agents such as pi or Claude Code, toyed with the idea of "reshaping one into your own Agent," but would rather not learn a whole new framework for the purpose.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CodeSmith v0.5.0 compresses "configuring an Agent" into a single key. One key — &lt;code&gt;preset&lt;/code&gt; — and 13 resource switches, 11 feature flags, the tool surface, and the memory setting all snap into place at once: the simple tier runs 9 tools with zero background; the experiment tier throws everything open.&lt;/p&gt;

&lt;p&gt;We put it at the head of this series because it produces no new "features" whatsoever, yet buys three things in one purchase: pi's minimalism, Claude Code's out-of-the-box readiness, and a DIY that belongs to you alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  pi Is Hot, but a Bare Shell Is Uninhabitable
&lt;/h2&gt;

&lt;p&gt;The hottest coding agent this year is, in all likelihood, &lt;a href="https://github.com/badlogic/pi-mono" rel="noopener noreferrer"&gt;pi&lt;/a&gt; by Mario Zechner (badlogic). Its philosophy is written on the storefront: other frameworks hand you a bigger box of parts; pi hands you a smaller one and leaves the rest for you to build. No forking, no source hacking — you grow it into what you want with extensions and skills.&lt;/p&gt;

&lt;p&gt;I admire that philosophy — CodeSmith's extension system is itself a port of the pi-mono &lt;code&gt;Extension&lt;/code&gt; model (&lt;code&gt;docs/EXTENSIONS.md&lt;/code&gt;). But the very heat of pi's popularity lights up an industry truth: frameworks deliver a bare-shell unit, while what most people want is water, power, and broadband all live on move-in day.&lt;/p&gt;

&lt;p&gt;DIY carries real costs. You must write TypeScript and read your way through its tool protocol; which tools to cut and which to keep, every one of those calls is yours to make alone; everyone on the team builds their own rig, then maintains their own copy of it through every version bump. None of these costs appear in the framework's README — they are all passed on to the user.&lt;/p&gt;

&lt;p&gt;A saying makes the industry rounds: out-of-the-box readiness and customizability sit at the two ends of a spectrum — products pick one end, frameworks pick the other, and you cannot have your cake and eat it too. We disagree. &lt;strong&gt;The two are not born opposites; the configuration layer has simply never had a "baseline" semantics — "who has the final say" was never defined clearly.&lt;/strong&gt; The answer v0.5.0 gives is called preset.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trouble with Configuration Overload
&lt;/h2&gt;

&lt;p&gt;In a coding agent like CodeSmith that supports free-form DIY, the configuration keys proliferate without end. Imagine handing a new user a fully annotated, 1068-line &lt;code&gt;config.example.toml&lt;/code&gt;: how do you get them "a working Agent in one keypress"?&lt;/p&gt;

&lt;p&gt;The dumbest approach: ship no presets, expose everything, and let the README say, in all honesty, "please first read the one hundred configuration keys." Freedom in pi's eyes; an undecipherable scripture in a newcomer's.&lt;/p&gt;

&lt;p&gt;First refinement: ship one recommended config, applied with a single key. But under what semantics? With override, the explicit config the user already wrote gets stomped on; without override, when the two sides fight, whose word wins? And this scheme promptly runs into a second bill left over from the old modes system.&lt;/p&gt;

&lt;p&gt;Second refinement: the recommended config only fills blanks — keys the user never wrote get filled in; keys the user did write always count; and where the two sides disagree, it does not lie, but truthfully marks "deviated."&lt;/p&gt;

&lt;h2&gt;
  
  
  Four Tiers: A Table That May Not Be Reordered
&lt;/h2&gt;

&lt;p&gt;The first impression a preset makes is four built-in tiers, each a step deeper than the last (&lt;code&gt;crates/config/src/presets.rs:58&lt;/code&gt;), with middle as the factory default:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Subagents&lt;/th&gt;
&lt;th&gt;Resource switches&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;simple&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;whitelist of 9&lt;/td&gt;
&lt;td&gt;goldfish (none)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;index/LSP/snapshots/memory/update checks/audit all off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;middle&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;inherited&lt;/td&gt;
&lt;td&gt;inherited&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;high-value, low-cost combinations on; experimental off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;full set&lt;/td&gt;
&lt;td&gt;notebook&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;middle + LSP warnings; preview flags still off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;experiment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;full set&lt;/td&gt;
&lt;td&gt;elephant + KOD&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;everything on: vision, teams, the coordinator, the context manager, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The true face of the simple tier is nothing more than a 49-line TOML (&lt;code&gt;crates/config/src/presets/simple.toml&lt;/code&gt;), compiled into the binary (the &lt;code&gt;include_str!&lt;/code&gt; at &lt;code&gt;presets.rs:43-47&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"simple"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Pi-style minimal: 9 core tools, thinking medium, no index/LSP/memory/snapshots/MCP/search."&lt;/span&gt;
&lt;span class="py"&gt;app_mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"agent"&lt;/span&gt;
&lt;span class="py"&gt;reasoning_effort&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"medium"&lt;/span&gt;
&lt;span class="py"&gt;memory_level&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"goldfish"&lt;/span&gt;
&lt;span class="py"&gt;max_subagents&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="py"&gt;index_enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;lsp_enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c"&gt;#...... all remaining resource switches are false&lt;/span&gt;

&lt;span class="nn"&gt;[tools]&lt;/span&gt;
&lt;span class="py"&gt;include&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s"&gt;"read_file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"write_file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"edit_file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"grep_files"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"list_dir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"file_search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"exec_shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"exec_shell_wait"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"update_plan"&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;Pi's minimalist posture — a small tool surface, medium thinking, no cross-session memory, zero background actions — is written out verbatim as data. The include list names only 9 tools, while the engine keeps 27 native tools on its books by default (the mirror list at &lt;code&gt;presets.rs:710&lt;/code&gt;; the full catalog is 50+ — see &lt;a href="//./16-tool-internals-fifty-weapons-one-slot.md"&gt;Article 16&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;More interesting still: this table may not fall out of order. A test at &lt;code&gt;presets.rs:625&lt;/code&gt; nails the entire four-tier switch matrix down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;governed_switch_matrix_is_monotonic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Every governed key must be non-decreasing along&lt;/span&gt;
    &lt;span class="c1"&gt;// simple → middle → all → experiment: once a tier turns a switch&lt;/span&gt;
    &lt;span class="c1"&gt;// on, deeper tiers may not turn it off.&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;builtin_tier_matrix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;seen_on&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="nf"&gt;.unwrap_or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seen_on&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nd"&gt;assert!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tier matrix regresses on {key}: {row:?}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;seen_on&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In plain words: the 13 governed boolean switches (the &lt;code&gt;bool_dials&lt;/code&gt; at &lt;code&gt;presets.rs:255-271&lt;/code&gt;) may only be turned on, one by one, along simple → middle → all → experiment, and never off. A companion test checks the full spelling (&lt;code&gt;presets.rs:671&lt;/code&gt;): every tier must write out every governed key explicitly — leave one unwritten, and the decision surface for diy quietly widens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The predictability of the tiers is not a promise made in documentation; it is nailed down by tests.&lt;/strong&gt; Moving up from simple to middle, your only mental burden is "there is more stuff now" — not a single familiar switch will suddenly vanish.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why must the tiers be monotonic?&lt;/strong&gt; Because a tier is, at bottom, a gradient of trust: simple is "I want none of it," experiment is "I want it all." If a middle tier turned one switch on here and another off there, every upgrade would force users to re-verify all 13 switches — and we would have degenerated right back into that 1068-line config file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Baseline, Not Override: fill-if-unset Has Only Three Branches
&lt;/h2&gt;

&lt;p&gt;The heart of the whole system is three helper functions cast from the same mold (&lt;code&gt;crates/tui/src/presets.rs:252&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;fill_bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deviated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&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="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;slot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;//1. Slot empty: fill it in&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;deviated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;//2. Has a value and differs: book it&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;                                       &lt;span class="c1"&gt;//3. Has a value and matches: nothing happens&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;A preset value fills only empty slots; when a slot already has an owner and the preset disagrees, it does not overwrite — it only makes a bookkeeping entry (see the comment markers 1 and 2). &lt;code&gt;fill_string&lt;/code&gt; and &lt;code&gt;fill_usize&lt;/code&gt; are the string and integer editions of the same logic — that familiar recipe again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A preset is a baseline, not an override: explicit configuration always wins.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apply_to_config&lt;/code&gt; (&lt;code&gt;presets.rs:282-411&lt;/code&gt;) runs this three-branch pattern over the 13 switches, 11 feature flags, and 5 scalar dials, one by one, and its return value is a single boolean: whether anything deviated. Those 130 lines are really the same pattern copied and pasted over and over — they are doing exactly one thing: asking every configuration key, in turn, "has the user spoken?"&lt;/p&gt;

&lt;p&gt;The startup path is therefore short (&lt;code&gt;presets.rs:429-484&lt;/code&gt;); one resolution pass looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Preset resolution at startup (crates/tui/src/presets.rs)
|-- Tier selection: --preset CLI &amp;gt; preset key in config.toml &amp;gt; last choice in settings.toml &amp;gt; middle
|-- PresetCatalog::load
|   |-- Five built-in tiers (simple/middle/all/experiment/plan, compiled into the binary)
|   |-- ~/.codesmith/presets/*.toml        # your global presets
|   |-- &amp;lt;workspace&amp;gt;/.codesmith/presets/    # project presets; recommended to commit to the repo
|   `-- legacy modes/ directory still scanned, with a one-time migration warning
|-- apply_to_config: fill-if-unset fills blanks + deviation bookkeeping
`-- config.preset_deviated → effective label (tier name, or diy)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plan in that tree is the fifth built-in tier, dedicated to Plan mode — read-only reconnaissance plus planning tools, with write operations passing through approval (&lt;code&gt;presets/plan.toml&lt;/code&gt; is all of 6 lines) — and it does not take part in the four-tier monotonic matrix.&lt;/p&gt;

&lt;p&gt;A detail easy to miss: hot-switching and startup are two different semantics — on purpose. Startup folding uses fill-if-unset — you did not name a preset, so it only qualifies as a baseline. Mid-session &lt;code&gt;/preset &amp;lt;name&amp;gt;&lt;/code&gt; uses override (the &lt;code&gt;apply&lt;/code&gt; at &lt;code&gt;presets.rs:85&lt;/code&gt;) — you just named one with your own mouth, so it takes full effect immediately, while config-class switches truthfully report "effective after restart." The same question, asked twice, answered differently — because it was asked differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  diy: The Tier You Are Not Allowed to Choose
&lt;/h2&gt;

&lt;p&gt;The outlet of all that deviation bookkeeping is a tier you cannot choose. First, watch it turn you down (&lt;code&gt;crates/config/src/presets.rs:72&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lowered&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"diy"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;bail!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"'diy' is a derived state, not a preset: it is shown when your &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;
         explicit config deviates from the selected tier. Pick simple | &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;
         middle | all | experiment (or a custom preset name)."&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;Then watch it get computed (&lt;code&gt;crates/tui/src/config.rs:2975&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;effective_preset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.preset_deviated&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"diy"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.preset_selection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap_or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"middle"&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;diy is not a configuration key; it is a computed state. The moment your explicit config differs from the selected tier in even one place, the status bar stops showing a tier name and truthfully writes diy. Want to pin it down by writing &lt;code&gt;preset = "diy"&lt;/code&gt; into config.toml? The validator refuses that too (&lt;code&gt;config.rs:1812&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This is my favorite stroke in the whole design. The value of a label is trust at zero cost: &lt;strong&gt;when you see middle, you know all 13 switches sit exactly where middle puts them — not one astray.&lt;/strong&gt; Conversely, if diy were allowed to be saved as a tier, the status bar would be licensed to lie — persisting a derived state amounts to archiving a lie.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Wouldn't override be simpler?&lt;/strong&gt; It would — but override hides "who has the final say" inside the runtime, and every read becomes a verdict rendered on the spot. fill-if-unset moves that reckoning up to load time and settles it once and for all, which earns a complimentary bonus: a preset can be taken off safely at any moment. After &lt;code&gt;/preset off&lt;/code&gt;, your explicit config survives intact down to the last hair; a value that was stomped, by contrast, can only be recovered from memory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  DIY Without Writing Code: TOML Is Your Wrench
&lt;/h2&gt;

&lt;p&gt;Back to the comparison with pi: pi's entrance to DIY is writing an extension; CodeSmith's is a TOML file dropped into one of two scanned directories — &lt;code&gt;~/.codesmith/presets/&lt;/code&gt; (global) or &lt;code&gt;&amp;lt;workspace&amp;gt;/.codesmith/presets/&lt;/code&gt; (project). Later layers override the built-ins by name: drop a project file named &lt;code&gt;simple.toml&lt;/code&gt;, and you have rewritten the definition of "minimal" for the whole team (&lt;code&gt;presets.rs:401-427&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;A bad file cannot crash startup: the directory loader skips files that fail to parse, collects them into warnings, and reports them faithfully in &lt;code&gt;/preset list&lt;/code&gt; (&lt;code&gt;presets.rs:449-505&lt;/code&gt;). The legacy &lt;code&gt;modes/&lt;/code&gt; directory is still scanned and gets only a migration hint — the rename does not cut off the old road.&lt;/p&gt;

&lt;p&gt;The third entrance is export. Once you have dialed in a set of knobs, &lt;code&gt;/preset export my-setup&lt;/code&gt; snapshots the current tool surface, thinking tier, approval posture, and memory level into TOML (&lt;code&gt;crates/tui/src/presets.rs:583-640&lt;/code&gt;) and writes it into the project presets directory. Want to overwrite a built-in tier name? You must write &lt;code&gt;/preset export! simple&lt;/code&gt; and force it explicitly — yet another gate against friendly fire.&lt;/p&gt;

&lt;p&gt;And so "compatible with pi's usage" acquires three layers of meaning. Want the minimalist posture: &lt;code&gt;--preset simple&lt;/code&gt;, 9 tools and zero background — the docs call it, verbatim, Pi-style minimal. Want programmability: the extension system is a port of the pi-mono model in the first place. Want the middle ground: TOML presets plus export, without writing a line of code.&lt;/p&gt;

&lt;p&gt;The honest boundary must also be confessed: CodeSmith does not yet have pi's in-file tree browser, and &lt;code&gt;docs/PRESETS_cn.md&lt;/code&gt; says outright that it is a larger UI/data-model project. What is compatible here is the usage — no stand-in is being impersonated.&lt;/p&gt;

&lt;p&gt;One last easily misread design point: the built-in tiers never govern safety keys. &lt;code&gt;yolo&lt;/code&gt;, &lt;code&gt;approval_policy&lt;/code&gt;, &lt;code&gt;sandbox_mode&lt;/code&gt;, telemetry, prompts and personality, provider credentials — the four tiers touch not a single one of them. The schema does keep &lt;code&gt;approval_policy&lt;/code&gt; and &lt;code&gt;sandbox_mode&lt;/code&gt; fields — those are for your own custom presets. &lt;strong&gt;A tier may decide how much capability you get; it never decides how much risk you take.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coda: Turning pi's Multiple-Choice into Fill-in-the-Blank
&lt;/h2&gt;

&lt;p&gt;String the mechanism into one chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One key selects the tier, with precedence &lt;code&gt;--preset&lt;/code&gt; &amp;gt; config.toml &amp;gt; the last session's choice &amp;gt; factory middle;&lt;/li&gt;
&lt;li&gt;The tier is a TOML baseline compiled into the binary; the four built-in tiers advance monotonically, nailed down by tests;&lt;/li&gt;
&lt;li&gt;At startup it is folded into the config with fill-if-unset, and explicit keys always win;&lt;/li&gt;
&lt;li&gt;The moment anything deviates, the effective label truthfully becomes diy — and diy may be neither chosen nor persisted;&lt;/li&gt;
&lt;li&gt;Customization and export go through TOML files in the two scanned directories — DIY with zero code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Distill further, and you get three features, each with its price:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Baseline, not override&lt;/strong&gt;: a preset can be taken off safely at any time; the price is that a double-write — "the preset says one thing, the config says another" — must be read with fill-in semantics, not taken for granted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monotonic tiers&lt;/strong&gt;: upgrades hold zero surprises; the price is that inverted combinations (say, "every tool on, zero memory") can only be expressed through a custom preset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;diy as a derived state&lt;/strong&gt;: the label never lies; the price is that it cannot be pinned down, so when a team wants to share one deviation posture, it has to settle into a named preset — which is exactly the job &lt;code&gt;/preset export&lt;/code&gt; does.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Series Roadmap
&lt;/h2&gt;

&lt;p&gt;This series opens with two introductory lectures, then runs a six-act main line and closes on the evolution finale, with several Textbook lectures threaded in between. The whole series is aligned against &lt;code&gt;v0.5.0&lt;/code&gt; (commit &lt;code&gt;3a74c82f&lt;/code&gt;); line numbers and facts refer to that version. The incremental commits that landed between v0.3.0→v0.5.0 (layered presets, three-zone wiring, the write-to-disk syntax gate, the security settlement, streaming termination, claim verification, the evolution closed loop) are unpacked by theme in the respective installments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opening: getting started and customization (Articles 00-02)&lt;/strong&gt;. The first lecture of the opening (this very article) is about v0.5.0's layered presets — one key, from Pi-style minimalism to the full suite: the simple tier runs 9 tools with zero background, the experiment tier throws everything open, the baseline never overrides, and deviations are truthfully reported as diy.&lt;/p&gt;

&lt;p&gt;Article 01 is the prologue: it starts from a stretch of streaming-filter code and a war over "open-source models faking tool calls," asks why the word harness fits better than "framework," and covers this project's pedigree and tonnage.&lt;/p&gt;

&lt;p&gt;Article 02 covers the customizable surface: from a single line of &lt;code&gt;personality = "playful"&lt;/code&gt; to swapping out the entire system prompt; from &lt;code&gt;auto_allow&lt;/code&gt; whitelist exact matching (waving &lt;code&gt;git status -s&lt;/code&gt; through, stopping &lt;code&gt;git push&lt;/code&gt;) to replacing built-in tools with shell scripts. The Constitution's nine-level hierarchy guarantees that however far you go, "truthfulness" and "user sovereignty" remain untouchable — &lt;strong&gt;you can customize everything about the Agent, except making it lie to you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act One: An Architecture Born to Save Money (Articles 04-05)&lt;/strong&gt;. The greatest virtue of open-source models is that they are cheap — but cheapness comes with terms: a prefix cache hits only when the request's byte prefix matches exactly. Article 04 covers how the three-zone model bets the product's economics on that rule: the Constitution dares to run 297 lines precisely because, once the cache hits, "the per-turn cost drops roughly 100×."&lt;/p&gt;

&lt;p&gt;Article 05 covers the v0.5.0 deed: the three-zone contract is wired into the engine's request path, and the conversation history's append-only-ness is promoted from discipline to a compile-time property of the type system — the methods that would rewrite history no longer compile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act Two: Signature Designs (Articles 06-07)&lt;/strong&gt;. Article 06 covers RLM: the Agent opens a resident private Python kitchen for itself, turning "can't read it all" into "can compute it all"; along the way come ten kinds of subagents and Team swarm orchestration.&lt;/p&gt;

&lt;p&gt;Article 07 covers the two designs I am proudest of and quickest to mock myself over: the slop ledger, which turns the mess AI leaves behind into a persistent ledger; and side-git, which snapshots the workspace every turn, so that "the AI botched it" becomes an event you can roll back precisely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act Three: Context Engineering (Articles 08-11)&lt;/strong&gt;. Governing the model's field of view: fitting the model with "virtual memory" — big outputs become handles, paged on demand (08); a conversation history that never gets rewritten — cache friendliness is a typographic art (09); the dashboard hung at the end of the conversation — the truth about the user role hanging at the tail (10); six lines of defense after the window fills up (11).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act Four: Meta-Ability (Articles 12-15)&lt;/strong&gt;. A probabilistic brain cannot compute deterministic problems, so let code think for the model — RLM's prompt writes "the LLM translates, the interpreter computes" into a contract (12). A rule written in natural language might as well not be written, so business rules get encoded: τ-bench's cancellation policy, execpolicy's three-valued verdicts, an 189-entry arity dictionary (13). The third ring is the Agent itself: doctor's deterministic boundary, example-based generation, genome replication with mutation for bootstrapping (14). The finale is v0.5.0's claim verifier: "tests all green" only counts after a replay, with four-tuple verdicts landing in a jsonl ledger (15).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act Five: Tool Internals (Articles 16-18)&lt;/strong&gt;. Fifty weapons, one slot (16); house rules written for the model — the manual teaches, error messages correct, the engine intercepts (17); and 18 covers v0.5.0's write-to-disk syntax gate: judge the delta, not the state — a good file may not be written bad, a broken workspace still gets repaired, and the four disk-writing tools share a single gate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act Six: Injection Defense and Loop Robustness (Articles 19-22)&lt;/strong&gt;. Article 19 covers the six walls against prompt injection: the Constitution's hierarchy, Unicode disinfectant, the permission ratchet, static command analysis, the network boundary, and output-side anti-forgery. Article 20 covers v0.5.0's seven notes on settling the security debt: honest sandbox reporting, fail-closed, splitting compound commands, path-traversal guards, trust boundaries, poisoned-lock tolerance, atomic writes and release-chain pinning.&lt;/p&gt;

&lt;p&gt;Article 21 covers loop robustness: a four-layer failure taxonomy, silent hangs and the adaptive watchdog, a graduated ladder of recovery with circuit breakers, and cross-vendor takeover. Article 22 covers v0.5.0's streaming cliff edge: when output is beheaded at the token limit, the tool call refuses to repair and refuses to execute — a severed stream no longer masquerades as a normal finish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finale: The Evolution Closed Loop (Article 23)&lt;/strong&gt;. First it sets the Textbook coordinates — three-layer verifiers, four kinds of update carriers, dual loops and three safety boundaries, the hardest of which is "safety mechanisms may not modify themselves"; then it looks at CodeSmith's implementation — the claim verifier reconciling the books online, doctor's LLM fallback, memory's sleep learning. Determinism as the foundation, proposals passing through verifiers — the loop closes here.&lt;/p&gt;

&lt;p&gt;The Textbook lectures threaded in between fall into three groups: Article 03 sets up the coordinate system before any incisions — the anatomy of an Agent (the loop, autonomy, and the cold water thrown on multi-Agent) plus five waves of engineering evolution; Articles 21 and 22 teach robustness; Article 23 gathers the whole series in. They do not track any single module; they are the common knowledge on which every module stands.&lt;/p&gt;

&lt;p&gt;The next installment (01) is the prologue — for whom this harness was built, and where to begin writing that inventory of distrust.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>hermesagentchallenge</category>
    </item>
    <item>
      <title>Big Boost for Flink &amp; Spark SQL: Both Tools Just Got Updated!</title>
      <dc:creator>DogeKing</dc:creator>
      <pubDate>Sat, 08 Feb 2025 03:08:50 +0000</pubDate>
      <link>https://dev.to/dogeking/big-boost-for-flink-spark-sql-both-tools-just-got-updated-36nj</link>
      <guid>https://dev.to/dogeking/big-boost-for-flink-spark-sql-both-tools-just-got-updated-36nj</guid>
      <description>&lt;p&gt;The latest update of SparkSQLHelper mainly introduces support for hint completions, with the release version being 2025.2.0.&lt;/p&gt;

&lt;p&gt;Plugin Address: &lt;a href="https://plugins.jetbrains.com/plugin/26079-spark-sql-helper" rel="noopener noreferrer"&gt;https://plugins.jetbrains.com/plugin/26079-spark-sql-helper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, you can search for "SparkSQLHelper" directly in the JetBrains plugin marketplace.&lt;/p&gt;

&lt;p&gt;The primary update for FlinkSQLHelper focuses on adding support for Hive syntax. The release version is also 2025.2.0.&lt;/p&gt;

&lt;p&gt;Plugin Address: &lt;a href="https://plugins.jetbrains.com/plugin/25912-flink-sql-helper" rel="noopener noreferrer"&gt;https://plugins.jetbrains.com/plugin/25912-flink-sql-helper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, you can search for "FlinkSQLHelper" directly in the JetBrains plugin marketplace.&lt;/p&gt;

&lt;p&gt;This update enhances the functionality of both plugins to better serve users working with SparkSQL and FlinkSQL, providing improved support for hints and Hive syntax respectively.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>sparksql</category>
      <category>spark</category>
      <category>flinksql</category>
    </item>
    <item>
      <title>Like IDE for FlinkSQL: Support Pycharm! FlikSQLHelper v2025.1.0 released</title>
      <dc:creator>DogeKing</dc:creator>
      <pubDate>Mon, 20 Jan 2025 09:15:55 +0000</pubDate>
      <link>https://dev.to/dogeking/like-ide-for-flinksql-support-pycharm-fliksqlhelper-v202510-released-20k</link>
      <guid>https://dev.to/dogeking/like-ide-for-flinksql-support-pycharm-fliksqlhelper-v202510-released-20k</guid>
      <description>&lt;p&gt;Recently, I have received feedback from users again, Expecting me to support Pycharm.&lt;/p&gt;

&lt;p&gt;So, The version v2025.1.0 released.Plugin Address: &lt;a href="https://plugins.jetbrains.com/plugin/25912-flink-sql-helper" rel="noopener noreferrer"&gt;https://plugins.jetbrains.com/plugin/25912-flink-sql-helper&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flinksql</category>
      <category>sql</category>
    </item>
    <item>
      <title>Like IDE for SparkSQL: Support Pycharm! SparkSQLHelper v2025.1.1 released</title>
      <dc:creator>DogeKing</dc:creator>
      <pubDate>Tue, 14 Jan 2025 06:51:31 +0000</pubDate>
      <link>https://dev.to/dogeking/like-ide-for-sparksql-support-pycharm-sparksqlhelper-v202511-released-4bgo</link>
      <guid>https://dev.to/dogeking/like-ide-for-sparksql-support-pycharm-sparksqlhelper-v202511-released-4bgo</guid>
      <description>&lt;p&gt;Recently, I have received feedback from users again, Expecting me to support Pycharm.&lt;/p&gt;

&lt;p&gt;So, The version v2025.1.1 released.Plugin Address: &lt;a href="https://plugins.jetbrains.com/plugin/26079-spark-sql-helper" rel="noopener noreferrer"&gt;https://plugins.jetbrains.com/plugin/26079-spark-sql-helper&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>tooling</category>
      <category>sparksql</category>
      <category>spark</category>
    </item>
    <item>
      <title>Like IDE for SparkSQL: SparkSQLHelper v2024.1.4 released</title>
      <dc:creator>DogeKing</dc:creator>
      <pubDate>Tue, 24 Dec 2024 13:34:53 +0000</pubDate>
      <link>https://dev.to/dogeking/sparksql-ide-sparksqlhelper-v202414-released-3edh</link>
      <guid>https://dev.to/dogeking/sparksql-ide-sparksqlhelper-v202414-released-3edh</guid>
      <description>&lt;p&gt;Since I published the article: &lt;a href="https://dev.to/dogeking/time-saver-this-idea-plugin-can-help-you-write-sparksql-faster-m6d"&gt;https://dev.to/dogeking/time-saver-this-idea-plugin-can-help-you-write-sparksql-faster-m6d&lt;/a&gt;, I have received much feedback.&lt;/p&gt;

&lt;p&gt;I take user feedback very seriously and immediately made the fixes and released the latest version v2024.1.4. I hope you all enjoy using it.&lt;/p&gt;

&lt;p&gt;This version fixes several important bugs, such as some parsing issues, and improves the error messages.&lt;/p&gt;

&lt;p&gt;Plugin Address: &lt;a href="https://plugins.jetbrains.com/plugin/26079-spark-sql-helper" rel="noopener noreferrer"&gt;https://plugins.jetbrains.com/plugin/26079-spark-sql-helper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, I provide a one-month activation code(valid until December 31, 2024):&lt;/p&gt;

&lt;p&gt;A58DD-DC5DC-TG47Y-9HSRR-5ZFTE&lt;br&gt;
XZ4F7-YQR42-LKP95–66TZ4-VUUT8&lt;br&gt;
DLWMY-E863U-P99JC-TJDMB-W8EB5&lt;br&gt;
K56NB-GV4SS-7GAXM-PURV4-PSKBL&lt;br&gt;
RVL57-JQ2H3-FCJGJ-P4MK9-M4J74&lt;/p&gt;

</description>
      <category>sql</category>
      <category>tooling</category>
      <category>sparksql</category>
      <category>spark</category>
    </item>
    <item>
      <title>Time-saver: This IDEA plugin can help you write FlinkSQL faster</title>
      <dc:creator>DogeKing</dc:creator>
      <pubDate>Wed, 18 Dec 2024 05:36:47 +0000</pubDate>
      <link>https://dev.to/dogeking/time-saver-this-idea-plugin-can-help-you-write-flinksql-faster-5d57</link>
      <guid>https://dev.to/dogeking/time-saver-this-idea-plugin-can-help-you-write-flinksql-faster-5d57</guid>
      <description>&lt;p&gt;I often find my development efficiency affected by lacking a good Grammar-checking tool during big data development. Common issues include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Missing commas, semicolons, or parentheses&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Omitting certain keywords&lt;/strong&gt; within CASE WHEN statements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overlooking some keywords&lt;/strong&gt; in nested queries&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These problems become quite common once SQL statements get lengthy.&lt;/p&gt;

&lt;p&gt;so I wanted a tool to provide an IDE-like experience while writing FlinkSQL. then I developed an IDEA plugin specifically for FlinkSQL.&lt;/p&gt;

&lt;p&gt;Address: &lt;a href="https://plugins.jetbrains.com/plugin/25912-flink-sql-helper" rel="noopener noreferrer"&gt;https://plugins.jetbrains.com/plugin/25912-flink-sql-helper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This plugin currently supports all statements of FlinkSQL version 1.20 Its main features include grammar checking, code formatting, and code completion.&lt;/p&gt;

&lt;p&gt;Let me introduce the features of this plugin.&lt;/p&gt;

&lt;h1&gt;
  
  
  Grammar check
&lt;/h1&gt;

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

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

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

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

&lt;h1&gt;
  
  
  SQL Format
&lt;/h1&gt;

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

&lt;h1&gt;
  
  
  Code Completion Proposals
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2r5i2syamnzzdg6av4u9.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.amazonaws.com%2Fuploads%2Farticles%2F2r5i2syamnzzdg6av4u9.jpg" width="689" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Refactorings
&lt;/h1&gt;

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

&lt;p&gt;Finally, I will provide a one-month activation code(valid until December 31, 2024). I hope everyone enjoys using it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;88YTG-UYMBT-UAF7E-NZN48-MNBZ3&lt;/li&gt;
&lt;li&gt;3H52G-Y33JM-Q9QS6-7KLBL-PY5QE&lt;/li&gt;
&lt;li&gt;FSQNR-UP5X7-6F5WN-M54YJ-QXEF8&lt;/li&gt;
&lt;li&gt;Z7FJJ-X2XS8-MB2FF-BG43S-M4QW2&lt;/li&gt;
&lt;li&gt;HDHYN-AEZSS-CFGC8-KAV2V-MXLAM&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flinksql</category>
      <category>sql</category>
    </item>
    <item>
      <title>Time-saver: This IDEA plugin can help you write SparkSQL faster</title>
      <dc:creator>DogeKing</dc:creator>
      <pubDate>Wed, 18 Dec 2024 05:09:29 +0000</pubDate>
      <link>https://dev.to/dogeking/time-saver-this-idea-plugin-can-help-you-write-sparksql-faster-m6d</link>
      <guid>https://dev.to/dogeking/time-saver-this-idea-plugin-can-help-you-write-sparksql-faster-m6d</guid>
      <description>&lt;p&gt;I often find my development efficiency affected by lacking a good Grammar-checking tool during big data development. Common issues include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Missing commas, semicolons, or parentheses&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Omitting certain keywords&lt;/strong&gt; within CASE WHEN statements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overlooking some keywords&lt;/strong&gt; in nested queries&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These problems become quite common once SQL statements get lengthy.&lt;/p&gt;

&lt;p&gt;so I wanted a tool to provide an IDE-like experience while writing SparkSQL. then I developed an IDEA plugin specifically for SparkSQL.&lt;br&gt;
Address: &lt;a href="https://plugins.jetbrains.com/plugin/26079-spark-sql-helper" rel="noopener noreferrer"&gt;https://plugins.jetbrains.com/plugin/26079-spark-sql-helper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This plugin currently supports all statements of SparkSQL version 3.5 Its main features include grammar checking, code formatting, and code completion.&lt;br&gt;
Let me introduce the features of this plugin.&lt;/p&gt;

&lt;h1&gt;
  
  
  Grammar check
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0cvhfe4n72ldvyopsqo.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.amazonaws.com%2Fuploads%2Farticles%2Fj0cvhfe4n72ldvyopsqo.jpg" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4uvh0whcyuc4s37usrfz.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.amazonaws.com%2Fuploads%2Farticles%2F4uvh0whcyuc4s37usrfz.jpg" width="445" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhpr9u4ikzm72sqgwrnk.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.amazonaws.com%2Fuploads%2Farticles%2Fmhpr9u4ikzm72sqgwrnk.jpg" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  SQL Format
&lt;/h1&gt;

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

&lt;h1&gt;
  
  
  Code Completion Proposals
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdojmjocb6b6mo32fbj4c.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.amazonaws.com%2Fuploads%2Farticles%2Fdojmjocb6b6mo32fbj4c.jpg" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Refactorings
&lt;/h1&gt;

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

&lt;p&gt;Finally, I will provide a one-month activation code(valid until December 31, 2024). I hope everyone enjoys using it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A58DD-DC5DC-TG47Y-9HSRR-5ZFTE&lt;/li&gt;
&lt;li&gt;XZ4F7-YQR42-LKP95–66TZ4-VUUT8&lt;/li&gt;
&lt;li&gt;DLWMY-E863U-P99JC-TJDMB-W8EB5&lt;/li&gt;
&lt;li&gt;K56NB-GV4SS-7GAXM-PURV4-PSKBL&lt;/li&gt;
&lt;li&gt;RVL57-JQ2H3-FCJGJ-P4MK9-M4J74&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spark</category>
      <category>sparksql</category>
      <category>apachespack</category>
    </item>
  </channel>
</rss>
