import { CLICommand } from "../cli/CLICommand.js"; import { parseTodoFile, writeTodoFile } from "../file.js"; import { getCurrentBranch, commitFileWithBody } from "../git.js"; import { validateStatusTransition } from "../issue.js"; export class DoneCommand extends CLICommand { name = "done "; help = "Mark an issue as done"; description = "Set issue to done (must be on issue branch)"; addArguments(yargs) { return yargs .positional("id", { type: "number", demandOption: true }) .option("summary", { type: "string", demandOption: true, description: "High-level summary of what was delivered", }); } async execute(args) { const todo = await parseTodoFile(); const issue = todo.issues.find(i => i.id === args.id); if (!issue) { console.error(`Issue #${args.id} not found`); return 1; } // Must be on the correct issue branch const expectedBranch = `${issue.type}/${issue.id}`; const branch = getCurrentBranch(); if (branch !== expectedBranch) { console.error(`Must be on ${expectedBranch} to mark issue as done (currently on ${branch})`); return 1; } const err = validateStatusTransition(issue.status, "done"); if (err) { console.error(err); return 1; } issue.status = "done"; writeTodoFile(todo); commitFileWithBody("TODO", `todo(${issue.id}): done`, args.summary); console.log(`Issue #${issue.id} is now done`); return 0; } }