/** * tasks/set-priority.ts — Change a task's priority. * * Usage: * woco tasks set-priority * * Valid priorities: critical, high, medium, low, wishlist * * Supports --output json and --dry-run. * Works on both top-level tasks and subtasks. */ import type { WomboConfig } from "../../config"; import { loadFeatures, saveFeatures, findFeatureById, type Priority, } from "../../lib/tasks"; import { VALID_PRIORITIES } from "../../lib/task-schema"; import { outputError, outputMessage, type OutputFormat } from "../../lib/output"; // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- export interface TasksSetPriorityOptions { projectRoot: string; config: WomboConfig; featureId: string; newPriority: string; outputFmt?: OutputFormat; dryRun?: boolean; } // --------------------------------------------------------------------------- // Command // --------------------------------------------------------------------------- export async function cmdTasksSetPriority(opts: TasksSetPriorityOptions): Promise { const { projectRoot, config } = opts; const fmt = opts.outputFmt ?? "text"; if (!opts.featureId || !opts.newPriority) { outputError(fmt, `Usage: woco tasks set-priority \nValid priorities: ${VALID_PRIORITIES.join(", ")}`); return; } // Validate priority if (!(VALID_PRIORITIES as readonly string[]).includes(opts.newPriority)) { outputError(fmt, `Invalid priority: "${opts.newPriority}"\nValid priorities: ${VALID_PRIORITIES.join(", ")}`); return; } const data = loadFeatures(projectRoot, config); const feature = findFeatureById(data, opts.featureId); if (!feature) { outputError(fmt, `Task "${opts.featureId}" not found.`); return; } const oldPriority = feature.priority; const newPriority = opts.newPriority as Priority; if (oldPriority === newPriority) { outputMessage(fmt, `Task "${opts.featureId}" already has priority "${newPriority}".`, { id: opts.featureId, priority: newPriority, changed: false, }); return; } // Dry-run: show what would change without writing if (opts.dryRun) { outputMessage(fmt, `[dry-run] Would change "${opts.featureId}" priority: ${oldPriority} → ${newPriority}`, { dry_run: true, id: opts.featureId, old_priority: oldPriority, new_priority: newPriority, changed: false, }); return; } // Apply priority change feature.priority = newPriority; saveFeatures(projectRoot, config, data); outputMessage(fmt, `Task "${opts.featureId}" priority: ${oldPriority} → ${newPriority}`, { id: opts.featureId, old_priority: oldPriority, new_priority: newPriority, changed: true, }); }