workspace

package
v0.0.0-...-e487a75 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 11, 2025 License: Apache-2.0 Imports: 13 Imported by: 0

README

Workspace 管理

本模块负责管理代码代理的工作空间,包括 Issue、PR 和 Session 目录的创建、移动和清理。

目录格式规范

所有目录都遵循统一的命名格式,包含 AI 模型信息以便区分不同的 AI 处理会话。

Issue 目录格式
  • 格式: {aiModel}-{repo}-issue-{issueNumber}-{timestamp}
  • 示例: gemini-codeagent-issue-123-1752829201
PR 目录格式
  • 格式: {aiModel}-{repo}-pr-{prNumber}-{timestamp}
  • 示例: gemini-codeagent-pr-161-1752829201
Session 目录格式
  • 格式: {aiModel}-{repo}-session-{prNumber}-{timestamp}
  • 示例: gemini-codeagent-session-161-1752829201

核心功能

1. 目录格式管理 (format.go)

提供统一的目录格式生成和解析功能,作为 Manager 的内部组件:

  • generateIssueDirName() - 生成 Issue 目录名
  • generatePRDirName() - 生成 PR 目录名
  • generateSessionDirName() - 生成 Session 目录名
  • parsePRDirName() - 解析 PR 目录名
  • extractSuffixFromPRDir() - 从 PR 目录名提取后缀
2. 工作空间管理 (manager.go)

负责工作空间的完整生命周期管理,并提供目录格式的公共接口:

目录格式公共方法
  • GenerateIssueDirName() - 生成 Issue 目录名
  • GeneratePRDirName() - 生成 PR 目录名
  • GenerateSessionDirName() - 生成 Session 目录名
  • ParsePRDirName() - 解析 PR 目录名
  • ExtractSuffixFromPRDir() - 从 PR 目录名提取后缀
  • ExtractSuffixFromIssueDir() - 从 Issue 目录名提取后缀
工作空间生命周期管理
  • 创建: 从 Issue 或 PR 创建工作空间
  • 移动: 将 Issue 工作空间移动到 PR 工作空间
  • 清理: 清理过期的工作空间和资源
  • Session 管理: 创建和管理 AI 会话目录
主要方法
工作空间创建
  • CreateWorkspaceFromIssueWithAI() - 从 Issue 创建工作空间
  • GetOrCreateWorkspaceForPRWithAI() - 获取或创建 PR 工作空间
工作空间操作
  • MoveIssueToPR() - 将 Issue 工作空间移动到 PR
  • CreateSessionPath() - 创建 Session 目录
  • CleanupWorkspace() - 清理工作空间
工作空间查询
  • GetAllWorkspacesByPR() - 获取 PR 的所有工作空间
  • GetExpiredWorkspaces() - 获取过期的工作空间

使用示例

// 创建工作空间管理器
manager := NewManager(config)

// 通过 Manager 调用目录格式功能
prDirName := manager.GeneratePRDirName("gemini", "codeagent", 161, 1752829201)
// 结果: "gemini-codeagent-pr-161-1752829201"

// 解析 PR 目录名
prInfo, err := manager.ParsePRDirName("gemini-codeagent-pr-161-1752829201")
if err == nil {
    fmt.Printf("AI Model: %s, Repo: %s, PR: %d\n",
        prInfo.AIModel, prInfo.Repo, prInfo.PRNumber)
}

// 从 Issue 创建工作空间
ws := manager.CreateWorkspaceFromIssueWithAI(issue, "gemini")

// 移动到 PR
err = manager.MoveIssueToPR(ws, prNumber)

// 创建 Session 目录
sessionPath, err := manager.CreateSessionPath(ws.Path, "gemini", "codeagent", prNumber, "1752829201")

设计原则

  1. 封装性: dirFormatter 作为 Manager 的内部组件,不直接暴露给外部
  2. 统一接口: 所有目录格式功能通过 Manager 的公共方法调用
  3. 统一格式: 所有目录都遵循相同的命名规范
  4. AI 模型区分: 通过 AI 模型信息区分不同的处理会话
  5. 时间戳标识: 使用时间戳确保目录名唯一性
  6. 生命周期管理: 完整的工作空间创建、移动、清理流程
  7. 错误处理: 完善的错误处理和日志记录

测试

运行测试确保功能正确:

go test ./internal/workspace -v

测试覆盖了以下功能:

  • 目录名生成
  • 目录名解析(包括错误处理)
  • 后缀提取
  • 工作空间创建和移动
  • Session 目录管理

Documentation

Index

Constants

