import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { runAddTemplateFlow } from "../workflows/add-template-flow.ts"; import { runCommitFlow } from "../workflows/commit-flow.ts"; import { runListTemplatesFlow } from "../workflows/list-templates-flow.ts"; import { runRemoveTemplateFlow } from "../workflows/remove-template-flow.ts"; /** 支持的无参数模板管理快捷命令。 */ const SUBCOMMANDS = [ { value: "add", label: "add", description: "Create a commit message template", }, { value: "list", label: "list", description: "List templates and switch the active one", }, { value: "remove", label: "remove", description: "Remove a user template", }, ]; /** 把未知错误转换为稳定的用户提示。 */ function getErrorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error); } /** 注册带会话内互斥保护的 /git-commit 命令。 */ export function registerGitCommitCommand(pi: ExtensionAPI): void { let running = false; pi.registerCommand("git-commit", { description: "Generate, review, and commit the current Git changes", /** 仅为无参数模板管理快捷命令提供首词补全。 */ getArgumentCompletions: (prefix) => { if (prefix.includes(" ")) { return null; } const matched = SUBCOMMANDS.filter((item) => item.value.startsWith(prefix)); return matched.length > 0 ? matched : null; }, /** 执行 /git-commit 命令。 */ handler: async (args, ctx) => { if (!ctx.hasUI) { console.error("[pi-ai-git-commit] /git-commit requires interactive TUI or RPC mode."); return; } if (running) { ctx.ui.notify("A /git-commit workflow is already running.", "warning"); return; } running = true; try { const trimmed = args.trim(); if (trimmed === "add") { await runAddTemplateFlow(pi, ctx); return; } if (trimmed === "list") { await runListTemplatesFlow(pi, ctx); return; } if (trimmed === "remove") { await runRemoveTemplateFlow(pi, ctx); return; } await ctx.waitForIdle(); await runCommitFlow(pi, ctx, trimmed); } catch (error) { ctx.ui.setStatus("pi-ai-git-commit", undefined); ctx.ui.notify(getErrorMessage(error), "error"); } finally { running = false; } }, }); }