CmdForge/architecture/index.html

58 lines
47 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-architecture" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">CmdForge Architecture | 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/architecture"><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 Architecture | CmdForge"><meta data-rh="true" name="description" content="Module Structure"><meta data-rh="true" property="og:description" content="Module Structure"><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/architecture"><link data-rh="true" rel="alternate" href="https://pages.brrd.tech/rob/CmdForge/architecture" hreflang="en"><link data-rh="true" rel="alternate" href="https://pages.brrd.tech/rob/CmdForge/architecture" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"CmdForge Architecture","item":"https://pages.brrd.tech/rob/CmdForge/architecture"}]}</script><link rel="stylesheet" href="/rob/CmdForge/assets/css/styles.37cb0314.css">
<script src="/rob/CmdForge/assets/js/runtime~main.a8ea285c.js" defer="defer"></script>
<script src="/rob/CmdForge/assets/js/main.af70b7f2.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 menu__link--active" aria-current="page" 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 menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist" href="/rob/CmdForge/category/reference"><span title="Reference" class="categoryLinkLabel_W154">Reference</span></a><button aria-label="Expand sidebar category &#x27;Reference&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></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 breadcrumbs__item--active"><span class="breadcrumbs__link">CmdForge Architecture</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 Architecture</h1></header>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="module-structure">Module Structure<a href="#module-structure" class="hash-link" aria-label="Direct link to Module Structure" title="Direct link to Module Structure" translate="no"></a></h2>
<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">src/cmdforge/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── cli/ # CLI commands</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── __init__.py</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── tool_commands.py # list, create, edit, delete</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── provider_commands.py # providers management</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── registry_commands.py # publish, install</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── collections_commands.py # collections list, info, install</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── registry/ # Registry API</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── app.py # Flask API endpoints</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── db.py # SQLite schema and queries</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── sync.py # Git repo sync</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── rate_limit.py</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── web/ # Web UI (cmdforge.brrd.tech)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── app.py # Flask app factory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── routes.py # Page routes</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── auth.py # User authentication</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── forum/ # Forum feature</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── templates/ # Jinja2 templates</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── static/ # CSS, JS</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── gui/ # Desktop GUI (PySide6)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── __init__.py # Entry point, run_gui()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── main_window.py # Main window with sidebar</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── styles.py # QSS stylesheet</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── pages/ # Application pages</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ ├── tools_page.py # Tool list and details</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ ├── tool_builder_page.py # Create/edit tools</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ ├── registry_page.py # Browse/install tools</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ └── providers_page.py # Provider management</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── dialogs/ # Modal dialogs</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── step_dialog.py # Prompt/code step editors</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── argument_dialog.py</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── provider_dialog.py</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── connect_dialog.py # Registry connect</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── publish_dialog.py</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── tool.py # Tool dataclass and loading</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── runner.py # Tool execution engine</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── providers.py # AI provider abstraction</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-flow">Data Flow<a href="#data-flow" class="hash-link" aria-label="Direct link to Data Flow" title="Direct link to Data Flow" translate="no"></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli-tool-execution">CLI Tool Execution<a href="#cli-tool-execution" class="hash-link" aria-label="Direct link to CLI Tool Execution" title="Direct link to CLI Tool Execution" 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">User Input (stdin)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">┌─────────────┐</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ runner.py │ ──── Loads tool from ~/.cmdforge/&lt;name&gt;/config.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└─────────────┘</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">┌─────────────┐</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ Steps │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ (prompt/ │ ──── For prompt steps, calls providers.py</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ code) │ ──── For code steps, exec() Python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└─────────────┘</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Output (stdout)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-ui-request-flow">Web UI Request Flow<a href="#web-ui-request-flow" class="hash-link" aria-label="Direct link to Web UI Request Flow" title="Direct link to Web UI Request Flow" 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">Browser Request</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">┌─────────────────┐</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ Cloudflare │ ──── HTTPS termination</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└─────────────────┘</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">┌─────────────────┐</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ Flask :5050 │ ──── web/app.py</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└─────────────────┘</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──── /api/* → registry/app.py (API)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> └──── /* → web/routes.py (Pages)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ┌─────────────┐</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │ SQLite DB │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> └─────────────┘</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-classes">Key Classes<a href="#key-classes" class="hash-link" aria-label="Direct link to Key Classes" title="Direct link to Key Classes" translate="no"></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tool-toolpy">Tool (tool.py)<a href="#tool-toolpy" class="hash-link" aria-label="Direct link to Tool (tool.py)" title="Direct link to Tool (tool.py)" translate="no"></a></h3>
<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 decorator annotation punctuation" style="color:rgb(248, 248, 242)">@dataclass</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Tool</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"> name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> arguments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> List</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ToolArgument</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"> steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> List</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">Step</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)"># PromptStep | CodeStep | ToolStep</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> output</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dependencies</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> List</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token builtin" style="color:rgb(189, 147, 249)">str</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"> source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ToolSource</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)"># Attribution for imports</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> version</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="toolsource-toolpy">ToolSource (tool.py)<a href="#toolsource-toolpy" class="hash-link" aria-label="Direct link to ToolSource (tool.py)" title="Direct link to ToolSource (tool.py)" translate="no"></a></h3>
<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 decorator annotation punctuation" style="color:rgb(248, 248, 242)">@dataclass</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">ToolSource</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 builtin" style="color:rgb(189, 147, 249)">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># &quot;original&quot;, &quot;imported&quot;, &quot;forked&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> license</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> original_tool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># e.g., &quot;fabric/patterns/extract_wisdom&quot;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-providerspy">Provider (providers.py)<a href="#provider-providerspy" class="hash-link" aria-label="Direct link to Provider (providers.py)" title="Direct link to Provider (providers.py)" translate="no"></a></h3>
<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 decorator annotation punctuation" style="color:rgb(248, 248, 242)">@dataclass</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Provider</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"> name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># e.g., &quot;opencode-pickle&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># e.g., &quot;$HOME/.opencode/bin/opencode run --model ...&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-handling">Error Handling<a href="#error-handling" class="hash-link" aria-label="Direct link to Error Handling" title="Direct link to Error Handling" translate="no"></a></h2>
<p>The runner provides detailed error messages for debugging:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-step-errors">Code Step Errors<a href="#code-step-errors" class="hash-link" aria-label="Direct link to Code Step Errors" title="Direct link to Code Step Errors" translate="no"></a></h3>
<p>When Python code fails in a code step, shows:</p>
<ul>
<li class="">Step number and error type</li>
<li class="">Offending line with context (line before/after)</li>
<li class="">Visual pointer (<code>&gt;&gt;&gt;</code>) to error line</li>
<li class="">List of available variables</li>
</ul>
<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">Error in code step (step 2):</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> NameError: name &#x27;undefined_var&#x27; is not defined</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"> 1: data = input.split(&#x27;\n&#x27;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;&gt;&gt; 2: result = undefined_var + data</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> 3: output = result</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"> Available variables: [&#x27;input&#x27;, &#x27;max_size&#x27;, &#x27;step1_output&#x27;]</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="yaml-syntax-errors">YAML Syntax Errors<a href="#yaml-syntax-errors" class="hash-link" aria-label="Direct link to YAML Syntax Errors" title="Direct link to YAML Syntax Errors" translate="no"></a></h3>
<p>When a tool&#x27;s config.yaml has syntax errors:</p>
<ul>
<li class="">Line and column number</li>
<li class="">Visual pointer to exact position</li>
<li class="">Context line above</li>
</ul>
<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">Error loading tool &#x27;my-tool&#x27;: YAML syntax error</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Line 15, column 8</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"> 14: steps:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> &gt; 15: - type prompt # missing colon</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ^</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Problem: expected &#x27;,&#x27; or &#x27;]&#x27;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nested-tool-errors">Nested Tool Errors<a href="#nested-tool-errors" class="hash-link" aria-label="Direct link to Nested Tool Errors" title="Direct link to Nested Tool Errors" translate="no"></a></h3>
<p>When a tool calls another tool that fails, shows the full call stack:</p>
<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">Error in tool chain:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">my-wrapper (step 2)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -&gt; summarize (step 1)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -&gt; Tool &#x27;missing-tool&#x27; not found</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="registry-database">Registry Database<a href="#registry-database" class="hash-link" aria-label="Direct link to Registry Database" title="Direct link to Registry Database" translate="no"></a></h2>
<p>SQLite schema for published tools:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TABLE</span><span class="token plain"> tools </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"> id </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTEGER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">KEY</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"> name </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TEXT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">UNIQUE</span><span class="token plain"> </span><span class="token operator">NOT</span><span class="token plain"> </span><span class="token boolean">NULL</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"> description </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TEXT</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"> category </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TEXT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">DEFAULT</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;Other&#x27;</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"> config_yaml </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TEXT</span><span class="token plain"> </span><span class="token operator">NOT</span><span class="token plain"> </span><span class="token boolean">NULL</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)">-- Full tool YAML</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> source </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TEXT</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)">-- Deprecated (type only)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> source_url </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TEXT</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)">-- Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> source_json </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TEXT</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)">-- Full ToolSource as JSON</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> published_at </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TIMESTAMP</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"> downloads </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTEGER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">DEFAULT</span><span class="token plain"> </span><span class="token number">0</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"> owner_id </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTEGER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">REFERENCES</span><span class="token plain"> users</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</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 punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<p>The <code>source_json</code> column stores the complete ToolSource object, preserving all attribution fields when tools are published.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-files">Configuration Files<a href="#configuration-files" class="hash-link" aria-label="Direct link to Configuration Files" title="Direct link to Configuration Files" translate="no"></a></h2>
<table><thead><tr><th>File</th><th>Location</th><th>Purpose</th></tr></thead><tbody><tr><td>Tool config</td><td><code>~/.cmdforge/&lt;name&gt;/config.yaml</code></td><td>Tool definition</td></tr><tr><td>Providers</td><td><code>~/.cmdforge/providers.yaml</code></td><td>AI provider commands</td></tr><tr><td>Main config</td><td><code>~/.cmdforge/config.yaml</code></td><td>Registry URL, client ID</td></tr></tbody></table></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/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">CmdForge Overview</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/rob/CmdForge/category/reference"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Reference</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="#module-structure" class="table-of-contents__link toc-highlight">Module Structure</a></li><li><a href="#data-flow" class="table-of-contents__link toc-highlight">Data Flow</a><ul><li><a href="#cli-tool-execution" class="table-of-contents__link toc-highlight">CLI Tool Execution</a></li><li><a href="#web-ui-request-flow" class="table-of-contents__link toc-highlight">Web UI Request Flow</a></li></ul></li><li><a href="#key-classes" class="table-of-contents__link toc-highlight">Key Classes</a><ul><li><a href="#tool-toolpy" class="table-of-contents__link toc-highlight">Tool (tool.py)</a></li><li><a href="#toolsource-toolpy" class="table-of-contents__link toc-highlight">ToolSource (tool.py)</a></li><li><a href="#provider-providerspy" class="table-of-contents__link toc-highlight">Provider (providers.py)</a></li></ul></li><li><a href="#error-handling" class="table-of-contents__link toc-highlight">Error Handling</a><ul><li><a href="#code-step-errors" class="table-of-contents__link toc-highlight">Code Step Errors</a></li><li><a href="#yaml-syntax-errors" class="table-of-contents__link toc-highlight">YAML Syntax Errors</a></li><li><a href="#nested-tool-errors" class="table-of-contents__link toc-highlight">Nested Tool Errors</a></li></ul></li><li><a href="#registry-database" class="table-of-contents__link toc-highlight">Registry Database</a></li><li><a href="#configuration-files" class="table-of-contents__link toc-highlight">Configuration Files</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>