View Source
const (
	// BranchPrefix branch name prefix, used to identify branches created by codeagent
	BranchPrefix = "codeagent"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type IssueDirFormat

type IssueDirFormat struct {
	AIModel     string
	Repo        string
	IssueNumber int
	Timestamp   int64
}

IssueDirFormat Issue目录格式

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

func NewManager

func NewManager(cfg *config.Config) *Manager

func (*Manager) CleanupWorkspace

func (m *Manager) CleanupWorkspace(ws *models.Workspace) bool

cleanupWorkspace 清理单个工作空间,返回是否清理成功

func (*Manager) CreateSessionPath

func (m *Manager) CreateSessionPath(underPath, aiModel, repo string, prNumber int, suffix string) (string, error)

func (*Manager) CreateWorkspaceFromIssueWithAI

func (m *Manager) CreateWorkspaceFromIssueWithAI(issue *github.Issue, aiModel string) *models.Workspace

CreateWorkspaceFromIssueWithAI 从 Issue 创建工作空间,支持指定AI模型

func (*Manager) CreateWorkspaceFromPR

func (m *Manager) CreateWorkspaceFromPR(pr *github.PullRequest) *models.Workspace

CreateWorkspaceFromPR 从 PR 创建工作空间(直接包含 PR 号)

func (*Manager) CreateWorkspaceFromPRWithAI

func (m *Manager) CreateWorkspaceFromPRWithAI(pr *github.PullRequest, aiModel string) *models.Workspace

CreateWorkspaceFromPRWithAI 从 PR 创建工作空间,支持指定AI模型

func (*Manager) ExtractAIModelFromBranch

func (m *Manager) ExtractAIModelFromBranch(branchName string) string

ExtractAIModelFromBranch extracts AI model information from branch name Branch format: codeagent/{aimodel}/{type}-{number}-{timestamp}

func (*Manager) ExtractSuffixFromIssueDir

func (m *Manager) ExtractSuffixFromIssueDir(aiModel, repo string, issueNumber int, dirName string) string

ExtractSuffixFromIssueDir extracts suffix from Issue directory name

func (*Manager) ExtractSuffixFromPRDir

func (m *Manager) ExtractSuffixFromPRDir(aiModel, repo string, prNumber int, dirName string) string

ExtractSuffixFromPRDir extracts suffix from PR directory name

func (*Manager) GenerateIssueDirName

func (m *Manager) GenerateIssueDirName(aiModel, repo string, issueNumber int, timestamp int64) string

GenerateIssueDirName generates Issue directory name

func (*Manager) GeneratePRDirName

func (m *Manager) GeneratePRDirName(aiModel, repo string, prNumber int, timestamp int64) string

GeneratePRDirName generates PR directory name

func (*Manager) GenerateSessionDirName

func (m *Manager) GenerateSessionDirName(aiModel, repo string, prNumber int, timestamp int64) string

GenerateSessionDirName generates Session directory name

func (*Manager) GetAllWorkspacesByPR

func (m *Manager) GetAllWorkspacesByPR(pr *github.PullRequest) []*models.Workspace

GetAllWorkspacesByPR 获取PR的所有工作空间(所有AI模型)

func (*Manager) GetExpiredWorkspaces

func (m *Manager) GetExpiredWorkspaces() []*models.Workspace

func (*Manager) GetOrCreateWorkspaceForPR

func (m *Manager) GetOrCreateWorkspaceForPR(pr *github.PullRequest) *models.Workspace

GetOrCreateWorkspaceForPR 获取或创建 PR 的工作空间

func (*Manager) GetOrCreateWorkspaceForPRWithAI

func (m *Manager) GetOrCreateWorkspaceForPRWithAI(pr *github.PullRequest, aiModel string) *models.Workspace

GetOrCreateWorkspaceForPRWithAI 获取或创建 PR 的工作空间,支持指定AI模型

func (*Manager) GetRepoManagerCount

func (m *Manager) GetRepoManagerCount() int

GetRepoManagerCount 获取仓库管理器数量

func (*Manager) GetWorkspaceByPR

func (m *Manager) GetWorkspaceByPR(pr *github.PullRequest) *models.Workspace

func (*Manager) GetWorkspaceByPRAndAI

func (m *Manager) GetWorkspaceByPRAndAI(pr *github.PullRequest, aiModel string) *models.Workspace

func (*Manager) GetWorkspaceCount

func (m *Manager) GetWorkspaceCount() int

GetWorkspaceCount 获取当前工作空间数量

func (*Manager) GetWorktreeCount

func (m *Manager) GetWorktreeCount() int

GetWorktreeCount 获取总 worktree 数量

func (*Manager) MoveIssueToPR

func (m *Manager) MoveIssueToPR(ws *models.Workspace, prNumber int) error

MoveIssueToPR 使用 git worktree move 将 Issue 工作空间移动到 PR 工作空间

func (*Manager) ParsePRDirName

func (m *Manager) ParsePRDirName(dirName string) (*PRDirFormat, error)

ParsePRDirName parses PR directory name

func (*Manager) PrepareFromEvent

func (m *Manager) PrepareFromEvent(event *github.IssueCommentEvent) models.Workspace

PrepareFromEvent 从完整的 IssueCommentEvent 准备工作空间

func (*Manager) RegisterWorkspace

func (m *Manager) RegisterWorkspace(ws *models.Workspace, pr *github.PullRequest)

RegisterWorkspace 注册工作空间

type PRDirFormat

type PRDirFormat struct {
	AIModel   string
	Repo      string
	PRNumber  int
	Timestamp int64
}

PRDirFormat PR目录格式

type RepoManager

type RepoManager struct {
	// contains filtered or unexported fields
}

RepoManager 仓库管理器,负责管理单个仓库的 worktree

func NewRepoManager

func NewRepoManager(repoPath, repoURL string) *RepoManager

NewRepoManager 创建新的仓库管理器

func (*RepoManager) CreateWorktreeWithName

func (r *RepoManager) CreateWorktreeWithName(worktreeName string, branch string, createNewBranch bool) (*WorktreeInfo, error)

CreateWorktreeWithName 使用指定名称创建 worktree

func (*RepoManager) EnsureMainRepositoryUpToDate

func (r *RepoManager) EnsureMainRepositoryUpToDate() error

EnsureMainRepositoryUpToDate 确保主仓库是最新的(公开方法,可被外部调用)

func (*RepoManager) GetRepoPath

func (r *RepoManager) GetRepoPath() string

GetRepoPath 获取仓库路径

func (*RepoManager) GetRepoURL

func (r *RepoManager) GetRepoURL() string

GetRepoURL 获取仓库 URL

func (*RepoManager) GetWorktree

func (r *RepoManager) GetWorktree(prNumber int) *WorktreeInfo

GetWorktree 获取指定 PR 的 worktree(向后兼容,默认无AI模型)

func (*RepoManager) GetWorktreeCount

func (r *RepoManager) GetWorktreeCount() int

GetWorktreeCount 获取 worktree 数量

func (*RepoManager) GetWorktreeWithAI

func (r *RepoManager) GetWorktreeWithAI(prNumber int, aiModel string) *WorktreeInfo

GetWorktreeWithAI 获取指定 PR 和 AI 模型的 worktree

func (*RepoManager) Initialize

func (r *RepoManager) Initialize() error

Initialize 初始化仓库(首次克隆)

func (*RepoManager) ListWorktrees

func (r *RepoManager) ListWorktrees() ([]*WorktreeInfo, error)

ListWorktrees 列出所有 worktree

func (*RepoManager) RegisterWorktree

func (r *RepoManager) RegisterWorktree(prNumber int, worktree *WorktreeInfo)

RegisterWorktree 注册单个 worktree 到内存(向后兼容,默认无AI模型)

func (*RepoManager) RegisterWorktreeWithAI

func (r *RepoManager) RegisterWorktreeWithAI(prNumber int, aiModel string, worktree *WorktreeInfo)

RegisterWorktreeWithAI 注册单个 worktree 到内存(支持AI模型)

func (*RepoManager) RemoveWorktree

func (r *RepoManager) RemoveWorktree(prNumber int) error

RemoveWorktree 移除指定 PR 的 worktree(向后兼容,默认无AI模型)

func (*RepoManager) RemoveWorktreeWithAI

func (r *RepoManager) RemoveWorktreeWithAI(prNumber int, aiModel string) error

RemoveWorktreeWithAI 移除指定 PR 和 AI 模型的 worktree

func (*RepoManager) RestoreWorktrees

func (r *RepoManager) RestoreWorktrees() error

RestoreWorktrees 扫描磁盘上的 worktree 并注册到内存

type SessionDirFormat

type SessionDirFormat struct {
	AIModel   string
	Repo      string
	PRNumber  int
	Timestamp int64
}

SessionDirFormat Session目录格式

type WorktreeInfo

type WorktreeInfo struct {
	Worktree string
	Head     string
	Branch   string
}

worktree /Users/jicarl/codeagent/qbox/codeagent/issue-11-1752143989 HEAD 5c2df7724d26a27c154b90f519b6d4f4efdd1436 branch refs/heads/codeagent/issue-11-1752143989

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL