Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cmd/task/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,7 @@ Examples:
project, _ := cmd.Flags().GetString("project")
taskExecutor, _ := cmd.Flags().GetString("executor")
effortLevel, _ := cmd.Flags().GetString("effort")
modelProfile, _ := cmd.Flags().GetString("model-profile")
execute, _ := cmd.Flags().GetBool("execute")
createDangerous, _ := cmd.Flags().GetBool("dangerous")
permissionModeFlag, _ := cmd.Flags().GetString("permission-mode")
Expand Down Expand Up @@ -721,6 +722,7 @@ Examples:
Project: project,
Executor: taskExecutor,
EffortLevel: effortLevel,
ModelProfile: strings.TrimSpace(modelProfile),
Tags: tags,
Pinned: pinned,
SourceBranch: branch,
Expand Down Expand Up @@ -748,6 +750,9 @@ Examples:
if task.EffortLevel != "" {
output["effort_level"] = task.EffortLevel
}
if task.ModelProfile != "" {
output["model_profile"] = task.ModelProfile
}
jsonBytes, _ := json.Marshal(output)
fmt.Println(string(jsonBytes))
} else {
Expand All @@ -771,6 +776,7 @@ Examples:
createCmd.Flags().StringP("project", "p", "", "Project name (auto-detected from cwd if not specified)")
createCmd.Flags().StringP("executor", "e", "", "Task executor: claude, codex, gemini, pi, opencode, openclaw (default: claude)")
createCmd.Flags().String("effort", "", "Per-task Claude effort override: low, medium, high, xhigh, max (default: Claude's global default)")
createCmd.Flags().String("model-profile", "", "Named model profile for the Pi executor (provider+model+base_url from ~/.config/taskyou/pi-models.json)")
createCmd.Flags().BoolP("execute", "x", false, "Queue task for immediate execution")
createCmd.Flags().Bool("dangerous", false, "Execute in dangerous mode (alias for --permission-mode dangerous)")
createCmd.Flags().String("permission-mode", "", "Permission mode: default (prompt), accept-edits (auto-accept file edits), auto (Claude Code auto mode: auto-approve safe actions, block risky ones), dangerous (skip all). Defaults to the project's setting")
Expand Down
2 changes: 2 additions & 0 deletions internal/db/sqlite.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ func (db *DB) migrate() error {
`ALTER TABLE tasks ADD COLUMN effort_level TEXT DEFAULT ''`,

`ALTER TABLE tasks ADD COLUMN remote_control INTEGER DEFAULT 0`, // Whether to launch claude with --remote-control
// Per-task model profile name (Pi executor): selects provider+model+base_url from the model-profile config ("" = Pi default)
`ALTER TABLE tasks ADD COLUMN model_profile TEXT DEFAULT ''`,
}

for _, m := range alterMigrations {
Expand Down
39 changes: 20 additions & 19 deletions internal/db/tasks.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ type Task struct {
Project string
Executor string // Task executor: "claude" (default), "codex", "gemini"
EffortLevel string // Per-task Claude effort override ("" = use global/Claude default; otherwise low/medium/high/xhigh/max)
ModelProfile string // Per-task model profile name (Pi executor): selects provider+model+base_url from the model-profile config. "" = Pi's default model.
WorktreePath string
BranchName string
Port int // Unique port for running the application in this task's worktree
Expand Down Expand Up @@ -298,9 +299,9 @@ func (db *DB) CreateTask(t *Task) error {
t.DangerousMode = t.PermissionMode == PermissionModeDangerous

result, err := db.Exec(`
INSERT INTO tasks (title, body, status, type, project, executor, pinned, tags, source_branch, dangerous_mode, permission_mode, remote_control, effort_level)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`, t.Title, t.Body, t.Status, t.Type, t.Project, t.Executor, t.Pinned, t.Tags, t.SourceBranch, t.DangerousMode, t.PermissionMode, t.RemoteControl, t.EffortLevel)
INSERT INTO tasks (title, body, status, type, project, executor, pinned, tags, source_branch, dangerous_mode, permission_mode, remote_control, effort_level, model_profile)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`, t.Title, t.Body, t.Status, t.Type, t.Project, t.Executor, t.Pinned, t.Tags, t.SourceBranch, t.DangerousMode, t.PermissionMode, t.RemoteControl, t.EffortLevel, t.ModelProfile)
if err != nil {
return fmt.Errorf("insert task: %w", err)
}
Expand Down Expand Up @@ -353,7 +354,7 @@ func (db *DB) GetTask(id int64) (*Task, error) {
COALESCE(claude_pane_id, ''), COALESCE(shell_pane_id, ''),
COALESCE(pr_url, ''), COALESCE(pr_number, 0), COALESCE(pr_info_json, ''),
COALESCE(dangerous_mode, 0), COALESCE(permission_mode, ''), COALESCE(remote_control, 0), COALESCE(pinned, 0), COALESCE(tags, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''), COALESCE(model_profile, ''),
created_at, updated_at, started_at, completed_at,
last_distilled_at, last_accessed_at,
COALESCE(archive_ref, ''), COALESCE(archive_commit, ''),
Expand All @@ -365,7 +366,7 @@ func (db *DB) GetTask(id int64) (*Task, error) {
&t.DaemonSession, &t.TmuxWindowID, &t.ClaudePaneID, &t.ShellPaneID,
&t.PRURL, &t.PRNumber, &t.PRInfoJSON,
&t.DangerousMode, &t.PermissionMode, &t.RemoteControl, &t.Pinned, &t.Tags,
&t.SourceBranch, &t.Summary, &t.EffortLevel,
&t.SourceBranch, &t.Summary, &t.EffortLevel, &t.ModelProfile,
&t.CreatedAt, &t.UpdatedAt, &t.StartedAt, &t.CompletedAt,
&t.LastDistilledAt, &t.LastAccessedAt,
&t.ArchiveRef, &t.ArchiveCommit, &t.ArchiveWorktreePath, &t.ArchiveBranchName,
Expand Down Expand Up @@ -399,7 +400,7 @@ func (db *DB) ListTasks(opts ListTasksOptions) ([]*Task, error) {
COALESCE(claude_pane_id, ''), COALESCE(shell_pane_id, ''),
COALESCE(pr_url, ''), COALESCE(pr_number, 0), COALESCE(pr_info_json, ''),
COALESCE(dangerous_mode, 0), COALESCE(permission_mode, ''), COALESCE(remote_control, 0), COALESCE(pinned, 0), COALESCE(tags, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''), COALESCE(model_profile, ''),
created_at, updated_at, started_at, completed_at,
last_distilled_at, last_accessed_at,
COALESCE(archive_ref, ''), COALESCE(archive_commit, ''),
Expand Down Expand Up @@ -468,7 +469,7 @@ func (db *DB) ListTasks(opts ListTasksOptions) ([]*Task, error) {
&t.DaemonSession, &t.TmuxWindowID, &t.ClaudePaneID, &t.ShellPaneID,
&t.PRURL, &t.PRNumber, &t.PRInfoJSON,
&t.DangerousMode, &t.PermissionMode, &t.RemoteControl, &t.Pinned, &t.Tags,
&t.SourceBranch, &t.Summary, &t.EffortLevel,
&t.SourceBranch, &t.Summary, &t.EffortLevel, &t.ModelProfile,
&t.CreatedAt, &t.UpdatedAt, &t.StartedAt, &t.CompletedAt,
&t.LastDistilledAt, &t.LastAccessedAt,
&t.ArchiveRef, &t.ArchiveCommit, &t.ArchiveWorktreePath, &t.ArchiveBranchName,
Expand All @@ -493,7 +494,7 @@ func (db *DB) GetMostRecentlyCreatedTask() (*Task, error) {
COALESCE(claude_pane_id, ''), COALESCE(shell_pane_id, ''),
COALESCE(pr_url, ''), COALESCE(pr_number, 0), COALESCE(pr_info_json, ''),
COALESCE(dangerous_mode, 0), COALESCE(permission_mode, ''), COALESCE(remote_control, 0), COALESCE(pinned, 0), COALESCE(tags, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''), COALESCE(model_profile, ''),
created_at, updated_at, started_at, completed_at,
last_distilled_at, last_accessed_at,
COALESCE(archive_ref, ''), COALESCE(archive_commit, ''),
Expand All @@ -507,7 +508,7 @@ func (db *DB) GetMostRecentlyCreatedTask() (*Task, error) {
&t.DaemonSession, &t.TmuxWindowID, &t.ClaudePaneID, &t.ShellPaneID,
&t.PRURL, &t.PRNumber, &t.PRInfoJSON,
&t.DangerousMode, &t.PermissionMode, &t.RemoteControl, &t.Pinned, &t.Tags,
&t.SourceBranch, &t.Summary, &t.EffortLevel,
&t.SourceBranch, &t.Summary, &t.EffortLevel, &t.ModelProfile,
&t.CreatedAt, &t.UpdatedAt, &t.StartedAt, &t.CompletedAt,
&t.LastDistilledAt, &t.LastAccessedAt,
&t.ArchiveRef, &t.ArchiveCommit, &t.ArchiveWorktreePath, &t.ArchiveBranchName,
Expand Down Expand Up @@ -536,7 +537,7 @@ func (db *DB) SearchTasks(query string, limit int) ([]*Task, error) {
COALESCE(claude_pane_id, ''), COALESCE(shell_pane_id, ''),
COALESCE(pr_url, ''), COALESCE(pr_number, 0), COALESCE(pr_info_json, ''),
COALESCE(dangerous_mode, 0), COALESCE(permission_mode, ''), COALESCE(remote_control, 0), COALESCE(pinned, 0), COALESCE(tags, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''), COALESCE(model_profile, ''),
created_at, updated_at, started_at, completed_at,
last_distilled_at, last_accessed_at,
COALESCE(archive_ref, ''), COALESCE(archive_commit, ''),
Expand Down Expand Up @@ -569,7 +570,7 @@ func (db *DB) SearchTasks(query string, limit int) ([]*Task, error) {
&t.DaemonSession, &t.TmuxWindowID, &t.ClaudePaneID, &t.ShellPaneID,
&t.PRURL, &t.PRNumber, &t.PRInfoJSON,
&t.DangerousMode, &t.PermissionMode, &t.RemoteControl, &t.Pinned, &t.Tags,
&t.SourceBranch, &t.Summary, &t.EffortLevel,
&t.SourceBranch, &t.Summary, &t.EffortLevel, &t.ModelProfile,
&t.CreatedAt, &t.UpdatedAt, &t.StartedAt, &t.CompletedAt,
&t.LastDistilledAt, &t.LastAccessedAt,
&t.ArchiveRef, &t.ArchiveCommit, &t.ArchiveWorktreePath, &t.ArchiveBranchName,
Expand Down Expand Up @@ -671,13 +672,13 @@ func (db *DB) UpdateTask(t *Task) error {
title = ?, body = ?, status = ?, type = ?, project = ?, executor = ?,
worktree_path = ?, branch_name = ?, port = ?, claude_session_id = ?,
daemon_session = ?, pr_url = ?, pr_number = ?, pr_info_json = ?, dangerous_mode = ?, permission_mode = ?, remote_control = ?,
pinned = ?, tags = ?, source_branch = ?, effort_level = ?,
pinned = ?, tags = ?, source_branch = ?, effort_level = ?, model_profile = ?,
updated_at = CURRENT_TIMESTAMP
WHERE id = ?
`, t.Title, t.Body, t.Status, t.Type, t.Project, t.Executor,
t.WorktreePath, t.BranchName, t.Port, t.ClaudeSessionID,
t.DaemonSession, t.PRURL, t.PRNumber, t.PRInfoJSON, t.DangerousMode, t.PermissionMode, t.RemoteControl,
t.Pinned, t.Tags, t.SourceBranch, t.EffortLevel, t.ID)
t.Pinned, t.Tags, t.SourceBranch, t.EffortLevel, t.ModelProfile, t.ID)
if err != nil {
return fmt.Errorf("update task: %w", err)
}
Expand Down Expand Up @@ -1003,7 +1004,7 @@ func (db *DB) GetNextQueuedTask() (*Task, error) {
COALESCE(claude_pane_id, ''), COALESCE(shell_pane_id, ''),
COALESCE(pr_url, ''), COALESCE(pr_number, 0), COALESCE(pr_info_json, ''),
COALESCE(dangerous_mode, 0), COALESCE(permission_mode, ''), COALESCE(remote_control, 0), COALESCE(pinned, 0), COALESCE(tags, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''), COALESCE(model_profile, ''),
created_at, updated_at, started_at, completed_at,
last_distilled_at, last_accessed_at,
COALESCE(archive_ref, ''), COALESCE(archive_commit, ''),
Expand All @@ -1018,7 +1019,7 @@ func (db *DB) GetNextQueuedTask() (*Task, error) {
&t.DaemonSession, &t.TmuxWindowID, &t.ClaudePaneID, &t.ShellPaneID,
&t.PRURL, &t.PRNumber, &t.PRInfoJSON,
&t.DangerousMode, &t.PermissionMode, &t.RemoteControl, &t.Pinned, &t.Tags,
&t.SourceBranch, &t.Summary, &t.EffortLevel,
&t.SourceBranch, &t.Summary, &t.EffortLevel, &t.ModelProfile,
&t.CreatedAt, &t.UpdatedAt, &t.StartedAt, &t.CompletedAt,
&t.LastDistilledAt, &t.LastAccessedAt,
&t.ArchiveRef, &t.ArchiveCommit, &t.ArchiveWorktreePath, &t.ArchiveBranchName,
Expand All @@ -1041,7 +1042,7 @@ func (db *DB) GetQueuedTasks() ([]*Task, error) {
COALESCE(claude_pane_id, ''), COALESCE(shell_pane_id, ''),
COALESCE(pr_url, ''), COALESCE(pr_number, 0), COALESCE(pr_info_json, ''),
COALESCE(dangerous_mode, 0), COALESCE(permission_mode, ''), COALESCE(remote_control, 0), COALESCE(pinned, 0), COALESCE(tags, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''), COALESCE(model_profile, ''),
created_at, updated_at, started_at, completed_at,
last_distilled_at, last_accessed_at,
COALESCE(archive_ref, ''), COALESCE(archive_commit, ''),
Expand All @@ -1064,7 +1065,7 @@ func (db *DB) GetQueuedTasks() ([]*Task, error) {
&t.DaemonSession, &t.TmuxWindowID, &t.ClaudePaneID, &t.ShellPaneID,
&t.PRURL, &t.PRNumber, &t.PRInfoJSON,
&t.DangerousMode, &t.PermissionMode, &t.RemoteControl, &t.Pinned, &t.Tags,
&t.SourceBranch, &t.Summary, &t.EffortLevel,
&t.SourceBranch, &t.Summary, &t.EffortLevel, &t.ModelProfile,
&t.CreatedAt, &t.UpdatedAt, &t.StartedAt, &t.CompletedAt,
&t.LastDistilledAt, &t.LastAccessedAt,
&t.ArchiveRef, &t.ArchiveCommit, &t.ArchiveWorktreePath, &t.ArchiveBranchName,
Expand Down Expand Up @@ -2007,7 +2008,7 @@ func (db *DB) GetStaleWorktreeTasks(maxAge time.Duration) ([]*Task, error) {
COALESCE(claude_pane_id, ''), COALESCE(shell_pane_id, ''),
COALESCE(pr_url, ''), COALESCE(pr_number, 0), COALESCE(pr_info_json, ''),
COALESCE(dangerous_mode, 0), COALESCE(permission_mode, ''), COALESCE(remote_control, 0), COALESCE(pinned, 0), COALESCE(tags, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''),
COALESCE(source_branch, ''), COALESCE(summary, ''), COALESCE(effort_level, ''), COALESCE(model_profile, ''),
created_at, updated_at, started_at, completed_at,
last_distilled_at, last_accessed_at,
COALESCE(archive_ref, ''), COALESCE(archive_commit, ''),
Expand All @@ -2034,7 +2035,7 @@ func (db *DB) GetStaleWorktreeTasks(maxAge time.Duration) ([]*Task, error) {
&t.DaemonSession, &t.TmuxWindowID, &t.ClaudePaneID, &t.ShellPaneID,
&t.PRURL, &t.PRNumber, &t.PRInfoJSON,
&t.DangerousMode, &t.PermissionMode, &t.RemoteControl, &t.Pinned, &t.Tags,
&t.SourceBranch, &t.Summary, &t.EffortLevel,
&t.SourceBranch, &t.Summary, &t.EffortLevel, &t.ModelProfile,
&t.CreatedAt, &t.UpdatedAt, &t.StartedAt, &t.CompletedAt,
&t.LastDistilledAt, &t.LastAccessedAt,
&t.ArchiveRef, &t.ArchiveCommit, &t.ArchiveWorktreePath, &t.ArchiveBranchName,
Expand Down
Loading