@shutootaki/gwm
Version:
git worktree manager CLI
132 lines (127 loc) • 3.74 kB
JavaScript
/**
* 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