From ca548c1eaa4ba1d6f0fdc073f7b93e6a50859b68 Mon Sep 17 00:00:00 2001 From: Lukas May Date: Tue, 10 Feb 2026 10:53:35 +0100 Subject: [PATCH] feat: Auto-branch initiative system with per-project default branches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Planning tasks (research, discuss, plan, detail, refine) now run on the project's defaultBranch instead of hardcoded 'main'. Execution tasks (execute, verify, merge, review) auto-generate an initiative branch (cw/) on first dispatch. Branch configuration removed from initiative creation — it's now fully automatic. - Add PLANNING_CATEGORIES/EXECUTION_CATEGORIES to branch-naming - Dispatch manager splits logic by task category - ProcessManager uses per-project defaultBranch fallback - Phase dispatch uses project.defaultBranch for ensureBranch base - Remove mergeTarget from createInitiative input - Rename updateInitiativeMergeConfig → updateInitiativeConfig - Add defaultBranch field to registerProject + UI - Rename mergeTarget → branch across all frontend components --- .../src/components/CreateInitiativeDialog.tsx | 19 +--------- .../web/src/components/InitiativeHeader.tsx | 6 +-- .../src/components/RegisterProjectDialog.tsx | 12 ++++++ src/agent/file-io.test.ts | 2 +- src/agent/file-io.ts | 2 +- src/agent/manager.ts | 2 +- src/agent/process-manager.ts | 5 ++- src/dispatch/manager.ts | 38 ++++++++++++------- src/dispatch/phase-manager.ts | 8 ++-- src/execution/orchestrator.ts | 12 +++--- src/git/branch-naming.ts | 33 ++++++++++++++-- src/trpc/routers/initiative.ts | 5 +-- src/trpc/routers/project.ts | 7 +++- 13 files changed, 93 insertions(+), 58 deletions(-) diff --git a/packages/web/src/components/CreateInitiativeDialog.tsx b/packages/web/src/components/CreateInitiativeDialog.tsx index 0d70a2c..338e23d 100644 --- a/packages/web/src/components/CreateInitiativeDialog.tsx +++ b/packages/web/src/components/CreateInitiativeDialog.tsx @@ -33,7 +33,6 @@ export function CreateInitiativeDialog({ const [name, setName] = useState(""); const [projectIds, setProjectIds] = useState([]); const [executionMode, setExecutionMode] = useState<"yolo" | "review_per_phase">("review_per_phase"); - const [mergeTarget, setMergeTarget] = useState(""); const [error, setError] = useState(null); const utils = trpc.useUtils(); @@ -48,7 +47,7 @@ export function CreateInitiativeDialog({ createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), mergeRequiresApproval: true, - mergeTarget: 'main', + branch: null, projects: [], }; utils.listInitiatives.setData(undefined, (old = []) => [tempInitiative, ...old]); @@ -73,7 +72,6 @@ export function CreateInitiativeDialog({ setName(""); setProjectIds([]); setExecutionMode("review_per_phase"); - setMergeTarget(""); setError(null); } }, [open]); @@ -85,7 +83,6 @@ export function CreateInitiativeDialog({ name: name.trim(), projectIds: projectIds.length > 0 ? projectIds : undefined, executionMode, - mergeTarget: mergeTarget.trim() || null, }); } @@ -123,20 +120,6 @@ export function CreateInitiativeDialog({ -
- - setMergeTarget(e.target.value)} - /> -
+
+ + setDefaultBranch(e.target.value)} + /> +
{error &&

{error}

}