UNPKG

@shutootaki/gwm

Version:
132 lines (127 loc) 3.74 kB
/** * Fig/Kiro CLI 互換 completion spec 生成 */ import { completionDefinition } from '../../definition.js'; /** * プロバイダIDからgeneratorを生成 */ function generateGenerator(providerId) { const scriptMap = { worktrees: 'gwm completion __fig_worktrees', localBranches: 'gwm completion __fig_branches_local', remoteBranchesOrigin: 'gwm completion __fig_branches_remote', subcommands: 'gwm completion __fig_worktrees', // フォールバック }; return { script: ['bash', '-c', scriptMap[providerId] || 'echo'], postProcess: `function(out) { return out.split('\\n').filter(Boolean).map(function(line) { var parts = line.split('\\t'); return { name: parts[0], description: parts[1] }; }); }`, cache: { ttl: 1000 }, }; } /** * 引数をFig形式に変換 */ function convertArg(arg) { const figArg = { name: arg.name, description: arg.description, isOptional: !arg.required, isVariadic: arg.isVariadic, }; if (arg.staticValues) { figArg.suggestions = arg.staticValues; } else if (arg.providers?.length) { figArg.generators = generateGenerator(arg.providers[0]); } return figArg; } /** * オプションをFig形式に変換 */ function convertOption(opt) { const figOpt = { name: opt.names.length === 1 ? opt.names[0] : opt.names, description: opt.description, }; if (opt.takesValue && opt.valueArg) { figOpt.args = convertArg(opt.valueArg); } return figOpt; } /** * コマンドをFig形式に変換 */ function convertCommand(cmd) { const figCmd = { name: cmd.aliases ? [cmd.name, ...cmd.aliases] : cmd.name, description: cmd.description, hidden: cmd.hidden, }; if (cmd.options?.length) { figCmd.options = cmd.options.map(convertOption); } if (cmd.args?.length) { figCmd.args = cmd.args.map(convertArg); } if (cmd.subcommands?.length) { figCmd.subcommands = cmd.subcommands.map(convertCommand); } return figCmd; } /** * Fig completion spec を生成 */ export function generateFigSpec(definition = completionDefinition) { const spec = { name: definition.rootName, description: definition.description, subcommands: definition.commands.map(convertCommand), }; if (definition.globalOptions?.length) { spec.options = definition.globalOptions.map(convertOption); } // JavaScript 形式で出力(Kiro/Fig が読み込める形式) return `// gwm Fig/Kiro CLI completion spec // Generated by gwm completion // // Installation: // gwm completion install --kiro // // Manual installation: // Copy this file to ~/.fig/autocomplete/build/gwm.js var completionSpec = ${JSON.stringify(spec, null, 2)}; // CommonJS export if (typeof module !== 'undefined' && module.exports) { module.exports = completionSpec; } // ES Module export if (typeof exports !== 'undefined') { exports.default = completionSpec; } `; } /** * TypeScript 形式の Fig completion spec を生成(開発用) */ export function generateFigSpecTypeScript(definition = completionDefinition) { const spec = { name: definition.rootName, description: definition.description, subcommands: definition.commands.map(convertCommand), }; if (definition.globalOptions?.length) { spec.options = definition.globalOptions.map(convertOption); } return `// gwm Fig/Kiro CLI completion spec // Generated by gwm completion const completionSpec: Fig.Spec = ${JSON.stringify(spec, null, 2)}; export default completionSpec; `; } //# sourceMappingURL=spec.js.map