import { SCHEMA_VERSION } from "../core/constants.js"; import { GROUP_SUMMARIES, commandDocs, hasVisibleSubcommands, isHiddenPath } from "./docs.js"; import type { HelpPayload } from "../core/types.js"; export function helpPayload(pathParts: string[]): HelpPayload | null { const path = pathParts.join(" "); if (path && isHiddenPath(path)) return null; if (path && commandDocs.has(path)) return commandDocs.get(path)!; if (!path) { const seen = new Set(); const commands: Array<{ command: string; summary: string }> = []; for (const doc of [...commandDocs.values()].sort((a, b) => a.command.localeCompare(b.command))) { if (isHiddenPath(doc.command)) continue; const command = doc.command.split(" ")[0]!; if (seen.has(command)) continue; seen.add(command); commands.push({ command, summary: GROUP_SUMMARIES[command] ?? `${command} 可用子命令` }); } return { ok: true, schema_version: SCHEMA_VERSION, summary: "可用一级菜单", menu_level: 1, commands, }; } const prefix = path ? `${path} ` : ""; const children: Array<{ command: string; summary: string; usage: string; example: string }> = []; const seen = new Set(); for (const doc of [...commandDocs.values()].sort((a, b) => a.command.localeCompare(b.command))) { if (isHiddenPath(doc.command)) continue; if (!doc.command.startsWith(prefix)) continue; const child = doc.command.slice(prefix.length).split(" ")[0]!; if (seen.has(child)) continue; seen.add(child); const childPath = path ? `${path} ${child}` : child; const isGroup = hasVisibleSubcommands(childPath); const childDoc = commandDocs.get(childPath) ?? doc; children.push({ command: childPath, summary: isGroup ? (GROUP_SUMMARIES[childPath] ?? `${childPath} 可用子命令`) : childDoc.summary, usage: isGroup ? `tjwater-cli ${childPath} help` : childDoc.usage, example: isGroup ? `tjwater-cli ${childPath} help` : childDoc.examples[0]!, }); } if (!children.length && path) return null; return { ok: true, schema_version: SCHEMA_VERSION, summary: GROUP_SUMMARIES[path] ?? `${path} 可用子命令`, commands: children, }; }