Let the agent set the merge commit title, defaulting to the task title

This commit is contained in:
Ian Gulliver
2026-10-14 21:21:54 -07:00
parent 73f6dd73d2
commit 01c60d6618
24 changed files with 373 additions and 202 deletions
+22 -2
View File
@@ -159,6 +159,8 @@ CREATE TABLE turn_queue_next (
INSERT INTO turn_queue_next (session_id, actor, text, created_at) SELECT session_id, actor, text, created_at FROM turn_queue;
DROP TABLE turn_queue;
ALTER TABLE turn_queue_next RENAME TO turn_queue;
`}, {"add-task-merge-title", `
ALTER TABLE tasks ADD COLUMN merge_title TEXT NOT NULL DEFAULT '';
`}}
type Store struct {
@@ -412,6 +414,21 @@ func (s *Store) GetTask(ctx context.Context, id string) (api.Task, error) {
return t, err
}
func (s *Store) SetMergeTitle(ctx context.Context, id, title, actor string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
projectID := ""
err := tx.QueryRowContext(ctx, `UPDATE tasks SET merge_title = ? WHERE id = ? AND status = ? RETURNING project_id`,
title, id, string(api.TaskStatusActive)).Scan(&projectID)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
if err != nil {
return err
}
return emit(api.Event{Kind: "task.merge_title", ProjectId: &projectID, TaskId: &id, Actor: actor, Payload: map[string]any{"id": id, "merge_title": title}})
})
}
func (s *Store) MergeTask(ctx context.Context, id, commit, actor string) (api.Task, error) {
return s.closeTask(ctx, id, api.TaskStatusMerged, commit, actor, "task.merged", map[string]any{"id": id, "commit": commit})
}
@@ -710,7 +727,7 @@ func (s *Store) write(ctx context.Context, fn func(tx *sql.Tx, emit emitFunc) er
const projectColumns = `id, name, repo_path, default_branch, remote, created_by, created_at`
const taskColumns = `id, project_id, title, branch, worktree_path, base_ref, status, created_by, created_at, closed_at, merge_commit`
const taskColumns = `id, project_id, title, merge_title, branch, worktree_path, base_ref, status, created_by, created_at, closed_at, merge_commit`
const sessionColumns = `id, task_id, vendor, model, vendor_session_id, state, role, created_by, created_at`
@@ -735,10 +752,13 @@ func scanTask(row scanner) (api.Task, error) {
createdAt := ""
closedAt := sql.NullString{}
mergeCommit := ""
err := row.Scan(&t.Id, &t.ProjectId, &t.Title, &t.Branch, &t.WorktreePath, &t.BaseRef, &status, &t.CreatedBy, &createdAt, &closedAt, &mergeCommit)
err := row.Scan(&t.Id, &t.ProjectId, &t.Title, &t.MergeTitle, &t.Branch, &t.WorktreePath, &t.BaseRef, &status, &t.CreatedBy, &createdAt, &closedAt, &mergeCommit)
if err != nil {
return t, err
}
if t.MergeTitle == "" {
t.MergeTitle = t.Title
}
t.Status = api.TaskStatus(status)
t.CreatedAt, err = parseTime(createdAt)
if err != nil {