diff --git a/agent_go/executor.py b/agent_go/executor.py index c9f2adf..8ceacd9 100644 --- a/agent_go/executor.py +++ b/agent_go/executor.py @@ -12,17 +12,13 @@ __all__ = ["run_subtask"] -def run_subtask(task_id, subtask, repo, task_dir, logger, upstream_worktrees=None, headless=False, issue_ref="", active_pids=None, active_pids_lock=None): - sub_id = subtask["id"] + +def _create_worktree(task_id, sub_id, repo, task_dir, logger): + """Create worktree for a subtask. Returns (worktree_path, create_time_ms).""" sub_dir = task_dir / sub_id sub_dir.mkdir(parents=True, exist_ok=True) worktree = sub_dir / "work" - logger.info(f"─── {sub_id} START: {subtask['title']} ───") - log_event(logger, "subtask_start", {"id": sub_id, "title": subtask["title"], - "depends_on": subtask.get("depends_on", []), "headless": headless, "issue": issue_ref}) - - clone_start = time.time() worktree_create_ms = 0 if (worktree / ".git").exists(): logger.info(f"worktree 已存在,跳过创建") @@ -44,30 +40,11 @@ def run_subtask(task_id, subtask, repo, task_dir, logger, upstream_worktrees=Non worktree.mkdir(parents=True, exist_ok=True) shutil.copytree(str(repo), str(worktree), dirs_exist_ok=True) - # 产物传递:通过 git merge 将上游代码合并到当前 worktree - # Tag 使用完整路径 task_id/sub_id 避免跨任务冲突 - merge_conflicts = {} - merge_results = [] - merge_upstream_ms = 0 - if upstream_worktrees: - for up_id, up_path in upstream_worktrees.items(): - if up_path.exists(): - upstream_tag = f"{task_id}/{up_id}" - logger.info(f"产物传递 (git merge): {up_id} → {sub_id} (tag={upstream_tag})") - m_start = time.time() - _git_merge_upstream(up_path, worktree, upstream_tag, logger, headless=headless) - merge_upstream_ms += (time.time() - m_start) * 1000 - # 检测上游 merge 是否产生冲突 - conflict_file = worktree / ".MERGE_CONFLICT" - has_conflict = conflict_file.exists() - if has_conflict: - merge_conflicts[up_id] = conflict_file.read_text(encoding="utf-8") - conflict_file.unlink() - merge_results.append(collect_merge_result(up_id, not has_conflict, - merge_conflicts.get(up_id, "").split("\n") if has_conflict else None)) - clone_time = time.time() - clone_start + return worktree, worktree_create_ms + - # 构建 TASK.md:包含完整 Agent Prompt、资源清单、上游上下文 +def _build_task_md(subtask, repo, task_dir, worktree, logger, headless, merge_conflicts=None): + """Build TASK.md content. Returns (task_md, verification, skill_names, unresolved_skills).""" task_md_parts = [f"# 子任务: {subtask['title']}", ""] # 注入 git merge 冲突信息(如有) @@ -140,7 +117,6 @@ def run_subtask(task_id, subtask, repo, task_dir, logger, upstream_worktrees=Non logger.warning(f"Skill 未找到: \"{sn}\",已跳过。已安装: {installed_names[:10]}") # 将 Agent Prompt 中的源项目路径替换为 worktree 路径,确保隔离 - # 边界字符包含: 空白、引号、括号、冒号(含全角)、路径分隔符、中文标点 task_md_text = "\n".join(task_md_parts) _boundary_chars = r'\s"\'\(\):/:,。、' _before = rf'(?