<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Introduction on Zigcli</title><link>https://jiacai2050.github.io/zigcli/</link><description>Recent content in Introduction on Zigcli</description><generator>Hugo</generator><language>en-us</language><copyright>&amp;copy; 2023-2026 Jiacai Liu. Built with &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; using &lt;a href="https://www.docsy.dev/"&gt;docsy theme&lt;/a&gt; &lt;br&gt;
&lt;a href="https://github.com/jiacai2050/zigcli"&gt;Source Code&lt;/a&gt;</copyright><lastBuildDate>Fri, 09 Oct 2026 16:34:39 +0800</lastBuildDate><atom:link href="https://jiacai2050.github.io/zigcli/index.xml" rel="self" type="application/rss+xml"/><item><title>Install</title><link>https://jiacai2050.github.io/zigcli/install/</link><pubDate>Thu, 02 Jan 2025 23:20:23 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/install/</guid><description>&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;CLI Programs&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-4"&gt;&#10;&lt;h4 id="headline-2"&gt;&#10;Quick Install (recommended)&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://jiacai2050.github.io/zigcli/install.sh | sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;This installs all binaries packaged in the latest release to &lt;code class="verbatim"&gt;~/.local/bin&lt;/code&gt; by default.&lt;/p&gt;&#10;&lt;p&gt;&#10;Options:&lt;/p&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#408080;font-style:italic"&gt;# Custom install directory&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL ... | sh -s -- --install-dir /usr/local/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#408080;font-style:italic"&gt;# Install all packaged binaries explicitly&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL ... | sh -s -- --bins all&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#408080;font-style:italic"&gt;# Choose which binaries to install&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL ... | sh -s -- --bins &lt;span style="color:#ba2121"&gt;&amp;#34;loc zfetch tree cowsay&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#408080;font-style:italic"&gt;# Pin a specific version&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL ... | sh -s -- --version v0.4.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#408080;font-style:italic"&gt;# Use mirror for users in China&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL ... | sh -s -- --china&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-4"&gt;&#10;&lt;h4 id="headline-3"&gt;&#10;Release binary CPU targets&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-4"&gt;&#10;&lt;p&gt;&#10;The prebuilt release binaries use conservative CPU targets so the same archive can run on older&#10;machines:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;x86_64&lt;/code&gt; release binaries are built with &lt;code class="verbatim"&gt;haswell&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;aarch64-macos&lt;/code&gt; release binaries are built with &lt;code class="verbatim"&gt;apple_m1&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;aarch64-windows&lt;/code&gt; release binaries are built with &lt;code class="verbatim"&gt;cortex_a76&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;other &lt;code class="verbatim"&gt;aarch64&lt;/code&gt; targets currently use &lt;code class="verbatim"&gt;generic&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;If those defaults do not match your deployment needs, build from source and choose your own&#10;&lt;code class="verbatim"&gt;-Dcpu&lt;/code&gt; target.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-4"&gt;&#10;&lt;h4 id="headline-4"&gt;&#10;Build from source&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/jiacai2050/zigcli.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Then build with zig 0.17.0&lt;/p&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>structargs</title><link>https://jiacai2050.github.io/zigcli/packages/structargs/</link><pubDate>Sat, 21 Oct 2023 12:04:40 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/packages/structargs/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;structargs&lt;/code&gt; turns a Zig struct into a command-line interface.&lt;/p&gt;&#10;&lt;p&gt;&#10;Instead of building a parser through chained builder calls, you declare one options struct, and&#10;&lt;code class="verbatim"&gt;structargs&lt;/code&gt; derives the flags, defaults, enums, subcommands, and help output from that type at&#10;comptime.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Features&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;The CLI schema lives in one Zig struct:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;normal fields become options&lt;/li&gt;&#10;&lt;li&gt;optional fields and default values become optional flags&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;__shorts__&lt;/code&gt; declares short aliases&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;__messages__&lt;/code&gt; declares help text&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Nested subcommands are declared with &lt;code class="verbatim"&gt;__commands__: union(enum)&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Help and usage text are generated from the same type definition&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;--version&lt;/code&gt; support is enabled through &lt;code class="verbatim"&gt;version_string&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;print_help_on_error&lt;/code&gt; can print stderr help before returning parse errors&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Supported option value types include:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;All &lt;a href="https://ziglang.org/documentation/0.17.0/#Primitive-Types"&gt;primitive types&lt;/a&gt;, such as &lt;code class="verbatim"&gt;i8&lt;/code&gt;, &lt;code class="verbatim"&gt;u16&lt;/code&gt;, &lt;code class="verbatim"&gt;f32&lt;/code&gt;, &lt;code class="verbatim"&gt;bool&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;[]const u8&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;Enum&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>pretty-table</title><link>https://jiacai2050.github.io/zigcli/packages/pretty-table/</link><pubDate>Sat, 17 Aug 2024 17:48:29 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/packages/pretty-table/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;pretty-table&lt;/code&gt; provides two table types plus one owning helper:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;Table(N)&lt;/code&gt; — fixed-size rows and fixed column count, both known at &lt;strong&gt;comptime&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;Table(N).Owned&lt;/code&gt; — runtime row collection for &lt;code class="verbatim"&gt;Table(N)&lt;/code&gt;, while keeping the same fixed column count.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;RuntimeTable&lt;/code&gt; — both row count and column count are driven at runtime.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The key constraint is Zig&amp;#39;s comptime generics: &lt;code class="verbatim"&gt;Table(N)&lt;/code&gt; requires &lt;code class="verbatim"&gt;N&lt;/code&gt; to be a compile-time constant.&#10;If the column count comes from runtime data (e.g. parsing a CSV header), &lt;code class="verbatim"&gt;RuntimeTable&lt;/code&gt; is the only option.&lt;/p&gt;</description></item><item><title>csv</title><link>https://jiacai2050.github.io/zigcli/packages/csv/</link><pubDate>Sun, 22 Mar 2026 16:20:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/packages/csv/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;csv&lt;/code&gt; parses CSV-style delimited text into rows and fields.&lt;/p&gt;&#10;&lt;p&gt;&#10;With the default comma delimiter, &lt;code class="verbatim"&gt;parseDocument()&lt;/code&gt; implements RFC 4180 record and quoted-field&#10;parsing, including embedded CRLF, doubled-quote escaping, consistent field counts, and explicit&#10;parse errors for malformed input.&lt;/p&gt;&#10;&lt;p&gt;&#10;It also supports a few explicit extensions: alternate delimiters, optional empty-line skipping, and&#10;LF-only line endings.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Usage&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;div class="src src-zig"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zig" data-lang="zig"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;std&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;std&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;zigcli&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;csv&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli.csv;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;allocator&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;std.heap.page_allocator;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;input&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;name,age,city&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\r\n&lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;++&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;alice,30,beijing&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\r\n&lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;++&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;bob,25,&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#ba2121"&gt;new york&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\&amp;#34;\r\n&lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;&lt;/span&gt;;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;document&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;csv.&lt;span style="color:#00f"&gt;parseDocument&lt;/span&gt;(allocator,&lt;span style="color:#bbb"&gt; &lt;/span&gt;input,&lt;span style="color:#bbb"&gt; &lt;/span&gt;.{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.delimiter&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;document.&lt;span style="color:#00f"&gt;deinit&lt;/span&gt;(allocator);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;for&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(document.rows)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;|&lt;/span&gt;row&lt;span style="color:#666"&gt;|&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;std.debug.&lt;span style="color:#00f"&gt;print&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;{s}&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;.{row[&lt;span style="color:#666"&gt;0&lt;/span&gt;]});&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;API&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;&lt;code class="verbatim"&gt;parseLine(allocator, line, delimiter)&lt;/code&gt;&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;Parse one line and return a newly allocated slice of fields.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;&lt;code class="verbatim"&gt;parseDocument(allocator, input, options)&lt;/code&gt;&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;Parse a whole input buffer and return a &lt;code class="verbatim"&gt;Document&lt;/code&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;rows&lt;/code&gt;: parsed rows&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;num_cols&lt;/code&gt;: column count inferred from the first parsed row&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Malformed input returns a parse error such as &lt;code class="verbatim"&gt;error.InvalidQuotedField&lt;/code&gt;,&#10;&lt;code class="verbatim"&gt;error.InvalidRecordTerminator&lt;/code&gt;, &lt;code class="verbatim"&gt;error.InconsistentFieldCount&lt;/code&gt;, or&#10;&lt;code class="verbatim"&gt;error.UnclosedQuotedField&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;Document&lt;/code&gt; owns the row and field storage. Call &lt;code class="verbatim"&gt;document.deinit(allocator)&lt;/code&gt; when you are done with&#10;it.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>gitignore</title><link>https://jiacai2050.github.io/zigcli/packages/gitignore/</link><pubDate>Fri, 20 Mar 2026 08:45:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/packages/gitignore/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Features&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Full &lt;a href="https://git-scm.com/docs/gitignore"&gt;.gitignore spec&lt;/a&gt; support: &lt;code class="verbatim"&gt;*&lt;/code&gt;, &lt;code class="verbatim"&gt;?&lt;/code&gt;, &lt;code class="verbatim"&gt;[abc]&lt;/code&gt;, &lt;code class="verbatim"&gt;**/&lt;/code&gt;, negation (&lt;code class="verbatim"&gt;!&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;Recursive &lt;code class="verbatim"&gt;.gitignore&lt;/code&gt; filtering via &lt;code class="verbatim"&gt;GitignoreStack&lt;/code&gt; (per-directory layers)&lt;/li&gt;&#10;&lt;li&gt;Pure Zig implementation — no &lt;code class="verbatim"&gt;libc&lt;/code&gt; &lt;code class="verbatim"&gt;fnmatch&lt;/code&gt; dependency&lt;/li&gt;&#10;&lt;li&gt;Last-match-wins semantics across all layers&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;API&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;&lt;code class="verbatim"&gt;Gitignore&lt;/code&gt;&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;p&gt;Parse a single &lt;code class="verbatim"&gt;.gitignore&lt;/code&gt; file and match paths against it.&lt;/p&gt;&#10;&lt;div class="src src-zig"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zig" data-lang="zig"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;zigcli&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;gitignore&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli.gitignore;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;gi&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;gitignore.Gitignore.&lt;span style="color:#00f"&gt;init&lt;/span&gt;(allocator,&lt;span style="color:#bbb"&gt; &lt;/span&gt;content);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;gi.&lt;span style="color:#00f"&gt;deinit&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(gi.&lt;span style="color:#00f"&gt;shouldIgnore&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;build/output.o&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;false&lt;/span&gt;))&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#408080;font-style:italic"&gt;// path is ignored&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;&lt;code class="verbatim"&gt;GitignoreStack&lt;/code&gt;&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;p&gt;Manage a stack of &lt;code class="verbatim"&gt;.gitignore&lt;/code&gt; layers for recursive directory walks.&#10;Each layer is anchored to its directory, and patterns are evaluated with&#10;correct relative paths.&lt;/p&gt;&#10;&lt;div class="src src-zig"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zig" data-lang="zig"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;zigcli&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;gitignore&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli.gitignore;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;stack&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;gitignore.GitignoreStack.&lt;span style="color:#00f"&gt;init&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;stack.&lt;span style="color:#00f"&gt;deinit&lt;/span&gt;(allocator);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#408080;font-style:italic"&gt;// Push a layer when entering a directory.&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;pushed&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;stack.&lt;span style="color:#00f"&gt;tryPushDir&lt;/span&gt;(dir,&lt;span style="color:#bbb"&gt; &lt;/span&gt;rel_dir,&lt;span style="color:#bbb"&gt; &lt;/span&gt;allocator);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(stack.&lt;span style="color:#00f"&gt;shouldIgnore&lt;/span&gt;(rel_path,&lt;span style="color:#bbb"&gt; &lt;/span&gt;is_dir))&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#408080;font-style:italic"&gt;// path is ignored&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#408080;font-style:italic"&gt;// Pop when leaving the directory.&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(pushed)&lt;span style="color:#bbb"&gt; &lt;/span&gt;stack.&lt;span style="color:#00f"&gt;pop&lt;/span&gt;(allocator);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Roadmap</title><link>https://jiacai2050.github.io/zigcli/roadmap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jiacai2050.github.io/zigcli/roadmap/</guid><description>&lt;p&gt;&lt;code&gt;zigcli&lt;/code&gt; already has two complementary kinds of value:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;as a set of reusable Zig packages for building CLI tools&lt;/li&gt;&#10;&lt;li&gt;as a collection of standalone command-line programs that users can install directly&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The next phase should prioritize foundational capabilities that can be reused across both sides of the project, instead of only adding more isolated utilities.&lt;/p&gt;&#10;&lt;h2 id="p0-strengthen-the-cli-foundation"&gt;P0: Strengthen the CLI foundation&lt;/h2&gt;&#10;&lt;h3 id="1-configuration-system"&gt;1. Configuration system&lt;/h3&gt;&#10;&lt;p&gt;Goal: provide a unified configuration layer that merges command-line flags, environment variables, and config files.&lt;/p&gt;</description></item><item><title>term</title><link>https://jiacai2050.github.io/zigcli/packages/term/</link><pubDate>Sat, 21 Mar 2026 21:05:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/packages/term/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;term&lt;/code&gt; provides the small terminal-focused building blocks shared by &lt;code class="verbatim"&gt;zigcli&lt;/code&gt; packages and&#10;programs.&lt;/p&gt;&#10;&lt;p&gt;&#10;Use it when you want reusable ANSI styling, a shared color type, or lightweight terminal&#10;capability checks without pulling table rendering into your own code.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Features&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;Style.Color&lt;/code&gt; defines the standard ANSI foreground/background colors, including bright variants&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;Style&lt;/code&gt; combines bold, italic, foreground color, and background color into one reusable value&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;isTty(file)&lt;/code&gt; reports whether a file is attached to an interactive terminal&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;terminalWidth(file)&lt;/code&gt; returns the terminal width when it can be detected, otherwise &lt;code class="verbatim"&gt;null&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;stdoutWidth()&lt;/code&gt; is a convenience wrapper for the common stdout case&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;Usage&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;div class="src src-zig"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zig" data-lang="zig"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;std&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;std&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;zigcli&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;term&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli.term;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;stdout&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;std.fs.File.&lt;span style="color:#00f"&gt;stdout&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;buffer:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#666"&gt;1024&lt;/span&gt;]&lt;span style="color:#b00040"&gt;u8&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;undefined&lt;/span&gt;;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;writer&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;stdout.&lt;span style="color:#00f"&gt;writer&lt;/span&gt;(&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;buffer);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;style:&lt;span style="color:#bbb"&gt; &lt;/span&gt;term.Style&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.bold&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;true&lt;/span&gt;,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.fg&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.bright_green,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;style.&lt;span style="color:#00f"&gt;writeString&lt;/span&gt;(&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;writer.interface,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;writer.interface.&lt;span style="color:#00f"&gt;writeByte&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;writer.interface.&lt;span style="color:#00f"&gt;flush&lt;/span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-2"&gt;&#10;&lt;h2 id="headline-3"&gt;&#10;&lt;code class="verbatim"&gt;Style.Color&lt;/code&gt;&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;Style.Color&lt;/code&gt; is the shared ANSI color enum used by &lt;code class="verbatim"&gt;pretty-table&lt;/code&gt; cell styling and by any program&#10;that wants plain colored output.&lt;/p&gt;&#10;&lt;p&gt;&#10;Available colors:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;black&lt;/code&gt;, &lt;code class="verbatim"&gt;red&lt;/code&gt;, &lt;code class="verbatim"&gt;green&lt;/code&gt;, &lt;code class="verbatim"&gt;yellow&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;blue&lt;/code&gt;, &lt;code class="verbatim"&gt;magenta&lt;/code&gt;, &lt;code class="verbatim"&gt;cyan&lt;/code&gt;, &lt;code class="verbatim"&gt;white&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;bright variants such as &lt;code class="verbatim"&gt;bright_red&lt;/code&gt; and &lt;code class="verbatim"&gt;bright_cyan&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Useful helpers:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;toEscapeCode()&lt;/code&gt;: foreground color escape sequence&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;toBgEscapeCode()&lt;/code&gt;: background color escape sequence&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;writeString(writer, text)&lt;/code&gt;: write colored text and reset afterward&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;reset&lt;/code&gt;: the ANSI reset sequence&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="src src-zig"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zig" data-lang="zig"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;term.Style.Color.yellow.&lt;span style="color:#00f"&gt;writeString&lt;/span&gt;(&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;writer.interface,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;warning&amp;#34;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>progress</title><link>https://jiacai2050.github.io/zigcli/packages/progress/</link><pubDate>Fri, 17 Apr 2026 11:55:10 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/packages/progress/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;progress&lt;/code&gt; renders progress bars and spinners to the terminal. It handles ANSI&#10;cursor control, terminal width detection, render throttling, and rate/ETA&#10;calculation automatically.&lt;/p&gt;&#10;&lt;p&gt;&#10;Output is hidden when the target file is not a TTY, so piping or redirecting&#10;will not produce garbled escape sequences.&lt;/p&gt;&#10;&lt;p&gt;&#10;Timing uses a monotonic clock (&lt;code class="verbatim"&gt;std.time.Timer&lt;/code&gt;), so rate and ETA calculations&#10;are immune to wall-clock adjustments.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Quick start&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;Progress bar&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;div class="src src-zig"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zig" data-lang="zig"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;std&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;std&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;@import&lt;/span&gt;(&lt;span style="color:#ba2121"&gt;&amp;#34;zigcli&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;progress&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;zigcli.progress;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bar&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;progress.Progress.&lt;span style="color:#00f"&gt;bar&lt;/span&gt;(allocator,&lt;span style="color:#bbb"&gt; &lt;/span&gt;.{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.total&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;100&lt;/span&gt;,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.prefix&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;download&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.message&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;fetching data&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bar.&lt;span style="color:#00f"&gt;deinit&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;for&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#666"&gt;0&lt;/span&gt;&lt;span style="color:#666"&gt;..&lt;/span&gt;&lt;span style="color:#666"&gt;100&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;|&lt;/span&gt;_&lt;span style="color:#666"&gt;|&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bar.&lt;span style="color:#00f"&gt;inc&lt;/span&gt;(&lt;span style="color:#666"&gt;1&lt;/span&gt;);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bar.&lt;span style="color:#00f"&gt;render&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bar.&lt;span style="color:#00f"&gt;finish&lt;/span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Output:&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10;download [==========&amp;gt;---------] 55.0% 55/100 27/s ETA 0:01 fetching data&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;Spinner&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;div class="src src-zig"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zig" data-lang="zig"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;spinner&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;progress.Progress.&lt;span style="color:#00f"&gt;spinner&lt;/span&gt;(allocator,&lt;span style="color:#bbb"&gt; &lt;/span&gt;.{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.prefix&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;.message&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#ba2121"&gt;&amp;#34;compiling&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;spinner.&lt;span style="color:#00f"&gt;deinit&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;for&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#666"&gt;0&lt;/span&gt;&lt;span style="color:#666"&gt;..&lt;/span&gt;&lt;span style="color:#666"&gt;40&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;|&lt;/span&gt;_&lt;span style="color:#666"&gt;|&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;spinner.&lt;span style="color:#00f"&gt;tick&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;spinner.&lt;span style="color:#00f"&gt;render&lt;/span&gt;();&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;try&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;spinner.&lt;span style="color:#00f"&gt;finish&lt;/span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Output:&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10;build | elapsed 0:05 compiling&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>pstat</title><link>https://jiacai2050.github.io/zigcli/programs/pstat/</link><pubDate>Sat, 18 Jul 2026 10:22:32 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/pstat/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;pstat&lt;/code&gt; continuously prints process snapshots by default. Use &lt;code class="verbatim"&gt;--count 1&lt;/code&gt;&#10;to emit a single sample and exit.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;cumulative CPU time split into total, user, and system time&lt;/li&gt;&#10;&lt;li&gt;resident and virtual memory sizes, in bytes by default&lt;/li&gt;&#10;&lt;li&gt;thread counts, page faults, page-ins, and context switches&lt;/li&gt;&#10;&lt;li&gt;cumulative process energy consumed&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;It uses &lt;code class="verbatim"&gt;proc_pidinfo(PROC_PIDTASKINFO)&lt;/code&gt; for CPU and memory, and&#10;&lt;code class="verbatim"&gt;proc_pid_rusage(RUSAGE_INFO_V6)&lt;/code&gt; for energy counters.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Example&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./zig-out/bin/pstat --count &lt;span style="color:#666"&gt;1&lt;/span&gt; &lt;span style="color:#666"&gt;12345&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./zig-out/bin/pstat --human --count &lt;span style="color:#666"&gt;5&lt;/span&gt; &lt;span style="color:#666"&gt;12345&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./zig-out/bin/pstat --interval &lt;span style="color:#666"&gt;1&lt;/span&gt; --count &lt;span style="color:#666"&gt;5&lt;/span&gt; &lt;span style="color:#666"&gt;12345&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;pre class="example"&gt;&#10;Process ID: 12345&#10;Command Line: /usr/bin/python3 script.py --port 8080&#10;CPU(s) USER(s) SYS(s) RSS(bytes) VIRT(bytes) TH FAULTS PAGEINS CSW ENERGY(mJ)&#10;18.764 15.932 2.832 103809024 1930428416 4/12 4248 19 10668 511.200&#10;18.781 15.947 2.834 103809024 1930428416 4/12 4250 19 10692 511.742&#10;&#10;Process ID: 12345&#10;Command Line: /usr/bin/python3 script.py --port 8080&#10;CPU(s) USER(s) SYS(s) RSS VIRT TH FAULTS PAGEINS CSW ENERGY(mJ)&#10;18.764 15.932 2.832 99.0MiB 1.8GiB 4/12 4248 19 10668 511.200&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;Key flags&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Flag&lt;/th&gt;&#10;&lt;th&gt;Description&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-H, --human&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Format memory sizes with adaptive units&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-i, --interval&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Delay in seconds between successive samples&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-n, --count&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Number of samples to print, &lt;code class="verbatim"&gt;0&lt;/code&gt; means infinite&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;Metric meanings&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;Command Line&lt;/code&gt;: argv reconstructed from &lt;code class="verbatim"&gt;KERN_PROCARGS2&lt;/code&gt; when available; otherwise the executable path is shown.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;CPU(s)&lt;/code&gt;: cumulative CPU time charged to the process since it started.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;USER(s)&lt;/code&gt;: cumulative user-space CPU time charged to the process since it started.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;SYS(s)&lt;/code&gt;: cumulative kernel-space CPU time charged to the process since it started.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;RSS&lt;/code&gt;: physical memory currently resident for this process; &lt;code class="verbatim"&gt;--human&lt;/code&gt; switches to adaptive units.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;VIRT&lt;/code&gt;: total virtual address space reserved by this process; &lt;code class="verbatim"&gt;--human&lt;/code&gt; switches to adaptive units.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;TH&lt;/code&gt;: runnable threads versus all task threads, formatted as &lt;code class="verbatim"&gt;running/total&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;FAULTS&lt;/code&gt;: cumulative page faults since the process started.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;PAGEINS&lt;/code&gt;: cumulative page-ins serviced from storage since the process started.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;CSW&lt;/code&gt;: cumulative task context switches since the process started.&lt;/li&gt;&#10;&lt;li&gt;&lt;code class="verbatim"&gt;ENERGY(mJ)&lt;/code&gt;: cumulative process energy counter from &lt;code class="verbatim"&gt;ri_energy_nj&lt;/code&gt;, shown in millijoules.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>hexdump</title><link>https://jiacai2050.github.io/zigcli/programs/hexdump/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/hexdump/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;hexdump&lt;/code&gt; prints a color-coded hex dump of files or stdin.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Byte categories colored by semantic meaning: null, whitespace, control chars, printable ASCII, non-ASCII.&lt;/li&gt;&#10;&lt;li&gt;Unicode border and separator characters (&lt;code class="verbatim"&gt;┌─┬─┐&lt;/code&gt;, &lt;code class="verbatim"&gt;┊&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;Consecutive identical rows collapsed into a single &lt;code class="verbatim"&gt;*&lt;/code&gt; line (squeezing).&lt;/li&gt;&#10;&lt;li&gt;Reads from a file or stdin.&lt;/li&gt;&#10;&lt;li&gt;Auto-disables color when output is not a TTY.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Color scheme&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Category&lt;/th&gt;&#10;&lt;th&gt;Bytes&lt;/th&gt;&#10;&lt;th&gt;Color&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;Null&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;0x00&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;bright black&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;ASCII whitespace&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;0x09 0x0A 0x0C 0x0D 0x20&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;green&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;ASCII control chars&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;0x01–0x08 0x0B 0x0E–0x1F 0x7F&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;green&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;Printable ASCII&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;0x21–0x7E&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;cyan&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;Non-ASCII&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;0x80–0xFF&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;yellow&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;Demo&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10;$ echo &amp;#34;Hello, World!&amp;#34; | hexdump --no-color&#10;┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐&#10;│00000000│ 48 65 6c 6c 6f 2c 20 57 ┊ 6f 72 6c 64 21 0a │Hello, W┊orld!_ │&#10;└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;Options&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Flag&lt;/th&gt;&#10;&lt;th&gt;Short&lt;/th&gt;&#10;&lt;th&gt;Description&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--length&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-n&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Only read N bytes&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--skip&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-s&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Skip N bytes from the start&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--color&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;/td&gt;&#10;&lt;td&gt;When to use colors: &lt;code class="verbatim"&gt;always&lt;/code&gt;, &lt;code class="verbatim"&gt;auto&lt;/code&gt;, &lt;code class="verbatim"&gt;never&lt;/code&gt; (default: &lt;code class="verbatim"&gt;auto&lt;/code&gt;)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--no-squeezing&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;/td&gt;&#10;&lt;td&gt;Print all rows, do not collapse repeated rows&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--print-color-table&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;/td&gt;&#10;&lt;td&gt;Print a color reference table and exit&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--version&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-v&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Print version&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--help&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-h&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Print help&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;Examples&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-4"&gt;&#10;&lt;h4 id="headline-5"&gt;&#10;Dump a file&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hexdump /bin/ls | head -20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-4"&gt;&#10;&lt;h4 id="headline-6"&gt;&#10;Inspect the first 64 bytes&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hexdump -n &lt;span style="color:#666"&gt;64&lt;/span&gt; file.bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-4"&gt;&#10;&lt;h4 id="headline-7"&gt;&#10;Skip a header and dump the next 128 bytes&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hexdump -s &lt;span style="color:#666"&gt;16&lt;/span&gt; -n &lt;span style="color:#666"&gt;128&lt;/span&gt; file.bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-8" class="outline-4"&gt;&#10;&lt;h4 id="headline-8"&gt;&#10;Pipe from another command&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-8" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -s https://example.com | hexdump | head -20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>pretty-csv</title><link>https://jiacai2050.github.io/zigcli/programs/pretty-csv/</link><pubDate>Fri, 20 Mar 2026 10:00:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/pretty-csv/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;pretty-csv&lt;/code&gt; renders CSV (or TSV) files as aligned, bordered tables in the terminal.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Auto-fits table width to the terminal (truncates with &lt;code class="verbatim"&gt;…&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;Three border styles: &lt;code class="verbatim"&gt;ascii&lt;/code&gt;, &lt;code class="verbatim"&gt;box&lt;/code&gt;, &lt;code class="verbatim"&gt;dos&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Transpose mode: show each record as a vertical key-value block.&lt;/li&gt;&#10;&lt;li&gt;Column selection: display only specific columns.&lt;/li&gt;&#10;&lt;li&gt;Optional row separators between data rows.&lt;/li&gt;&#10;&lt;li&gt;Right-align selected original columns (useful for numeric CSV fields).&lt;/li&gt;&#10;&lt;li&gt;For standard comma-separated CSV input, parsing now fully implements RFC 4180.&lt;/li&gt;&#10;&lt;li&gt;Supports quoted fields, including delimiters inside quotes.&lt;/li&gt;&#10;&lt;li&gt;Supports embedded CRLF inside quoted fields.&lt;/li&gt;&#10;&lt;li&gt;Unescapes doubled quotes in quoted fields.&lt;/li&gt;&#10;&lt;li&gt;Rejects malformed quoted fields and rows with inconsistent column counts.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Demo&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10;$ printf &amp;#39;Name,Age,City\nAlice,30,Beijing\nBob,25,New York\nCharlie,35,London\n&amp;#39; | pretty-csv&#10;┌─────────┬─────┬──────────┐&#10;│ Name │ Age │ City │&#10;├─────────┼─────┼──────────┤&#10;│ Alice │ 30 │ Beijing │&#10;│ Bob │ 25 │ New York │&#10;│ Charlie │ 35 │ London │&#10;└─────────┴─────┴──────────┘&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;Options&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Flag&lt;/th&gt;&#10;&lt;th&gt;Short&lt;/th&gt;&#10;&lt;th&gt;Description&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--delimiter&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-d&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Field delimiter (default: &lt;code class="verbatim"&gt;,&lt;/code&gt;)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--style&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-s&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Border style: &lt;code class="verbatim"&gt;ascii&lt;/code&gt;, &lt;code class="verbatim"&gt;box&lt;/code&gt;, &lt;code class="verbatim"&gt;dos&lt;/code&gt;&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--padding&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-p&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Cell padding (default: 1)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--row-separator&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;/td&gt;&#10;&lt;td&gt;Insert separator lines between data rows&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--no-header&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;/td&gt;&#10;&lt;td&gt;Treat first row as data&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--right-columns&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-r&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Original column indices to right-align (1-based)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--max-width&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-w&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Max total table width (0 = auto-fit)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--transpose&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-t&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Show each record vertically&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--columns&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-c&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Column indices to show (1-based)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;--max-size&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;/td&gt;&#10;&lt;td&gt;Max input file size in MiB (default: 64)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;Examples&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-4"&gt;&#10;&lt;h4 id="headline-4"&gt;&#10;TSV input&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000"&gt;printf&lt;/span&gt; &lt;span style="color:#ba2121"&gt;&amp;#39;a\tb\n1\t2\n&amp;#39;&lt;/span&gt; | pretty-csv -d &lt;span style="color:#ba2121"&gt;$&amp;#39;\t&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-4"&gt;&#10;&lt;h4 id="headline-5"&gt;&#10;Select columns&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pretty-csv -c 1,3,5 data.csv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-4"&gt;&#10;&lt;h4 id="headline-6"&gt;&#10;Right-align numeric columns&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pretty-csv -r 2,4 ledger.csv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-4"&gt;&#10;&lt;h4 id="headline-7"&gt;&#10;Row separators&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pretty-csv --row-separator data.csv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-8" class="outline-4"&gt;&#10;&lt;h4 id="headline-8"&gt;&#10;Transpose mode&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-8" class="outline-text-4"&gt;&#10;&lt;pre class="example"&gt;&#10;$ printf &amp;#39;Name,Age,City\nAlice,30,Beijing\nBob,25,New York\n&amp;#39; | pretty-csv -t&#10;┌──────┬─────────┐&#10;│ Name │ Alice │&#10;│ Age │ 30 │&#10;│ City │ Beijing │&#10;└──────┴─────────┘&#10;&#10;┌──────┬──────────┐&#10;│ Name │ Bob │&#10;│ Age │ 25 │&#10;│ City │ New York │&#10;└──────┴──────────┘&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-9" class="outline-4"&gt;&#10;&lt;h4 id="headline-9"&gt;&#10;Limit table width&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-9" class="outline-text-4"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pretty-csv -w &lt;span style="color:#666"&gt;80&lt;/span&gt; wide-data.csv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>zfetch</title><link>https://jiacai2050.github.io/zigcli/programs/zfetch/</link><pubDate>Mon, 16 Mar 2026 20:30:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/zfetch/</guid><description>&lt;p&gt;&#10;&lt;code class="verbatim"&gt;zfetch&lt;/code&gt; (⚡) is a lightweight, high-performance system information fetcher inspired by the &lt;a href="https://github.com/fastfetch-cli/fastfetch"&gt;fastfetch&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;The &amp;#34;z&amp;#34; stands for both &lt;strong&gt;Zig&lt;/strong&gt; (the language it&amp;#39;s written in) and &lt;strong&gt;zap&lt;/strong&gt; (⚡ lightning-fast). It aims to be extremely fast by avoiding external process calls and using native C APIs or virtual filesystems instead.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Cross-platform&lt;/strong&gt;&lt;/strong&gt;: Supports macOS, Linux, and FreeBSD.&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Detailed Memory Info&lt;/strong&gt;&lt;/strong&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;On macOS: Provides breakdown of App Memory, Wired Memory, and Compressed Memory (matching Activity Monitor).&lt;/li&gt;&#10;&lt;li&gt;On Linux: Provides Swap usage details.&lt;/li&gt;&#10;&lt;li&gt;On FreeBSD: Uses &lt;code class="verbatim"&gt;sysctl&lt;/code&gt; for memory and ACPI for battery status.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Hardware Insights&lt;/strong&gt;&lt;/strong&gt;: Displays CPU core distribution (Performance vs. Efficiency cores on Apple Silicon), GPU (macOS), and Page Size.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;strong&gt;High Performance&lt;/strong&gt;&lt;/strong&gt;: Uses &lt;code class="verbatim"&gt;sysctl&lt;/code&gt;, &lt;code class="verbatim"&gt;IOKit&lt;/code&gt;, &lt;code class="verbatim"&gt;CoreFoundation&lt;/code&gt; on macOS, &lt;code class="verbatim"&gt;procfs&lt;/code&gt;, &lt;code class="verbatim"&gt;sysfs&lt;/code&gt; on Linux, and &lt;code class="verbatim"&gt;sysctl&lt;/code&gt; on FreeBSD.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Demo&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;&lt;figure&gt;&lt;img src="https://fs.liujiacai.net/public/zfetch.webp"&#10;&#9;&#9;&#9;alt="zfetch screenshot" width="400"&gt;&#10;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-4"&gt;&#10;&lt;h4 id="headline-2"&gt;&#10;macOS&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-4"&gt;&#10;&lt;pre class="example"&gt;&#10; ..&amp;#39; jiacai@mario&#10; ,xNMM. ────────────&#10; .OMMMMo OS macOS 26.3 aarch64&#10; lMM&amp;#34; Host Mac14,10&#10; .;loddo:. .olloddol;. Kernel 25.3.0&#10; cKMMMMMMMMMMNWMMMMMMMMMM0: Uptime 20 days, 11 hours, 6 mins&#10; .KMMMMMMMMMMMMMMMMMMMMMMMWd. Shell bash&#10; XMMMMMMMMMMMMMMMMMMMMMMMX. Terminal ghostty&#10;;MMMMMMMMMMMMMMMMMMMMMMMM: Resolution 1728x1117 @ 120Hz&#10;:MMMMMMMMMMMMMMMMMMMMMMMM: Theme Light&#10;.MMMMMMMMMMMMMMMMMMMMMMMMX. CPU Apple M2 Pro (12 cores: 8P + 4E)&#10; kMMMMMMMMMMMMMMMMMMMMMMMMWd. Memory 24.6 GiB / 32.0 GiB (77%) [App: 14.8 GiB, Wired: 3.5 GiB, Compressed: 6.2 GiB]&#10; &amp;#39;XMMMMMMMMMMMMMMMMMMMMMMMMMMk Disk /: 827 GiB / 926 GiB (89%)&#10; &amp;#39;XMMMMMMMMMMMMMMMMMMMMMMMMK. Battery 80% [Discharging]&#10; kMMMMMMMMMMMMMMMMMMMMMMd Page 16 KiB&#10; ;KMMMMMMMWXXWMMMMMMMk. Local IP 10.192.157.86 (en0), 100.80.224.100 (utun0)&#10; &amp;#34;cooc*&amp;#34; &amp;#34;*coo&amp;#39;&amp;#34;&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-4"&gt;&#10;&lt;h4 id="headline-3"&gt;&#10;Linux&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-4"&gt;&#10;&lt;pre class="example"&gt;&#10; _nnnn_ jiacai@ThinkCentre-M760t&#10; dGGGGMMb ───────────────────────&#10; @p~qp~~qMb OS Ubuntu 24.04.3 LTS x86_64&#10; M|@||@) M| Host LENOVO 12USCTO1WW&#10; @,----.JM| Kernel 6.11.0-29-generic&#10; JS^\__/ qKL Uptime 2 hours, 52 mins&#10; dZP qKRb Shell bash&#10; dZP qKKb Terminal tmux&#10; fZP SMMb Resolution 2560x1440&#10; HZM MMMM Theme Light&#10; FqM MMMM CPU 13th Gen Intel(R) Core(TM) i7-13700 (24 logical, 16 physical cores)&#10; __| &amp;#34;. |\dS&amp;#34;qML Memory 2.9 GiB / 30.9 GiB (9%) [Swap: 0 MiB / 59.6 GiB]&#10; | `. | `&amp;#39; \Zq Disk /: 547 GiB / 878 GiB (62%)&#10;_) \.___.,| .&amp;#39; Battery No Battery&#10;\____ )MMMMMP| .&amp;#39; Page 4 KiB&#10; `-&amp;#39; `--&amp;#39; Local IP 10.192.32.23 (eno1), 172.17.0.1 (docker0)&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-4"&gt;&#10;&lt;h4 id="headline-4"&gt;&#10;FreeBSD&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-4"&gt;&#10;&lt;pre class="example"&gt;&#10; ``` ` root@freebsd&#10; ` `.....---.......--.``` -/ ────────────&#10; +o .--` /y:` +. OS FreeBSD 15.0-RELEASE x86_64&#10; yo`:. :o `+- Host FreeBSD&#10; y/ -/` -o/ Kernel 15.0-RELEASE&#10; .- ::/sy+:. Uptime 27 mins, 15 secs&#10; / `-- / Shell sh&#10; `: :` Terminal vt100&#10; `: :` Resolution Unknown&#10; / / Theme Light&#10; .- -. CPU QEMU Virtual CPU version 2.5+ (2 cores)&#10; -- -. Memory 171 MiB / 1.9 GiB (8%)&#10; `:` `:` Disk /: 2 GiB / 4 GiB (67%)&#10; .-- `--. Battery No Battery&#10; .---.....----. Page 4 KiB&#10; Local IP 10.0.2.15 (vtnet0)&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>progress-it</title><link>https://jiacai2050.github.io/zigcli/programs/progress-it/</link><pubDate>Mon, 16 Mar 2026 14:00:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/progress-it/</guid><description>&lt;p&gt;&#10;A port of &lt;a href="https://github.com/Xfennec/progress"&gt;Xfennec/progress&lt;/a&gt; to Zig.&lt;/p&gt;&#10;&lt;p&gt;&#10;Monitors running processes and displays the percentage, throughput, and ETA for&#10;ongoing file operations such as &lt;code class="verbatim"&gt;cp&lt;/code&gt;, &lt;code class="verbatim"&gt;mv&lt;/code&gt;, &lt;code class="verbatim"&gt;dd&lt;/code&gt;, &lt;code class="verbatim"&gt;tar&lt;/code&gt;, &lt;code class="verbatim"&gt;cat&lt;/code&gt;, &lt;code class="verbatim"&gt;rsync&lt;/code&gt;, etc.&lt;/p&gt;&#10;&lt;p&gt;&#10;Supports Linux (via &lt;code class="verbatim"&gt;/proc&lt;/code&gt;) and macOS (via &lt;code class="verbatim"&gt;libproc&lt;/code&gt;).&lt;/p&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Example output&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10;[24185] cp /home/user/bigfile.iso&#10; 73.5% (7.4 GiB / 10.0 GiB) [284.5 MiB/s] ETA 0:09&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;Key flags&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Flag&lt;/th&gt;&#10;&lt;th&gt;Description&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-m&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Loop while monitored processes are running&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-p &amp;lt;pids&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Monitor specific PIDs (comma-separated)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-c &amp;lt;cmds&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Monitor specific command names&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-w&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Wait for a matching process to appear&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-W &amp;lt;secs&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Set wait timeout in seconds&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-q&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Quiet mode — percentages only&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;code class="verbatim"&gt;-n&lt;/code&gt;&lt;/td&gt;&#10;&lt;td&gt;Disable ANSI color output&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>cowsay</title><link>https://jiacai2050.github.io/zigcli/programs/cowsay/</link><pubDate>Mon, 16 Mar 2026 04:25:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/cowsay/</guid><description>&lt;pre class="example"&gt;&#10; USAGE:&#10; ./zig-out/bin/cowsay [OPTIONS] [--] [message]&#10;&#10; OPTIONS:&#10; -f, --face STRING Which cow face to use (cow, tux). Default: cow.(valid: cow|tux)(default: cow)&#10; -v, --version Print version.&#10; -h, --help Print help information.&#10;&lt;/pre&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Demo&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cowsay hi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ____&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt; hi &amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ----&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\ &lt;/span&gt; ^__^&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\ &lt;/span&gt; &lt;span style="color:#666"&gt;(&lt;/span&gt;oo&lt;span style="color:#666"&gt;)&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\_&lt;/span&gt;______&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;(&lt;/span&gt;__&lt;span style="color:#666"&gt;)&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\ &lt;/span&gt; &lt;span style="color:#666"&gt;)&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\/\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;||&lt;/span&gt;----w |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;||&lt;/span&gt; &lt;span style="color:#666"&gt;||&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cowsay -f tux hi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ____&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt; hi &amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ----&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .--.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; |o_o |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; |:_/ |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // &lt;span style="color:#b62;font-weight:bold"&gt;\ \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;(&lt;/span&gt;| | &lt;span style="color:#666"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /&lt;span style=""&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\_&lt;/span&gt; _/&lt;span style="color:#ba2121"&gt;`&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\_&lt;/span&gt;__&lt;span style="color:#666"&gt;)=(&lt;/span&gt;___/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cowsay hello world&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ___________&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt; hello world &amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -----------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\ &lt;/span&gt; ^__^&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\ &lt;/span&gt; &lt;span style="color:#666"&gt;(&lt;/span&gt;oo&lt;span style="color:#666"&gt;)&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\_&lt;/span&gt;______&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;(&lt;/span&gt;__&lt;span style="color:#666"&gt;)&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\ &lt;/span&gt; &lt;span style="color:#666"&gt;)&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\/\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;||&lt;/span&gt;----w |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;||&lt;/span&gt; &lt;span style="color:#666"&gt;||&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>timeout</title><link>https://jiacai2050.github.io/zigcli/programs/timeout/</link><pubDate>Thu, 23 Jan 2025 22:28:53 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/timeout/</guid><description>&lt;pre class="example"&gt;&#10;timeout SECONDS COMMAND [ARG]...&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;Start a command, and kill it if the specified timeout expires.&lt;/p&gt;&#10;&lt;p&gt;&#10;The &lt;code class="verbatim"&gt;timeout&lt;/code&gt; command is crucial for:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Process Control&lt;/li&gt;&#10;&lt;li&gt;Limits execution time of commands&lt;/li&gt;&#10;&lt;li&gt;Prevents resource-consuming tasks from running indefinitely&lt;/li&gt;&#10;&lt;li&gt;Provides automatic process termination&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>zigfetch</title><link>https://jiacai2050.github.io/zigcli/programs/zigfetch/</link><pubDate>Wed, 01 Jan 2025 18:01:47 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/zigfetch/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;code class="verbatim"&gt;zigfetch&lt;/code&gt; has been removed starting with Zig 0.17.0.&#10;Please use &lt;a href="https://github.com/jiacai2050/zig-maker"&gt;zig-maker&lt;/a&gt; as its replacement. If you are still using Zig 0.16, &lt;a href="https://github.com/jiacai2050/zigcli/releases/tag/v0.6.3"&gt;v0.6.3&lt;/a&gt; is the last version that includes &lt;code class="verbatim"&gt;zigfetch&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;zigfetch&lt;/code&gt; behaves similarly to &lt;code class="verbatim"&gt;zig fetch&lt;/code&gt;, but utilizing the capabilities of libcurl for its functionality.&lt;/p&gt;&#10;&lt;p&gt;&#10;HTTP support within Zig&amp;#39;s standard library isn&amp;#39;t currently stable, &lt;a href="https://github.com/ziglang/zig/issues/21792"&gt;this proxy issue&lt;/a&gt; make it even harder, resulting in multiple errors occurring during dependency downloads when building Zig projects. This poses a significant challenge for Chinese developers owing to &lt;a href="https://en.wikipedia.org/wiki/Great_Firewall"&gt;the Great Firewall&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>tcp-proxy</title><link>https://jiacai2050.github.io/zigcli/programs/tcp-proxy/</link><pubDate>Sun, 01 Sep 2024 00:02:43 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/tcp-proxy/</guid><description>&lt;p&gt;&#10;Both IPv4 and IPv6 are supported. On Linux &lt;a href="https://man7.org/linux/man-pages/man2/splice.2.html"&gt;splice&lt;/a&gt; is used to improve perf, details can be found &lt;a href="https://blog.cloudflare.com/sockmap-tcp-splicing-of-the-future/"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; USAGE:&#10; ./zig-out/bin/tcp-proxy [OPTIONS]&#10;&#10; OPTIONS:&#10; -b, --bind_host STRING Local bind host(default: 0.0.0.0)&#10; -p, --local_port INTEGER Local bind port(default: 8081)&#10; -H, --remote_host STRING Remote host(required)&#10; -P, --remote_port INTEGER Remote port(required)&#10; --buf_size INTEGER Buffer size for tcp read/write(default: 16384)&#10; --server_threads INTEGER Server worker threads num(default: 24)&#10; -h, --help&#10; -v, --version&#10; --verbose&#10;&lt;/pre&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tcp-proxy -b 0.0.0.0 -p &lt;span style="color:#666"&gt;8082&lt;/span&gt; -H 192.168.0.2 -P &lt;span style="color:#666"&gt;8082&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;This will forward tcp requests from &lt;code class="verbatim"&gt;localhost:8082&lt;/code&gt; to &lt;code class="verbatim"&gt;192.168.0.2:8082&lt;/code&gt;&lt;/p&gt;</description></item><item><title>loc</title><link>https://jiacai2050.github.io/zigcli/programs/loc/</link><pubDate>Sat, 17 Aug 2024 17:52:51 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/loc/</guid><description>&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./zig-out/bin/loc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;pre class="example"&gt;&#10;┌───────────┬───────┬────────┬───────┬──────────┬────────┬──────────┐&#10;│Language │File │Line │Code │Comment │Blank │Size │&#10;├───────────┼───────┼────────┼───────┼──────────┼────────┼──────────┤&#10;│Zig │363 │10808 │9369 │1050 │389 │632.19K │&#10;│YAML │8 │317 │292 │4 │21 │7.84K │&#10;│TOML │1 │32 │27 │0 │5 │698.00B │&#10;│Makefile │1 │23 │16 │0 │7 │365.00B │&#10;│Python │1 │10 │7 │2 │1 │166.00B │&#10;│C │1 │9 │2 │4 │3 │34.00B │&#10;│Ruby │1 │8 │5 │2 │1 │201.00B │&#10;│Markdown │1 │5 │5 │0 │0 │102.00B │&#10;│CHeader │1 │2 │2 │0 │0 │44.00B │&#10;│JSON │2 │2 │2 │0 │0 │247.00B │&#10;├───────────┼───────┼────────┼───────┼──────────┼────────┼──────────┤&#10;│Total │380 │11216 │9727 │1062 │427 │641.84K │&#10;└───────────┴───────┴────────┴───────┴──────────┴────────┴──────────┘&#10;&lt;/pre&gt;</description></item><item><title>pidof</title><link>https://jiacai2050.github.io/zigcli/programs/pidof/</link><pubDate>Sat, 17 Aug 2024 17:52:44 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/pidof/</guid><description>&lt;p&gt;&#10;Program name is case insensitive by default, pass &lt;code class="verbatim"&gt;-S&lt;/code&gt; option if you want sensitive match.&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; USAGE:&#10; ./zig-out/bin/pidof [OPTIONS] [--] [program]&#10;&#10; OPTIONS:&#10; -s, --single Only return the first matching pid.&#10; -d, --delimiter STRING Delimiter used if more than one PID is shown.(default: )&#10; -S, --strict Case sensitive when matching program name.&#10; -u, --user_only Only show process belonging to current user.&#10; -v, --version Print version.&#10; -h, --help Print help message.&#10;&lt;/pre&gt;</description></item><item><title>repeat</title><link>https://jiacai2050.github.io/zigcli/programs/repeat/</link><pubDate>Sat, 17 Aug 2024 17:52:32 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/repeat/</guid><description>&lt;pre class="example"&gt;&#10; USAGE:&#10; ./zig-out/bin/repeat [OPTIONS] [--] command&#10;&#10; OPTIONS:&#10; -m, --max INTEGER Max times to repeat&#10; -i, --interval INTEGER Pause interval(in seconds) between repeats&#10; -v, --version Print version&#10; -h, --help Print help information&#10;&lt;/pre&gt;</description></item><item><title>tree</title><link>https://jiacai2050.github.io/zigcli/programs/tree/</link><pubDate>Sat, 17 Aug 2024 17:52:22 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/tree/</guid><description>&lt;pre class="example"&gt;&#10; USAGE:&#10; ./zig-out/bin/tree [OPTIONS] [--] [directory]&#10;&#10; OPTIONS:&#10; -m, --mode STRING Line drawing characters. (valid: ascii|box|dos)(default: box)&#10; -a, --all All files are printed.&#10; -s, --size Print the size of each file in bytes along with the name.&#10; -d, --directory List directories only.&#10; -L, --level INTEGER Max display depth of the directory tree.&#10; -v, --version Print version.&#10; -h, --help Print help information.&#10;&lt;/pre&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Demo&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;div class="src src-bash"&gt;&#10;&lt;div class="highlight"&gt;&lt;div style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style=";-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./zig-out/bin/tree src&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;src&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├──bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├──loc.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├──night-shift.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├──pidof.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├──repeat.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├──tree.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├──util.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └──yes.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└──mod&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├──pretty-table.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └──structargs.zig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; directories, &lt;span style="color:#666"&gt;4&lt;/span&gt; files&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>night-shift</title><link>https://jiacai2050.github.io/zigcli/programs/night-shift/</link><pubDate>Sat, 17 Aug 2024 17:52:12 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/night-shift/</guid><description>&lt;pre class="example"&gt;&#10; USAGE:&#10; ./zig-out/bin/night-shift [OPTIONS] [--] &amp;lt;command&amp;gt;&#10;&#10; Available commands by category:&#10; Manual on/off control:&#10; status View current Night Shift status&#10; on Turn Night Shift on&#10; off Turn Night Shift off&#10; toggle Toggle Night Shift&#10;&#10; Color temperature:&#10; temp View temperature preference&#10; temp &amp;lt;0-100&amp;gt; Set temperature preference&#10;&#10; Schedule:&#10; schedule View current schedule&#10; schedule sun Start schedule from sunset to sunrise&#10; schedule off Stop the current schedule&#10; schedule &amp;lt;from&amp;gt; &amp;lt;to&amp;gt; Start a custom schedule(HH:mm, 24-hour format)&#10;&#10; OPTIONS:&#10;&#9;-v, --version Print version&#10;&#9;-h, --help Print help information&#10;&lt;/pre&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Acknowledgment&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/smudge/nightlight"&gt;https://github.com/smudge/nightlight&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>dark-mode</title><link>https://jiacai2050.github.io/zigcli/programs/dark-mode/</link><pubDate>Sat, 17 Aug 2024 17:52:00 +0800</pubDate><guid>https://jiacai2050.github.io/zigcli/programs/dark-mode/</guid><description>&lt;pre class="example"&gt;&#10; USAGE:&#10; ./zig-out/bin/dark-mode [OPTIONS] [--] &amp;lt;command&amp;gt;&#10;&#10; Available commands:&#10; status View dark mode status&#10; on Turn dark mode on&#10; off Turn dark mode off&#10; toggle Toggle dark mode&#10;&#10; OPTIONS:&#10;&#9;-v, --version Print version&#10;&#9;-h, --help Print help information&#10;&lt;/pre&gt;</description></item></channel></rss>