<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Go Subcommand</title><link>https://arran4.github.io/go-subcommand/</link><description>Recent content on Go Subcommand</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://arran4.github.io/go-subcommand/index.xml" rel="self" type="application/rss+xml"/><item><title>CLI Reference</title><link>https://arran4.github.io/go-subcommand/docs/reference/cli-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/reference/cli-reference/</guid><description>&lt;h1 id="cli-reference"&gt;CLI Reference&lt;a class="anchor" href="#cli-reference"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;The &lt;code&gt;gosubc&lt;/code&gt; tool has the following commands:&lt;/p&gt;&#10;&lt;h2 id="generate"&gt;&lt;code&gt;generate&lt;/code&gt;&lt;a class="anchor" href="#generate"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Generates the Go code for your CLI.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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;gosubc generate &lt;span style="color:#f92672"&gt;[&lt;/span&gt;flags&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Flags:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--dir &amp;lt;path&amp;gt;&lt;/code&gt;: The project root directory containing &lt;code&gt;go.mod&lt;/code&gt;. Defaults to &lt;code&gt;.&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--man-dir &amp;lt;path&amp;gt;&lt;/code&gt;: Directory to generate Unix man pages in. If omitted, no man pages are generated.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="list"&gt;&lt;code&gt;list&lt;/code&gt;&lt;a class="anchor" href="#list"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Lists all identified subcommands in the project. Useful for debugging parsing.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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;gosubc list &lt;span style="color:#f92672"&gt;[&lt;/span&gt;flags&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Flags:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--dir &amp;lt;path&amp;gt;&lt;/code&gt;: The project root directory.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="validate"&gt;&lt;code&gt;validate&lt;/code&gt;&lt;a class="anchor" href="#validate"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Validates subcommand definitions for conflicts or errors.&lt;/p&gt;</description></item><item><title>Getting Started</title><link>https://arran4.github.io/go-subcommand/docs/usage/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/usage/getting-started/</guid><description>&lt;h1 id="getting-started"&gt;Getting Started&lt;a class="anchor" href="#getting-started"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Let&amp;rsquo;s build a simple CLI application named &lt;code&gt;greet&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="1-create-a-go-module"&gt;1. Create a Go Module&lt;a class="anchor" href="#1-create-a-go-module"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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;mkdir greet&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd greet&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go mod init example.com/greet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-define-a-command"&gt;2. Define a Command&lt;a class="anchor" href="#2-define-a-command"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Create &lt;code&gt;main.go&lt;/code&gt; and define your command function.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&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:#f92672"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fmt&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:#75715e"&gt;// Hello is a subcommand `greet hello`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Prints a greeting.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Hello&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello, %s!\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;name&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// This will be replaced by the generated code usage,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// but for now you can leave it empty or use it to run the generated cmd.&lt;/span&gt;&#10;&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;/div&gt;&lt;h2 id="3-configure-generation"&gt;3. Configure Generation&lt;a class="anchor" href="#3-configure-generation"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Create a &lt;code&gt;generate.go&lt;/code&gt; file to instruct &lt;code&gt;go generate&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Defining Commands</title><link>https://arran4.github.io/go-subcommand/docs/usage/defining-commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/usage/defining-commands/</guid><description>&lt;h1 id="defining-commands"&gt;Defining Commands&lt;a class="anchor" href="#defining-commands"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Commands are defined by adding specific comments to your Go functions.&lt;/p&gt;&#10;&lt;h2 id="syntax"&gt;Syntax&lt;a class="anchor" href="#syntax"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FunctionName is a subcommand `root-cmd sub-cmd...`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Description text...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;FunctionName&lt;/strong&gt;: The name of the Go function to execute.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;root-cmd&lt;/strong&gt;: The name of your root application (e.g., &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;kubectl&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;sub-cmd&amp;hellip;&lt;/strong&gt;: A space-separated list of subcommands (e.g., &lt;code&gt;remote add&lt;/code&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="description"&gt;Description&lt;a class="anchor" href="#description"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The text following the command definition or on subsequent lines is used as the command description in usage text.&lt;/p&gt;</description></item><item><title>Installation</title><link>https://arran4.github.io/go-subcommand/docs/introduction/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/introduction/installation/</guid><description>&lt;h1 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;To use &lt;strong&gt;Go Subcommand&lt;/strong&gt;, you need to install the &lt;code&gt;gosubc&lt;/code&gt; CLI tool.&lt;/p&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&lt;a class="anchor" href="#prerequisites"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Go&lt;/strong&gt;: Version 1.18 or later.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="installing-gosubc"&gt;Installing &lt;code&gt;gosubc&lt;/code&gt;&lt;a class="anchor" href="#installing-gosubc"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Run the following command to install the latest version:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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;go install github.com/arran4/go-subcommand/cmd/gosubc@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify the installation:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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;gosubc --help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="adding-to-your-project"&gt;Adding to Your Project&lt;a class="anchor" href="#adding-to-your-project"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;You don&amp;rsquo;t need to import &lt;code&gt;go-subcommand&lt;/code&gt; in your application logic files unless you are using specific helper types. The generated code will reside in a separate package (usually &lt;code&gt;cmd/appname&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Flags &amp; Parameters</title><link>https://arran4.github.io/go-subcommand/docs/usage/flags-parameters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/usage/flags-parameters/</guid><description>&lt;h1 id="flags--parameters"&gt;Flags &amp;amp; Parameters&lt;a class="anchor" href="#flags--parameters"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;code&gt;go-subcommand&lt;/code&gt; automatically maps your function parameters to command-line flags and arguments.&lt;/p&gt;&#10;&lt;h2 id="automatic-mapping"&gt;Automatic Mapping&lt;a class="anchor" href="#automatic-mapping"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Function parameters are converted to flags by default.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Server&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;port&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;verbose&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Generates flags:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--port &amp;lt;int&amp;gt;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--verbose&lt;/code&gt; (boolean flag)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Flag names are automatically converted to kebab-case (e.g., &lt;code&gt;maxRetries&lt;/code&gt; -&amp;gt; &lt;code&gt;--max-retries&lt;/code&gt;).&lt;/p&gt;&#10;&lt;h2 id="customizing-flags"&gt;Customizing Flags&lt;a class="anchor" href="#customizing-flags"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;You can customize flags using comments. There are three ways to define them, in order of priority:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Flags Block&lt;/strong&gt;: A &lt;code&gt;Flags:&lt;/code&gt; block in the function documentation.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Inline Comment&lt;/strong&gt;: Comment on the same line as the parameter.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Preceding Comment&lt;/strong&gt;: Comment on the line before the parameter.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="1-flags-block-highest-priority"&gt;1. Flags Block (Highest Priority)&lt;a class="anchor" href="#1-flags-block-highest-priority"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MyCmd is a subcommand `app cmd`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Flags:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// port: default: 8080 description: Port to listen on&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyCmd&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;port&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) {}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-inline-comment"&gt;2. Inline Comment&lt;a class="anchor" href="#2-inline-comment"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyCmd&lt;/span&gt;(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;port&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// default: 8080 description: Port to listen on&lt;/span&gt;&#10;&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;/div&gt;&lt;h3 id="3-preceding-comment"&gt;3. Preceding Comment&lt;a class="anchor" href="#3-preceding-comment"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// default: 8080 description: Port to listen on&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;port&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="syntax-reference"&gt;Syntax Reference&lt;a class="anchor" href="#syntax-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The parameter definition syntax supports several attributes:&lt;/p&gt;</description></item><item><title>Agent Skills</title><link>https://arran4.github.io/go-subcommand/docs/usage/skills/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/usage/skills/</guid><description>&lt;h1 id="agent-skills"&gt;Agent Skills&lt;a class="anchor" href="#agent-skills"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;code&gt;gosubc&lt;/code&gt; supports installing and managing &lt;strong&gt;AI Agent Skills&lt;/strong&gt;. Skills are Markdown files (&lt;code&gt;SKILL.md&lt;/code&gt;) and supporting files that teach AI coding assistants (like Cursor, Copilot, or generic agents) how to use your CLI properly.&lt;/p&gt;&#10;&lt;h2 id="managing-skills"&gt;Managing Skills&lt;a class="anchor" href="#managing-skills"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;gosubc&lt;/code&gt; includes a built-in &lt;code&gt;skill&lt;/code&gt; command group to manage these agent instructions.&lt;/p&gt;&#10;&lt;h3 id="installing-a-skill"&gt;Installing a Skill&lt;a class="anchor" href="#installing-a-skill"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;You can install a skill from a local directory or a remote git repository.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#75715e"&gt;# Install a local skill&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gosubc skill install ./my-local-skill&#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:#75715e"&gt;# Install a skill from a GitHub repository (e.g., github.com/owner/repo)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gosubc skill install owner/repo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Scopes:&lt;/strong&gt;&#10;By default, skills are installed to the &lt;code&gt;user&lt;/code&gt; scope (e.g., &lt;code&gt;~/.agents/skills/&lt;/code&gt;). You can install a skill for a specific project by using &lt;code&gt;--scope project&lt;/code&gt;, which places it in &lt;code&gt;.agents/skills/&lt;/code&gt; in your current working directory.&lt;/p&gt;</description></item><item><title>Generator design principles</title><link>https://arran4.github.io/go-subcommand/docs/advanced/generator-design-principles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/generator-design-principles/</guid><description>&lt;h1 id="generator-design-principles"&gt;Generator design principles&lt;a class="anchor" href="#generator-design-principles"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class='book-hint '&gt;&#10;&lt;p&gt;&lt;strong&gt;go-subcommand owns command execution and process policy. User functions supply actions, initialization and dependencies. Templates remain an optional escape hatch.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;The preferred workflow is deliberately small: &lt;strong&gt;write a Go function, document it with a Go comment, generate, and run&lt;/strong&gt;. A user should not need to understand the generated entry point, implement dispatch, manually register callbacks, or customize templates to get a usable CLI.&lt;/p&gt;&#10;&lt;p&gt;For example, the ordinary current workflow begins with:&lt;/p&gt;</description></item><item><title>Project generation configuration</title><link>https://arran4.github.io/go-subcommand/docs/advanced/project-configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/project-configuration/</guid><description>&lt;p&gt;&lt;code&gt;gosubc generate --config gosubc.mdc&lt;/code&gt; reads optional generator settings.&#10;Both &lt;code&gt;.mdc&lt;/code&gt; and &lt;code&gt;.mdconf&lt;/code&gt; are supported candidates; neither filename is required.&#10;Generated applications do not read this file or depend on go-subcommand at runtime.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;format-version: 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cli-parser: gnu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;recursive: true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;emit-go-generate: false&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;paths:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- commands&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Explicit flags override file values, including &lt;code&gt;--recursive=false&lt;/code&gt; and&#10;&lt;code&gt;--prov-version=&lt;/code&gt;. File settings override built-in defaults. Settings belong at&#10;the top, without a &lt;code&gt;# Configuration&lt;/code&gt; heading. Generator settings are &lt;code&gt;dir&lt;/code&gt;,&#10;&lt;code&gt;man-dir&lt;/code&gt;, &lt;code&gt;parser-name&lt;/code&gt;, &lt;code&gt;cli-parser&lt;/code&gt;, &lt;code&gt;paths&lt;/code&gt;, &lt;code&gt;recursive&lt;/code&gt;,&#10;&lt;code&gt;force&lt;/code&gt;, &lt;code&gt;clean&lt;/code&gt;, &lt;code&gt;replace-templates&lt;/code&gt;, &lt;code&gt;project-provenance&lt;/code&gt; (alias &lt;code&gt;project&lt;/code&gt;),&#10;&lt;code&gt;timestamp&lt;/code&gt;, &lt;code&gt;emit-go-generate&lt;/code&gt;, &lt;code&gt;prov-version&lt;/code&gt;, &lt;code&gt;prov-commit&lt;/code&gt;, and &lt;code&gt;prov-date&lt;/code&gt;.&#10;Keys ignore case, hyphens and underscores. &lt;code&gt;version&lt;/code&gt; is an alias for&#10;&lt;code&gt;format-version&lt;/code&gt;, and one version declaration is required.&lt;/p&gt;</description></item><item><title>Functionless command metadata</title><link>https://arran4.github.io/go-subcommand/docs/advanced/command-metadata/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/command-metadata/</guid><description>&lt;p&gt;Use a package or standalone comment to describe a root or child without&#10;registering an executable action:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// App is a command `app` -- Manage jobs.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// More application help.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;commands&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:#75715e"&gt;// Generate is a subcommand `app generate` -- Generate jobs.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Generate&lt;/span&gt;() { &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;generate&amp;#34;&lt;/span&gt;) }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;app&lt;/code&gt; prints described help on stderr and exits 0. &lt;code&gt;app generate&lt;/code&gt; prints&#10;&lt;code&gt;generate&lt;/code&gt; on stdout. &lt;code&gt;app unknown&lt;/code&gt; returns an unknown-command error and status 1.&#10;&lt;code&gt;app help&lt;/code&gt;, &lt;code&gt;app usage&lt;/code&gt;, &lt;code&gt;app --help&lt;/code&gt;, recursive help and version keep normal&#10;dispatch behaviour and do not acquire business providers.&lt;/p&gt;</description></item><item><title>Generated errors and process boundary</title><link>https://arran4.github.io/go-subcommand/docs/advanced/generated-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/generated-errors/</guid><description>&lt;p&gt;Generated &lt;code&gt;cmd&lt;/code&gt; packages expose &lt;code&gt;ErrUsage&lt;/code&gt; and &lt;code&gt;*UsageError&lt;/code&gt;. These are generated&#10;application types; applications do not import go-subcommand at runtime.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;cmd&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;UsageError&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;errors&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Is&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;cmd&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ErrUsage&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;errors&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;As&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%s: kind=%s flag=%s\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;CommandPath&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Kind&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Flag&lt;/span&gt;)&#10;&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;/div&gt;&lt;p&gt;The stable kinds are &lt;code&gt;UsageUnknownCommand&lt;/code&gt;, &lt;code&gt;UsageUnknownFlag&lt;/code&gt;,&#10;&lt;code&gt;UsageMissingFlagValue&lt;/code&gt;, &lt;code&gt;UsageInvalidValue&lt;/code&gt;, &lt;code&gt;UsageInvalidArguments&lt;/code&gt;, and&#10;&lt;code&gt;UsageMissingRequiredFlag&lt;/code&gt;. The error holds a canonical command path, a flag name&#10;without leading dashes where applicable, an optional underlying cause, and a&#10;presentation message. Classification never depends on matching that message.&#10;Causes remain available through &lt;code&gt;errors.Is&lt;/code&gt; and &lt;code&gt;errors.As&lt;/code&gt;. Application-provided&#10;usage errors and explicit exit errors retain their wrappers when returned from&#10;dispatch.&lt;/p&gt;</description></item><item><title>No-command policy</title><link>https://arran4.github.io/go-subcommand/docs/advanced/no-command-policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/no-command-policy/</guid><description>&lt;p&gt;Use functionless root metadata to require a selected command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// App is a command `app` -- Run jobs.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// No command: error&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;commands&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:#75715e"&gt;// Run is a subcommand `app run` -- Run a job.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Run&lt;/span&gt;() { &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;run&amp;#34;&lt;/span&gt;) }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or place the same directive in native configuration:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;format-version: 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Commands&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;```command: app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description: Run jobs.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No command: error&#10;&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;/div&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Invocation&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;stdout&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;stderr&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Status&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Error: no command provided&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app --&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Error: no command provided&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app run&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;run&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app help&lt;/code&gt;, &lt;code&gt;app usage&lt;/code&gt;, &lt;code&gt;app --help&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;normal help&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app version&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;normal version&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app missing&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;usage and unknown-command error&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app -- run&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;usage and unknown-command error&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;The directive is an execution policy, independent of executable routing. When&#10;omitted, bare invocation preserves existing help and status 0. Only &lt;code&gt;error&lt;/code&gt; is&#10;accepted. Empty/unknown values, duplicate declarations and policies on children&#10;are generation errors with source filename and line diagnostics. A real root&#10;action or any default route, including a help route or a child marked default,&#10;conflicts with the policy. Put it in root metadata rather than an action comment.&lt;/p&gt;</description></item></channel></rss>