"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[413],{6785(e,r,n){n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>d,default:()=>a,frontMatter:()=>t,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"overview","title":"CmdForge Overview","description":"A lightweight personal tool builder for AI-powered CLI commands.","source":"@site/docs/overview.md","sourceDirName":".","slug":"/","permalink":"/rob/CmdForge/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","sidebar_position":1},"sidebar":"docs","next":{"title":"CmdForge Architecture","permalink":"/rob/CmdForge/architecture"}}');var i=n(4848),o=n(8453);const t={slug:"/",sidebar_position:1},d="CmdForge Overview",c={},l=[{value:"Project Links",id:"project-links",level:2},{value:"Components",id:"components",level:2},{value:"Key Directories",id:"key-directories",level:2},{value:"Development (AI-Server)",id:"development-ai-server",level:3},{value:"Production (OpenMediaVault)",id:"production-openmediavault",level:3},{value:"Recent Changes",id:"recent-changes",level:2}];function h(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.header,{children:(0,i.jsx)(r.h1,{id:"cmdforge-overview",children:"CmdForge Overview"})}),"\n",(0,i.jsx)(r.p,{children:"A lightweight personal tool builder for AI-powered CLI commands."}),"\n",(0,i.jsx)(r.h2,{id:"project-links",children:"Project Links"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Resource"}),(0,i.jsx)(r.th,{children:"URL"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Public Website"})}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.a,{href:"https://cmdforge.brrd.tech/",children:"https://cmdforge.brrd.tech/"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Git Repository"})}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.a,{href:"https://gitea.brrd.tech/rob/CmdForge",children:"https://gitea.brrd.tech/rob/CmdForge"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Registry Repo"})}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.a,{href:"https://gitea.brrd.tech/rob/CmdForge-Registry",children:"https://gitea.brrd.tech/rob/CmdForge-Registry"})})]})]})]}),"\n",(0,i.jsx)(r.h2,{id:"components",children:"Components"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 CmdForge \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 CLI + GUI \u2502 Web UI \u2502 Registry \u2502\n\u2502 (cmdforge) \u2502 (Flask) \u2502 (API + DB) \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Local install \u2502 cmdforge.brrd. \u2502 Tool publishing \u2502\n\u2502 ~/.cmdforge/ \u2502 tech \u2502 Search, download \u2502\n\u2502 PySide6 desktop \u2502 \u2502 User accounts \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,i.jsx)(r.h2,{id:"key-directories",children:"Key Directories"}),"\n",(0,i.jsx)(r.h3,{id:"development-ai-server",children:"Development (AI-Server)"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:"~/PycharmProjects/CmdForge/ # Source code\n~/.cmdforge/ # Local tools storage\n~/.local/bin/cmdforge # CLI symlink\n"})}),"\n",(0,i.jsx)(r.h3,{id:"production-openmediavault",children:"Production (OpenMediaVault)"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:"/srv/mergerfs/data_pool/home/rob/cmdforge-registry/ # Deployed code\n/tmp/cmdforge-data/ # Runtime database\n"})}),"\n",(0,i.jsx)(r.h2,{id:"recent-changes",children:"Recent Changes"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": ",(0,i.jsx)(r.strong,{children:"GUI conversion"})," - Replaced urwid TUI with PySide6 desktop GUI"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": Modern GUI with sidebar navigation (My Tools, Registry, Providers)"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": GUI Tool Builder for creating/editing tools visually"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": GUI Registry browser with search and one-click install"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": GUI Connect dialog with polling-based account pairing"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": App pairing - connect GUI to web account without manual token copying"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": ",(0,i.jsx)(r.code,{children:"cmdforge config connect "})," command for CLI-based pairing"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),': "Connections" dashboard replaces "API Tokens" for simpler app management']}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-14"}),": Private tool sync - auto-publish tools privately when connected"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": Tool search and filtering with faceted results"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": Docker containers: ",(0,i.jsx)(r.code,{children:"Dockerfile.ready"})," (pre-installed), ",(0,i.jsx)(r.code,{children:"Dockerfile.test-install"})," (fresh)"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": Interactive installer script (",(0,i.jsx)(r.code,{children:"install.sh"}),")"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": Database migration system (auto-adds missing columns)"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": Gunicorn production server (replaced Flask dev server)"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": CI/CD auto-deploy via Gitea webhook"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": Full ToolSource support in registry (source_json)"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-13"}),": Improved error messages with line numbers and call stacks"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-03"}),": Migrated from SmartTools to CmdForge"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"2026-01-03"}),": Added source field support for Fabric imports"]}),"\n"]})]})}function a(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,r,n){n.d(r,{R:()=>t,x:()=>d});var s=n(6540);const i={},o=s.createContext(i);function t(e){const r=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(o.Provider,{value:r},e.children)}}}]);