diff --git a/404.html b/404.html index aa1b2f4..cfa763c 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@
new-project Script",id:"the-new-project-script",level:2},{value:"What It Creates",id:"what-it-creates",level:3},{value:"Usage",id:"usage",level:3},{value:"Architecture",id:"architecture",level:2},{value:"Key Classes",id:"key-classes",level:3},{value:"Project Structure",id:"project-structure",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Gitea API Token",id:"gitea-api-token",level:3},{value:"Template Placeholders",id:"template-placeholders",level:2},{value:"Related Projects",id:"related-projects",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"development-hub",children:"Development Hub"})}),"\n",(0,i.jsx)(t.p,{children:"Central orchestration project for managing Rob's multi-project development ecosystem."}),"\n",(0,i.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(t.p,{children:"Development Hub provides:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"GUI Application"})," - PyQt6 workspace with project list, splittable terminal panes, and session persistence"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"CLI Tools"})," - Scripts to create and manage projects following consistent patterns"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Centralized Documentation"})," - Docusaurus-based docs with Gitea Pages deployment"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"gui-application",children:"GUI Application"}),"\n",(0,i.jsx)(t.p,{children:"A PyQt6-based workspace for managing your development projects."}),"\n",(0,i.jsx)(t.h3,{id:"running-the-app",children:"Running the App"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"cd ~/PycharmProjects/development-hub\nsource .venv/bin/activate\npython -m development_hub\n"})}),"\n",(0,i.jsx)(t.h3,{id:"features",children:"Features"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Project List"})," - Auto-discovers projects, right-click for actions (terminal, editor, Gitea, docs, deploy)"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Splittable Panes"})," - Horizontal/vertical splits, each pane has its own tab bar"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"PTY Terminals"})," - Full terminal emulation with TUI support (vim, htop work)"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Drag & Drop"})," - Drop files/folders into terminal to inject paths"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Session Persistence"})," - Remembers pane layout and open terminals on restart"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"New Project Dialog"})," - Create projects with optional Ramble voice input"]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Shortcut"}),(0,i.jsx)(t.th,{children:"Action"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+Shift+T"})}),(0,i.jsx)(t.td,{children:"New terminal tab"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+Shift+W"})}),(0,i.jsx)(t.td,{children:"Close current tab"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+Shift+D"})}),(0,i.jsx)(t.td,{children:"Split horizontal"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+Shift+E"})}),(0,i.jsx)(t.td,{children:"Split vertical"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+Shift+P"})}),(0,i.jsx)(t.td,{children:"Close active pane"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+Alt+Left/Right"})}),(0,i.jsx)(t.td,{children:"Switch panes"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+B"})}),(0,i.jsx)(t.td,{children:"Toggle project panel"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Ctrl+N"})}),(0,i.jsx)(t.td,{children:"New project dialog"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"F5"})}),(0,i.jsx)(t.td,{children:"Refresh project list"})]})]})]}),"\n",(0,i.jsxs)(t.h2,{id:"the-new-project-script",children:["The ",(0,i.jsx)(t.code,{children:"new-project"})," Script"]}),"\n",(0,i.jsxs)(t.p,{children:["The main tool is ",(0,i.jsx)(t.code,{children:"new-project"}),", which automates creating a new project in the ecosystem:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'new-project my-tool --title "My Tool" --tagline "Does useful things"\n'})}),"\n",(0,i.jsx)(t.h3,{id:"what-it-creates",children:"What It Creates"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Gitea repository"})," at ",(0,i.jsx)(t.code,{children:"gitea.brrd.tech/rob/my-tool"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Local project"})," at ",(0,i.jsx)(t.code,{children:"~/PycharmProjects/my-tool/"})," with:","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"CLAUDE.md"})," - AI assistant context"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"README.md"})," - Project readme"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"pyproject.toml"})," - Python packaging"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:".gitignore"})," - Standard ignores"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"docs/"})," - Symlink to centralized docs"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Documentation folder"})," at ",(0,i.jsx)(t.code,{children:"project-docs/docs/projects/my-tool/"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Build configuration"})," in ",(0,i.jsx)(t.code,{children:"build-public-docs.sh"})]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'# Full specification\nnew-project myproject --title "My Project" --tagline "Short description"\n\n# Interactive mode (prompts for title/tagline)\nnew-project myproject\n\n# Options\n--dry-run Show what would happen without making changes\n--skip-gitea Skip Gitea repo creation (for offline use)\n--help Show help\n'})}),"\n",(0,i.jsx)(t.h2,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"src/development_hub/\n\u251c\u2500\u2500 __init__.py\n\u251c\u2500\u2500 __main__.py # Entry point\n\u251c\u2500\u2500 app.py # QApplication subclass\n\u251c\u2500\u2500 main_window.py # Main window with menus\n\u251c\u2500\u2500 project_list.py # Left panel - project discovery & context menu\n\u251c\u2500\u2500 workspace.py # Right panel - splittable panes with tabs\n\u251c\u2500\u2500 terminal_widget.py # PTY terminal with pyte emulation\n\u251c\u2500\u2500 project_discovery.py # Parse projects from build-public-docs.sh\n\u251c\u2500\u2500 dialogs.py # New Project (with Ramble), Settings dialogs\n\u251c\u2500\u2500 settings.py # JSON persistence for settings & session\n\u2514\u2500\u2500 styles.py # Dark theme stylesheet\n"})}),"\n",(0,i.jsx)(t.h3,{id:"key-classes",children:"Key Classes"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Class"}),(0,i.jsx)(t.th,{children:"File"}),(0,i.jsx)(t.th,{children:"Purpose"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"MainWindow"})}),(0,i.jsx)(t.td,{children:"main_window.py"}),(0,i.jsx)(t.td,{children:"QMainWindow with menus, splitter layout"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"ProjectListWidget"})}),(0,i.jsx)(t.td,{children:"project_list.py"}),(0,i.jsx)(t.td,{children:"Project list with context menu actions"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"WorkspaceManager"})}),(0,i.jsx)(t.td,{children:"workspace.py"}),(0,i.jsx)(t.td,{children:"Manages splittable pane layout"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PaneWidget"})}),(0,i.jsx)(t.td,{children:"workspace.py"}),(0,i.jsx)(t.td,{children:"Tab container within a pane"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"TerminalWidget"})}),(0,i.jsx)(t.td,{children:"terminal_widget.py"}),(0,i.jsx)(t.td,{children:"PTY-based terminal with pyte screen emulation"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"project-structure",children:"Project Structure"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"development-hub/\n\u251c\u2500\u2500 src/development_hub/ # GUI application (see Architecture above)\n\u251c\u2500\u2500 bin/\n\u2502 \u2514\u2500\u2500 new-project # CLI scaffolding script\n\u251c\u2500\u2500 templates/\n\u2502 \u251c\u2500\u2500 gitignore.template # Python .gitignore with docs exclusion\n\u2502 \u251c\u2500\u2500 CLAUDE.md.template # AI context file\n\u2502 \u251c\u2500\u2500 README.md.template # Basic README\n\u2502 \u251c\u2500\u2500 pyproject.toml.template\n\u2502 \u251c\u2500\u2500 overview.md.template # Docs overview\n\u2502 \u2514\u2500\u2500 updating-documentation.md.template\n\u251c\u2500\u2500 docs/ # Symlink to project-docs\n\u251c\u2500\u2500 pyproject.toml # Python packaging with PyQt6 dep\n\u251c\u2500\u2500 CLAUDE.md\n\u2514\u2500\u2500 README.md\n"})}),"\n",(0,i.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(t.h3,{id:"gitea-api-token",children:"Gitea API Token"}),"\n",(0,i.jsx)(t.p,{children:"The script needs a Gitea API token to create repositories automatically."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Setup options:"})}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Environment variable: ",(0,i.jsx)(t.code,{children:"export GITEA_TOKEN=your_token"})]}),"\n",(0,i.jsxs)(t.li,{children:["Config file: ",(0,i.jsx)(t.code,{children:"~/.config/development-hub/gitea-token"})]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The script will prompt for the token on first run and save it automatically."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Creating a token:"})}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Go to ",(0,i.jsx)(t.a,{href:"https://gitea.brrd.tech/user/settings/applications",children:"https://gitea.brrd.tech/user/settings/applications"})]}),"\n",(0,i.jsx)(t.li,{children:"Generate a new token with 'repo' scope"}),"\n",(0,i.jsx)(t.li,{children:"Copy the token when prompted"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"template-placeholders",children:"Template Placeholders"}),"\n",(0,i.jsx)(t.p,{children:"When creating new projects, templates use these placeholders:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Placeholder"}),(0,i.jsx)(t.th,{children:"Description"}),(0,i.jsx)(t.th,{children:"Example"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{{PROJECT_NAME}}"})}),(0,i.jsx)(t.td,{children:"Lowercase project name"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"my-tool"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{{PROJECT_TITLE}}"})}),(0,i.jsx)(t.td,{children:"Display title"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"My Tool"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{{PROJECT_TAGLINE}}"})}),(0,i.jsx)(t.td,{children:"Short description"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"Does useful things"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{{YEAR}}"})}),(0,i.jsx)(t.td,{children:"Current year"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"2026"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{{DATE}}"})}),(0,i.jsx)(t.td,{children:"Creation date"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"2026-01-06"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{{GITEA_URL}}"})}),(0,i.jsx)(t.td,{children:"Gitea server URL"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"https://gitea.brrd.tech"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{{GITEA_OWNER}}"})}),(0,i.jsx)(t.td,{children:"Repository owner"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"rob"})})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"related-projects",children:"Related Projects"}),"\n",(0,i.jsx)(t.p,{children:"Development Hub manages these projects:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Project"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"../cmdforge/overview",children:"CmdForge"})}),(0,i.jsx)(t.td,{children:"AI-powered CLI tool builder"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"../cascadingdev/overview",children:"CascadingDev"})}),(0,i.jsx)(t.td,{children:"Cascading Development Framework"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"../orchestrated-discussions/overview",children:"Orchestrated Discussions"})}),(0,i.jsx)(t.td,{children:"AI Discussion Framework"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"../artifact-editor/overview",children:"Artifact Editor"})}),(0,i.jsx)(t.td,{children:"Code Artifact Editor"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"../ramble/overview",children:"Ramble"})}),(0,i.jsx)(t.td,{children:"Voice Note Transcription"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["All projects follow the same patterns and can be created using ",(0,i.jsx)(t.code,{children:"new-project"}),"."]})]})}function a(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,t,n){n.d(t,{R:()=>c,x:()=>l});var r=n(6540);const i={},s=r.createContext(i);function c(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1db64337.e2b8ddcf.js b/assets/js/1db64337.e2b8ddcf.js
deleted file mode 100644
index 8f37450..0000000
--- a/assets/js/1db64337.e2b8ddcf.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[413],{6785(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"overview","title":"Development Hub","description":"Central orchestration project for managing Rob\'s multi-project development ecosystem.","source":"@site/docs/overview.md","sourceDirName":".","slug":"/","permalink":"/rob/development-hub/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","sidebar_position":1},"sidebar":"docs"}');var i=t(4848),s=t(8453);const l={slug:"/",sidebar_position:1},o="Development Hub",c={},d=[{value:"Overview",id:"overview",level:2},{value:"GUI Application",id:"gui-application",level:2},{value:"Running the App",id:"running-the-app",level:3},{value:"Features",id:"features",level:3},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"The new-project Script",id:"the-new-project-script",level:2},{value:"What It Creates",id:"what-it-creates",level:3},{value:"Usage",id:"usage",level:3},{value:"Project Structure",id:"project-structure",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Gitea API Token",id:"gitea-api-token",level:3},{value:"Related Projects",id:"related-projects",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"development-hub",children:"Development Hub"})}),"\n",(0,i.jsx)(n.p,{children:"Central orchestration project for managing Rob's multi-project development ecosystem."}),"\n",(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(n.p,{children:"Development Hub provides:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GUI Application"})," - PyQt6 workspace with project list, splittable terminal panes, and session persistence"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"CLI Tools"})," - Scripts to create and manage projects following consistent patterns"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Centralized Documentation"})," - Docusaurus-based docs with Gitea Pages deployment"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"gui-application",children:"GUI Application"}),"\n",(0,i.jsx)(n.p,{children:"A PyQt6-based workspace for managing your development projects."}),"\n",(0,i.jsx)(n.h3,{id:"running-the-app",children:"Running the App"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/PycharmProjects/development-hub\nsource .venv/bin/activate\npython -m development_hub\n"})}),"\n",(0,i.jsx)(n.h3,{id:"features",children:"Features"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Project List"})," - Auto-discovers projects, right-click for actions (terminal, editor, Gitea, docs, deploy)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Splittable Panes"})," - Horizontal/vertical splits, each pane has its own tab bar"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PTY Terminals"})," - Full terminal emulation with TUI support (vim, htop work)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Drag & Drop"})," - Drop files/folders into terminal to inject paths"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Session Persistence"})," - Remembers pane layout and open terminals on restart"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"New Project Dialog"})," - Create projects with optional Ramble voice input"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Shortcut"}),(0,i.jsx)(n.th,{children:"Action"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Ctrl+Shift+T"})}),(0,i.jsx)(n.td,{children:"New terminal tab"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Ctrl+Shift+W"})}),(0,i.jsx)(n.td,{children:"Close current tab"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Ctrl+Shift+D"})}),(0,i.jsx)(n.td,{children:"Split horizontal"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Ctrl+Shift+E"})}),(0,i.jsx)(n.td,{children:"Split vertical"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Ctrl+Alt+Left/Right"})}),(0,i.jsx)(n.td,{children:"Switch panes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Ctrl+B"})}),(0,i.jsx)(n.td,{children:"Toggle project panel"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Ctrl+N"})}),(0,i.jsx)(n.td,{children:"New project dialog"})]})]})]}),"\n",(0,i.jsxs)(n.h2,{id:"the-new-project-script",children:["The ",(0,i.jsx)(n.code,{children:"new-project"})," Script"]}),"\n",(0,i.jsxs)(n.p,{children:["The main tool is ",(0,i.jsx)(n.code,{children:"new-project"}),", which automates creating a new project in the ecosystem:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'new-project my-tool --title "My Tool" --tagline "Does useful things"\n'})}),"\n",(0,i.jsx)(n.h3,{id:"what-it-creates",children:"What It Creates"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Gitea repository"})," at ",(0,i.jsx)(n.code,{children:"gitea.brrd.tech/rob/my-tool"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Local project"})," at ",(0,i.jsx)(n.code,{children:"~/PycharmProjects/my-tool/"})," with:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CLAUDE.md"})," - AI assistant context"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"README.md"})," - Project readme"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"pyproject.toml"})," - Python packaging"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:".gitignore"})," - Standard ignores"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"docs/"})," - Symlink to centralized docs"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Documentation folder"})," at ",(0,i.jsx)(n.code,{children:"project-docs/docs/projects/my-tool/"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Build configuration"})," in ",(0,i.jsx)(n.code,{children:"build-public-docs.sh"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'# Full specification\nnew-project myproject --title "My Project" --tagline "Short description"\n\n# Interactive mode (prompts for title/tagline)\nnew-project myproject\n\n# Options\n--dry-run Show what would happen without making changes\n--skip-gitea Skip Gitea repo creation (for offline use)\n--help Show help\n'})}),"\n",(0,i.jsx)(n.h2,{id:"project-structure",children:"Project Structure"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"development-hub/\n\u251c\u2500\u2500 src/development_hub/ # GUI application\n\u2502 \u251c\u2500\u2500 main_window.py # Main window with menus\n\u2502 \u251c\u2500\u2500 project_list.py # Project discovery & context menu\n\u2502 \u251c\u2500\u2500 workspace.py # Splittable pane layout\n\u2502 \u251c\u2500\u2500 terminal_widget.py # PTY terminal with pyte\n\u2502 \u251c\u2500\u2500 dialogs.py # New Project, Settings dialogs\n\u2502 \u2514\u2500\u2500 ...\n\u251c\u2500\u2500 bin/\n\u2502 \u2514\u2500\u2500 new-project # CLI scaffolding script\n\u251c\u2500\u2500 templates/ # Project templates\n\u251c\u2500\u2500 docs/ # Symlink to this folder\n\u251c\u2500\u2500 pyproject.toml\n\u251c\u2500\u2500 CLAUDE.md\n\u2514\u2500\u2500 README.md\n"})}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n.h3,{id:"gitea-api-token",children:"Gitea API Token"}),"\n",(0,i.jsx)(n.p,{children:"The script needs a Gitea API token to create repositories automatically."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Setup options:"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Environment variable: ",(0,i.jsx)(n.code,{children:"export GITEA_TOKEN=your_token"})]}),"\n",(0,i.jsxs)(n.li,{children:["Config file: ",(0,i.jsx)(n.code,{children:"~/.config/development-hub/gitea-token"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The script will prompt for the token on first run and save it automatically."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Creating a token:"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Go to ",(0,i.jsx)(n.a,{href:"https://gitea.brrd.tech/user/settings/applications",children:"https://gitea.brrd.tech/user/settings/applications"})]}),"\n",(0,i.jsx)(n.li,{children:"Generate a new token with 'repo' scope"}),"\n",(0,i.jsx)(n.li,{children:"Copy the token when prompted"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"related-projects",children:"Related Projects"}),"\n",(0,i.jsx)(n.p,{children:"Development Hub manages these projects:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Project"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"../cmdforge/overview",children:"CmdForge"})}),(0,i.jsx)(n.td,{children:"AI-powered CLI tool builder"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"../cascadingdev/overview",children:"CascadingDev"})}),(0,i.jsx)(n.td,{children:"Cascading Development Framework"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"../orchestrated-discussions/overview",children:"Orchestrated Discussions"})}),(0,i.jsx)(n.td,{children:"AI Discussion Framework"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"../artifact-editor/overview",children:"Artifact Editor"})}),(0,i.jsx)(n.td,{children:"Code Artifact Editor"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"../ramble/overview",children:"Ramble"})}),(0,i.jsx)(n.td,{children:"Voice Note Transcription"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["All projects follow the same patterns and can be created using ",(0,i.jsx)(n.code,{children:"new-project"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453(e,n,t){t.d(n,{R:()=>l,x:()=>o});var r=t(6540);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.20c2acbd.js b/assets/js/runtime~main.95ff8c89.js
similarity index 96%
rename from assets/js/runtime~main.20c2acbd.js
rename to assets/js/runtime~main.95ff8c89.js
index 8995d79..e58a2ff 100644
--- a/assets/js/runtime~main.20c2acbd.js
+++ b/assets/js/runtime~main.95ff8c89.js
@@ -1 +1 @@
-(()=>{"use strict";var e,r,t,a,o,n={},i={};function l(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(t.exports,t,t.exports,l),t.loaded=!0,t.exports}l.m=n,l.c=i,e=[],l.O=(r,t,a,o)=>{if(!t){var n=1/0;for(d=0;d| Shortcut | Action |
|---|---|
Ctrl+Shift+T | New terminal tab |
Ctrl+Shift+W | Close current tab |
Ctrl+Shift+D | Split horizontal |
Ctrl+Shift+E | Split vertical |
Ctrl+Alt+Left/Right | Switch panes |
Ctrl+B | Toggle project panel |
Ctrl+N | New project dialog |
| Shortcut | Action |
|---|---|
Ctrl+Shift+T | New terminal tab |
Ctrl+Shift+W | Close current tab |
Ctrl+Shift+D | Split horizontal |
Ctrl+Shift+E | Split vertical |
Ctrl+Shift+P | Close active pane |
Ctrl+Alt+Left/Right | Switch panes |
Ctrl+B | Toggle project panel |
Ctrl+N | New project dialog |
F5 | Refresh project list |
new-project ScriptThe main tool is new-project, which automates creating a new project in the ecosystem:
new-project my-tool --title "My Tool" --tagline "Does useful things"
# Full specification
new-project myproject --title "My Project" --tagline "Short description"
# Interactive mode (prompts for title/tagline)
new-project myproject
# Options
--dry-run Show what would happen without making changes
--skip-gitea Skip Gitea repo creation (for offline use)
--help Show help
src/development_hub/
├── __init__.py
├── __main__.py # Entry point
├── app.py # QApplication subclass
├── main_window.py # Main window with menus
├── project_list.py # Left panel - project discovery & context menu
├── workspace.py # Right panel - splittable panes with tabs
├── terminal_widget.py # PTY terminal with pyte emulation
├── project_discovery.py # Parse projects from build-public-docs.sh
├── dialogs.py # New Project (with Ramble), Settings dialogs
├── settings.py # JSON persistence for settings & session
└── styles.py # Dark theme stylesheet
| Class | File | Purpose |
|---|---|---|
MainWindow | main_window.py | QMainWindow with menus, splitter layout |
ProjectListWidget | project_list.py | Project list with context menu actions |
WorkspaceManager | workspace.py | Manages splittable pane layout |
PaneWidget | workspace.py | Tab container within a pane |
TerminalWidget | terminal_widget.py | PTY-based terminal with pyte screen emulation |
development-hub/
├── src/development_hub/ # GUI application
│ ├── main_window.py # Main window with menus
│ ├── project_list.py # Project discovery & context menu
│ ├── workspace.py # Splittable pane layout
│ ├── terminal_widget.py # PTY terminal with pyte
│ ├── dialogs.py # New Project, Settings dialogs
│ └── ...
├── bin/
│ └── new-project # CLI scaffolding script
├── templates/ # Project templates
├── docs/ # Symlink to this folder
├── pyproject.toml
├── CLAUDE.md
└── README.md
development-hub/
├── src/development_hub/ # GUI application (see Architecture above)
├── bin/
│ └── new-project # CLI scaffolding script
├── templates/
│ ├── gitignore.template # Python .gitignore with docs exclusion
│ ├── CLAUDE.md.template # AI context file
│ ├── README.md.template # Basic README
│ ├── pyproject.toml.template
│ ├── overview.md.template # Docs overview
│ └── updating-documentation.md.template
├── docs/ # Symlink to project-docs
├── pyproject.toml # Python packaging with PyQt6 dep
├── CLAUDE.md
└── README.md
The script needs a Gitea API token to create repositories automatically.
@@ -72,9 +76,12 @@When creating new projects, templates use these placeholders:
+| Placeholder | Description | Example |
|---|---|---|
{{PROJECT_NAME}} | Lowercase project name | my-tool |
{{PROJECT_TITLE}} | Display title | My Tool |
{{PROJECT_TAGLINE}} | Short description | Does useful things |
{{YEAR}} | Current year | 2026 |
{{DATE}} | Creation date | 2026-01-06 |
{{GITEA_URL}} | Gitea server URL | https://gitea.brrd.tech |
{{GITEA_OWNER}} | Repository owner | rob |
Development Hub manages these projects:
| Project | Description |
|---|---|
| CmdForge | AI-powered CLI tool builder |
| CascadingDev | Cascading Development Framework |
| Orchestrated Discussions | AI Discussion Framework |
| Artifact Editor | Code Artifact Editor |
| Ramble | Voice Note Transcription |
All projects follow the same patterns and can be created using new-project.
All projects follow the same patterns and can be created using new-project.