@aion0/forge 0.5.26 → 0.5.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.forge/worktrees/pipeline-4dd8dc2d/CLAUDE.md +86 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/README.md +136 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/RELEASE_NOTES.md +36 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/agents/route.ts +17 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/[...nextauth]/route.ts +3 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/verify/route.ts +46 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/route.ts +31 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/stream/route.ts +63 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/route.ts +28 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/entries/route.ts +23 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/live/route.ts +72 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/route.ts +37 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/sync/route.ts +17 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-templates/route.ts +145 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/code/route.ts +299 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/[id]/route.ts +62 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/route.ts +40 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/detect-cli/route.ts +46 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/route.ts +176 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/sessions/route.ts +54 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/favorites/route.ts +26 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/route.ts +6 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/run/route.ts +19 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/git/route.ts +149 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/help/route.ts +84 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/issue-scanner/route.ts +116 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/logs/route.ts +100 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/mobile-chat/route.ts +115 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/monitor/route.ts +74 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notifications/route.ts +42 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notify/test/route.ts +33 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/online/route.ts +40 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/[id]/route.ts +41 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/route.ts +90 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/plugins/route.ts +75 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/[...path]/route.ts +64 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/route.ts +156 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-pipelines/route.ts +91 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-sessions/route.ts +61 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/projects/route.ts +26 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/chat/route.ts +64 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/messages/route.ts +9 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/route.ts +17 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/route.ts +20 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/settings/route.ts +64 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/local/route.ts +228 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/route.ts +182 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/smith-templates/route.ts +81 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/status/route.ts +12 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tabs/route.ts +25 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/route.ts +51 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/stream/route.ts +77 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/link/route.ts +37 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/route.ts +44 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/session/route.ts +14 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/telegram/route.ts +23 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/templates/route.ts +6 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-bell/route.ts +39 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-cwd/route.ts +19 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-state/route.ts +15 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tunnel/route.ts +26 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/upgrade/route.ts +43 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/usage/route.ts +20 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/version/route.ts +78 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/watchers/route.ts +33 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/agents/route.ts +35 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/memory/route.ts +23 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/smith/route.ts +22 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/stream/route.ts +31 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/route.ts +79 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/global-error.tsx +21 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/globals.css +52 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.ico +0 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.png +0 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.svg +106 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/layout.tsx +17 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/login/LoginForm.tsx +96 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/login/page.tsx +10 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/mobile/page.tsx +10 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/app/page.tsx +22 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/bin/forge-server.mjs +484 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/check-forge-status.sh +71 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/cli/mw.ts +579 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/BrowserPanel.tsx +175 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ChatPanel.tsx +191 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ClaudeTerminal.tsx +267 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/CodeViewer.tsx +787 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationEditor.tsx +411 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationGraphView.tsx +347 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationTerminalView.tsx +303 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/Dashboard.tsx +807 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/DashboardWrapper.tsx +9 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryFlowEditor.tsx +491 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryList.tsx +230 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryWorkspace.tsx +589 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/DocTerminal.tsx +187 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/DocsViewer.tsx +574 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpDialog.tsx +169 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpTerminal.tsx +141 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/InlinePipelineView.tsx +111 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/LogViewer.tsx +194 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/MarkdownContent.tsx +73 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/MobileView.tsx +385 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/MonitorPanel.tsx +122 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/NewSessionModal.tsx +93 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/NewTaskModal.tsx +492 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineEditor.tsx +570 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineView.tsx +1018 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/PluginsPanel.tsx +472 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectDetail.tsx +1618 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectList.tsx +108 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectManager.tsx +401 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionList.tsx +74 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionView.tsx +726 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/SettingsModal.tsx +1647 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/SkillsPanel.tsx +969 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/StatusBar.tsx +99 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/TabBar.tsx +46 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskBoard.tsx +113 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskDetail.tsx +372 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/TerminalLauncher.tsx +398 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/TunnelToggle.tsx +206 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/UsagePanel.tsx +207 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/WebTerminal.tsx +1743 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceTree.tsx +221 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceView.tsx +4048 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/dev-test.sh +5 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Memory_Layer_Design.docx +0 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Strategy_Research_2026.docx +0 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/docs/LOCAL-DEPLOY.md +144 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/docs/roadmap-multi-agent-workflow.md +330 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.png +0 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.svg +106 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/hooks/useSidebarResize.ts +52 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/install.sh +29 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/instrumentation.ts +35 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/claude-adapter.ts +104 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/generic-adapter.ts +64 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/index.ts +245 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/types.ts +70 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/artifacts.ts +106 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/auth.ts +62 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/docker.yaml +70 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/http.yaml +66 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/jenkins.yaml +92 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/llm-vision.yaml +85 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/playwright.yaml +111 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/shell-command.yaml +60 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/slack.yaml +48 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/webhook.yaml +56 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-process.ts +361 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-sessions.ts +266 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-templates.ts +227 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/cloudflared.ts +424 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/crypto.ts +67 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/delivery.ts +787 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/dirs.ts +99 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/flows.ts +86 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-mcp-server.ts +732 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-inbox.md +38 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-send.md +47 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-status.md +32 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-workspace-sync.md +37 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/00-overview.md +40 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/01-settings.md +194 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/02-telegram.md +41 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/03-tunnel.md +31 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/04-tasks.md +52 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/05-pipelines.md +460 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/06-skills.md +43 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/07-projects.md +73 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/08-rules.md +53 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/09-issue-autofix.md +55 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/10-troubleshooting.md +89 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/11-workspace.md +810 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/CLAUDE.md +62 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/init.ts +266 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/issue-scanner.ts +298 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/logger.ts +79 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/notifications.ts +75 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/notify.ts +108 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/password.ts +97 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline-scheduler.ts +373 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline.ts +1565 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/executor.ts +347 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/registry.ts +228 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/types.ts +103 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/project-sessions.ts +53 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/projects.ts +86 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-manager.ts +156 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-utils.ts +53 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-watcher.ts +345 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/settings.ts +195 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/skills.ts +458 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/task-manager.ts +951 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-bot.ts +1477 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-standalone.ts +83 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-server.ts +70 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-standalone.ts +438 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/usage-scanner.ts +249 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/state-machine.test.ts +388 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/workspace.test.ts +311 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-bus.ts +416 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-worker.ts +655 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/api-backend.ts +262 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/cli-backend.ts +491 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/index.ts +84 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/manager.ts +136 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/orchestrator.ts +3415 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/persistence.ts +309 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/presets.ts +649 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/requests.ts +287 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/session-monitor.ts +240 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/skill-installer.ts +275 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/smith-memory.ts +498 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/types.ts +241 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/watch-manager.ts +560 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace-standalone.ts +978 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/middleware.ts +51 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/next.config.ts +26 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/package.json +74 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-lock.yaml +3719 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-workspace.yaml +1 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/postcss.config.mjs +7 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/publish.sh +133 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/README.md +66 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/results/.gitignore +2 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/run.ts +635 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/task.md +26 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/validator.sh +46 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/setup.sh +19 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/task.md +48 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/validator.sh +69 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/setup.sh +82 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/task.md +30 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/validator.sh +29 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/scripts/verify-usage.ts +178 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/src/config/index.ts +129 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/src/core/db/database.ts +259 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/src/core/memory/strategy.ts +32 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/chat.ts +65 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/registry.ts +60 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/src/core/session/manager.ts +190 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/src/types/index.ts +129 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/start.sh +32 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/templates/smith-lead.json +45 -0
- package/.forge/worktrees/pipeline-4dd8dc2d/tsconfig.json +42 -0
- package/RELEASE_NOTES.md +11 -28
- package/app/api/terminal-bell/route.ts +6 -2
- package/components/WebTerminal.tsx +36 -2
- package/lib/terminal-standalone.ts +19 -2
- package/next-env.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
# Pipelines (Workflows)
|
|
2
|
+
|
|
3
|
+
## What Are Pipelines?
|
|
4
|
+
|
|
5
|
+
Pipelines chain multiple tasks into a DAG (directed acyclic graph). Each step can depend on previous steps, pass outputs forward, and run in parallel. Pipelines are defined as YAML workflow files.
|
|
6
|
+
|
|
7
|
+
## YAML Workflow Format
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
name: my-workflow
|
|
11
|
+
description: "What this workflow does"
|
|
12
|
+
input:
|
|
13
|
+
feature: "Feature description" # required input fields
|
|
14
|
+
priority: "Priority level (optional)"
|
|
15
|
+
vars:
|
|
16
|
+
project: my-app # default variables
|
|
17
|
+
nodes:
|
|
18
|
+
design:
|
|
19
|
+
project: "{{vars.project}}"
|
|
20
|
+
prompt: "Design: {{input.feature}}"
|
|
21
|
+
outputs:
|
|
22
|
+
- name: spec
|
|
23
|
+
extract: result
|
|
24
|
+
implement:
|
|
25
|
+
project: "{{vars.project}}"
|
|
26
|
+
depends_on: [design]
|
|
27
|
+
prompt: "Implement based on: {{nodes.design.outputs.spec}}"
|
|
28
|
+
outputs:
|
|
29
|
+
- name: diff
|
|
30
|
+
extract: git_diff
|
|
31
|
+
review:
|
|
32
|
+
project: "{{vars.project}}"
|
|
33
|
+
depends_on: [implement]
|
|
34
|
+
prompt: "Review the changes"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Node Options
|
|
38
|
+
|
|
39
|
+
| Field | Description | Default |
|
|
40
|
+
|-------|-------------|---------|
|
|
41
|
+
| `project` | Project name (supports templates) | required |
|
|
42
|
+
| `prompt` | Claude Code prompt or shell command | required |
|
|
43
|
+
| `mode` | `claude` (AI agent) or `shell` (raw command) | `claude` |
|
|
44
|
+
| `branch` | Auto-checkout branch before running (supports templates) | none |
|
|
45
|
+
| `depends_on` | List of node IDs that must complete first | `[]` |
|
|
46
|
+
| `outputs` | Extract results (see Output Extraction) | `[]` |
|
|
47
|
+
| `routes` | Conditional routing to next nodes (see Routing) | `[]` |
|
|
48
|
+
| `max_iterations` | Max loop iterations for routed nodes | `3` |
|
|
49
|
+
|
|
50
|
+
## Node Modes
|
|
51
|
+
|
|
52
|
+
### `claude` (default)
|
|
53
|
+
Runs the prompt via Claude Code (`claude -p`). The AI agent reads the codebase, makes changes, and returns a result.
|
|
54
|
+
|
|
55
|
+
### `shell`
|
|
56
|
+
Runs the prompt as a raw shell command (`bash -c "..."`). Useful for git operations, CLI tools, API calls, etc.
|
|
57
|
+
|
|
58
|
+
```yaml
|
|
59
|
+
nodes:
|
|
60
|
+
setup:
|
|
61
|
+
mode: shell
|
|
62
|
+
project: my-app
|
|
63
|
+
prompt: |
|
|
64
|
+
git checkout main && git pull && echo "READY"
|
|
65
|
+
outputs:
|
|
66
|
+
- name: info
|
|
67
|
+
extract: stdout
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Shell escaping**: Template values in shell mode are automatically escaped (single quotes `'` → `'\''`) to prevent injection.
|
|
71
|
+
|
|
72
|
+
## Template Variables
|
|
73
|
+
|
|
74
|
+
Templates use `{{...}}` syntax and are resolved before execution:
|
|
75
|
+
|
|
76
|
+
- `{{input.xxx}}` — pipeline input values provided at trigger time
|
|
77
|
+
- `{{vars.xxx}}` — workflow-level variables defined in YAML
|
|
78
|
+
- `{{nodes.<node_id>.outputs.<output_name>}}` — outputs from completed nodes
|
|
79
|
+
|
|
80
|
+
Node IDs can contain hyphens (e.g., `{{nodes.fetch-issue.outputs.data}}`).
|
|
81
|
+
|
|
82
|
+
### Examples
|
|
83
|
+
|
|
84
|
+
```yaml
|
|
85
|
+
prompt: "Fix issue #{{input.issue_id}} in {{input.project}}"
|
|
86
|
+
prompt: "Based on: {{nodes.design.outputs.spec}}"
|
|
87
|
+
prompt: |
|
|
88
|
+
REPO={{nodes.setup.outputs.repo}} && \
|
|
89
|
+
gh pr create --title "Fix #{{input.issue_id}}" -R "$REPO"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Output Extraction
|
|
93
|
+
|
|
94
|
+
Each node can extract outputs for downstream nodes:
|
|
95
|
+
|
|
96
|
+
| Extract Type | Description |
|
|
97
|
+
|-------------|-------------|
|
|
98
|
+
| `result` | Claude's final response text |
|
|
99
|
+
| `stdout` | Shell command stdout (same as result for shell mode) |
|
|
100
|
+
| `git_diff` | Git diff of changes made during the task |
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
outputs:
|
|
104
|
+
- name: summary
|
|
105
|
+
extract: result
|
|
106
|
+
- name: changes
|
|
107
|
+
extract: git_diff
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Skip Convention (`__SKIP__`)
|
|
111
|
+
|
|
112
|
+
If a shell node outputs `__SKIP__` in its stdout and exits with code 0, the node is marked as `skipped` instead of `done`. All downstream dependent nodes are also skipped. The pipeline completes successfully (not failed).
|
|
113
|
+
|
|
114
|
+
```yaml
|
|
115
|
+
nodes:
|
|
116
|
+
check:
|
|
117
|
+
mode: shell
|
|
118
|
+
project: my-app
|
|
119
|
+
prompt: |
|
|
120
|
+
if [ -z "{{input.issue_id}}" ]; then
|
|
121
|
+
echo "__SKIP__ No issue_id provided"
|
|
122
|
+
exit 0
|
|
123
|
+
fi
|
|
124
|
+
echo "Processing issue {{input.issue_id}}"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Use this for optional steps that should gracefully skip when preconditions aren't met.
|
|
128
|
+
|
|
129
|
+
## Conditional Routing
|
|
130
|
+
|
|
131
|
+
Nodes can route to different next steps based on output content:
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
nodes:
|
|
135
|
+
analyze:
|
|
136
|
+
project: my-app
|
|
137
|
+
prompt: "Analyze the issue. Reply SIMPLE or COMPLEX."
|
|
138
|
+
outputs:
|
|
139
|
+
- name: complexity
|
|
140
|
+
extract: result
|
|
141
|
+
routes:
|
|
142
|
+
- condition: "{{outputs.complexity contains 'SIMPLE'}}"
|
|
143
|
+
next: quick-fix
|
|
144
|
+
- condition: default
|
|
145
|
+
next: deep-fix
|
|
146
|
+
quick-fix:
|
|
147
|
+
depends_on: [analyze]
|
|
148
|
+
project: my-app
|
|
149
|
+
prompt: "Apply a quick fix"
|
|
150
|
+
deep-fix:
|
|
151
|
+
depends_on: [analyze]
|
|
152
|
+
project: my-app
|
|
153
|
+
prompt: "Do a thorough analysis and fix"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Route Conditions
|
|
157
|
+
|
|
158
|
+
- `{{outputs.<name> contains '<keyword>'}}` — check if output contains a keyword
|
|
159
|
+
- `default` — fallback route (always matches)
|
|
160
|
+
|
|
161
|
+
### Loops
|
|
162
|
+
|
|
163
|
+
If a route points back to the same node, it creates a loop (up to `max_iterations`):
|
|
164
|
+
|
|
165
|
+
```yaml
|
|
166
|
+
nodes:
|
|
167
|
+
fix-and-test:
|
|
168
|
+
project: my-app
|
|
169
|
+
prompt: "Fix the failing test, then run tests."
|
|
170
|
+
max_iterations: 5
|
|
171
|
+
outputs:
|
|
172
|
+
- name: test_result
|
|
173
|
+
extract: result
|
|
174
|
+
routes:
|
|
175
|
+
- condition: "{{outputs.test_result contains 'PASS'}}"
|
|
176
|
+
next: done
|
|
177
|
+
- condition: default
|
|
178
|
+
next: fix-and-test # loop back to retry
|
|
179
|
+
done:
|
|
180
|
+
depends_on: [fix-and-test]
|
|
181
|
+
mode: shell
|
|
182
|
+
project: my-app
|
|
183
|
+
prompt: "echo 'All tests passing!'"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Branch Auto-checkout
|
|
187
|
+
|
|
188
|
+
Pipeline steps automatically use **git worktree** for isolated execution. Each step gets its own working copy — your main working directory is never affected.
|
|
189
|
+
|
|
190
|
+
```yaml
|
|
191
|
+
nodes:
|
|
192
|
+
work:
|
|
193
|
+
project: my-app
|
|
194
|
+
branch: "feature/{{input.feature_name}}" # optional: custom branch name
|
|
195
|
+
prompt: "Implement the feature"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**How it works:**
|
|
199
|
+
- If `branch` is specified, a worktree is created at `<project>/.forge/worktrees/<branch>/`
|
|
200
|
+
- If `branch` is omitted, an auto-generated branch `pipeline/<id>` is used
|
|
201
|
+
- **All step modes** (shell, agent, prompt, plugin) run inside the worktree
|
|
202
|
+
- After completion, the worktree is preserved for review
|
|
203
|
+
- Clean up: `git worktree remove <path>` after reviewing changes
|
|
204
|
+
|
|
205
|
+
**Shell steps in worktree:**
|
|
206
|
+
|
|
207
|
+
Shell steps receive 3 environment variables for worktree context:
|
|
208
|
+
|
|
209
|
+
| Variable | Value | Example |
|
|
210
|
+
|----------|-------|---------|
|
|
211
|
+
| `FORGE_WORKTREE` | Worktree path (current working directory) | `/project/.forge/worktrees/pipeline-abc12345` |
|
|
212
|
+
| `FORGE_WORKTREE_BRANCH` | Branch name for this worktree | `pipeline/abc12345` or `feature/my-feature` |
|
|
213
|
+
| `FORGE_PROJECT_ROOT` | Original project root path | `/Users/me/projects/my-app` |
|
|
214
|
+
|
|
215
|
+
Use these when shell scripts need to reference the original repo:
|
|
216
|
+
|
|
217
|
+
```yaml
|
|
218
|
+
nodes:
|
|
219
|
+
push-changes:
|
|
220
|
+
mode: shell
|
|
221
|
+
prompt: |
|
|
222
|
+
git add -A && git commit -m "Pipeline changes" &&
|
|
223
|
+
git push origin "$FORGE_WORKTREE_BRANCH"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
To operate on the original repo from a shell step:
|
|
227
|
+
```yaml
|
|
228
|
+
check-main:
|
|
229
|
+
mode: shell
|
|
230
|
+
prompt: |
|
|
231
|
+
cd "$FORGE_PROJECT_ROOT" && git log --oneline -5
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Benefits:**
|
|
235
|
+
- Your working directory stays clean during pipeline execution
|
|
236
|
+
- Multiple pipelines can run in parallel on the same project
|
|
237
|
+
- Changes are isolated on branches, easy to review/merge/discard
|
|
238
|
+
- All step modes use the same isolation — consistent behavior
|
|
239
|
+
|
|
240
|
+
## Parallel Execution
|
|
241
|
+
|
|
242
|
+
Nodes without dependency relationships run in parallel:
|
|
243
|
+
|
|
244
|
+
```yaml
|
|
245
|
+
nodes:
|
|
246
|
+
frontend:
|
|
247
|
+
project: my-app
|
|
248
|
+
prompt: "Build frontend component"
|
|
249
|
+
backend:
|
|
250
|
+
project: my-app
|
|
251
|
+
prompt: "Build API endpoint"
|
|
252
|
+
integration:
|
|
253
|
+
depends_on: [frontend, backend] # waits for both
|
|
254
|
+
project: my-app
|
|
255
|
+
prompt: "Integration test"
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
`frontend` and `backend` run simultaneously; `integration` starts when both finish.
|
|
259
|
+
|
|
260
|
+
## Built-in Workflows
|
|
261
|
+
|
|
262
|
+
### issue-fix-and-review
|
|
263
|
+
Complete issue resolution: fetch GitHub issue → fix code on new branch → create PR.
|
|
264
|
+
|
|
265
|
+
**Input**: `issue_id`, `project`, `base_branch` (optional), `extra_context` (optional)
|
|
266
|
+
|
|
267
|
+
**Steps**: setup → fetch-issue → fix-code → push-and-pr → notify
|
|
268
|
+
|
|
269
|
+
**Prerequisites**: `gh` CLI installed and authenticated (`gh auth login`), project has GitHub remote.
|
|
270
|
+
|
|
271
|
+
### pr-review
|
|
272
|
+
Review a pull request: fetch PR diff → AI review → report.
|
|
273
|
+
|
|
274
|
+
**Input**: `pr_number`, `project`
|
|
275
|
+
|
|
276
|
+
**Steps**: setup → fetch-pr → review → post-review
|
|
277
|
+
|
|
278
|
+
## Project Pipeline Bindings
|
|
279
|
+
|
|
280
|
+
Projects can bind workflows for easy access and scheduled execution.
|
|
281
|
+
|
|
282
|
+
### Binding a Workflow to a Project
|
|
283
|
+
|
|
284
|
+
1. Go to **Projects → select project → Pipelines tab**
|
|
285
|
+
2. Click **+ Add** to attach a workflow
|
|
286
|
+
3. Configure:
|
|
287
|
+
- **Enabled**: toggle on/off
|
|
288
|
+
- **Schedule**: Manual only, or periodic (15min to 24h intervals)
|
|
289
|
+
4. Click **Run** to manually trigger
|
|
290
|
+
|
|
291
|
+
### Scheduled Execution
|
|
292
|
+
|
|
293
|
+
When a schedule is set (e.g., "Every 30 min"):
|
|
294
|
+
- The scheduler checks all bindings every 60 seconds
|
|
295
|
+
- If the interval has elapsed since last run, the pipeline triggers automatically
|
|
296
|
+
- Running pipelines are not re-triggered (prevents overlap)
|
|
297
|
+
- `Last run` and `Next run` times are shown in the UI
|
|
298
|
+
|
|
299
|
+
Schedule options: Manual only, 15min, 30min, 1h, 2h, 6h, 12h, 24h.
|
|
300
|
+
|
|
301
|
+
### API
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
# List bindings + runs + workflows for a project
|
|
305
|
+
curl "http://localhost:8403/api/project-pipelines?project=/path/to/project"
|
|
306
|
+
|
|
307
|
+
# Add binding
|
|
308
|
+
curl -X POST http://localhost:8403/api/project-pipelines \
|
|
309
|
+
-H 'Content-Type: application/json' \
|
|
310
|
+
-d '{"action":"add","projectPath":"/path","projectName":"my-app","workflowName":"issue-fix-and-review"}'
|
|
311
|
+
|
|
312
|
+
# Update binding (enable/disable, change config/schedule)
|
|
313
|
+
curl -X POST http://localhost:8403/api/project-pipelines \
|
|
314
|
+
-H 'Content-Type: application/json' \
|
|
315
|
+
-d '{"action":"update","projectPath":"/path","workflowName":"issue-fix-and-review","config":{"interval":30}}'
|
|
316
|
+
|
|
317
|
+
# Trigger pipeline manually
|
|
318
|
+
curl -X POST http://localhost:8403/api/project-pipelines \
|
|
319
|
+
-H 'Content-Type: application/json' \
|
|
320
|
+
-d '{"action":"trigger","projectPath":"/path","projectName":"my-app","workflowName":"issue-fix-and-review","input":{"issue_id":"42"}}'
|
|
321
|
+
|
|
322
|
+
# Remove binding
|
|
323
|
+
curl -X POST http://localhost:8403/api/project-pipelines \
|
|
324
|
+
-H 'Content-Type: application/json' \
|
|
325
|
+
-d '{"action":"remove","projectPath":"/path","workflowName":"issue-fix-and-review"}'
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## CLI
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
forge flows # list available workflows
|
|
332
|
+
forge run my-workflow # execute a workflow
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## Import a Workflow
|
|
336
|
+
|
|
337
|
+
1. In **Pipelines** tab, click **Import**
|
|
338
|
+
2. Paste YAML workflow content
|
|
339
|
+
3. Click **Save Workflow**
|
|
340
|
+
|
|
341
|
+
Or save YAML directly to `~/.forge/data/flows/<name>.yaml`.
|
|
342
|
+
|
|
343
|
+
To create a workflow via Help AI: ask "Create a pipeline that does X" — the AI will generate the YAML for you to import.
|
|
344
|
+
|
|
345
|
+
## Creating Workflows via API
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
curl -X POST http://localhost:8403/api/pipelines \
|
|
349
|
+
-H 'Content-Type: application/json' \
|
|
350
|
+
-d '{"action": "save-workflow", "yaml": "<yaml content>"}'
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Conversation Mode (Multi-Agent Dialogue)
|
|
354
|
+
|
|
355
|
+
Conversation mode enables multiple agents to collaborate through structured dialogue. Instead of a DAG of tasks, Forge acts as a message broker — sending prompts between agents in rounds until a stop condition is met.
|
|
356
|
+
|
|
357
|
+
### YAML Format
|
|
358
|
+
|
|
359
|
+
```yaml
|
|
360
|
+
name: architect-implementer
|
|
361
|
+
type: conversation
|
|
362
|
+
description: "Architect designs, implementer builds"
|
|
363
|
+
input:
|
|
364
|
+
project: "Project name"
|
|
365
|
+
task: "What to build"
|
|
366
|
+
agents:
|
|
367
|
+
- id: architect
|
|
368
|
+
agent: claude
|
|
369
|
+
role: "You are a software architect. Design the solution, define interfaces, and review implementations."
|
|
370
|
+
- id: implementer
|
|
371
|
+
agent: codex
|
|
372
|
+
role: "You are a developer. Implement what the architect designs."
|
|
373
|
+
max_rounds: 10
|
|
374
|
+
stop_condition: "both agents say DONE"
|
|
375
|
+
initial_prompt: "Build: {{input.task}}"
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Fields
|
|
379
|
+
|
|
380
|
+
| Field | Description | Default |
|
|
381
|
+
|-------|-------------|---------|
|
|
382
|
+
| `type` | Must be `conversation` | required |
|
|
383
|
+
| `agents` | List of participating agents | required |
|
|
384
|
+
| `agents[].id` | Logical ID within conversation | required |
|
|
385
|
+
| `agents[].agent` | Agent registry ID (`claude`, `codex`, `aider`, etc.) | `claude` |
|
|
386
|
+
| `agents[].role` | System prompt / role description | none |
|
|
387
|
+
| `agents[].project` | Project context (overrides input.project) | none |
|
|
388
|
+
| `max_rounds` | Maximum number of full rounds | `10` |
|
|
389
|
+
| `stop_condition` | When to stop early | none |
|
|
390
|
+
| `initial_prompt` | The seed prompt (supports `{{input.*}}` templates) | required |
|
|
391
|
+
| `context_strategy` | How to pass history between agents: `full`, `window`, `summary` | `summary` |
|
|
392
|
+
| `context_window` | Number of recent messages to include in full (for `window`/`summary`) | `4` |
|
|
393
|
+
| `max_content_length` | Truncate each message to this many characters | `3000` |
|
|
394
|
+
|
|
395
|
+
### Context Strategies
|
|
396
|
+
|
|
397
|
+
Agents don't share memory — Forge acts as broker and decides what context to forward.
|
|
398
|
+
|
|
399
|
+
- **`summary`** (default): Older messages are compressed to one-line summaries. The most recent N messages (set by `context_window`) are passed in full. Best balance of context quality and token usage.
|
|
400
|
+
- **`window`**: Only the last N messages are passed, older ones are dropped entirely. Lowest token usage.
|
|
401
|
+
- **`full`**: All messages from all rounds are passed in full (each truncated to `max_content_length`). Most context but token-heavy.
|
|
402
|
+
|
|
403
|
+
### Execution Flow
|
|
404
|
+
|
|
405
|
+
1. Forge sends `initial_prompt` + role to the first agent
|
|
406
|
+
2. Agent responds → Forge collects the response
|
|
407
|
+
3. Forge builds context (per `context_strategy`) and sends to the next agent
|
|
408
|
+
4. Repeat through all agents = 1 round
|
|
409
|
+
5. Continue rounds until `stop_condition` or `max_rounds`
|
|
410
|
+
|
|
411
|
+
### Stop Conditions
|
|
412
|
+
|
|
413
|
+
- `"any agent says DONE"` — stops when any agent includes "DONE" in its response
|
|
414
|
+
- `"both agents say DONE"` / `"all agents say DONE"` — stops when all agents have said "DONE"
|
|
415
|
+
- If no stop condition, runs until `max_rounds`
|
|
416
|
+
|
|
417
|
+
### UI
|
|
418
|
+
|
|
419
|
+
Conversation pipelines show a chat-like view with color-coded agent bubbles, round numbers, and linked task IDs. The sidebar shows round progress (e.g., R3/10).
|
|
420
|
+
|
|
421
|
+
### Example: Code Review Dialogue
|
|
422
|
+
|
|
423
|
+
```yaml
|
|
424
|
+
name: review-dialogue
|
|
425
|
+
type: conversation
|
|
426
|
+
description: "Two agents discuss code quality"
|
|
427
|
+
input:
|
|
428
|
+
project: "Project name"
|
|
429
|
+
pr_number: "PR number to review"
|
|
430
|
+
agents:
|
|
431
|
+
- id: reviewer
|
|
432
|
+
agent: claude
|
|
433
|
+
role: "You are a code reviewer. Find bugs, security issues, and suggest improvements."
|
|
434
|
+
- id: author
|
|
435
|
+
agent: claude
|
|
436
|
+
role: "You are the code author. Address review feedback, explain design decisions, and fix issues."
|
|
437
|
+
max_rounds: 5
|
|
438
|
+
stop_condition: "all agents say DONE"
|
|
439
|
+
initial_prompt: "Review PR #{{input.pr_number}} in project {{input.project}}. Reviewer: analyze the diff. Author: be ready to address feedback."
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
## Pipeline Model
|
|
443
|
+
|
|
444
|
+
In **Settings → Pipeline Model**, you can select which Claude model runs pipeline tasks. Set to `default` to use the same model as regular tasks.
|
|
445
|
+
|
|
446
|
+
## Storage
|
|
447
|
+
|
|
448
|
+
- Workflow YAML: `~/.forge/data/flows/`
|
|
449
|
+
- Execution state: `~/.forge/data/pipelines/`
|
|
450
|
+
- Binding config & run history: SQLite database (`~/.forge/data/forge.db`)
|
|
451
|
+
|
|
452
|
+
## Tips for Writing Workflows
|
|
453
|
+
|
|
454
|
+
1. **Start with shell nodes** for setup (git checkout, environment checks)
|
|
455
|
+
2. **Use `__SKIP__`** for optional steps with precondition checks
|
|
456
|
+
3. **Extract outputs** to pass data between nodes
|
|
457
|
+
4. **Use routes** for conditional logic (simple/complex paths, retry loops)
|
|
458
|
+
5. **Keep prompts focused** — each node should do one thing well
|
|
459
|
+
6. **Test manually first** before setting up schedules
|
|
460
|
+
7. **Use `depends_on`** to control execution order; nodes without dependencies run in parallel
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Skills Marketplace
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Browse, install, and manage Claude Code skills and commands from the Forge Skills registry.
|
|
6
|
+
|
|
7
|
+
## Types
|
|
8
|
+
|
|
9
|
+
| | Skills | Commands |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Location | `~/.claude/skills/<name>/` | `~/.claude/commands/<name>.md` |
|
|
12
|
+
| Entry file | `SKILL.md` | Single `.md` file |
|
|
13
|
+
| Complexity | Multi-file with templates | Simple slash command |
|
|
14
|
+
|
|
15
|
+
Both register as `/slash-command` in Claude Code.
|
|
16
|
+
|
|
17
|
+
## Install
|
|
18
|
+
|
|
19
|
+
1. Go to **Skills** tab in Forge
|
|
20
|
+
2. Click **Sync** to fetch latest registry
|
|
21
|
+
3. Click **Install** on any skill → choose Global or specific project
|
|
22
|
+
4. Use in Claude Code with `/<skill-name>`
|
|
23
|
+
|
|
24
|
+
## Update
|
|
25
|
+
|
|
26
|
+
Skills with newer versions show a yellow "update" indicator. Click to update (checks for local modifications first).
|
|
27
|
+
|
|
28
|
+
## Local Skills
|
|
29
|
+
|
|
30
|
+
The **Local** tab shows skills/commands installed on your machine (both from marketplace and manually created). You can:
|
|
31
|
+
- **Install to...** — Copy a local skill to another project or global
|
|
32
|
+
- **Delete** — Remove from project or global
|
|
33
|
+
- **Edit** — View and modify installed files
|
|
34
|
+
|
|
35
|
+
## Registry
|
|
36
|
+
|
|
37
|
+
Default: `https://raw.githubusercontent.com/aiwatching/forge-skills/main`
|
|
38
|
+
|
|
39
|
+
Change in Settings → Skills Repo URL.
|
|
40
|
+
|
|
41
|
+
## Custom Skills
|
|
42
|
+
|
|
43
|
+
Create your own: put a `.md` file in `<project>/.claude/commands/` or a directory in `<project>/.claude/skills/<name>/`.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Projects
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
|
|
5
|
+
Add project directories in Settings → **Project Roots** (e.g. `~/Projects`). Forge scans subdirectories automatically.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
### Code Tab
|
|
10
|
+
- File tree browser
|
|
11
|
+
- Syntax-highlighted code viewer
|
|
12
|
+
- Git diff view (click changed files)
|
|
13
|
+
- Git operations: commit, push, pull
|
|
14
|
+
- Commit history
|
|
15
|
+
|
|
16
|
+
### Skills & Commands Tab
|
|
17
|
+
- View installed skills/commands for this project
|
|
18
|
+
- Scope indicator: G (global), P (project), G+P (both)
|
|
19
|
+
- Edit files, update from marketplace, uninstall
|
|
20
|
+
|
|
21
|
+
### CLAUDE.md Tab
|
|
22
|
+
- View and edit project's CLAUDE.md
|
|
23
|
+
- Apply rule templates (built-in or custom)
|
|
24
|
+
- Templates auto-injected with dedup markers
|
|
25
|
+
|
|
26
|
+
### Issues Tab
|
|
27
|
+
- Enable GitHub Issue Auto-fix per project
|
|
28
|
+
- Configure scan interval and label filters
|
|
29
|
+
- Manual trigger: enter issue # and click Fix Issue
|
|
30
|
+
- Processed issues history with retry/delete
|
|
31
|
+
- Auto-chains: fix → create PR → review
|
|
32
|
+
|
|
33
|
+
### Workspace Tab
|
|
34
|
+
- Configure multi-agent workspace (Forge Smiths)
|
|
35
|
+
- Add smiths with roles, steps, and dependencies
|
|
36
|
+
- Start/stop daemon, monitor execution
|
|
37
|
+
- See [Workspace documentation](11-workspace.md) for details
|
|
38
|
+
|
|
39
|
+
## Favorites
|
|
40
|
+
|
|
41
|
+
Click ★ next to a project to favorite it. Favorites appear at the top of the sidebar.
|
|
42
|
+
|
|
43
|
+
## Terminal
|
|
44
|
+
|
|
45
|
+
### Opening a Terminal
|
|
46
|
+
|
|
47
|
+
There are two ways to open a terminal for a project:
|
|
48
|
+
|
|
49
|
+
**1. Project Header Button**
|
|
50
|
+
- Click **Terminal** in the project header → opens with default agent (claude)
|
|
51
|
+
- Click **▾** dropdown to select a different agent or profile
|
|
52
|
+
- If the agent supports sessions (claude-code), a dialog shows: New Session / Resume Latest / Browse Sessions
|
|
53
|
+
- Non-session agents (codex, aider) open directly
|
|
54
|
+
|
|
55
|
+
**2. Terminal Tab "+" Button**
|
|
56
|
+
- Click **+** in the terminal tab bar → select a project root → expand to see projects
|
|
57
|
+
- Click an agent button (C = Claude, X = Codex, A = Aider, ● = Profile) to open
|
|
58
|
+
- The terminal launches with the agent's configured env vars and model
|
|
59
|
+
|
|
60
|
+
### Agent & Profile Selection
|
|
61
|
+
|
|
62
|
+
When selecting an agent or profile for a terminal:
|
|
63
|
+
- **Base agents** (Claude, Codex, Aider): Use their default configuration
|
|
64
|
+
- **Profiles** (e.g., Forti K2, Claude Opus): Apply the profile's environment variables and model override
|
|
65
|
+
- Environment variables are exported in the terminal before launching the CLI
|
|
66
|
+
- Model is passed via `--model` flag (for claude-code agents)
|
|
67
|
+
|
|
68
|
+
### Terminal Features
|
|
69
|
+
- Full xterm.js terminal with tmux session persistence
|
|
70
|
+
- Split panes (horizontal/vertical)
|
|
71
|
+
- Multiple tabs per project
|
|
72
|
+
- Tab state preserved across page refreshes
|
|
73
|
+
- Tabs can be renamed and reordered
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Rules (CLAUDE.md Templates)
|
|
2
|
+
|
|
3
|
+
## What Are Rules?
|
|
4
|
+
|
|
5
|
+
Reusable markdown snippets that get appended to project CLAUDE.md files. They define coding conventions, security rules, workflow guidelines, etc.
|
|
6
|
+
|
|
7
|
+
## Built-in Templates
|
|
8
|
+
|
|
9
|
+
| Template | Description |
|
|
10
|
+
|----------|-------------|
|
|
11
|
+
| TypeScript Rules | Coding conventions (const, types, early returns) |
|
|
12
|
+
| Git Workflow | Commit messages, branch naming |
|
|
13
|
+
| Obsidian Vault | Vault integration instructions |
|
|
14
|
+
| Security Rules | OWASP guidelines, no hardcoded secrets |
|
|
15
|
+
|
|
16
|
+
## Manage Rules
|
|
17
|
+
|
|
18
|
+
**Skills tab → Rules sub-tab**:
|
|
19
|
+
- View all templates (built-in + custom)
|
|
20
|
+
- Create new: click "+ New"
|
|
21
|
+
- Edit any template (including built-in)
|
|
22
|
+
- Delete custom templates
|
|
23
|
+
- Set as "default" — auto-applied to new projects
|
|
24
|
+
- Batch apply: select template → check projects → click "Apply"
|
|
25
|
+
|
|
26
|
+
## Apply to Project
|
|
27
|
+
|
|
28
|
+
**Project → CLAUDE.md tab**:
|
|
29
|
+
- Left sidebar shows CLAUDE.md content + template list
|
|
30
|
+
- Click "+ add" to inject a template
|
|
31
|
+
- Click "added" to remove
|
|
32
|
+
- Templates wrapped in `<!-- forge:template:id -->` markers (prevents duplicate injection)
|
|
33
|
+
|
|
34
|
+
## Default Templates
|
|
35
|
+
|
|
36
|
+
Templates marked as "default" are automatically injected into new projects when they first appear in the project list.
|
|
37
|
+
|
|
38
|
+
## Custom Templates
|
|
39
|
+
|
|
40
|
+
Stored in `~/.forge/data/claude-templates/`. Each is a `.md` file with YAML frontmatter:
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
---
|
|
44
|
+
name: My Rule
|
|
45
|
+
description: What this rule does
|
|
46
|
+
tags: [category]
|
|
47
|
+
builtin: false
|
|
48
|
+
isDefault: false
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## My Custom Rule
|
|
52
|
+
Your content here...
|
|
53
|
+
```
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Issue Auto-fix
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Automatically scan GitHub Issues, fix code, create PRs — all hands-free. Uses the built-in `issue-fix-and-review` pipeline workflow with integrated issue scanning.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- `gh` CLI installed and authenticated: `gh auth login`
|
|
10
|
+
- Project has a GitHub remote
|
|
11
|
+
|
|
12
|
+
## Setup
|
|
13
|
+
|
|
14
|
+
1. Go to **Projects → select project → Pipelines tab**
|
|
15
|
+
2. Click **+ Add** and select `issue-fix-and-review`
|
|
16
|
+
3. Enable the binding
|
|
17
|
+
4. Check **Auto-scan GitHub Issues** to enable automatic scanning
|
|
18
|
+
5. Configure:
|
|
19
|
+
- **Schedule**: How often to scan (e.g., Every 30 min)
|
|
20
|
+
- **Labels**: Filter issues by label (comma-separated, empty = all)
|
|
21
|
+
- **Base Branch**: Leave empty for auto-detect (main/master)
|
|
22
|
+
6. Click **Scan** to manually trigger a scan
|
|
23
|
+
|
|
24
|
+
## Flow
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Scan Issues → For each new issue:
|
|
28
|
+
Setup → Fetch Issue → Fix Code (new branch) → Push & Create PR → Notify
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
1. **Scan**: `gh issue list` finds open issues matching labels
|
|
32
|
+
2. **Dedup**: Already-processed issues are skipped (tracked in `pipeline_runs`)
|
|
33
|
+
3. **Setup**: Checks for clean working directory, detects repo and base branch
|
|
34
|
+
4. **Fetch Issue**: `gh issue view` fetches issue data
|
|
35
|
+
5. **Fix Code**: Claude analyzes issue and fixes code on `fix/<id>-<description>` branch
|
|
36
|
+
6. **Push & PR**: Pushes branch and creates Pull Request via `gh pr create`
|
|
37
|
+
7. **Notify**: Switches back to original branch, reports PR URL
|
|
38
|
+
|
|
39
|
+
## Manual Trigger
|
|
40
|
+
|
|
41
|
+
- **Run** button: Triggers the workflow with custom input (requires `issue_id`)
|
|
42
|
+
- **Scan** button: Scans for all open issues and triggers fixes for new ones
|
|
43
|
+
|
|
44
|
+
## Dedup
|
|
45
|
+
|
|
46
|
+
Each processed issue is tracked with a `dedup_key` (e.g., `issue:42`) in the pipeline runs table. Once an issue has been processed, it won't be triggered again even if it's still open. To re-process an issue, delete its run from the execution history.
|
|
47
|
+
|
|
48
|
+
## Safety
|
|
49
|
+
|
|
50
|
+
- Checks for uncommitted changes before starting (aborts if dirty)
|
|
51
|
+
- Always works on new branches (never modifies main/master)
|
|
52
|
+
- Cleans up old fix branches for the same issue
|
|
53
|
+
- Switches back to original branch after completion
|
|
54
|
+
- Uses `--force-with-lease` for safe push
|
|
55
|
+
- Running pipelines are not re-triggered (one fix per issue at a time)
|