import type { Argv, ArgumentsCamelCase } from "yargs" 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 HoldCommand extends CLICommand { readonly name = "hold " readonly help = "Put an issue on hold" readonly description = "Set issue to hold (must be on issue branch)" addArguments(yargs: Argv): Argv { return yargs .positional("id", { type: "number", demandOption: true }) .option("reason", { type: "string", demandOption: true, description: "Reason for holding", }) } async execute(args: ArgumentsCamelCase): Promise { 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 } const expectedBranch = `${issue.type}/${issue.id}` const branch = getCurrentBranch() if (branch !== expectedBranch) { console.error(`Must be on ${expectedBranch} to hold issue (currently on ${branch})`) return 1 } const err = validateStatusTransition(issue.status, "hold") if (err) { console.error(err) return 1 } issue.status = "hold" writeTodoFile(todo) commitFileWithBody( "TODO", `todo(${issue.id}): hold`, args.reason as string ) console.log(`Issue #${issue.id} is now on hold`) console.log(`Switch back to develop: git checkout develop`) return 0 } }