CmdForge/reference/design/index.html

109 lines
54 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-reference/design" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">CmdForge Design Document | CmdForge</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pages.brrd.tech/rob/CmdForge/reference/design/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="CmdForge Design Document | CmdForge"><meta data-rh="true" name="description" content="A lightweight personal tool builder for AI-powered CLI commands"><meta data-rh="true" property="og:description" content="A lightweight personal tool builder for AI-powered CLI commands"><link data-rh="true" rel="icon" href="/rob/CmdForge/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pages.brrd.tech/rob/CmdForge/reference/design/"><link data-rh="true" rel="alternate" href="https://pages.brrd.tech/rob/CmdForge/reference/design/" hreflang="en"><link data-rh="true" rel="alternate" href="https://pages.brrd.tech/rob/CmdForge/reference/design/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Reference","item":"https://pages.brrd.tech/rob/CmdForge/category/reference"},{"@type":"ListItem","position":2,"name":"Design Philosophy","item":"https://pages.brrd.tech/rob/CmdForge/reference/design"}]}</script><link rel="stylesheet" href="/rob/CmdForge/assets/css/styles.37cb0314.css">
<script src="/rob/CmdForge/assets/js/runtime~main.97cd58b2.js" defer="defer"></script>
<script src="/rob/CmdForge/assets/js/main.ff45e93b.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/rob/CmdForge/"><b class="navbar__title text--truncate">CmdForge</b></a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://gitea.brrd.tech/rob/CmdForge" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Source Code<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/CmdForge/"><span title="CmdForge Overview" class="linkLabel_WmDU">CmdForge Overview</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/CmdForge/architecture/"><span title="CmdForge Architecture" class="linkLabel_WmDU">CmdForge Architecture</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--active" href="/rob/CmdForge/category/reference/"><span title="Reference" class="categoryLinkLabel_W154">Reference</span></a><button aria-label="Collapse sidebar category &#x27;Reference&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rob/CmdForge/reference/providers/"><span title="Provider Setup" class="linkLabel_WmDU">Provider Setup</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rob/CmdForge/reference/registry-spec/"><span title="Registry API" class="linkLabel_WmDU">Registry API</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rob/CmdForge/reference/meta-tools/"><span title="Meta-Tools" class="linkLabel_WmDU">Meta-Tools</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rob/CmdForge/reference/collections/"><span title="Collections" class="linkLabel_WmDU">Collections</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rob/CmdForge/reference/examples/"><span title="Example Tools" class="linkLabel_WmDU">Example Tools</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/rob/CmdForge/reference/design/"><span title="Design Philosophy" class="linkLabel_WmDU">Design Philosophy</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rob/CmdForge/reference/web-ui-spec/"><span title="Web UI Design" class="linkLabel_WmDU">Web UI Design</span></a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/CmdForge/todos/"><span title="CmdForge TODOs" class="linkLabel_WmDU">CmdForge TODOs</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/CmdForge/goals/"><span title="Goals" class="linkLabel_WmDU">Goals</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/CmdForge/ideas-and-exploration/"><span title="Ideas &amp; Exploration" class="linkLabel_WmDU">Ideas &amp; Exploration</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/CmdForge/milestones/"><span title="Milestones" class="linkLabel_WmDU">Milestones</span></a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/rob/CmdForge/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/rob/CmdForge/category/reference/"><span>Reference</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Design Philosophy</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>CmdForge Design Document</h1></header>
<blockquote>
<p>A lightweight personal tool builder for AI-powered CLI commands</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no"></a></h2>
<p>CmdForge lets you create custom AI-powered terminal commands. You define a tool once (name, steps, provider), then use it like any Linux command.</p>
<p><strong>Example:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Create a summarizer tool, then use it:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sum -i text.txt -o summary.txt --max 512</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-concepts">Core Concepts<a href="#core-concepts" class="hash-link" aria-label="Direct link to Core Concepts" title="Direct link to Core Concepts" translate="no"></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tool--directory--config">Tool = Directory + Config<a href="#tool--directory--config" class="hash-link" aria-label="Direct link to Tool = Directory + Config" title="Direct link to Tool = Directory + Config" translate="no"></a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">~/.cmdforge/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> sum/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> config.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> processed.py # Optional external code file</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> reviewer/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> config.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> translator/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> config.yaml</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configyaml-format">config.yaml Format<a href="#configyaml-format" class="hash-link" aria-label="Direct link to config.yaml Format" title="Direct link to config.yaml Format" translate="no"></a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> sum</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Summarize documents&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">arguments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">flag</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">max</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">variable</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> max</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;500&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Maximum words in summary&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prompt</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">prompt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)"> Summarize the following text in {max} words or less:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">provider</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> claude</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> response</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;{response}&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Optional: declare dependencies for meta-tools</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> official/summarize</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> official/translate@^1.0.0 </span><span class="token comment" style="color:rgb(98, 114, 164)"># With version constraint</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-types">Step Types<a href="#step-types" class="hash-link" aria-label="Direct link to Step Types" title="Direct link to Step Types" translate="no"></a></h3>
<p><strong>Prompt Step</strong> - Calls an AI provider:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prompt</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">prompt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Your prompt template with {variables}&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">provider</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> claude</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> response</span><br></span></code></pre></div></div>
<p><strong>Code Step</strong> - Runs Python code:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> code</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">code</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)"> processed = input.upper()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)"> count = len(processed.split())</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> processed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> count</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">code_file</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> processed.py </span><span class="token comment" style="color:rgb(98, 114, 164)"># Optional: external file storage</span><br></span></code></pre></div></div>
<p><strong>Tool Step</strong> - Calls another CmdForge tool (meta-tools):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> tool</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">tool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> official/summarize </span><span class="token comment" style="color:rgb(98, 114, 164)"># Tool reference (owner/name or just name for local)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">input</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;{input}&quot;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Input to pass (supports variable substitution)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Optional arguments</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">max_words</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;100&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> summary </span><span class="token comment" style="color:rgb(98, 114, 164)"># Variable to store the tool&#x27;s output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">provider</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> claude </span><span class="token comment" style="color:rgb(98, 114, 164)"># Optional: override the called tool&#x27;s provider</span><br></span></code></pre></div></div>
<p>Steps execute in order. Each step&#x27;s <code>output_var</code> becomes available to subsequent steps.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="variables">Variables<a href="#variables" class="hash-link" aria-label="Direct link to Variables" title="Direct link to Variables" translate="no"></a></h3>
<ul>
<li class=""><code>{input}</code> - Always available, contains stdin or input file content (empty string if no input)</li>
<li class=""><code>{variable_name}</code> - From arguments (e.g., <code>{max}</code>)</li>
<li class=""><code>{output_var}</code> - From previous steps (e.g., <code>{response}</code>, <code>{processed}</code>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="output-variables">Output Variables<a href="#output-variables" class="hash-link" aria-label="Direct link to Output Variables" title="Direct link to Output Variables" translate="no"></a></h3>
<p>The <code>output_var</code> field specifies which Python variable(s) to capture from your code:</p>
<p><strong>Single variable:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> processed</span><br></span></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">processed </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">input</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">upper</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># This gets captured</span><br></span></code></pre></div></div>
<p><strong>Multiple variables (comma-separated):</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> processed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> count</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> summary</span><br></span></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">processed </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">input</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">upper</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">count </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">len</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">processed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">split</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">summary </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f&quot;Processed </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">count</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> words&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># All three are captured and available as {processed}, {count}, {summary}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli-interface">CLI Interface<a href="#cli-interface" class="hash-link" aria-label="Direct link to CLI Interface" title="Direct link to CLI Interface" translate="no"></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-tools">Running Tools<a href="#running-tools" class="hash-link" aria-label="Direct link to Running Tools" title="Direct link to Running Tools" translate="no"></a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Basic usage (wrapper script in ~/.local/bin)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sum -i document.txt -o summary.txt</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># With custom args</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sum -i document.txt --max 200</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Preview prompt without calling AI</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sum -i document.txt --dry-run</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Test with mock (no API call)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sum -i document.txt --provider mock</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Read from stdin, write to stdout</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cat doc.txt | sum | less</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Or via cmdforge run</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge run sum -i document.txt</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="input-handling">Input Handling<a href="#input-handling" class="hash-link" aria-label="Direct link to Input Handling" title="Direct link to Input Handling" translate="no"></a></h3>
<table><thead><tr><th>Scenario</th><th>Behavior</th></tr></thead><tbody><tr><td>Piped stdin</td><td>Automatically read (<code>cat file.txt | mytool</code>)</td></tr><tr><td><code>-i file.txt</code></td><td>Read from file</td></tr><tr><td><code>--stdin</code></td><td>Interactive input (type then Ctrl+D)</td></tr><tr><td>No input</td><td>Empty string (useful for argument-only tools)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="universal-flags-all-tools">Universal Flags (all tools)<a href="#universal-flags-all-tools" class="hash-link" aria-label="Direct link to Universal Flags (all tools)" title="Direct link to Universal Flags (all tools)" translate="no"></a></h3>
<table><thead><tr><th>Flag</th><th>Short</th><th>Description</th></tr></thead><tbody><tr><td><code>--input</code></td><td><code>-i</code></td><td>Input file</td></tr><tr><td><code>--output</code></td><td><code>-o</code></td><td>Output file (or stdout if omitted)</td></tr><tr><td><code>--stdin</code></td><td></td><td>Read input interactively (type then Ctrl+D)</td></tr><tr><td><code>--dry-run</code></td><td></td><td>Show prompt, don&#x27;t call AI</td></tr><tr><td><code>--show-prompt</code></td><td></td><td>Call AI but also print prompt to stderr</td></tr><tr><td><code>--provider</code></td><td><code>-p</code></td><td>Override provider (e.g., <code>--provider mock</code>)</td></tr><tr><td><code>--verbose</code></td><td><code>-v</code></td><td>Show debug info</td></tr><tr><td><code>--help</code></td><td><code>-h</code></td><td>Show help</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="managing-tools">Managing Tools<a href="#managing-tools" class="hash-link" aria-label="Direct link to Managing Tools" title="Direct link to Managing Tools" translate="no"></a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge list # List all tools</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge create sum # Create new tool (basic)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge edit sum # Edit tool config in $EDITOR</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge delete sum # Delete tool</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge test sum # Test with mock provider</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge run sum # Run tool for real</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge refresh # Refresh all wrapper scripts</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge check sum # Check dependencies for meta-tools</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cmdforge ui # Launch interactive UI</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tool-composition">Tool Composition<a href="#tool-composition" class="hash-link" aria-label="Direct link to Tool Composition" title="Direct link to Tool Composition" translate="no"></a></h2>
<p>CmdForge tools are designed to chain together like any Unix command.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-pipelines-tool-to-tool">External Pipelines (Tool-to-Tool)<a href="#external-pipelines-tool-to-tool" class="hash-link" aria-label="Direct link to External Pipelines (Tool-to-Tool)" title="Direct link to External Pipelines (Tool-to-Tool)" translate="no"></a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Chain multiple CmdForge tools</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cat logs.txt | log-errors | summarize | translate --lang Japanese</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Mix with standard Unix tools</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git log --oneline | head -20 | changelog | tee CHANGELOG.md</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Build complex workflows</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cat *.py | review-code --focus security | json-extract --fields &quot;issue, severity, file&quot; | json2csv</span><br></span></code></pre></div></div>
<p>Each tool reads stdin and writes stdout. No special integration needed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="internal-pipelines-multi-step">Internal Pipelines (Multi-Step)<a href="#internal-pipelines-multi-step" class="hash-link" aria-label="Direct link to Internal Pipelines (Multi-Step)" title="Direct link to Internal Pipelines (Multi-Step)" translate="no"></a></h3>
<p>Within a single tool, chain steps for preprocessing/validation:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> code </span><span class="token comment" style="color:rgb(98, 114, 164)"># Preprocess</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">code</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)"> filtered = &#x27;\n&#x27;.join(l for l in input.split(&#x27;\n&#x27;) if &#x27;ERROR&#x27; in l)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> filtered</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prompt </span><span class="token comment" style="color:rgb(98, 114, 164)"># AI processes filtered input</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">prompt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Explain these errors: {filtered}&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">provider</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">haiku</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> explanation</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> code </span><span class="token comment" style="color:rgb(98, 114, 164)"># Post-process</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">code</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)"> result = f&quot;Found {len(filtered.split(chr(10)))} errors:\n\n{explanation}&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">output_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> result</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;{result}&quot;</span><br></span></code></pre></div></div>
<p><strong>When to use which:</strong></p>
<ul>
<li class=""><strong>External pipelines</strong>: Reusable tools, different providers per stage, standard Unix interop</li>
<li class=""><strong>Internal pipelines</strong>: Tightly coupled steps, shared context, validation of AI output</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-design-doesnt-include">What This Design Doesn&#x27;t Include<a href="#what-this-design-doesnt-include" class="hash-link" aria-label="Direct link to What This Design Doesn&#x27;t Include" title="Direct link to What This Design Doesn&#x27;t Include" translate="no"></a></h2>
<p>Intentionally omitted (not needed for personal use):</p>
<ul>
<li class="">Trust tiers / security levels</li>
<li class="">Cryptographic signing</li>
<li class="">Container isolation / sandboxing</li>
<li class="">Certification testing</li>
<li class="">Distribution packaging</li>
<li class="">PII redaction</li>
<li class="">Audit logging</li>
<li class="">Provider capability negotiation</li>
</ul>
<p><strong>Why?</strong> This is a personal tool builder. You write the tools, you run the tools, you accept the responsibility. Just like any bash script you write.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dependencies">Dependencies<a href="#dependencies" class="hash-link" aria-label="Direct link to Dependencies" title="Direct link to Dependencies" translate="no"></a></h2>
<p>Required:</p>
<ul>
<li class="">Python 3.10+</li>
<li class="">PyYAML</li>
<li class="">urwid (for TUI)</li>
</ul>
<p>Optional fallbacks:</p>
<ul>
<li class="">python3-newt/snack (simpler TUI)</li>
<li class="">dialog/whiptail (basic TUI)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-workflow">Example Workflow<a href="#example-workflow" class="hash-link" aria-label="Direct link to Example Workflow" title="Direct link to Example Workflow" translate="no"></a></h2>
<ol>
<li class="">Run <code>cmdforge</code> to open UI</li>
<li class="">Select &quot;Create&quot; to create a new tool</li>
<li class="">Fill in: name, description, output template</li>
<li class="">Add arguments (e.g., <code>--max</code> with default <code>500</code>)</li>
<li class="">Add a prompt step with your prompt template and provider</li>
<li class="">Click &quot;Save&quot;</li>
<li class="">Exit UI</li>
<li class="">Run <code>sum -i myfile.txt -o summary.txt</code></li>
</ol>
<p>Done. No containers, no signing, no certification. Just a tool that works.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/rob/CmdForge/reference/examples/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Example Tools</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/rob/CmdForge/reference/web-ui-spec/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Web UI Design</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#overview" class="table-of-contents__link toc-highlight">Overview</a></li><li><a href="#core-concepts" class="table-of-contents__link toc-highlight">Core Concepts</a><ul><li><a href="#tool--directory--config" class="table-of-contents__link toc-highlight">Tool = Directory + Config</a></li><li><a href="#configyaml-format" class="table-of-contents__link toc-highlight">config.yaml Format</a></li><li><a href="#step-types" class="table-of-contents__link toc-highlight">Step Types</a></li><li><a href="#variables" class="table-of-contents__link toc-highlight">Variables</a></li><li><a href="#output-variables" class="table-of-contents__link toc-highlight">Output Variables</a></li></ul></li><li><a href="#cli-interface" class="table-of-contents__link toc-highlight">CLI Interface</a><ul><li><a href="#running-tools" class="table-of-contents__link toc-highlight">Running Tools</a></li><li><a href="#input-handling" class="table-of-contents__link toc-highlight">Input Handling</a></li><li><a href="#universal-flags-all-tools" class="table-of-contents__link toc-highlight">Universal Flags (all tools)</a></li><li><a href="#managing-tools" class="table-of-contents__link toc-highlight">Managing Tools</a></li></ul></li><li><a href="#tool-composition" class="table-of-contents__link toc-highlight">Tool Composition</a><ul><li><a href="#external-pipelines-tool-to-tool" class="table-of-contents__link toc-highlight">External Pipelines (Tool-to-Tool)</a></li><li><a href="#internal-pipelines-multi-step" class="table-of-contents__link toc-highlight">Internal Pipelines (Multi-Step)</a></li></ul></li><li><a href="#what-this-design-doesnt-include" class="table-of-contents__link toc-highlight">What This Design Doesn&#39;t Include</a></li><li><a href="#dependencies" class="table-of-contents__link toc-highlight">Dependencies</a></li><li><a href="#example-workflow" class="table-of-contents__link toc-highlight">Example Workflow</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/rob/CmdForge/">Overview</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://gitea.brrd.tech/rob/CmdForge" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitea<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">CmdForge Documentation</div></div></div></footer></div>
</body>
</html>