"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[393],{8363(e,s,i){i.r(s),i.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>r,frontMatter:()=>n,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"todos","title":"CmdForge TODOs","description":"Active Tasks","source":"@site/docs/todos.md","sourceDirName":".","slug":"/todos","permalink":"/rob/CmdForge/todos","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"type":"todos","project":"cmdforge","updated":"2026-01-17T00:00:00.000Z","sidebar_position":6},"sidebar":"docs","previous":{"title":"Web UI Design","permalink":"/rob/CmdForge/reference/web-ui-spec"},"next":{"title":"Goals","permalink":"/rob/CmdForge/goals"}}');var c=i(4848),l=i(8453);const n={type:"todos",project:"cmdforge",updated:new Date("2026-01-17T00:00:00.000Z"),sidebar_position:6},d="CmdForge TODOs",a={},o=[{value:"Active Tasks",id:"active-tasks",level:2},{value:"Low Priority",id:"low-priority",level:3},{value:"Completed",id:"completed",level:2},{value:"Ideas / Backlog",id:"ideas--backlog",level:2},{value:"Known Issues",id:"known-issues",level:2}];function h(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",input:"input",li:"li",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.header,{children:(0,c.jsx)(s.h1,{id:"cmdforge-todos",children:"CmdForge TODOs"})}),"\n",(0,c.jsx)(s.h2,{id:"active-tasks",children:"Active Tasks"}),"\n",(0,c.jsx)(s.h3,{id:"low-priority",children:"Low Priority"}),"\n",(0,c.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Email verification for registration"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Video embed component for tutorials"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Schema.org structured data for SEO"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",disabled:!0})," ","PWA features (offline support, install prompt)"]}),"\n"]}),"\n",(0,c.jsx)(s.h2,{id:"completed",children:"Completed"}),"\n",(0,c.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Project dependency system (",(0,c.jsx)(s.code,{children:"cmdforge install"}),") @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,c.jsx)(s.code,{children:"cmdforge add"})," command @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Dependency resolution for meta-tools @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Password reset flow @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Collections CLI commands (",(0,c.jsx)(s.code,{children:"cmdforge collections list/info/install"}),") @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Admin collections management UI @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Improve error messages and debugging @M1 #medium (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Set up CI/CD pipeline with Gitea webhook @M1 #medium (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add source field display to web UI @M1 #medium (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Set up gunicorn for production server @M1 #medium (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Enable systemd linger for service persistence @M1 #medium (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Fix Dockerfile - remove docs/ symlink copy #medium (2026-01-10)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Create public documentation with Docusaurus @M1 #medium (2026-01-05)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Set up systemd service on production @M1 #medium (2025-12-05)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Migrate from SmartTools to CmdForge naming #medium (2025-12-15)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add ToolSource dataclass for attribution #medium (2025-12-10)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Create Fabric import script #medium (2025-12-08)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Fix database persistence with backup/restore #medium (2025-12-03)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Update cron jobs to use cmdforge names #medium (2025-12-01)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Implement YAML tool definition system @M0 #medium (2025-12-01)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Create CLI entry point and subcommands @M0 #medium (2025-11-15)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Build provider abstraction layer @M0 #medium (2025-11-10)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add offline caching for tools @M0 #medium (2025-11-05)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Create web UI for tool browsing @M0 #medium (2025-10-20)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool execution engine @M0 #medium (2025-10-15)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","YAML tool definition system @M0 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","CLI entry point and subcommands @M0 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Provider abstraction layer @M0 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Offline caching for tools @M0 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Web UI for tool browsing @M0 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Public documentation @M1 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Systemd service setup @M1 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Gunicorn production server @M1 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Systemd linger for persistence @M1 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","CI/CD pipeline @M1 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Error message improvements @M1 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Source field display in web UI @M1 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","TUI Registry browser @M2 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","TUI Publishing with token input @M2 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Docker containers (test + ready) @M2 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Interactive installer script @M2 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Database migration system @M2 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool search and filtering @M2 #high (2026-01-13)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","App pairing/connection flow @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Registry curation system @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","PySide6 GUI conversion @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","GUI Registry browser @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","GUI Publishing with connect flow @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool ratings/reviews @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool marketplace UI enhancements @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","AI persona profiles @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","AI-assisted code generation @M2 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Import Fabric patterns (233 total) @M3 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Scheduled Fabric repo sync @M3 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Auto-vetting pipeline integration @M3 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Community tool submissions workflow @M3 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Duplicate detection automation @M3 #high (2026-01-14)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Collections CLI commands @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Visual node-based step editor @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool visualization improvements @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Drag-and-drop step reordering @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool composition and chaining UI @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Auto-populate dependencies for ToolStep in GUI @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,c.jsx)(s.code,{children:"--auto-install"})," flag for runtime dependency installation @M4 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Interactive onboarding walkthroughs @M4 #medium (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Project dependency system (",(0,c.jsx)(s.code,{children:"cmdforge install"}),") @M5 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,c.jsx)(s.code,{children:"cmdforge add"})," command @M5 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Dependency resolution for meta-tools @M5 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool versioning support @M5 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Version constraints in manifests @M5 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Simple theming (external QSS files) @M5 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Dark mode @M5 #high (2026-01-17)"]}),"\n",(0,c.jsxs)(s.li,{className:"task-list-item",children:[(0,c.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Tool testing framework @M5 #high (2026-01-17)"]}),"\n"]}),"\n",(0,c.jsx)(s.h2,{id:"ideas--backlog",children:"Ideas / Backlog"}),"\n",(0,c.jsxs)(s.ul,{children:["\n",(0,c.jsx)(s.li,{children:"Tool usage analytics"}),"\n",(0,c.jsx)(s.li,{children:"GUI tool builder (visual YAML editor)"}),"\n",(0,c.jsx)(s.li,{children:"VS Code extension"}),"\n",(0,c.jsx)(s.li,{children:"Provider auto-detection"}),"\n",(0,c.jsx)(s.li,{children:"Parallel tool step execution"}),"\n",(0,c.jsx)(s.li,{children:"Conditional step execution (skip based on conditions)"}),"\n",(0,c.jsx)(s.li,{children:"Tool aliases (shorthand names for frequently used tools)"}),"\n",(0,c.jsx)(s.li,{children:"Output caching for identical inputs"}),"\n",(0,c.jsx)(s.li,{children:"CDN setup for static assets"}),"\n",(0,c.jsx)(s.li,{children:"Accessibility testing (WCAG 2.1 AA formal verification)"}),"\n",(0,c.jsx)(s.li,{children:"Newsletter signup with double opt-in"}),"\n",(0,c.jsx)(s.li,{children:"A/B testing for landing page"}),"\n",(0,c.jsx)(s.li,{children:"Premium publisher tiers"}),"\n",(0,c.jsx)(s.li,{children:"Internationalization (i18n)"}),"\n"]}),"\n",(0,c.jsx)(s.h2,{id:"known-issues",children:"Known Issues"}),"\n",(0,c.jsxs)(s.table,{children:[(0,c.jsx)(s.thead,{children:(0,c.jsxs)(s.tr,{children:[(0,c.jsx)(s.th,{children:"Issue"}),(0,c.jsx)(s.th,{children:"Status"}),(0,c.jsx)(s.th,{children:"Workaround"})]})}),(0,c.jsxs)(s.tbody,{children:[(0,c.jsxs)(s.tr,{children:[(0,c.jsx)(s.td,{children:"MergerFS SQLite limitation"}),(0,c.jsx)(s.td,{children:"Resolved"}),(0,c.jsx)(s.td,{children:"Database moved to /var/tmp on root filesystem"})]}),(0,c.jsxs)(s.tr,{children:[(0,c.jsx)(s.td,{children:"Service persistence"}),(0,c.jsx)(s.td,{children:"Resolved"}),(0,c.jsx)(s.td,{children:"Systemd linger now enabled"})]}),(0,c.jsxs)(s.tr,{children:[(0,c.jsx)(s.td,{children:"Flask dev server"}),(0,c.jsx)(s.td,{children:"Resolved"}),(0,c.jsx)(s.td,{children:"Now using gunicorn for production"})]})]})]})]})}function r(e={}){const{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,c.jsx)(s,{...e,children:(0,c.jsx)(h,{...e})}):h(e)}},8453(e,s,i){i.d(s,{R:()=>n,x:()=>d});var t=i(6540);const c={},l=t.createContext(c);function n(e){const s=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:n(e.components),t.createElement(l.Provider,{value:s},e.children)}}}]);