@cannbot-ai/install-helper 0.0.2-beta.1 → 0.0.2-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +32 -20
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/ui/wizard.ts","../src/core/registry.ts","../src/core/detector.ts","../src/utils/paths.ts","../src/core/manifest.ts","../src/utils/i18n.ts","../src/utils/logger.ts","../src/utils/config.ts","../src/ui/theme.ts","../src/core/repository.ts","../src/core/scanner.ts","../src/core/skill-registry.ts","../src/core/installer.ts","../src/core/record.ts","../src/core/skill-installer.ts","../src/ui/display.ts","../src/commands/list.ts","../src/commands/doctor.ts","../src/commands/status.ts","../src/commands/install.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/commands/info.ts","../src/commands/lang.ts","../src/index.ts"],"sourcesContent":["// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { installCommand } from \"./commands/install.js\";\nimport { uninstallCommand } from \"./commands/uninstall.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { langCommand } from \"./commands/lang.js\";\nimport { readConfig } from \"./utils/config.js\";\nimport { setLanguage } from \"./utils/i18n.js\";\n\nexport function createCLI(): Command {\n const config = readConfig();\n if (config.language) {\n setLanguage(config.language);\n }\n\n const program = new Command();\n\n program\n .name(\"install-helper\")\n .description(\"Install Helper - Interactive installer for CANN operator development skills\")\n .version(\"0.0.2-beta.1\");\n\n program\n .command(\"init\", { isDefault: false })\n .description(\"Run interactive installation wizard\")\n .action(async () => {\n await initCommand();\n });\n\n program\n .command(\"list\")\n .description(\"List available plugins\")\n .action(async () => {\n await listCommand();\n });\n\n program\n .command(\"doctor\")\n .description(\"Run health check\")\n .option(\"--fix\", \"Auto-fix detected issues\")\n .action(async (options: { fix?: boolean }) => {\n await doctorCommand(options);\n });\n\n program\n .command(\"status\")\n .description(\"Show installed plugins\")\n .action(async () => {\n await statusCommand();\n });\n\n program\n .command(\"install [names...]\")\n .description(\"Install plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--list\", \"List all available skills by category\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; list?: boolean }) => {\n await installCommand(names, options);\n });\n\n program\n .command(\"uninstall <names...>\")\n .description(\"Uninstall plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (names: string[], options: { tool?: string; level?: string }) => {\n await uninstallCommand(names, options);\n });\n\n program\n .command(\"update [plugins...]\")\n .description(\"Update installed plugins (git pull + reinstall)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (plugins: string[], options: { tool?: string; level?: string }) => {\n await updateCommand(plugins, options);\n });\n\n program\n .command(\"info <plugin>\")\n .description(\"Show plugin details\")\n .action(async (plugin: string) => {\n await infoCommand(plugin);\n });\n\n program\n .command(\"lang [action] [value]\")\n .description(\"Manage language settings (show/set)\")\n .action(async (action?: string, value?: string) => {\n await langCommand(action, value);\n });\n\n program.action(async () => {\n await initCommand();\n });\n\n return program;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { runWizard, selectToolWithDetection, stepLevel } from \"../ui/wizard.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { installSkills, interactiveSkillSelect } from \"../core/skill-installer.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner, printBanner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { selectTheme } from \"../ui/theme.js\";\nimport { printBoxTitle, showOperationHints } from \"../utils/logger.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function initCommand(): Promise<void> {\n const cwd = process.cwd();\n if (\n existsSync(join(cwd, \"package.json\")) &&\n (() => {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\"));\n return pkg.name === \"@cannbot-ai/install-helper\";\n } catch { return false; }\n })()\n ) {\n logger.warn(\"当前目录看起来是 install-helper 包目录\");\n logger.info(\"请在你的项目目录中运行此命令,而不是在 install-helper 安装目录中\");\n logger.info(\"示例:cd ~/my-project && install-helper\");\n return;\n }\n\n printBanner(t(\"wizard_title\"));\n\n const spinner = createSpinner(\"正在加载 Skills 列表...\");\n spinner.start();\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n spinner.succeed(\"Skills 列表加载完成\");\n } catch {\n spinner.warn(\"Skills 列表加载失败,将使用内置数据\");\n }\n\n let step = 0;\n let mode: \"plugin\" | \"skill\" = \"plugin\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectMode();\n if (result === null) return;\n mode = result;\n step = 1;\n break;\n }\n case 1: {\n if (mode === \"plugin\") {\n const result = await pluginInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n } else {\n const result = await skillInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n }\n }\n }\n }\n}\n\nasync function selectMode(): Promise<\"plugin\" | \"skill\" | null> {\n printBoxTitle(\"选择安装类型\");\n\n const CANCEL = \"__cancel__\";\n const choices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `> ${t(\"wizard_mode_plugin\")} — ${t(\"wizard_mode_plugin_desc\")}`,\n value: \"plugin\",\n },\n {\n name: `> ${t(\"wizard_mode_skill\")} — ${t(\"wizard_mode_skill_desc\")}`,\n value: \"skill\",\n },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_mode\"),\n choices,\n loop: false,\n theme: selectTheme,\n });\n if (result === CANCEL) return null;\n return result as \"plugin\" | \"skill\";\n}\n\nasync function pluginInstallFlow(): Promise<\"done\" | \"back\"> {\n const answers = await runWizard();\n\n if (!answers.confirmed) {\n if (answers.back) return \"back\";\n logger.info(\"已取消安装\");\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = answers.plugins.map((id) =>\n allPlugins.find((p) => p.id === id)\n );\n\n const total = answers.plugins.length;\n const results = [];\n\n for (let i = 0; i < answers.plugins.length; i++) {\n const pluginId = answers.plugins[i];\n const plugin = selectedPlugins[i];\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"install_progress\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool: answers.tool,\n level: answers.level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => ({\n pluginId: result.pluginId,\n displayName: selectedPlugins[index]?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n }));\n\n printInstallSummary(summary);\n\n const configRoot = getConfigRoot(answers.tool, answers.level);\n printEnhancedSummary(summary, answers.tool, configRoot);\n return \"done\";\n}\n\nasync function skillInstallFlow(): Promise<\"done\" | \"back\"> {\n let step = 0;\n let tool: AITool = \"opencode\";\n let level: InstallLevel = \"project\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectToolWithDetection();\n if (result === \"back\") return \"back\";\n if (result === \"cancel\") {\n logger.info(\"已取消安装\");\n return \"done\";\n }\n tool = result;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel();\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n logger.info(\"已取消安装\");\n return \"done\";\n }\n level = result;\n step = 2;\n break;\n }\n case 2: {\n const selectedSkills = await interactiveSkillSelect();\n if (selectedSkills === \"back\") { step = 1; break; }\n if (selectedSkills === \"cancel\") {\n logger.info(\"已取消安装\");\n return \"done\";\n }\n if (selectedSkills.length === 0) {\n logger.info(\"未选择任何 Skill\");\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${chalk.bold(selectedSkills.length)} 个 Skills...`);\n\n const results = await installSkills(selectedSkills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n if (result.success) {\n logger.success(`${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n logger.info(`安装到: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`启动 ${chalk.green(tool)} 即可使用`);\n logger.blank();\n return \"done\";\n }\n }\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel, WizardAnswers } from \"../types/index.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { detectTools, getToolDisplayName } from \"../core/detector.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { selectTheme, checkboxTheme } from \"./theme.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function selectToolWithDetection(): Promise<AITool | \"back\" | \"cancel\"> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) return \"back\";\n if (result === CANCEL) return \"cancel\";\n return result as AITool;\n}\n\nexport async function runWizard(): Promise<WizardAnswers> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n let selectedTool: AITool | undefined;\n let level: InstallLevel = \"project\";\n let plugins: string[] = [];\n\n let step = 0;\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false, back: true };\n }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false };\n }\n selectedTool = result as AITool;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel(config.lastLevel);\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level: \"project\", plugins: [], confirmed: false };\n }\n level = result as InstallLevel;\n step = 2;\n break;\n }\n case 2: {\n const result = await stepPlugins(selectedTool!, level);\n if (result === BACK) { step = 1; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n plugins = result as string[];\n step = 3;\n break;\n }\n case 3: {\n const result = await stepConfirm(selectedTool!, level, plugins);\n if (result === BACK) { step = 2; break; }\n if (result === CANCEL || result === false) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n updateConfig({ lastTool: selectedTool, lastLevel: level });\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins, confirmed: true };\n }\n }\n }\n}\n\nasync function stepTool(detectedTools: Awaited<ReturnType<typeof detectTools>>, lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"选择 AI 编程工具\");\n\n if (detectedTools.length === 0) {\n logger.error(t(\"error_tool_not_found\"));\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n }\n\n if (detectedTools.length === 1) {\n const tool = detectedTools[0];\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n logger.success(\n `${t(\"wizard_detected_tool\")}: ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`\n );\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> ${t(\"wizard_confirm_tool\")} ${getToolDisplayName(tool.name)}`, value: tool.name },\n { name: `> ${t(\"wizard_select_tool\")}`, value: \"manual\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n if (result === \"manual\") {\n return stepToolManual(lastTool);\n }\n return tool.name as AITool;\n }\n\n const choices: Array<{ name: string; value: string } | Separator> = detectedTools.map((tool) => {\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n return {\n name: `> ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`,\n value: tool.name,\n };\n });\n choices.push(new Separator(\"──────────────\"));\n choices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK });\n choices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL });\n\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nasync function stepToolManual(lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nexport async function stepLevel(lastLevel?: InstallLevel): Promise<InstallLevel | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"选择安装位置\");\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: \"> project — 安装到当前目录(推荐,仅当前项目可用)\", value: \"project\" },\n { name: \"> global — 安装到全局(所有项目共享)\", value: \"global\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_level\"),\n choices,\n default: lastLevel || \"project\",\n loop: false,\n theme: selectTheme,\n });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as InstallLevel;\n}\n\nasync function stepPlugins(tool: AITool, level: InstallLevel): Promise<string[] | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"选择要安装的插件\");\n\n const plugins = getAllPlugins();\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n\n const choices: Array<{ name: string; value: string; checked: boolean } | Separator> = plugins.map((p) => {\n const isInstalled = installedSet.has(p.id);\n const suffix = isInstalled ? ` [${t(\"wizard_already_installed\")}]` : \"\";\n return {\n name: `${p.displayName}${suffix} — ${p.description}`,\n value: p.id,\n checked: false,\n };\n });\n choices.push(new Separator(\"──────────────\"));\n choices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK, checked: false });\n choices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL, checked: false });\n\n showOperationHints(true);\n const selected = await checkbox({\n message: t(\"wizard_select_plugins\"),\n choices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n });\n\n if (selected.includes(BACK)) return BACK;\n if (selected.includes(CANCEL)) return CANCEL;\n\n const pluginIds = selected.filter((v) => v !== BACK && v !== CANCEL);\n\n if (pluginIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") return BACK;\n return CANCEL;\n }\n\n return pluginIds;\n}\n\nasync function stepConfirm(\n tool: AITool,\n level: InstallLevel,\n plugins: string[]\n): Promise<true | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"确认安装\");\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = plugins.map((id) => allPlugins.find((p) => p.id === id));\n\n const displayPath = getConfigRoot(tool, level);\n logger.info(`即将安装 ${chalk.bold(plugins.length)} 个场景到 ${chalk.cyan(displayPath)}:`);\n for (const plugin of selectedPlugins) {\n if (plugin) {\n logger.step(` • ${chalk.bold(plugin.displayName)} ${chalk.dim(`(${plugin.skills} skills, ${plugin.agents} agents)`)}`);\n }\n }\n logger.blank();\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: \"> \" + t(\"wizard_confirm\"), value: \"confirm\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_confirm\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return true;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport type { PluginEntry } from \"../types/index.js\";\n\nexport const PLUGIN_REGISTRY: PluginEntry[] = [\n {\n id: \"ops-direct-invoke\",\n dir: \"plugins-official/ops-direct-invoke\",\n displayName: \"AscendC Kernel 直调\",\n script: \"init.sh\",\n aliases: [\"ops-direct\", \"ascendc-direct\", \"direct\", \"kernel\"],\n skills: 16,\n agents: 3,\n description: \"Ascend C Kernel <<<>>> 直调算子开发全流程\",\n },\n {\n id: \"ops-direct-invoke-flash\",\n dir: \"plugins-official/ops-direct-invoke-flash\",\n displayName: \"AscendC Kernel 从零构建\",\n script: \"init.sh\",\n aliases: [\"flash\", \"kernel-flash\"],\n skills: 1,\n agents: 1,\n description: \"Ascend C / Ascend950 Reg API 核函数从零构建\",\n },\n {\n id: \"ops-registry-invoke\",\n dir: \"plugins-official/ops-registry-invoke\",\n displayName: \"AscendC 算子注册调用\",\n script: \"init.sh\",\n aliases: [\"ops-registry\", \"ascendc-registry\", \"registry\"],\n skills: 12,\n agents: 4,\n description: \"Ascend C 算子注册调用开发流程\",\n },\n {\n id: \"pypto-op-orchestrator\",\n dir: \"plugins-official/pypto-op-orchestrator\",\n displayName: \"PyPTO 算子\",\n script: \"init.sh\",\n aliases: [\"pypto\", \"pytorch\"],\n skills: 8,\n agents: 3,\n description: \"PyPTO 算子端到端开发编排\",\n },\n {\n id: \"triton-op-generator\",\n dir: \"plugins-official/triton-op-generator\",\n displayName: \"Triton 算子生成\",\n script: \"install.sh\",\n aliases: [\"triton\"],\n skills: 6,\n agents: 0,\n description: \"Triton-Ascend 算子代码生成与优化\",\n },\n {\n id: \"tilelang-op-orchestrator\",\n dir: \"plugins-official/tilelang-op-orchestrator\",\n displayName: \"TileLang 算子\",\n script: \"init.sh\",\n aliases: [\"tilelang\"],\n skills: 9,\n agents: 3,\n description: \"TileLang 算子开发流程\",\n },\n {\n id: \"model-infer-optimize\",\n dir: \"plugins-official/model-infer-optimize\",\n displayName: \"NPU 推理优化\",\n script: \"init.sh\",\n aliases: [\"model-infer\", \"infer\", \"inference\"],\n skills: 11,\n agents: 3,\n description: \"NPU 模型推理端到端优化\",\n },\n {\n id: \"catlass-op-generator\",\n dir: \"plugins-official/catlass-op-generator\",\n displayName: \"Catlass 算子直调\",\n script: \"init.sh\",\n aliases: [\"catlass\"],\n skills: 10,\n agents: 3,\n description: \"Catlass 算子直调开发\",\n },\n {\n id: \"ops-code-reviewer\",\n dir: \"plugins-official/ops-code-reviewer\",\n displayName: \"代码检视\",\n script: \"init.sh\",\n aliases: [\"code-review\", \"reviewer\", \"review\"],\n skills: 5,\n agents: 1,\n description: \"代码检视与规范检查\",\n },\n {\n id: \"torch-compile\",\n dir: \"plugins-official/torch-compile\",\n displayName: \"torch.compile 图模式\",\n script: \"init.sh\",\n aliases: [\"torch\", \"compile\", \"graph\"],\n skills: 6,\n agents: 1,\n description: \"PyTorch torch.compile 图模式适配\",\n },\n];\n\nexport function findPlugin(query: string): PluginEntry | undefined {\n const normalized = query.toLowerCase().trim();\n\n const exactMatch = PLUGIN_REGISTRY.find(\n (p) => p.id === normalized || p.id === query.trim()\n );\n if (exactMatch) return exactMatch;\n\n const aliasMatch = PLUGIN_REGISTRY.find((p) =>\n p.aliases.some((a) => a === normalized)\n );\n if (aliasMatch) return aliasMatch;\n\n const prefixMatch = PLUGIN_REGISTRY.find((p) => p.id.startsWith(normalized));\n if (prefixMatch) return prefixMatch;\n\n return undefined;\n}\n\nexport function getAllPlugins(): PluginEntry[] {\n return PLUGIN_REGISTRY;\n}\n\nexport function getPluginById(id: string): PluginEntry | undefined {\n return PLUGIN_REGISTRY.find((p) => p.id === id);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { execa } from \"execa\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport type { AITool, DetectedTool } from \"../types/index.js\";\nimport { detectTraeVariant } from \"../utils/paths.js\";\n\nasync function getCommandVersion(\n cmd: string,\n args: string[] = [\"--version\"]\n): Promise<string | undefined> {\n try {\n const result = await execa(cmd, args, { timeout: 5000 });\n const output = result.stdout.trim();\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match ? match[1] : output.split(\"\\n\")[0];\n } catch {\n return undefined;\n }\n}\n\nasync function getCommandPath(cmd: string): Promise<string | undefined> {\n try {\n const result = await execa(\"sh\", [\"-c\", `command -v ${cmd}`], { timeout: 5000 });\n return result.stdout.trim();\n } catch {\n return undefined;\n }\n}\n\nasync function detectOpenCode(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"opencode\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"opencode\");\n return { name: \"opencode\", version, path };\n}\n\nasync function detectClaude(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"claude\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"claude\");\n return { name: \"claude\", version, path };\n}\n\nasync function detectTrae(): Promise<DetectedTool | undefined> {\n const home = homedir();\n const variant = detectTraeVariant();\n\n let path: string | undefined;\n if (variant === \"ide\" && existsSync(join(home, \".trae-cn\"))) {\n path = join(home, \".trae-cn\");\n } else if (variant === \"plugin\" && existsSync(join(home, \".marscode\"))) {\n path = join(home, \".marscode\");\n } else if (variant === \"cli\" && existsSync(join(home, \".traecli\"))) {\n path = join(home, \".traecli\");\n } else if (variant === \"unknown\") {\n const cmdPath = await getCommandPath(\"trae\");\n if (cmdPath) path = cmdPath;\n }\n\n if (!path) return undefined;\n return { name: \"trae\", version: variant, path };\n}\n\nasync function detectCursor(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"cursor\");\n if (path) {\n const version = await getCommandVersion(\"cursor\");\n return { name: \"cursor\", version, path };\n }\n\n if (process.platform === \"darwin\") {\n const appPath = \"/Applications/Cursor.app\";\n if (existsSync(appPath)) {\n return { name: \"cursor\", path: appPath };\n }\n }\n\n return undefined;\n}\n\nasync function detectCopilot(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"gh\");\n if (!path) return undefined;\n\n try {\n await execa(\"gh\", [\"extension\", \"list\"], { timeout: 5000 });\n return { name: \"copilot\", path };\n } catch {\n return undefined;\n }\n}\n\nexport async function detectTools(): Promise<DetectedTool[]> {\n const detectors = [\n detectOpenCode,\n detectClaude,\n detectTrae,\n detectCursor,\n detectCopilot,\n ];\n\n const results = await Promise.allSettled(detectors.map((d) => d()));\n const tools: DetectedTool[] = [];\n\n for (const result of results) {\n if (result.status === \"fulfilled\" && result.value) {\n tools.push(result.value);\n }\n }\n\n return tools;\n}\n\nexport async function detectSingleTool(): Promise<DetectedTool | undefined> {\n const tools = await detectTools();\n return tools[0];\n}\n\nexport function getToolDisplayName(tool: AITool): string {\n const names: Record<AITool, string> = {\n opencode: \"OpenCode\",\n claude: \"Claude Code\",\n trae: \"Trae\",\n cursor: \"Cursor\",\n copilot: \"GitHub Copilot\",\n };\n return names[tool];\n}\n\nexport function getAllTools(): AITool[] {\n return [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport type { AITool, InstallLevel, TraeVariant } from \"../types/index.js\";\n\nexport function detectTraeVariant(): TraeVariant {\n const home = homedir();\n if (existsSync(join(home, \".trae-cn\"))) return \"ide\";\n if (existsSync(join(home, \".marscode\"))) return \"plugin\";\n if (existsSync(join(home, \".traecli\"))) return \"cli\";\n return \"unknown\";\n}\n\nexport function getConfigRoot(\n tool: AITool,\n level: InstallLevel,\n base?: string\n): string {\n const home = homedir();\n\n if (level === \"global\") {\n switch (tool) {\n case \"opencode\":\n return join(home, \".config\", \"opencode\");\n case \"claude\":\n return join(home, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(home, \".marscode\");\n case \"cli\":\n return join(home, \".traecli\");\n default:\n return join(home, \".trae-cn\");\n }\n }\n case \"cursor\":\n return join(home, \".cursor\");\n case \"copilot\":\n return join(home, \".copilot\");\n }\n }\n\n const baseDir = base || process.cwd();\n switch (tool) {\n case \"opencode\":\n return join(baseDir, \".opencode\");\n case \"claude\":\n return join(baseDir, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(baseDir, \".marscode\");\n case \"cli\":\n return join(baseDir, \".traecli\");\n default:\n return join(baseDir, \".trae\");\n }\n }\n case \"cursor\":\n return join(baseDir, \".cursor\");\n case \"copilot\":\n return join(baseDir, \".github\");\n }\n}\n\nexport function getConfigFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function getSkillsDir(configRoot: string): string {\n return join(configRoot, \"skills\");\n}\n\nexport function getAgentsDir(configRoot: string): string {\n return join(configRoot, \"agents\");\n}\n\nexport function getManifestPath(configRoot: string): string {\n return join(configRoot, \"cannbot-manifest.json\");\n}\n\nexport function getCannbotConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getCannbotRepoPath(): string {\n return join(getCannbotConfigDir(), \"repo\");\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type {\n CannbotManifest,\n InstalledPlugin,\n AITool,\n InstallLevel,\n} from \"../types/index.js\";\nimport { getConfigRoot, getManifestPath } from \"../utils/paths.js\";\nimport { getAllPlugins } from \"./registry.js\";\n\nexport function readManifest(configRoot: string): CannbotManifest | null {\n const manifestPath = getManifestPath(configRoot);\n if (existsSync(manifestPath)) {\n try {\n const content = readFileSync(manifestPath, \"utf-8\");\n return JSON.parse(content) as CannbotManifest;\n } catch {\n // fall through\n }\n }\n return null;\n}\n\nexport function readAllManifests(configRoot: string): CannbotManifest[] {\n const manifests: CannbotManifest[] = [];\n const plugins = getAllPlugins();\n\n const standardPath = getManifestPath(configRoot);\n if (existsSync(standardPath)) {\n try {\n const content = readFileSync(standardPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n\n for (const plugin of plugins) {\n const pluginManifestPath = join(configRoot, `${plugin.id}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n try {\n const content = readFileSync(pluginManifestPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n }\n\n return manifests;\n}\n\nexport function scanInstalled(): InstalledPlugin[] {\n const plugins = getAllPlugins();\n const installed: InstalledPlugin[] = [];\n const tools: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n const levels: InstallLevel[] = [\"project\", \"global\"];\n\n for (const tool of tools) {\n for (const level of levels) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n\n for (const manifest of manifests) {\n const plugin = plugins.find((p) => p.id === manifest.team);\n if (!plugin) continue;\n\n const alreadyAdded = installed.some(\n (p) => p.id === plugin.id && p.tool === tool && p.level === level\n );\n if (alreadyAdded) continue;\n\n installed.push({\n id: plugin.id,\n displayName: plugin.displayName,\n tool,\n level,\n skillsCount: manifest.installed_skills?.length || 0,\n agentsCount: manifest.installed_agents?.length || 0,\n installTime: manifest.install_time,\n configRoot,\n });\n }\n }\n }\n\n return installed;\n}\n\nexport function isPluginInstalled(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): boolean {\n const installed = scanInstalled();\n return installed.some(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n\nexport function getInstalledPlugin(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): InstalledPlugin | undefined {\n const installed = scanInstalled();\n return installed.find(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\ntype Messages = {\n wizard_title: string;\n wizard_detect: string;\n wizard_select_tool: string;\n wizard_select_level: string;\n wizard_select_plugins: string;\n wizard_confirm: string;\n wizard_detected_tool: string;\n wizard_confirm_tool: string;\n wizard_last_used: string;\n wizard_already_installed: string;\n install_cloning: string;\n install_repo_ready: string;\n install_progress: string;\n install_done: string;\n install_success: string;\n install_failed: string;\n install_already_installed: string;\n install_reinstall_confirm: string;\n install_skip: string;\n install_enhanced_next_steps: string;\n install_enhanced_launch: string;\n install_enhanced_try: string;\n install_enhanced_more: string;\n install_enhanced_check: string;\n install_enhanced_docs: string;\n update_title: string;\n update_updating: string;\n update_done: string;\n update_no_plugins: string;\n doctor_title: string;\n doctor_tools: string;\n doctor_plugins: string;\n doctor_links: string;\n doctor_config: string;\n doctor_result: string;\n doctor_fix_title: string;\n doctor_fix_cleaning: string;\n doctor_fix_rebuilding: string;\n doctor_fix_done: string;\n info_title: string;\n info_description: string;\n info_skills: string;\n info_agents: string;\n info_status: string;\n info_quickstart: string;\n info_not_found: string;\n lang_title: string;\n lang_current: string;\n lang_set: string;\n lang_invalid: string;\n list_title: string;\n list_id: string;\n list_name: string;\n list_status: string;\n list_skills: string;\n list_agents: string;\n status_installed: string;\n status_not_installed: string;\n error_tool_not_found: string;\n error_plugin_not_found: string;\n error_repo_not_found: string;\n quick_start: string;\n quick_start_hint: string;\n skill_select_category: string;\n skill_select_items: string;\n skill_already_installed: string;\n skill_install_progress: string;\n skill_install_done: string;\n skill_uninstall_done: string;\n skill_list_title: string;\n wizard_select_mode: string;\n wizard_mode_plugin: string;\n wizard_mode_plugin_desc: string;\n wizard_mode_skill: string;\n wizard_mode_skill_desc: string;\n wizard_back: string;\n wizard_cancel: string;\n wizard_no_selection: string;\n wizard_back_to_reselect: string;\n status_title: string;\n status_none: string;\n status_hint: string;\n status_install_time: string;\n};\n\nconst zh_CN: Messages = {\n wizard_title: \"CANNBot Install Helper\",\n wizard_detect: \"正在检测已安装的 AI 编程工具...\",\n wizard_select_tool: \"选择 AI 编程工具\",\n wizard_select_level: \"选择安装位置\",\n wizard_select_plugins: \"选择要安装的插件\",\n wizard_confirm: \"确认安装\",\n wizard_detected_tool: \"检测到\",\n wizard_confirm_tool: \"使用\",\n wizard_last_used: \"上次使用\",\n wizard_already_installed: \"已安装\",\n install_cloning: \"正在克隆 cannbot-skills 仓库...\",\n install_repo_ready: \"仓库就绪\",\n install_progress: \"正在安装\",\n install_done: \"安装完成\",\n install_success: \"成功\",\n install_failed: \"失败\",\n install_already_installed: \"已安装\",\n install_reinstall_confirm: \"是否重新安装(覆盖)\",\n install_skip: \"跳过\",\n install_enhanced_next_steps: \"下一步\",\n install_enhanced_launch: \"启动\",\n install_enhanced_try: \"试试\",\n install_enhanced_more: \"更多\",\n install_enhanced_check: \"检查\",\n install_enhanced_docs: \"文档\",\n update_title: \"更新已安装的 Skills\",\n update_updating: \"正在更新\",\n update_done: \"更新完成\",\n update_no_plugins: \"暂无已安装的插件\",\n doctor_title: \"CANNBot Doctor\",\n doctor_tools: \"AI 工具\",\n doctor_plugins: \"已安装插件\",\n doctor_links: \"链接完整性\",\n doctor_config: \"配置文件\",\n doctor_result: \"结果\",\n doctor_fix_title: \"自动修复\",\n doctor_fix_cleaning: \"清理失效链接\",\n doctor_fix_rebuilding: \"重建目录\",\n doctor_fix_done: \"修复完成\",\n info_title: \"插件详情\",\n info_description: \"描述\",\n info_skills: \"Skills\",\n info_agents: \"Agents\",\n info_status: \"状态\",\n info_quickstart: \"快速开始\",\n info_not_found: \"未找到插件\",\n lang_title: \"语言设置\",\n lang_current: \"当前语言\",\n lang_set: \"语言已设置为\",\n lang_invalid: \"无效的语言,支持: zh_CN, en_US\",\n list_title: \"可用场景\",\n list_id: \"序号\",\n list_name: \"场景名\",\n list_status: \"状态\",\n list_skills: \"Skills\",\n list_agents: \"Agents\",\n status_installed: \"已装\",\n status_not_installed: \"未装\",\n error_tool_not_found: \"未检测到任何 AI 编程工具\",\n error_plugin_not_found: \"未找到插件\",\n error_repo_not_found: \"仓库未找到\",\n quick_start: \"启动命令\",\n quick_start_hint: \"试试输入: 帮我开发一个 Abs 算子\",\n skill_select_category: \"选择 Skill 类别\",\n skill_select_items: \"选择要安装的 Skills\",\n skill_already_installed: \"已安装\",\n skill_install_progress: \"正在安装\",\n skill_install_done: \"Skill 安装完成\",\n skill_uninstall_done: \"Skill 卸载完成\",\n skill_list_title: \"可用 Skills\",\n wizard_select_mode: \"选择安装类型\",\n wizard_mode_plugin: \"安装 Plugin\",\n wizard_mode_plugin_desc: \"完整开发工作流(Skills + Agents + 配置文件)\",\n wizard_mode_skill: \"安装 Skill\",\n wizard_mode_skill_desc: \"仅安装领域知识技能,让 AI 掌握特定能力\",\n wizard_back: \"返回\",\n wizard_cancel: \"退出\",\n wizard_no_selection: \"未选择任何项,请选择操作\",\n wizard_back_to_reselect: \"返回\",\n status_title: \"已安装插件\",\n status_none: \"暂无已安装的插件\",\n status_hint: \"运行 install-helper init 开始安装\",\n status_install_time: \"安装时间\",\n};\n\nconst en_US: Messages = {\n wizard_title: \"CANNBot Skills Setup Wizard\",\n wizard_detect: \"Detecting installed AI coding tools...\",\n wizard_select_tool: \"Select AI coding tool\",\n wizard_select_level: \"Select install level\",\n wizard_select_plugins: \"Select scenarios to install\",\n wizard_confirm: \"Confirm installation\",\n wizard_detected_tool: \"Detected\",\n wizard_confirm_tool: \"Confirm using\",\n wizard_last_used: \"last used\",\n wizard_already_installed: \"installed\",\n install_cloning: \"Cloning cannbot-skills repository...\",\n install_repo_ready: \"Repository ready\",\n install_progress: \"Installing\",\n install_done: \"Installation complete\",\n install_success: \"success\",\n install_failed: \"failed\",\n install_already_installed: \"already installed\",\n install_reinstall_confirm: \"Reinstall (overwrite)\",\n install_skip: \"skipped\",\n install_enhanced_next_steps: \"Next steps\",\n install_enhanced_launch: \"Launch\",\n install_enhanced_try: \"Try\",\n install_enhanced_more: \"More\",\n install_enhanced_check: \"Check\",\n install_enhanced_docs: \"Docs\",\n update_title: \"Update installed Skills\",\n update_updating: \"Updating\",\n update_done: \"Update complete\",\n update_no_plugins: \"No installed plugins\",\n doctor_title: \"CANNBot Doctor\",\n doctor_tools: \"AI Tools\",\n doctor_plugins: \"Installed Plugins\",\n doctor_links: \"Link Integrity\",\n doctor_config: \"Configuration\",\n doctor_result: \"Result\",\n doctor_fix_title: \"Auto-fix\",\n doctor_fix_cleaning: \"Cleaning broken links\",\n doctor_fix_rebuilding: \"Rebuilding directories\",\n doctor_fix_done: \"Fix complete\",\n info_title: \"Plugin Details\",\n info_description: \"Description\",\n info_skills: \"Skills\",\n info_agents: \"Agents\",\n info_status: \"Status\",\n info_quickstart: \"Quick Start\",\n info_not_found: \"Plugin not found\",\n lang_title: \"Language Settings\",\n lang_current: \"Current language\",\n lang_set: \"Language set to\",\n lang_invalid: \"Invalid language, supported: zh_CN, en_US\",\n list_title: \"Available Scenarios\",\n list_id: \"#\",\n list_name: \"Name\",\n list_status: \"Status\",\n list_skills: \"Skills\",\n list_agents: \"Agents\",\n status_installed: \"installed\",\n status_not_installed: \"not installed\",\n error_tool_not_found: \"No AI coding tool detected\",\n error_plugin_not_found: \"Plugin not found\",\n error_repo_not_found: \"Repository not found\",\n quick_start: \"Launch command\",\n quick_start_hint: \"Try: help me develop an Abs operator\",\n skill_select_category: \"Select Skill category\",\n skill_select_items: \"Select Skills to install (space to toggle, enter to confirm)\",\n skill_already_installed: \"installed\",\n skill_install_progress: \"Installing\",\n skill_install_done: \"Skill installation complete\",\n skill_uninstall_done: \"Skill uninstallation complete\",\n skill_list_title: \"Available Skills\",\n wizard_select_mode: \"Select installation mode\",\n wizard_mode_plugin: \"Install Plugin\",\n wizard_mode_plugin_desc: \"Full development workflow (Skills + Agents + config)\",\n wizard_mode_skill: \"Install Skill\",\n wizard_mode_skill_desc: \"Domain knowledge only, give AI specific capabilities\",\n wizard_back: \"Go back\",\n wizard_cancel: \"Cancel installation\",\n wizard_no_selection: \"No items selected, please choose an action\",\n wizard_back_to_reselect: \"Go back\",\n status_title: \"Installed Plugins\",\n status_none: \"No installed plugins\",\n status_hint: \"Run install-helper init to start\",\n status_install_time: \"Installed at\",\n};\n\nlet currentLang: \"zh_CN\" | \"en_US\" = \"zh_CN\";\n\nexport function setLanguage(lang: \"zh_CN\" | \"en_US\"): void {\n currentLang = lang;\n}\n\nexport function getLanguage(): \"zh_CN\" | \"en_US\" {\n return currentLang;\n}\n\nexport function t(key: keyof Messages): string {\n return currentLang === \"zh_CN\" ? zh_CN[key] : en_US[key];\n}\n\nexport const i18n = {\n setLanguage,\n getLanguage,\n t,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\n\nexport const logger = {\n success: (msg: string) => console.log(chalk.green(\"✓\") + \" \" + msg),\n error: (msg: string) => console.log(chalk.red(\"✗\") + \" \" + msg),\n warn: (msg: string) => console.log(chalk.yellow(\"⚠\") + \" \" + msg),\n info: (msg: string) => console.log(chalk.cyan(\"→\") + \" \" + msg),\n step: (msg: string) => console.log(chalk.dim(msg)),\n blank: () => console.log(),\n};\n\nexport function createSpinner(text: string): Ora {\n return ora({ text, color: \"cyan\" });\n}\n\nexport function printBanner(subtitle?: string): void {\n console.log(chalk.cyan(`\n ____ _ _ _ _ _ ____ _\n / ___| / \\\\ | \\\\ | | \\\\ | | __ ) ___ | |_\n | | / _ \\\\ | \\\\| | \\\\| | _ \\\\ / _ \\\\| __|\n | |___ / ___ \\\\| |\\\\ | |\\\\ | |_) | (_) | |_\n \\\\____/_/ \\\\_\\\\_| \\\\_|_| \\\\_|____/ \\\\___/ \\\\__|\n`));\n if (subtitle) {\n console.log(chalk.bold(` ${subtitle}`));\n console.log();\n }\n}\n\nfunction getDisplayWidth(str: string): number {\n let width = 0;\n for (const ch of str) {\n const code = ch.codePointAt(0)!;\n if (\n (code >= 0x2E80 && code <= 0x9FFF) ||\n (code >= 0xF900 && code <= 0xFAFF) ||\n (code >= 0xFE30 && code <= 0xFE4F) ||\n (code >= 0xFF00 && code <= 0xFFEF) ||\n (code >= 0x3400 && code <= 0x4DBF) ||\n (code >= 0x20000 && code <= 0x2A6DF) ||\n (code >= 0x2A700 && code <= 0x2B73F) ||\n (code >= 0x2B740 && code <= 0x2B81F) ||\n (code >= 0x2B820 && code <= 0x2CEAF)\n ) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nexport function printBoxTitle(title: string, width: number = 65): void {\n const border = \"═\".repeat(width);\n const displayWidth = getDisplayWidth(title);\n const totalPadding = width - displayWidth;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n const paddedTitle = \" \".repeat(Math.max(0, leftPadding)) + title + \" \".repeat(Math.max(0, rightPadding));\n console.log();\n console.log(chalk.cyan.bold(` ╔${border}╗`));\n console.log(chalk.cyan.bold(` ║`) + chalk.cyan.bold(paddedTitle) + chalk.cyan.bold(`║`));\n console.log(chalk.cyan.bold(` ╚${border}╝`));\n console.log();\n}\n\nexport function showOperationHints(isCheckbox: boolean = false): void {\n if (isCheckbox) {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m 移动 | \\x1b[36m空格\\x1b[0m 选择 | \\x1b[36m⏎\\x1b[0m 确认\\n`);\n } else {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m 移动 | \\x1b[36m⏎\\x1b[0m 确认\\n`);\n }\n}\n\nexport function printBox(content: string[]): void {\n const maxLen = Math.max(...content.map((line) => line.length));\n const border = \"─\".repeat(maxLen + 2);\n console.log(chalk.cyan(` ┌${border}┐`));\n for (const line of content) {\n console.log(chalk.cyan(\" │ \") + line.padEnd(maxLen) + chalk.cyan(\" │\"));\n }\n console.log(chalk.cyan(` └${border}┘`));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { parse, stringify } from \"yaml\";\nimport type { AppConfig } from \"../types/index.js\";\n\nexport function getConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.yaml\");\n}\n\nexport function readConfig(): AppConfig {\n const configPath = getConfigPath();\n if (!existsSync(configPath)) {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const parsed = parse(content) as Partial<AppConfig>;\n return {\n language: parsed.language || \"zh_CN\",\n lastTool: parsed.lastTool,\n lastLevel: parsed.lastLevel,\n repoPath: parsed.repoPath,\n installedPlugins: parsed.installedPlugins || [],\n };\n } catch {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n}\n\nexport function writeConfig(config: AppConfig): void {\n const configDir = getConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const configPath = getConfigPath();\n const content = stringify(config);\n writeFileSync(configPath, content, \"utf-8\");\n}\n\nexport function updateConfig(updates: Partial<AppConfig>): AppConfig {\n const config = readConfig();\n const updated = { ...config, ...updates };\n writeConfig(updated);\n return updated;\n}\n\nexport function addInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n if (!config.installedPlugins.includes(pluginId)) {\n config.installedPlugins.push(pluginId);\n writeConfig(config);\n }\n}\n\nexport function removeInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n config.installedPlugins = config.installedPlugins.filter(\n (id) => id !== pluginId\n );\n writeConfig(config);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nexport const selectTheme = {\n helpMode: \"never\" as const,\n};\n\nexport const checkboxTheme = {\n icon: {\n checked: \"\\x1b[32m☑\\x1b[22m\",\n unchecked: \"☐\",\n cursor: \"❯\",\n },\n helpMode: \"never\" as const,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { execa } from \"execa\";\nimport { getCannbotConfigDir, getCannbotRepoPath } from \"../utils/paths.js\";\nimport {\n scanSkills,\n getCurrentCommit,\n readScanCache,\n writeScanCache,\n} from \"./scanner.js\";\nimport { initFromScan } from \"./skill-registry.js\";\n\nconst REPO_URL = \"https://gitcode.com/cann/cannbot-skills.git\";\n\nexport class RepositoryManager {\n private repoPath: string | undefined;\n\n constructor(customPath?: string) {\n this.repoPath = customPath;\n }\n\n async ensureRepo(): Promise<string> {\n if (this.repoPath && this.isValidRepo(this.repoPath)) {\n return this.repoPath;\n }\n\n const cwd = process.cwd();\n if (this.isValidRepo(cwd)) {\n this.repoPath = cwd;\n return cwd;\n }\n\n const envPath = process.env.CANNBOT_REPO_PATH;\n if (envPath && this.isValidRepo(envPath)) {\n this.repoPath = envPath;\n return envPath;\n }\n\n const cachedPath = getCannbotRepoPath();\n if (this.isValidRepo(cachedPath)) {\n this.repoPath = cachedPath;\n return cachedPath;\n }\n\n return await this.cloneRepo();\n }\n\n async ensureRepoAndScan(): Promise<string> {\n const repoPath = await this.ensureRepo();\n\n const cache = readScanCache();\n if (cache && cache.repoCommit === getCurrentCommit(repoPath)) {\n initFromScan(cache.skills);\n return repoPath;\n }\n\n const skills = scanSkills(repoPath);\n initFromScan(skills);\n\n writeScanCache({\n skills,\n repoCommit: getCurrentCommit(repoPath),\n timestamp: Date.now(),\n });\n\n return repoPath;\n }\n\n async updateRepo(): Promise<void> {\n const repoPath = await this.ensureRepo();\n try {\n await execa(\"git\", [\"pull\", \"--quiet\"], { cwd: repoPath, timeout: 30000 });\n } catch {\n // Ignore update failures\n }\n }\n\n getRepoPath(): string {\n if (!this.repoPath) {\n throw new Error(\"Repository not initialized. Call ensureRepo() first.\");\n }\n return this.repoPath;\n }\n\n private isValidRepo(path: string): boolean {\n if (!existsSync(path)) return false;\n const gitDir = join(path, \".git\");\n const pluginsDir = join(path, \"plugins-official\");\n return existsSync(gitDir) && existsSync(pluginsDir);\n }\n\n private async cloneRepo(): Promise<string> {\n const configDir = getCannbotConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const targetPath = getCannbotRepoPath();\n if (existsSync(targetPath)) {\n if (this.isValidRepo(targetPath)) {\n this.repoPath = targetPath;\n return targetPath;\n }\n }\n\n try {\n await execa(\n \"git\",\n [\"clone\", \"--depth\", \"1\", REPO_URL, targetPath],\n { timeout: 120000 }\n );\n this.repoPath = targetPath;\n return targetPath;\n } catch (error) {\n throw new Error(\n `Failed to clone repository: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n}\n\nexport function createRepositoryManager(customPath?: string): RepositoryManager {\n return new RepositoryManager(customPath);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join, relative, dirname, basename } from \"path\";\nimport { parse as parseYaml } from \"yaml\";\n\nexport interface ScannedSkill {\n id: string;\n description: string;\n source: string;\n filePath: string;\n}\n\nexport interface ScanCache {\n skills: ScannedSkill[];\n repoCommit: string;\n timestamp: number;\n}\n\nconst EXCLUDE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"asc-devkit\",\n \"cann-samples\",\n \"tilelang-ascend\",\n \".agents\",\n \".opencode\",\n \".claude\",\n \".claude-plugin\",\n \"dist\",\n \"build\",\n \"references\",\n \"hooks\",\n \"operators\",\n \"workflows\",\n \"tests\",\n \"docs\",\n \"scripts\",\n]);\n\nconst SKILL_SCAN_DIRS = [\n \"ops\",\n \"model\",\n \"graph\",\n \"infra\",\n \"ops-lab\",\n];\n\nconst PLUGIN_SCAN_DIRS = [\n \"plugins-official\",\n \"plugins-community\",\n];\n\nexport function scanSkills(repoPath: string): ScannedSkill[] {\n const skills: ScannedSkill[] = [];\n const seen = new Set<string>();\n\n for (const dir of SKILL_SCAN_DIRS) {\n const fullPath = join(repoPath, dir);\n if (!existsSync(fullPath)) continue;\n scanDirectory(fullPath, repoPath, dir, skills, seen);\n }\n\n for (const pluginDir of PLUGIN_SCAN_DIRS) {\n const pluginParent = join(repoPath, pluginDir);\n if (!existsSync(pluginParent)) continue;\n \n for (const plugin of safeReaddir(pluginParent)) {\n const pluginPath = join(pluginParent, plugin);\n if (!isDirectory(pluginPath)) continue;\n\n const skillsDir = join(pluginPath, \"skills\");\n if (existsSync(skillsDir)) {\n scanDirectory(skillsDir, repoPath, `${pluginDir}/${plugin}/skills`, skills, seen);\n }\n\n const skillDir = join(pluginPath, \"skill\");\n if (existsSync(skillDir)) {\n scanDirectory(skillDir, repoPath, `${pluginDir}/${plugin}/skill`, skills, seen);\n }\n }\n }\n\n return skills;\n}\n\nexport function parseFrontmatter(filePath: string): { name: string; description: string } | null {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n \n if (lines.length < 3) return null;\n if (lines[0].trim() !== \"---\") return null;\n\n let endIndex = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === \"---\") {\n endIndex = i;\n break;\n }\n }\n\n if (endIndex === -1) return null;\n\n const yamlBlock = lines.slice(1, endIndex).map(l => l.replace(/\\r$/, \"\")).join(\"\\n\");\n const parsed = parseYaml(yamlBlock);\n\n if (!parsed || typeof parsed !== \"object\") return null;\n if (!parsed.name || typeof parsed.name !== \"string\") return null;\n\n return {\n name: parsed.name.trim(),\n description: (parsed.description || \"\").trim(),\n };\n } catch {\n return null;\n }\n}\n\nexport function getCurrentCommit(repoPath: string): string {\n try {\n const headFile = join(repoPath, \".git\", \"HEAD\");\n if (!existsSync(headFile)) return \"unknown\";\n \n const headContent = readFileSync(headFile, \"utf-8\").trim();\n if (headContent.startsWith(\"ref: \")) {\n const refPath = join(repoPath, \".git\", headContent.slice(5));\n if (existsSync(refPath)) {\n return readFileSync(refPath, \"utf-8\").trim();\n }\n // Fallback to packed-refs for shallow clones\n const packedRefsPath = join(repoPath, \".git\", \"packed-refs\");\n if (existsSync(packedRefsPath)) {\n const packedRefs = readFileSync(packedRefsPath, \"utf-8\");\n const refName = headContent.slice(5);\n const lines = packedRefs.split(\"\\n\");\n for (const line of lines) {\n if (line.endsWith(refName)) {\n return line.split(\" \")[0];\n }\n }\n }\n }\n return headContent;\n } catch {\n return \"unknown\";\n }\n}\n\nexport function readScanCache(): ScanCache | null {\n try {\n const cachePath = getCachePath();\n if (!existsSync(cachePath)) return null;\n \n const content = readFileSync(cachePath, \"utf-8\");\n const cache = JSON.parse(content) as ScanCache;\n \n if (!cache.skills || !cache.timestamp) return null;\n \n const age = Date.now() - cache.timestamp;\n if (age > 24 * 60 * 60 * 1000) return null;\n \n return cache;\n } catch {\n return null;\n }\n}\n\nexport function writeScanCache(cache: ScanCache): void {\n try {\n const cachePath = getCachePath();\n const cacheDir = dirname(cachePath);\n if (!existsSync(cacheDir)) {\n mkdirSync(cacheDir, { recursive: true });\n }\n writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n }\n}\n\nfunction getCachePath(): string {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"/tmp\";\n return join(homeDir, \".cannbot\", \"scan-cache.json\");\n}\n\nfunction scanDirectory(\n dirPath: string,\n repoPath: string,\n sourcePrefix: string,\n skills: ScannedSkill[],\n seen: Set<string>\n): void {\n // Check if dirPath itself contains SKILL.md (for skill/ directories)\n const selfSkillMd = join(dirPath, \"SKILL.md\");\n if (existsSync(selfSkillMd)) {\n const frontmatter = parseFrontmatter(selfSkillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: selfSkillMd,\n });\n }\n return; // Don't recurse into subdirectories\n }\n\n for (const entry of safeReaddir(dirPath)) {\n const fullPath = join(dirPath, entry);\n \n if (EXCLUDE_DIRS.has(entry)) continue;\n \n if (!isDirectory(fullPath)) continue;\n\n const skillMd = join(fullPath, \"SKILL.md\");\n if (existsSync(skillMd)) {\n const frontmatter = parseFrontmatter(skillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: skillMd,\n });\n }\n continue;\n }\n\n scanDirectory(fullPath, repoPath, sourcePrefix, skills, seen);\n }\n}\n\nfunction safeReaddir(dir: string): string[] {\n try {\n return readdirSync(dir);\n } catch {\n return [];\n }\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport type { ScannedSkill } from \"./scanner.js\";\n\nexport interface SkillEntry {\n id: string;\n description: string;\n source: string;\n}\n\nexport interface SkillCategory {\n id: string;\n name: string;\n skills: SkillEntry[];\n}\n\nconst CATEGORY_DEFS: { id: string; name: string }[] = [\n { id: \"knowledge\", name: \"知识与参考\" },\n { id: \"env-tools\", name: \"环境与工具\" },\n { id: \"debug\", name: \"调试与诊断\" },\n { id: \"testing\", name: \"测试与质量\" },\n { id: \"ascendc\", name: \"AscendC 开发\" },\n { id: \"pypto\", name: \"PyPTO 开发\" },\n { id: \"tilelang\", name: \"TileLang 开发\" },\n { id: \"triton\", name: \"Triton 开发\" },\n { id: \"model\", name: \"模型推理优化\" },\n { id: \"graph\", name: \"图模式\" },\n { id: \"platform\", name: \"平台工具\" },\n { id: \"other\", name: \"其他 Skills\" },\n];\n\nlet dynamicSkills: SkillEntry[] = [];\nlet initialized = false;\n\nexport function initFromScan(scanned: ScannedSkill[]): void {\n dynamicSkills = scanned.map((s) => ({\n id: s.id,\n description: s.description,\n source: s.source,\n }));\n initialized = true;\n}\n\nexport function isScanInitialized(): boolean {\n return initialized;\n}\n\nconst STATIC_SKILL_CATEGORIES: SkillCategory[] = [\n {\n id: \"knowledge\",\n name: \"知识与参考\",\n skills: [\n { id: \"npu-arch\", description: \"NPU 架构知识、芯片型号映射\", source: \"ops\" },\n { id: \"ascendc-api-best-practices\", description: \"API 使用最佳实践\", source: \"ops\" },\n { id: \"ascendc-tiling-design\", description: \"Tiling 和 Kernel 设计方法论\", source: \"ops\" },\n { id: \"ascendc-docs-search\", description: \"API 文档索引 + 在线搜索\", source: \"ops\" },\n { id: \"ascendc-docs-gen\", description: \"算子文档写作参考\", source: \"ops\" },\n { id: \"ascendc-performance-best-practices\", description: \"性能优化经验总结\", source: \"ops\" },\n { id: \"ascendc-regbase-best-practice\", description: \"RegBase 算子 API 约束\", source: \"ops\" },\n { id: \"ops-precision-standard\", description: \"算子精度标准(atol/rtol)\", source: \"ops\" },\n { id: \"ops-spec-gen\", description: \"算子 spec.yaml 生成与校验\", source: \"ops\" },\n ],\n },\n {\n id: \"env-tools\",\n name: \"环境与工具\",\n skills: [\n { id: \"ascendc-env-check\", description: \"NPU 设备查询、CANN 环境验证\", source: \"ops\" },\n { id: \"cann-env-setup\", description: \"CANN 安装与环境配置指导\", source: \"ops\" },\n { id: \"ops-profiling\", description: \"NPU 性能采集与分析\", source: \"ops\" },\n { id: \"ops-simulator\", description: \"CANN Simulator 精度/性能仿真\", source: \"ops\" },\n { id: \"torch-ops-profiler\", description: \"torch_npu.profiler 性能报告\", source: \"ops\" },\n { id: \"aiss-tiling-solver\", description: \"AISS-TilingSolver 自动求解 Tiling 参数\", source: \"ops\" },\n ],\n },\n {\n id: \"debug\",\n name: \"调试与诊断\",\n skills: [\n { id: \"ascendc-precision-debug\", description: \"精度调试、症状-原因速查\", source: \"ops\" },\n { id: \"ascendc-runtime-debug\", description: \"运行时错误码解析\", source: \"ops\" },\n { id: \"ascendc-crash-debug\", description: \"卡死/崩溃调试、Coredump 分析\", source: \"ops\" },\n { id: \"ascendc-perf-optimize\", description: \"性能优化策略制定\", source: \"ops\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"npugraph_ex DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"npugraph_ex 编译期报错诊断\", source: \"graph\" },\n ],\n },\n {\n id: \"testing\",\n name: \"测试与质量\",\n skills: [\n { id: \"ascendc-code-review\", description: \"代码检视方法论\", source: \"ops\" },\n { id: \"ascendc-ut-develop\", description: \"UT 开发与覆盖率增强\", source: \"ops\" },\n { id: \"ascendc-st-design\", description: \"ST 测试用例设计\", source: \"ops\" },\n { id: \"ascendc-whitebox-design\", description: \"白盒测试用例生成\", source: \"ops\" },\n { id: \"ascendc-task-focus\", description: \"长任务聚焦防迷失\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"TileLang 测试设计\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"TileLang 代码格式检查\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"Triton 算子验证\", source: \"ops\" },\n ],\n },\n {\n id: \"ascendc\",\n name: \"AscendC 开发\",\n skills: [\n { id: \"ascendc-direct-invoke-template\", description: \"Kernel 直调工程模板\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-template\", description: \"自定义算子工程模板\", source: \"ops\" },\n { id: \"ascendc-direct-invoke-to-registry-invoke\", description: \"直调转注册调用\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-to-direct-invoke\", description: \"注册调用转直调\", source: \"ops\" },\n { id: \"ascendc-blaze-best-practice\", description: \"Matmul/GEMM Blaze 直调生成\", source: \"ops\" },\n { id: \"ascendc-simt-best-practices\", description: \"SIMT 最佳实践与 API 导航\", source: \"ops\" },\n { id: \"ascendc-simt-tiling-design\", description: \"SIMT 算子切分设计\", source: \"ops\" },\n { id: \"torch-ascendc-op-extension\", description: \"Ascend C 对接 PyTorch\", source: \"ops\" },\n { id: \"catlass-op-design\", description: \"Catlass 算子设计\", source: \"ops\" },\n { id: \"catlass-op-develop\", description: \"Catlass 算子开发\", source: \"ops\" },\n { id: \"catlass-op-perf-tune\", description: \"Catlass 性能调优\", source: \"ops\" },\n { id: \"cuda2ascend-simt\", description: \"CUDA 迁移到 Ascend C SIMT\", source: \"ops-lab\" },\n { id: \"ops-direct-invoke-flash\", description: \"从零构建 Ascend C 核函数\", source: \"plugins-official/ops-direct-invoke-flash/skills\" },\n { id: \"ops-registry-invoke-workflow\", description: \"注册调用工作流\", source: \"plugins-official/ops-registry-invoke\" },\n { id: \"ops-easyasc-dsl\", description: \"EasyASC DSL 算子开发\", source: \"plugins-community/ops-easyasc-dsl/skill\" },\n ],\n },\n {\n id: \"pypto\",\n name: \"PyPTO 开发\",\n skills: [\n { id: \"pypto-intent-understand\", description: \"需求意图理解与规格生成\", source: \"ops\" },\n { id: \"pypto-api-explore\", description: \"API 可行性探索与分析\", source: \"ops\" },\n { id: \"pypto-op-design\", description: \"算子方案设计生成\", source: \"ops\" },\n { id: \"pypto-golden-generate\", description: \"Golden 参考实现生成\", source: \"ops\" },\n { id: \"pypto-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"pypto-precision-debug\", description: \"精度问题排查\", source: \"ops\" },\n { id: \"pypto-precision-compare\", description: \"精度对比分析\", source: \"ops\" },\n { id: \"pypto-op-perf-tune\", description: \"性能分析与调优\", source: \"ops\" },\n ],\n },\n {\n id: \"tilelang\",\n name: \"TileLang 开发\",\n skills: [\n { id: \"tilelang-env-check\", description: \"环境检查与配置验证\", source: \"ops\" },\n { id: \"tilelang-submodule-pull\", description: \"三方库与子模块拉取\", source: \"ops\" },\n { id: \"tilelang-api-best-practices\", description: \"TileLang API 最佳实践\", source: \"ops\" },\n { id: \"tilelang-programming-model-guide\", description: \"Developer/Expert 模式选择\", source: \"ops\" },\n { id: \"tilelang-op-design\", description: \"算子设计文档生成\", source: \"ops\" },\n { id: \"tilelang-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"测试设计与覆盖率分析\", source: \"ops\" },\n { id: \"tilelang-perf-optimization\", description: \"性能调优与劣化检查\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"代码格式检查与修复\", source: \"ops\" },\n ],\n },\n {\n id: \"triton\",\n name: \"Triton 开发\",\n skills: [\n { id: \"triton-task-extractor\", description: \"算子任务提取与构建\", source: \"ops\" },\n { id: \"triton-op-designer\", description: \"算法草图设计\", source: \"ops\" },\n { id: \"triton-op-coding\", description: \"Triton 内核代码生成\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"算子精度和性能验证\", source: \"ops\" },\n { id: \"triton-latency-optimizer\", description: \"Triton 代码性能优化\", source: \"ops\" },\n ],\n },\n {\n id: \"model\",\n name: \"模型推理优化\",\n skills: [\n { id: \"model-infer-migrator\", description: \"框架适配与部署基线\", source: \"model\" },\n { id: \"model-infer-parallel-analysis\", description: \"并行策略分析(TP/EP/DP)\", source: \"model\" },\n { id: \"model-infer-parallel-impl\", description: \"并行切分实施\", source: \"model\" },\n { id: \"model-infer-kvcache\", description: \"KVCache 优化 + FA 替换\", source: \"model\" },\n { id: \"model-infer-fusion\", description: \"torch_npu 融合算子替换\", source: \"model\" },\n { id: \"model-infer-graph-mode\", description: \"torch.compile 图模式适配\", source: \"model\" },\n { id: \"model-infer-multi-stream\", description: \"多流并行优化\", source: \"model\" },\n { id: \"model-infer-prefetch\", description: \"权重预取适配\", source: \"model\" },\n { id: \"model-infer-superkernel\", description: \"SuperKernel 适配\", source: \"model\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n ],\n },\n {\n id: \"graph\",\n name: \"图模式\",\n skills: [\n { id: \"torch-npugraph-ex-knowledge\", description: \"npugraph_ex 使用指南\", source: \"graph\" },\n { id: \"torch-npugraph-ex-template\", description: \"npugraph_ex MRE 代码模板\", source: \"graph\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"编译期报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-runtime-error-diagnosis\", description: \"运行时报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-performance-diagnosis\", description: \"性能诊断\", source: \"graph\" },\n { id: \"torch-custom-ops-guide\", description: \"自定义算子入图指南\", source: \"graph\" },\n ],\n },\n {\n id: \"platform\",\n name: \"平台工具\",\n skills: [\n { id: \"gitcode-pr-handler\", description: \"GitCode PR 标题/描述生成\", source: \"infra\" },\n { id: \"gitcode-issue-gen\", description: \"GitCode Issue 生成与关联\", source: \"infra\" },\n { id: \"gitcode-issue-handler\", description: \"GitCode Issue 端到端处置\", source: \"infra\" },\n { id: \"gitcode-toolkit\", description: \"GitCode 协作通用参考\", source: \"infra\" },\n { id: \"cannbot-skill-reviewer\", description: \"Skill 入库质量审查\", source: \"infra\" },\n ],\n },\n];\n\nconst CATEGORY_MAP: Record<string, string> = {};\nfor (const cat of STATIC_SKILL_CATEGORIES) {\n for (const skill of cat.skills) {\n CATEGORY_MAP[skill.id] = cat.id;\n }\n}\n\nfunction getActiveSkills(): SkillEntry[] {\n if (initialized) return deduplicate(dynamicSkills);\n return deduplicate(STATIC_SKILL_CATEGORIES.flatMap((c) => c.skills));\n}\n\nfunction deduplicate(skills: SkillEntry[]): SkillEntry[] {\n const seen = new Set<string>();\n const result: SkillEntry[] = [];\n for (const skill of skills) {\n if (!seen.has(skill.id)) {\n result.push(skill);\n seen.add(skill.id);\n }\n }\n return result;\n}\n\nexport function findSkill(query: string): SkillEntry | undefined {\n const normalized = query.toLowerCase().trim();\n const pool = getActiveSkills();\n return pool.find((s) => s.id === normalized);\n}\n\nexport function getAllSkills(): SkillEntry[] {\n return getActiveSkills();\n}\n\nexport function getSkillsByCategory(categoryId: string): SkillEntry[] {\n return getAllCategories().find((c) => c.id === categoryId)?.skills ?? [];\n}\n\nexport function getAllCategories(): SkillCategory[] {\n const skills = getActiveSkills();\n return CATEGORY_DEFS.map((def) => ({\n id: def.id,\n name: def.name,\n skills: skills.filter((s) => {\n const catId = CATEGORY_MAP[s.id];\n if (catId) return catId === def.id;\n return def.id === \"other\";\n }),\n })).filter((cat) => cat.skills.length > 0);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult } from \"../types/index.js\";\nimport { getPluginById } from \"./registry.js\";\nimport { readManifest } from \"./manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { scanInstalledFiles, writeRecord } from \"./record.js\";\n\nexport async function installPlugin(\n opts: InstallOptions\n): Promise<InstallResult> {\n const plugin = getPluginById(opts.pluginId);\n if (!plugin) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Plugin not found: ${opts.pluginId}`],\n warnings: [],\n };\n }\n\n const scriptPath = join(opts.repoPath, plugin.dir, plugin.script);\n if (!existsSync(scriptPath)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Script not found: ${scriptPath}`],\n warnings: [],\n };\n }\n\n const args = [opts.level, opts.tool];\n if (opts.installPath) {\n args.push(opts.installPath);\n }\n\n const cwd = opts.installPath || process.cwd();\n\n try {\n await execa(\"bash\", [scriptPath, ...args], {\n cwd,\n timeout: 300000,\n stdio: \"pipe\",\n });\n\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n const manifest = readManifest(configRoot);\n\n let skillsCount = 0;\n let agentsCount = 0;\n\n if (manifest) {\n skillsCount = manifest.installed_skills?.length || 0;\n agentsCount = manifest.installed_agents?.length || 0;\n } else {\n skillsCount = plugin.skills;\n agentsCount = plugin.agents;\n }\n\n try {\n const record = scanInstalledFiles(\n opts.pluginId,\n plugin.displayName,\n opts.tool,\n opts.level,\n cwd,\n configRoot,\n manifest\n );\n writeRecord(record);\n } catch {\n // Record writing is best-effort, don't fail install\n }\n\n return {\n success: true,\n pluginId: opts.pluginId,\n skillsCount,\n agentsCount,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [errorMessage],\n warnings: [],\n };\n }\n}\n\nexport async function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string,\n installPath?: string\n): Promise<InstallResult[]> {\n const results: InstallResult[] = [];\n\n for (const pluginId of pluginIds) {\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n installPath,\n });\n results.push(result);\n }\n\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, lstatSync, readlinkSync, unlinkSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel, CannbotManifest } from \"../types/index.js\";\n\nexport interface InstallRecord {\n pluginId: string;\n displayName: string;\n tool: AITool;\n level: InstallLevel;\n installPath: string;\n configRoot: string;\n installTime: string;\n files: string[];\n directories: string[];\n}\n\nfunction getInstallsDir(): string {\n return join(getCannbotConfigDir(), \"installs\");\n}\n\nexport function getRecordPath(pluginId: string): string {\n return join(getInstallsDir(), `${pluginId}.json`);\n}\n\nexport function readRecord(pluginId: string): InstallRecord | null {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as InstallRecord;\n } catch {\n return null;\n }\n}\n\nexport function writeRecord(record: InstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n\n const recordPath = getRecordPath(record.pluginId);\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function deleteRecord(pluginId: string): void {\n const recordPath = getRecordPath(pluginId);\n if (existsSync(recordPath)) {\n unlinkSync(recordPath);\n }\n}\n\nexport function scanInstalledFiles(\n pluginId: string,\n displayName: string,\n tool: AITool,\n level: InstallLevel,\n installPath: string,\n configRoot: string,\n manifest: CannbotManifest | null\n): InstallRecord {\n const files: string[] = [];\n const directories: string[] = [];\n\n if (manifest) {\n const skillsDir = join(configRoot, \"skills\");\n if (existsSync(skillsDir)) {\n directories.push(skillsDir);\n for (const skillName of manifest.installed_skills || []) {\n const skillPath = join(skillsDir, skillName);\n if (existsSync(skillPath) || isSymlink(skillPath)) {\n files.push(skillPath);\n }\n }\n }\n\n const agentsDir = join(configRoot, \"agents\");\n if (existsSync(agentsDir)) {\n directories.push(agentsDir);\n for (const agentName of manifest.installed_agents || []) {\n const agentPath = join(agentsDir, agentName);\n const agentPathMd = join(agentsDir, agentName + \".md\");\n if (existsSync(agentPath) || isSymlink(agentPath)) {\n files.push(agentPath);\n } else if (existsSync(agentPathMd) || isSymlink(agentPathMd)) {\n files.push(agentPathMd);\n }\n }\n }\n }\n\n const workflowsLink = join(configRoot, \"workflows\");\n if (isSymlink(workflowsLink)) {\n files.push(workflowsLink);\n }\n\n const manifestPath = join(configRoot, \"cannbot-manifest.json\");\n if (existsSync(manifestPath)) {\n files.push(manifestPath);\n }\n\n const pluginManifestPath = join(configRoot, `${pluginId}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n files.push(pluginManifestPath);\n }\n\n const configFileName = tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n const configFilePath = level === \"project\"\n ? join(installPath, configFileName)\n : join(configRoot, configFileName);\n if (existsSync(configFilePath)) {\n files.push(configFilePath);\n }\n\n const repoLinks = [\"asc-devkit\", \"pypto\", \"tilelang-ascend\", \"cann-recipes-infer\", \"cann-samples\"];\n for (const repoName of repoLinks) {\n const repoLinkPath = join(installPath, repoName);\n if (isSymlink(repoLinkPath)) {\n files.push(repoLinkPath);\n }\n const repoLinkInConfig = join(configRoot, repoName);\n if (isSymlink(repoLinkInConfig)) {\n files.push(repoLinkInConfig);\n }\n }\n\n directories.push(configRoot);\n\n return {\n pluginId,\n displayName,\n tool,\n level,\n installPath,\n configRoot,\n installTime: new Date().toISOString(),\n files,\n directories,\n };\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n// === Skill-level install records ===\n\nexport interface SkillInstallEntry {\n skills: string[];\n installTime: string;\n}\n\nexport interface SkillInstallRecord {\n [tool: string]: {\n [level: string]: {\n [installPath: string]: SkillInstallEntry;\n };\n };\n}\n\nfunction getSkillRecordPath(): string {\n return join(getInstallsDir(), \"skills.json\");\n}\n\nexport function readSkillRecord(): SkillInstallRecord {\n const recordPath = getSkillRecordPath();\n if (!existsSync(recordPath)) {\n return {};\n }\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as SkillInstallRecord;\n } catch {\n return {};\n }\n}\n\nexport function writeSkillRecord(record: SkillInstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n const recordPath = getSkillRecordPath();\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function addSkillsToRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]) record[tool] = {};\n if (!record[tool][level]) record[tool][level] = {};\n if (!record[tool][level][installPath]) {\n record[tool][level][installPath] = { skills: [], installTime: \"\" };\n }\n const entry = record[tool][level][installPath];\n for (const id of skillIds) {\n if (!entry.skills.includes(id)) {\n entry.skills.push(id);\n }\n }\n entry.installTime = new Date().toISOString();\n writeSkillRecord(record);\n}\n\nexport function removeSkillsFromRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]?.[level]?.[installPath]) return;\n const entry = record[tool][level][installPath];\n entry.skills = entry.skills.filter((id) => !skillIds.includes(id));\n if (entry.skills.length === 0) {\n delete record[tool][level][installPath];\n if (Object.keys(record[tool][level]).length === 0) {\n delete record[tool][level];\n if (Object.keys(record[tool]).length === 0) {\n delete record[tool];\n }\n }\n }\n writeSkillRecord(record);\n}\n\nexport function getInstalledSkills(\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): string[] {\n const record = readSkillRecord();\n return record[tool]?.[level]?.[installPath]?.skills || [];\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, symlinkSync, unlinkSync, readdirSync, rmdirSync, realpathSync, lstatSync } from \"fs\";\nimport { join } from \"path\";\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getAllCategories, findSkill, getAllSkills } from \"./skill-registry.js\";\nimport { addSkillsToRecord, removeSkillsFromRecord, getInstalledSkills } from \"./record.js\";\nimport { selectTheme, checkboxTheme } from \"../ui/theme.js\";\n\nexport interface SkillInstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport interface SkillUninstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport async function installSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n): Promise<SkillInstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n const results: SkillInstallResult[] = [];\n const installedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const skill = findSkill(skillId);\n if (!skill) {\n results.push({ skillId, success: false, error: \"Skill not found in registry\" });\n continue;\n }\n\n const sourcePath = join(repoPath, skill.source, skill.id);\n const targetPath = join(skillsDir, skillId);\n\n if (!existsSync(sourcePath)) {\n results.push({ skillId, success: false, error: `Source not found: ${sourcePath}` });\n continue;\n }\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n }\n symlinkSync(realpathSync(sourcePath), targetPath);\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (installedIds.length > 0) {\n addSkillsToRecord(installedIds, tool, level, installPath);\n }\n\n return results;\n}\n\nexport async function uninstallSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel\n): Promise<SkillUninstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n const results: SkillUninstallResult[] = [];\n const removedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const targetPath = join(skillsDir, skillId);\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n results.push({ skillId, success: true });\n removedIds.push(skillId);\n logger.step(` 移除: ${skillId}`);\n } else {\n results.push({ skillId, success: false, error: \"Not installed\" });\n logger.warn(`${skillId} 未安装`);\n }\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (removedIds.length > 0) {\n removeSkillsFromRecord(removedIds, tool, level, installPath);\n }\n\n // Clean up empty skills directory\n if (existsSync(skillsDir)) {\n try {\n const entries = readdirSync(skillsDir);\n if (entries.length === 0) {\n rmdirSync(skillsDir);\n logger.step(` 清理空目录: skills/`);\n }\n } catch {\n // ignore\n }\n }\n\n // Clean up empty config root\n if (existsSync(configRoot)) {\n try {\n const entries = readdirSync(configRoot);\n if (entries.length === 0) {\n rmdirSync(configRoot);\n logger.step(` 清理空目录: ${configRoot.split(\"/\").pop()}/`);\n }\n } catch {\n // ignore\n }\n }\n\n return results;\n}\n\nexport async function interactiveSkillSelect(): Promise<string[] | \"back\" | \"cancel\"> {\n const BACK = \"__back__\";\n const CANCEL = \"__cancel__\";\n const categories = getAllCategories();\n\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n printBoxTitle(\"选择 Skill 类别\");\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n ...categories.map((cat) => ({\n name: `> ${cat.name} (${cat.skills.length} skills)`,\n value: cat.id,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n\n showOperationHints();\n selectedCategoryId = await select({\n message: t(\"skill_select_category\"),\n choices: categoryChoices,\n loop: false,\n theme: selectTheme,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n step = 1;\n break;\n }\n case 1: {\n const category = categories.find((c) => c.id === selectedCategoryId);\n if (!category) return [];\n\n printBoxTitle(`选择要安装的 Skills — ${category.name}`);\n\n const tools: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n const levels: InstallLevel[] = [\"project\", \"global\"];\n const installedSkills: string[] = [];\n for (const tk of tools) {\n for (const l of levels) {\n const path = l === \"project\" ? process.cwd() : getConfigRoot(tk, l);\n installedSkills.push(...getInstalledSkills(tk, l, path));\n }\n }\n const installedSet = new Set(installedSkills);\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean } | Separator> = category.skills.map((skill) => {\n const isInstalled = installedSet.has(skill.id);\n const suffix = isInstalled ? ` [${t(\"skill_already_installed\")}]` : \"\";\n return {\n name: `${skill.id}${suffix} — ${skill.description}`,\n value: skill.id,\n checked: false,\n };\n });\n skillChoices.push(new Separator(\"──────────────\"));\n skillChoices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK, checked: false });\n skillChoices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL, checked: false });\n\n showOperationHints(true);\n const selectedSkills = await checkbox({\n message: t(\"skill_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n });\n\n if (selectedSkills.includes(BACK)) { step = 0; break; }\n if (selectedSkills.includes(CANCEL)) return \"cancel\";\n\n const skillIds = selectedSkills.filter((v) => v !== BACK && v !== CANCEL);\n\n if (skillIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") { step = 0; break; }\n return \"cancel\";\n }\n\n return skillIds;\n }\n }\n }\n}\n\nexport function listAllSkills(): void {\n const categories = getAllCategories();\n\n console.log();\n console.log(chalk.bold(` ${t(\"skill_list_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(60)));\n\n for (const category of categories) {\n console.log();\n console.log(chalk.bold(` ${category.name}`) + chalk.dim(` (${category.skills.length} skills)`));\n\n const table = new Table({\n style: { head: [], border: [] },\n colWidths: [35, 45],\n wordWrap: true,\n });\n\n for (const skill of category.skills) {\n table.push([\n chalk.cyan(skill.id),\n skill.description,\n ]);\n }\n\n console.log(table.toString());\n }\n\n console.log();\n console.log(chalk.dim(` 共 ${getAllSkills().length} 个 Skills`));\n console.log();\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { PluginEntry, InstalledPlugin, AITool } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getToolDisplayName } from \"../core/detector.js\";\n\nexport function printPluginList(\n plugins: PluginEntry[],\n installed: Map<string, InstalledPlugin>\n): void {\n const table = new Table({\n head: [\n chalk.cyan(t(\"list_id\")),\n chalk.cyan(t(\"list_name\")),\n chalk.cyan(t(\"list_status\")),\n chalk.cyan(t(\"list_skills\")),\n chalk.cyan(t(\"list_agents\")),\n ],\n style: { head: [], border: [] },\n });\n\n plugins.forEach((plugin, index) => {\n const isInstalled = installed.has(plugin.id);\n const status = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`—`);\n\n table.push([\n String(index + 1),\n plugin.displayName,\n status,\n String(plugin.skills),\n String(plugin.agents),\n ]);\n });\n\n console.log();\n console.log(chalk.bold(` ${t(\"list_title\")} (${plugins.length} 个)`));\n console.log(table.toString());\n console.log();\n}\n\nexport function printInstallSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>\n): void {\n const successCount = results.filter((r) => r.success).length;\n const totalCount = results.length;\n\n console.log();\n console.log(\n chalk.bold(\n ` ${t(\"install_done\")}! ${successCount}/${totalCount} ${t(\"install_success\")}`\n )\n );\n console.log();\n\n for (const result of results) {\n if (result.success) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${result.displayName} (${result.skillsCount} skills, ${result.agentsCount} agents)`\n );\n } else {\n console.log(chalk.red(\" ✗\") + ` ${result.displayName}`);\n }\n }\n console.log();\n}\n\nexport function printEnhancedSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>,\n tool: AITool,\n configRoot: string\n): void {\n const successResults = results.filter((r) => r.success);\n const totalSkills = successResults.reduce((sum, r) => sum + r.skillsCount, 0);\n const totalAgents = successResults.reduce((sum, r) => sum + r.agentsCount, 0);\n\n if (successResults.length === 0) {\n return;\n }\n\n const toolName = getToolDisplayName(tool);\n const lines = [\n chalk.bold(` ${t(\"install_done\")}!`),\n \"\",\n ` ${chalk.dim(\"安装到:\")} ${configRoot}`,\n ` ${chalk.dim(\"Skills:\")} ${totalSkills} 个 ${chalk.dim(\"|\")} ${chalk.dim(\"Agents:\")} ${totalAgents} 个`,\n \"\",\n chalk.bold(` ${t(\"install_enhanced_next_steps\")}:`),\n ` ${chalk.cyan(\"1.\")} ${t(\"install_enhanced_launch\")}: ${chalk.green(toolName.toLowerCase())}`,\n ` ${chalk.cyan(\"2.\")} ${t(\"install_enhanced_try\")}: ${chalk.green(\"帮我开发一个 Abs 算子\")}`,\n ` ${chalk.cyan(\"3.\")} ${t(\"install_enhanced_more\")}: ${chalk.green(\"install-helper list\")}`,\n ` ${chalk.cyan(\"4.\")} ${t(\"install_enhanced_check\")}: ${chalk.green(\"install-helper doctor\")}`,\n \"\",\n ];\n\n if (successResults.length === 1) {\n lines.push(\n ` ${chalk.dim(t(\"install_enhanced_docs\"))}: ${chalk.dim(`plugins-official/${successResults[0].pluginId}/quickstart.md`)}`\n );\n }\n\n console.log();\n for (const line of lines) {\n console.log(line);\n }\n console.log();\n}\n\nexport function printQuickStart(tool: string): void {\n console.log(chalk.bold(` ${t(\"quick_start\")}: ${tool}`));\n console.log(chalk.dim(` ${t(\"quick_start_hint\")}`));\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { printPluginList } from \"../ui/display.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\n\nexport async function listCommand(): Promise<void> {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n printPluginList(plugins, installedMap);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync, lstatSync, unlinkSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { detectTools, getToolDisplayName, getAllTools } from \"../core/detector.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { getConfigRoot, getSkillsDir, getAgentsDir, getConfigFileName } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool } from \"../types/index.js\";\n\nexport async function doctorCommand(options: { fix?: boolean } = {}): Promise<void> {\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n\n let errors = 0;\n let warnings = 0;\n let fixes = 0;\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_tools\")}`));\n const detectedTools = await detectTools();\n const allTools = getAllTools();\n\n for (const tool of allTools) {\n const detected = detectedTools.find((d) => d.name === tool);\n if (detected) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${getToolDisplayName(tool)}${detected.version ? ` v${detected.version}` : \"\"}`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${getToolDisplayName(tool)} — 未安装`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_plugins\")}`));\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n for (const plugin of plugins) {\n const inst = installedMap.get(plugin.id);\n if (inst) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${plugin.id.padEnd(30)} ${inst.skillsCount} skills, ${inst.agentsCount} agents`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${plugin.id.padEnd(30)} — 未安装`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_links\")}`));\n\n const primaryTool = detectedTools[0]?.name || \"opencode\";\n const configRoot = getConfigRoot(primaryTool, \"project\");\n\n const skillsDir = getSkillsDir(configRoot);\n const agentsDir = getAgentsDir(configRoot);\n\n if (existsSync(skillsDir)) {\n const brokenLinks = checkBrokenLinks(skillsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(skillsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${skillsDir} — ${count} 个软链接均有效`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${skillsDir} — ${brokenLinks} 个失效链接`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(skillsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: 已清理 ${fixed} 个失效链接`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${skillsDir} — 不存在`);\n if (options.fix) {\n mkdirSync(skillsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: 已创建 ${skillsDir}`);\n }\n }\n\n if (existsSync(agentsDir)) {\n const brokenLinks = checkBrokenLinks(agentsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(agentsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${agentsDir} — ${count} 个软链接均有效`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${agentsDir} — ${brokenLinks} 个失效链接`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(agentsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: 已清理 ${fixed} 个失效链接`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${agentsDir} — 不存在`);\n if (options.fix) {\n mkdirSync(agentsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: 已创建 ${agentsDir}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_config\")}`));\n const configFile = getConfigFileName(primaryTool);\n const configPath = join(process.cwd(), configFile);\n if (existsSync(configPath)) {\n console.log(chalk.green(\" ✓\") + ` ${configFile} 存在`);\n } else {\n console.log(chalk.dim(\" —\") + ` ${configFile} 不存在`);\n }\n\n console.log();\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n if (options.fix && fixes > 0) {\n console.log(\n ` ${t(\"doctor_result\")}: ${warnings} 个警告, ${errors} 个错误, ${fixes} 项已修复`\n );\n } else {\n console.log(\n ` ${t(\"doctor_result\")}: ${warnings} 个警告, ${errors} 个错误`\n );\n }\n console.log();\n}\n\nfunction checkBrokenLinks(dir: string): number {\n let broken = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n broken++;\n }\n }\n } catch {\n broken++;\n }\n }\n } catch {\n // ignore\n }\n return broken;\n}\n\nfunction fixBrokenLinks(dir: string): number {\n let fixed = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n unlinkSync(fullPath);\n fixed++;\n }\n }\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n return fixed;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function statusCommand(): Promise<void> {\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n console.log();\n console.log(chalk.bold(` ${t(\"status_title\")}`));\n console.log();\n\n if (installed.length === 0) {\n console.log(chalk.dim(` ${t(\"status_none\")}`));\n console.log(chalk.dim(` ${t(\"status_hint\")}`));\n console.log();\n return;\n }\n\n for (const inst of installed) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${inst.displayName}` +\n chalk.dim(` (${inst.tool}, ${inst.level})`)\n );\n console.log(\n chalk.dim(` ${inst.skillsCount} skills, ${inst.agentsCount} agents`)\n );\n console.log(chalk.dim(` ${inst.configRoot}`));\n console.log(chalk.dim(` ${t(\"status_install_time\")}: ${inst.installTime}`));\n console.log();\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { installSkills, interactiveSkillSelect, listAllSkills } from \"../core/skill-installer.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function installCommand(\n names: string[],\n options: { tool?: string; level?: string; yes?: boolean; list?: boolean }\n): Promise<void> {\n // Handle --list flag\n if (options.list) {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n listAllSkills();\n return;\n }\n\n // If no names provided, enter interactive skill selection\n if (names.length === 0) {\n // Scan repo for dynamic skill discovery\n const scanSpinner = createSpinner(\"正在加载 Skills 列表...\");\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(\"Skills 列表加载完成\");\n } catch {\n scanSpinner.warn(\"Skills 列表加载失败,将使用内置数据\");\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = options.tool as AITool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\") return;\n tool = detected;\n }\n\n let step = 1;\n while (true) {\n switch (step) {\n case 1: {\n const selectedSkills = await interactiveSkillSelect();\n if (selectedSkills === \"back\") {\n const redetected = await selectToolWithDetection();\n if (redetected === \"back\") return;\n tool = redetected;\n break;\n }\n if (selectedSkills.length === 0) {\n logger.info(\"未选择任何 Skill\");\n return;\n }\n names = selectedSkills;\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${chalk.bold(names.length)} 个 Skills...`);\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n const results = await installSkills(names, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n for (const result of results) {\n if (result.success) { logger.success(`${result.skillId}`); successCount++; }\n else { logger.error(`${result.skillId}: ${result.error}`); failCount++; }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n logger.info(`安装到: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`启动 ${chalk.green(tool)} 即可使用`);\n logger.blank();\n return;\n }\n }\n }\n }\n\n // Scan repo for dynamic skill/plugin discovery\n const scanSpinner = createSpinner(\"正在加载 Skills 列表...\");\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(\"Skills 列表加载完成\");\n } catch {\n scanSpinner.warn(\"Skills 列表加载失败,将使用内置数据\");\n }\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n // Not found\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n const allPlugins = getAllPlugins();\n logger.info(\"可用插件:\");\n for (const p of allPlugins) {\n logger.step(` ${p.id} (${p.aliases.join(\", \")})`);\n }\n logger.info(`可用 Skills: ${chalk.cyan(\"install-helper install --list\")}`);\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = options.tool as AITool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\") return;\n tool = detected;\n }\n\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n\n // Install plugins\n if (plugins.length > 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n const pluginsToInstall: string[] = [];\n const skippedPlugins: string[] = [];\n\n for (const pluginId of plugins) {\n if (installedSet.has(pluginId) && !options.yes) {\n const plugin = findPlugin(pluginId);\n const displayName = plugin?.displayName || pluginId;\n logger.warn(`${displayName} [${t(\"install_already_installed\")}]`);\n const shouldReinstall = await confirm({\n message: `${t(\"install_reinstall_confirm\")}?`,\n default: false,\n });\n if (shouldReinstall) {\n pluginsToInstall.push(pluginId);\n } else {\n skippedPlugins.push(pluginId);\n logger.info(`${displayName} ${t(\"install_skip\")}`);\n }\n } else {\n pluginsToInstall.push(pluginId);\n }\n }\n\n if (pluginsToInstall.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n const allPlugins = getAllPlugins();\n const results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath\n );\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n printEnhancedSummary(summary, tool, configRoot);\n }\n }\n\n // Install skills\n if (skills.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${chalk.bold(skills.length)} 个 Skills...`);\n\n const results = await installSkills(skills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n if (result.success) {\n logger.success(`${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n logger.info(`安装到: ${chalk.cyan(getConfigRoot(tool, level) + \"/skills/\")}`);\n logger.info(`启动 ${chalk.green(tool)} 即可使用`);\n logger.blank();\n }\n}\n\nasync function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n) {\n const results = [];\n const total = pluginIds.length;\n\n for (let i = 0; i < pluginIds.length; i++) {\n const pluginId = pluginIds[i];\n const progress = `[${i + 1}/${total}]`;\n const spinner = createSpinner(`${progress} ${t(\"install_progress\")} ${pluginId}...`);\n spinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n spinner.succeed(\n `${progress} ${pluginId} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n spinner.fail(`${progress} ${pluginId} — ${result.errors.join(\", \")}`);\n }\n\n results.push(result);\n }\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, unlinkSync, rmdirSync, readdirSync, lstatSync } from \"fs\";\nimport chalk from \"chalk\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { uninstallSkills } from \"../core/skill-installer.js\";\nimport { readRecord, deleteRecord } from \"../core/record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function uninstallCommand(\n names: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n const tool: AITool = (options.tool as AITool) || \"opencode\";\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n logger.error(`未找到: ${name}`);\n }\n\n // Uninstall plugins\n for (const pluginId of plugins) {\n const plugin = findPlugin(pluginId);\n if (!plugin) continue;\n\n const record = readRecord(plugin.id);\n if (!record) {\n logger.warn(`${plugin.displayName} 未找到安装记录,可能未安装或安装记录已损坏`);\n logger.info(`如需强制清理,请手动删除 .opencode/ 或 .claude/ 目录中的相关文件`);\n continue;\n }\n\n logger.info(`正在卸载 ${plugin.displayName}...`);\n\n let removedFiles = 0;\n let removedDirs = 0;\n\n for (const filePath of record.files) {\n try {\n if (existsSync(filePath) || isSymlink(filePath)) {\n unlinkSync(filePath);\n const name = filePath.split(\"/\").pop() || filePath;\n logger.step(` 移除: ${name}`);\n removedFiles++;\n }\n } catch {\n // ignore\n }\n }\n\n const sortedDirs = [...record.directories].sort((a, b) => b.length - a.length);\n for (const dirPath of sortedDirs) {\n try {\n if (existsSync(dirPath)) {\n const entries = readdirSync(dirPath);\n if (entries.length === 0) {\n rmdirSync(dirPath);\n const name = dirPath.split(\"/\").pop() || dirPath;\n logger.step(` 清理空目录: ${name}/`);\n removedDirs++;\n }\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id);\n removeInstalledPlugin(plugin.id);\n\n const totalRemoved = removedFiles + removedDirs;\n if (totalRemoved > 0) {\n logger.success(`已卸载 ${plugin.displayName}(移除 ${removedFiles} 个文件,${removedDirs} 个目录)`);\n } else {\n logger.warn(`${plugin.displayName} 的文件已不存在,已清理安装记录`);\n }\n }\n\n // Uninstall skills\n if (skills.length > 0) {\n logger.info(`正在卸载 ${skills.length} 个 Skills...`);\n\n const results = await uninstallSkills(skills, tool, level);\n\n let successCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n if (result.success) {\n successCount++;\n } else {\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_uninstall_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n }\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function updateCommand(\n pluginNames: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n let tool: AITool;\n if (options.tool) {\n tool = options.tool as AITool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\") return;\n tool = detected;\n }\n\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n\n let pluginsToUpdate: string[] = [];\n\n if (pluginNames.length === 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n pluginsToUpdate = manifests.map((m) => m.team);\n if (pluginsToUpdate.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n logger.info(`使用 ${chalk.cyan(\"install-helper install <plugin>\")} 安装插件`);\n return;\n }\n } else {\n for (const name of pluginNames) {\n const plugin = findPlugin(name);\n if (!plugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n return;\n }\n pluginsToUpdate.push(plugin.id);\n }\n }\n\n const repoManager = createRepositoryManager();\n const updateSpinner = createSpinner(t(\"update_updating\") + \"...\");\n updateSpinner.start();\n\n await repoManager.updateRepo();\n const repoPath = repoManager.getRepoPath();\n await repoManager.ensureRepoAndScan();\n updateSpinner.succeed(t(\"install_repo_ready\"));\n\n const allPlugins = getAllPlugins();\n const results = [];\n const total = pluginsToUpdate.length;\n\n for (let i = 0; i < pluginsToUpdate.length; i++) {\n const pluginId = pluginsToUpdate[i];\n const plugin = allPlugins.find((p) => p.id === pluginId);\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"update_updating\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n logger.success(t(\"update_done\"));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function infoCommand(pluginName: string): Promise<void> {\n const plugin = findPlugin(pluginName);\n if (!plugin) {\n console.log(chalk.red(` ${t(\"info_not_found\")}: ${pluginName}`));\n return;\n }\n\n const installed = scanInstalled();\n const isInstalled = installed.some((p) => p.id === plugin.id);\n const statusText = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`— ${t(\"status_not_installed\")}`);\n\n console.log();\n console.log(chalk.bold(` ${plugin.displayName}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"info_description\") + \":\")} ${plugin.description}`);\n console.log(` ${chalk.dim(\"ID:\")} ${plugin.id}`);\n console.log(` ${chalk.dim(t(\"info_status\") + \":\")} ${statusText}`);\n console.log(` ${chalk.dim(t(\"info_skills\") + \":\")} ${plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${plugin.agents}`);\n console.log(` ${chalk.dim(\"别名:\")} ${plugin.aliases.join(\", \")}`);\n console.log();\n\n try {\n const repoManager = createRepositoryManager();\n const repoPath = await repoManager.ensureRepo();\n const quickstartPath = join(repoPath, plugin.dir, \"quickstart.md\");\n\n if (existsSync(quickstartPath)) {\n console.log(` ${chalk.dim(t(\"info_quickstart\") + \":\")} ${quickstartPath}`);\n }\n\n const agentsDir = join(repoPath, plugin.dir, \"agents\");\n if (existsSync(agentsDir)) {\n const agentFiles = readdirSync(agentsDir).filter((f: string) => f.endsWith(\".md\"));\n if (agentFiles.length > 0) {\n console.log();\n console.log(` ${chalk.bold(\"Agents:\")}`);\n for (const agent of agentFiles) {\n console.log(` • ${agent.replace(\".md\", \"\")}`);\n }\n }\n }\n } catch {\n // ignore if repo not available\n }\n\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { setLanguage, t } from \"../utils/i18n.js\";\n\nexport async function langCommand(\n action?: string,\n value?: string\n): Promise<void> {\n const config = readConfig();\n\n if (!action || action === \"show\") {\n console.log();\n console.log(chalk.bold(` ${t(\"lang_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"lang_current\") + \":\")} ${config.language}`);\n console.log();\n console.log(chalk.dim(\" 支持的语言: zh_CN, en_US\"));\n console.log(chalk.dim(\" 用法: install-helper lang set <language>\"));\n console.log();\n return;\n }\n\n if (action === \"set\") {\n if (!value) {\n console.log(chalk.red(\" 请指定语言: install-helper lang set zh_CN\"));\n return;\n }\n\n if (value !== \"zh_CN\" && value !== \"en_US\") {\n console.log(chalk.red(` ${t(\"lang_invalid\")}`));\n return;\n }\n\n updateConfig({ language: value });\n setLanguage(value);\n console.log();\n console.log(chalk.green(` ✓ ${t(\"lang_set\")} ${value}`));\n console.log();\n return;\n }\n\n console.log(chalk.red(` 未知操作: ${action}`));\n console.log(chalk.dim(\" 支持的操作: show, set\"));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createCLI } from \"./cli.js\";\n\nprocess.on(\"uncaughtException\", (error: any) => {\n if (error.name === \"ExitPromptError\") {\n console.log(\"\\n已取消安装\");\n process.exit(0);\n }\n throw error;\n});\n\nconst program = createCLI();\nprogram.parse();\n"],"mappings":"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","names":["select","Separator","chalk","chalk","existsSync","homedir","join","homedir","existsSync","join","existsSync","join","existsSync","join","existsSync","readFileSync","join","homedir","choices","result","chalk","existsSync","mkdirSync","join","execa","existsSync","readFileSync","writeFileSync","mkdirSync","join","execa","existsSync","join","mkdirSync","existsSync","join","execa","existsSync","mkdirSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","join","existsSync","execa","existsSync","mkdirSync","unlinkSync","readdirSync","lstatSync","join","select","checkbox","Separator","chalk","join","existsSync","mkdirSync","isSymlink","unlinkSync","readdirSync","BACK","CANCEL","Separator","select","checkbox","chalk","lstatSync","chalk","Table","Table","chalk","existsSync","readFileSync","join","BACK","CANCEL","existsSync","join","readFileSync","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","join","chalk","existsSync","readdirSync","mkdirSync","join","lstatSync","unlinkSync","chalk","chalk","chalk","scanSpinner","tool","level","existsSync","unlinkSync","rmdirSync","readdirSync","lstatSync","chalk","existsSync","isSymlink","unlinkSync","readdirSync","rmdirSync","chalk","lstatSync","chalk","chalk","existsSync","readdirSync","join","chalk","join","existsSync","readdirSync","chalk","chalk","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/ui/wizard.ts","../src/core/registry.ts","../src/core/detector.ts","../src/utils/paths.ts","../src/core/manifest.ts","../src/utils/i18n.ts","../src/utils/logger.ts","../src/utils/config.ts","../src/ui/theme.ts","../src/core/repository.ts","../src/core/scanner.ts","../src/core/skill-registry.ts","../src/core/installer.ts","../src/core/record.ts","../src/core/skill-installer.ts","../src/ui/display.ts","../src/commands/list.ts","../src/commands/doctor.ts","../src/commands/status.ts","../src/commands/install.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/commands/info.ts","../src/commands/lang.ts","../src/index.ts"],"sourcesContent":["// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { installCommand } from \"./commands/install.js\";\nimport { uninstallCommand } from \"./commands/uninstall.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { langCommand } from \"./commands/lang.js\";\nimport { readConfig } from \"./utils/config.js\";\nimport { setLanguage } from \"./utils/i18n.js\";\n\nexport function createCLI(): Command {\n const config = readConfig();\n if (config.language) {\n setLanguage(config.language);\n }\n\n const program = new Command();\n\n program\n .name(\"install-helper\")\n .description(\"Install Helper - Interactive installer for CANN operator development skills\")\n .version(\"0.0.2-beta.3\");\n\n program\n .command(\"init\", { isDefault: false })\n .description(\"Run interactive installation wizard\")\n .action(async () => {\n await initCommand();\n });\n\n program\n .command(\"list\")\n .description(\"List available plugins\")\n .action(async () => {\n await listCommand();\n });\n\n program\n .command(\"doctor\")\n .description(\"Run health check\")\n .option(\"--fix\", \"Auto-fix detected issues\")\n .action(async (options: { fix?: boolean }) => {\n await doctorCommand(options);\n });\n\n program\n .command(\"status\")\n .description(\"Show installed plugins\")\n .action(async () => {\n await statusCommand();\n });\n\n program\n .command(\"install [names...]\")\n .description(\"Install plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--list\", \"List all available skills by category\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; list?: boolean }) => {\n await installCommand(names, options);\n });\n\n program\n .command(\"uninstall <names...>\")\n .description(\"Uninstall plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (names: string[], options: { tool?: string; level?: string }) => {\n await uninstallCommand(names, options);\n });\n\n program\n .command(\"update [plugins...]\")\n .description(\"Update installed plugins (git pull + reinstall)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (plugins: string[], options: { tool?: string; level?: string }) => {\n await updateCommand(plugins, options);\n });\n\n program\n .command(\"info <plugin>\")\n .description(\"Show plugin details\")\n .action(async (plugin: string) => {\n await infoCommand(plugin);\n });\n\n program\n .command(\"lang [action] [value]\")\n .description(\"Manage language settings (show/set)\")\n .action(async (action?: string, value?: string) => {\n await langCommand(action, value);\n });\n\n program.action(async () => {\n await initCommand();\n });\n\n return program;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { runWizard, selectToolWithDetection, stepLevel } from \"../ui/wizard.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { installSkills, interactiveSkillSelect } from \"../core/skill-installer.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner, printBanner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { selectTheme } from \"../ui/theme.js\";\nimport { printBoxTitle, showOperationHints } from \"../utils/logger.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function initCommand(): Promise<void> {\n const cwd = process.cwd();\n if (\n existsSync(join(cwd, \"package.json\")) &&\n (() => {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\"));\n return pkg.name === \"@cannbot-ai/install-helper\";\n } catch { return false; }\n })()\n ) {\n logger.warn(\"当前目录看起来是 install-helper 包目录\");\n logger.info(\"请在你的项目目录中运行此命令,而不是在 install-helper 安装目录中\");\n logger.info(\"示例:cd ~/my-project && install-helper\");\n return;\n }\n\n printBanner(t(\"wizard_title\"));\n\n const spinner = createSpinner(\"正在加载 Skills 列表...\");\n spinner.start();\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n spinner.succeed(\"Skills 列表加载完成\");\n } catch {\n spinner.warn(\"Skills 列表加载失败,将使用内置数据\");\n }\n\n let step = 0;\n let mode: \"plugin\" | \"skill\" = \"plugin\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectMode();\n if (result === null) return;\n mode = result;\n step = 1;\n break;\n }\n case 1: {\n if (mode === \"plugin\") {\n const result = await pluginInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n } else {\n const result = await skillInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n }\n }\n }\n }\n}\n\nasync function selectMode(): Promise<\"plugin\" | \"skill\" | null> {\n printBoxTitle(\"选择安装类型\");\n\n const CANCEL = \"__cancel__\";\n const choices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `> ${t(\"wizard_mode_plugin\")} — ${t(\"wizard_mode_plugin_desc\")}`,\n value: \"plugin\",\n },\n {\n name: `> ${t(\"wizard_mode_skill\")} — ${t(\"wizard_mode_skill_desc\")}`,\n value: \"skill\",\n },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_mode\"),\n choices,\n loop: false,\n theme: selectTheme,\n });\n if (result === CANCEL) return null;\n return result as \"plugin\" | \"skill\";\n}\n\nasync function pluginInstallFlow(): Promise<\"done\" | \"back\"> {\n const answers = await runWizard();\n\n if (!answers.confirmed) {\n if (answers.back) return \"back\";\n logger.info(\"已取消安装\");\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(\"正在加载插件数据...\");\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(\"插件数据加载完成\");\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = answers.plugins.map((id) =>\n allPlugins.find((p) => p.id === id)\n );\n\n const total = answers.plugins.length;\n const results = [];\n\n for (let i = 0; i < answers.plugins.length; i++) {\n const pluginId = answers.plugins[i];\n const plugin = selectedPlugins[i];\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"install_progress\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool: answers.tool,\n level: answers.level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => ({\n pluginId: result.pluginId,\n displayName: selectedPlugins[index]?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n }));\n\n printInstallSummary(summary);\n\n const configRoot = getConfigRoot(answers.tool, answers.level);\n printEnhancedSummary(summary, answers.tool, configRoot);\n return \"done\";\n}\n\nasync function skillInstallFlow(): Promise<\"done\" | \"back\"> {\n let step = 0;\n let tool: AITool = \"opencode\";\n let level: InstallLevel = \"project\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectToolWithDetection();\n if (result === \"back\") return \"back\";\n if (result === \"cancel\") {\n logger.info(\"已取消安装\");\n return \"done\";\n }\n tool = result;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel();\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n logger.info(\"已取消安装\");\n return \"done\";\n }\n level = result;\n step = 2;\n break;\n }\n case 2: {\n const selectedSkills = await interactiveSkillSelect();\n if (selectedSkills === \"back\") { step = 1; break; }\n if (selectedSkills === \"cancel\") {\n logger.info(\"已取消安装\");\n return \"done\";\n }\n if (selectedSkills.length === 0) {\n logger.info(\"未选择任何 Skill\");\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(\"正在加载插件数据...\");\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(\"插件数据加载完成\");\n\n logger.info(`${t(\"skill_install_progress\")} ${chalk.bold(selectedSkills.length)} 个 Skills...`);\n\n const results = await installSkills(selectedSkills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) {\n logger.success(`${progress} ${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${progress} ${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n logger.info(`安装到: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`启动 ${chalk.green(tool)} 即可使用`);\n logger.blank();\n return \"done\";\n }\n }\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel, WizardAnswers } from \"../types/index.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { detectTools, getToolDisplayName } from \"../core/detector.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { selectTheme, checkboxTheme } from \"./theme.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function selectToolWithDetection(): Promise<AITool | \"back\" | \"cancel\"> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) return \"back\";\n if (result === CANCEL) return \"cancel\";\n return result as AITool;\n}\n\nexport async function runWizard(): Promise<WizardAnswers> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n let selectedTool: AITool | undefined;\n let level: InstallLevel = \"project\";\n let plugins: string[] = [];\n\n let step = 0;\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false, back: true };\n }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false };\n }\n selectedTool = result as AITool;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel(config.lastLevel);\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level: \"project\", plugins: [], confirmed: false };\n }\n level = result as InstallLevel;\n step = 2;\n break;\n }\n case 2: {\n const result = await stepPlugins(selectedTool!, level);\n if (result === BACK) { step = 1; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n plugins = result as string[];\n step = 3;\n break;\n }\n case 3: {\n const result = await stepConfirm(selectedTool!, level, plugins);\n if (result === BACK) { step = 2; break; }\n if (result === CANCEL || result === false) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n updateConfig({ lastTool: selectedTool, lastLevel: level });\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins, confirmed: true };\n }\n }\n }\n}\n\nasync function stepTool(detectedTools: Awaited<ReturnType<typeof detectTools>>, lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"[1/4] 选择 AI 编程工具\");\n\n if (detectedTools.length === 0) {\n logger.error(t(\"error_tool_not_found\"));\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n }\n\n if (detectedTools.length === 1) {\n const tool = detectedTools[0];\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n logger.success(\n `${t(\"wizard_detected_tool\")}: ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`\n );\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> ${t(\"wizard_confirm_tool\")} ${getToolDisplayName(tool.name)}`, value: tool.name },\n { name: `> ${t(\"wizard_select_tool\")}`, value: \"manual\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n if (result === \"manual\") {\n return stepToolManual(lastTool);\n }\n return tool.name as AITool;\n }\n\n const choices: Array<{ name: string; value: string } | Separator> = detectedTools.map((tool) => {\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n return {\n name: `> ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`,\n value: tool.name,\n };\n });\n choices.push(new Separator(\"──────────────\"));\n choices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK });\n choices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL });\n\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nasync function stepToolManual(lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nexport async function stepLevel(lastLevel?: InstallLevel): Promise<InstallLevel | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"[2/4] 选择安装位置\");\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: \"> project — 安装到当前目录(推荐,仅当前项目可用)\", value: \"project\" },\n { name: \"> global — 安装到全局(所有项目共享)\", value: \"global\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_level\"),\n choices,\n default: lastLevel || \"project\",\n loop: false,\n theme: selectTheme,\n });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as InstallLevel;\n}\n\nasync function stepPlugins(tool: AITool, level: InstallLevel): Promise<string[] | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"[3/4] 选择要安装的插件\");\n\n const plugins = getAllPlugins();\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n\n const choices: Array<{ name: string; value: string; checked: boolean } | Separator> = plugins.map((p) => {\n const isInstalled = installedSet.has(p.id);\n const suffix = isInstalled ? ` [${t(\"wizard_already_installed\")}]` : \"\";\n return {\n name: `${p.displayName}${suffix} — ${p.description}`,\n value: p.id,\n checked: false,\n };\n });\n choices.push(new Separator(\"──────────────\"));\n choices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK, checked: false });\n choices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL, checked: false });\n\n showOperationHints(true);\n const selected = await checkbox({\n message: t(\"wizard_select_plugins\"),\n choices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n });\n\n if (selected.includes(BACK)) return BACK;\n if (selected.includes(CANCEL)) return CANCEL;\n\n const pluginIds = selected.filter((v) => v !== BACK && v !== CANCEL);\n\n if (pluginIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") return BACK;\n return CANCEL;\n }\n\n return pluginIds;\n}\n\nasync function stepConfirm(\n tool: AITool,\n level: InstallLevel,\n plugins: string[]\n): Promise<true | typeof BACK | typeof CANCEL> {\n printBoxTitle(\"[4/4] 确认安装\");\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = plugins.map((id) => allPlugins.find((p) => p.id === id));\n\n const displayPath = getConfigRoot(tool, level);\n const toolName = getToolDisplayName(tool);\n const levelText = level === \"project\" ? \"project\" : \"global\";\n logger.info(`即将安装 ${chalk.bold(plugins.length)} 个插件到 ${chalk.green(toolName)}(${chalk.cyan(levelText)} 级别):`);\n logger.info(`安装路径: ${chalk.cyan(displayPath)}`);\n for (const plugin of selectedPlugins) {\n if (plugin) {\n logger.step(` • ${chalk.bold(plugin.displayName)}`);\n }\n }\n logger.blank();\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: \"> \" + t(\"wizard_confirm\"), value: \"confirm\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_confirm\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return true;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport type { PluginEntry } from \"../types/index.js\";\n\nexport const PLUGIN_REGISTRY: PluginEntry[] = [\n {\n id: \"ops-direct-invoke\",\n dir: \"plugins-official/ops-direct-invoke\",\n displayName: \"AscendC Kernel 直调\",\n script: \"init.sh\",\n aliases: [\"ops-direct\", \"ascendc-direct\", \"direct\", \"kernel\"],\n skills: 16,\n agents: 3,\n description: \"Ascend C Kernel <<<>>> 直调算子开发全流程\",\n },\n {\n id: \"ops-direct-invoke-flash\",\n dir: \"plugins-official/ops-direct-invoke-flash\",\n displayName: \"AscendC Kernel 从零构建\",\n script: \"init.sh\",\n aliases: [\"flash\", \"kernel-flash\"],\n skills: 1,\n agents: 1,\n description: \"Ascend C / Ascend950 Reg API 核函数从零构建\",\n },\n {\n id: \"ops-registry-invoke\",\n dir: \"plugins-official/ops-registry-invoke\",\n displayName: \"AscendC 算子注册调用\",\n script: \"init.sh\",\n aliases: [\"ops-registry\", \"ascendc-registry\", \"registry\"],\n skills: 12,\n agents: 4,\n description: \"Ascend C 算子注册调用开发流程\",\n },\n {\n id: \"pypto-op-orchestrator\",\n dir: \"plugins-official/pypto-op-orchestrator\",\n displayName: \"PyPTO 算子\",\n script: \"init.sh\",\n aliases: [\"pypto\", \"pytorch\"],\n skills: 8,\n agents: 3,\n description: \"PyPTO 算子端到端开发编排\",\n },\n {\n id: \"triton-op-generator\",\n dir: \"plugins-official/triton-op-generator\",\n displayName: \"Triton 算子生成\",\n script: \"install.sh\",\n aliases: [\"triton\"],\n skills: 6,\n agents: 0,\n description: \"Triton-Ascend 算子代码生成与优化\",\n },\n {\n id: \"tilelang-op-orchestrator\",\n dir: \"plugins-official/tilelang-op-orchestrator\",\n displayName: \"TileLang 算子\",\n script: \"init.sh\",\n aliases: [\"tilelang\"],\n skills: 9,\n agents: 3,\n description: \"TileLang 算子开发流程\",\n },\n {\n id: \"model-infer-optimize\",\n dir: \"plugins-official/model-infer-optimize\",\n displayName: \"NPU 推理优化\",\n script: \"init.sh\",\n aliases: [\"model-infer\", \"infer\", \"inference\"],\n skills: 11,\n agents: 3,\n description: \"NPU 模型推理端到端优化\",\n },\n {\n id: \"catlass-op-generator\",\n dir: \"plugins-official/catlass-op-generator\",\n displayName: \"Catlass 算子直调\",\n script: \"init.sh\",\n aliases: [\"catlass\"],\n skills: 10,\n agents: 3,\n description: \"Catlass 算子直调开发\",\n },\n {\n id: \"ops-code-reviewer\",\n dir: \"plugins-official/ops-code-reviewer\",\n displayName: \"代码检视\",\n script: \"init.sh\",\n aliases: [\"code-review\", \"reviewer\", \"review\"],\n skills: 5,\n agents: 1,\n description: \"代码检视与规范检查\",\n },\n {\n id: \"torch-compile\",\n dir: \"plugins-official/torch-compile\",\n displayName: \"torch.compile 图模式\",\n script: \"init.sh\",\n aliases: [\"torch\", \"compile\", \"graph\"],\n skills: 6,\n agents: 1,\n description: \"PyTorch torch.compile 图模式适配\",\n },\n];\n\nexport function findPlugin(query: string): PluginEntry | undefined {\n const normalized = query.toLowerCase().trim();\n\n const exactMatch = PLUGIN_REGISTRY.find(\n (p) => p.id === normalized || p.id === query.trim()\n );\n if (exactMatch) return exactMatch;\n\n const aliasMatch = PLUGIN_REGISTRY.find((p) =>\n p.aliases.some((a) => a === normalized)\n );\n if (aliasMatch) return aliasMatch;\n\n const prefixMatch = PLUGIN_REGISTRY.find((p) => p.id.startsWith(normalized));\n if (prefixMatch) return prefixMatch;\n\n return undefined;\n}\n\nexport function getAllPlugins(): PluginEntry[] {\n return PLUGIN_REGISTRY;\n}\n\nexport function getPluginById(id: string): PluginEntry | undefined {\n return PLUGIN_REGISTRY.find((p) => p.id === id);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { execa } from \"execa\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport type { AITool, DetectedTool } from \"../types/index.js\";\nimport { detectTraeVariant } from \"../utils/paths.js\";\n\nasync function getCommandVersion(\n cmd: string,\n args: string[] = [\"--version\"]\n): Promise<string | undefined> {\n try {\n const result = await execa(cmd, args, { timeout: 5000 });\n const output = result.stdout.trim();\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match ? match[1] : output.split(\"\\n\")[0];\n } catch {\n return undefined;\n }\n}\n\nasync function getCommandPath(cmd: string): Promise<string | undefined> {\n try {\n const result = await execa(\"sh\", [\"-c\", `command -v ${cmd}`], { timeout: 5000 });\n return result.stdout.trim();\n } catch {\n return undefined;\n }\n}\n\nasync function detectOpenCode(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"opencode\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"opencode\");\n return { name: \"opencode\", version, path };\n}\n\nasync function detectClaude(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"claude\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"claude\");\n return { name: \"claude\", version, path };\n}\n\nasync function detectTrae(): Promise<DetectedTool | undefined> {\n const home = homedir();\n const variant = detectTraeVariant();\n\n let path: string | undefined;\n if (variant === \"ide\" && existsSync(join(home, \".trae-cn\"))) {\n path = join(home, \".trae-cn\");\n } else if (variant === \"plugin\" && existsSync(join(home, \".marscode\"))) {\n path = join(home, \".marscode\");\n } else if (variant === \"cli\" && existsSync(join(home, \".traecli\"))) {\n path = join(home, \".traecli\");\n } else if (variant === \"unknown\") {\n const cmdPath = await getCommandPath(\"trae\");\n if (cmdPath) path = cmdPath;\n }\n\n if (!path) return undefined;\n return { name: \"trae\", version: variant, path };\n}\n\nasync function detectCursor(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"cursor\");\n if (path) {\n const version = await getCommandVersion(\"cursor\");\n return { name: \"cursor\", version, path };\n }\n\n if (process.platform === \"darwin\") {\n const appPath = \"/Applications/Cursor.app\";\n if (existsSync(appPath)) {\n return { name: \"cursor\", path: appPath };\n }\n }\n\n return undefined;\n}\n\nasync function detectCopilot(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"gh\");\n if (!path) return undefined;\n\n try {\n await execa(\"gh\", [\"extension\", \"list\"], { timeout: 5000 });\n return { name: \"copilot\", path };\n } catch {\n return undefined;\n }\n}\n\nexport async function detectTools(): Promise<DetectedTool[]> {\n const detectors = [\n detectOpenCode,\n detectClaude,\n detectTrae,\n detectCursor,\n detectCopilot,\n ];\n\n const results = await Promise.allSettled(detectors.map((d) => d()));\n const tools: DetectedTool[] = [];\n\n for (const result of results) {\n if (result.status === \"fulfilled\" && result.value) {\n tools.push(result.value);\n }\n }\n\n return tools;\n}\n\nexport async function detectSingleTool(): Promise<DetectedTool | undefined> {\n const tools = await detectTools();\n return tools[0];\n}\n\nexport function getToolDisplayName(tool: AITool): string {\n const names: Record<AITool, string> = {\n opencode: \"OpenCode\",\n claude: \"Claude Code\",\n trae: \"Trae\",\n cursor: \"Cursor\",\n copilot: \"GitHub Copilot\",\n };\n return names[tool];\n}\n\nexport function getAllTools(): AITool[] {\n return [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport type { AITool, InstallLevel, TraeVariant } from \"../types/index.js\";\n\nexport function detectTraeVariant(): TraeVariant {\n const home = homedir();\n if (existsSync(join(home, \".trae-cn\"))) return \"ide\";\n if (existsSync(join(home, \".marscode\"))) return \"plugin\";\n if (existsSync(join(home, \".traecli\"))) return \"cli\";\n return \"unknown\";\n}\n\nexport function getConfigRoot(\n tool: AITool,\n level: InstallLevel,\n base?: string\n): string {\n const home = homedir();\n\n if (level === \"global\") {\n switch (tool) {\n case \"opencode\":\n return join(home, \".config\", \"opencode\");\n case \"claude\":\n return join(home, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(home, \".marscode\");\n case \"cli\":\n return join(home, \".traecli\");\n default:\n return join(home, \".trae-cn\");\n }\n }\n case \"cursor\":\n return join(home, \".cursor\");\n case \"copilot\":\n return join(home, \".copilot\");\n }\n }\n\n const baseDir = base || process.cwd();\n switch (tool) {\n case \"opencode\":\n return join(baseDir, \".opencode\");\n case \"claude\":\n return join(baseDir, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(baseDir, \".marscode\");\n case \"cli\":\n return join(baseDir, \".traecli\");\n default:\n return join(baseDir, \".trae\");\n }\n }\n case \"cursor\":\n return join(baseDir, \".cursor\");\n case \"copilot\":\n return join(baseDir, \".github\");\n }\n}\n\nexport function getConfigFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function getSkillsDir(configRoot: string): string {\n return join(configRoot, \"skills\");\n}\n\nexport function getAgentsDir(configRoot: string): string {\n return join(configRoot, \"agents\");\n}\n\nexport function getManifestPath(configRoot: string): string {\n return join(configRoot, \"cannbot-manifest.json\");\n}\n\nexport function getCannbotConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getCannbotRepoPath(): string {\n return join(getCannbotConfigDir(), \"repo\");\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type {\n CannbotManifest,\n InstalledPlugin,\n AITool,\n InstallLevel,\n} from \"../types/index.js\";\nimport { getConfigRoot, getManifestPath } from \"../utils/paths.js\";\nimport { getAllPlugins } from \"./registry.js\";\n\nexport function readManifest(configRoot: string): CannbotManifest | null {\n const manifestPath = getManifestPath(configRoot);\n if (existsSync(manifestPath)) {\n try {\n const content = readFileSync(manifestPath, \"utf-8\");\n return JSON.parse(content) as CannbotManifest;\n } catch {\n // fall through\n }\n }\n return null;\n}\n\nexport function readAllManifests(configRoot: string): CannbotManifest[] {\n const manifests: CannbotManifest[] = [];\n const plugins = getAllPlugins();\n\n const standardPath = getManifestPath(configRoot);\n if (existsSync(standardPath)) {\n try {\n const content = readFileSync(standardPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n\n for (const plugin of plugins) {\n const pluginManifestPath = join(configRoot, `${plugin.id}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n try {\n const content = readFileSync(pluginManifestPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n }\n\n return manifests;\n}\n\nexport function scanInstalled(): InstalledPlugin[] {\n const plugins = getAllPlugins();\n const installed: InstalledPlugin[] = [];\n const tools: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n const levels: InstallLevel[] = [\"project\", \"global\"];\n\n for (const tool of tools) {\n for (const level of levels) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n\n for (const manifest of manifests) {\n const plugin = plugins.find((p) => p.id === manifest.team);\n if (!plugin) continue;\n\n const alreadyAdded = installed.some(\n (p) => p.id === plugin.id && p.tool === tool && p.level === level\n );\n if (alreadyAdded) continue;\n\n installed.push({\n id: plugin.id,\n displayName: plugin.displayName,\n tool,\n level,\n skillsCount: manifest.installed_skills?.length || 0,\n agentsCount: manifest.installed_agents?.length || 0,\n installTime: manifest.install_time,\n configRoot,\n });\n }\n }\n }\n\n return installed;\n}\n\nexport function isPluginInstalled(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): boolean {\n const installed = scanInstalled();\n return installed.some(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n\nexport function getInstalledPlugin(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): InstalledPlugin | undefined {\n const installed = scanInstalled();\n return installed.find(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\ntype Messages = {\n wizard_title: string;\n wizard_detect: string;\n wizard_select_tool: string;\n wizard_select_level: string;\n wizard_select_plugins: string;\n wizard_confirm: string;\n wizard_detected_tool: string;\n wizard_confirm_tool: string;\n wizard_last_used: string;\n wizard_already_installed: string;\n install_cloning: string;\n install_repo_ready: string;\n install_progress: string;\n install_done: string;\n install_success: string;\n install_failed: string;\n install_already_installed: string;\n install_reinstall_confirm: string;\n install_skip: string;\n install_enhanced_next_steps: string;\n install_enhanced_launch: string;\n install_enhanced_try: string;\n install_enhanced_more: string;\n install_enhanced_check: string;\n install_enhanced_docs: string;\n update_title: string;\n update_updating: string;\n update_done: string;\n update_no_plugins: string;\n doctor_title: string;\n doctor_tools: string;\n doctor_plugins: string;\n doctor_links: string;\n doctor_config: string;\n doctor_result: string;\n doctor_fix_title: string;\n doctor_fix_cleaning: string;\n doctor_fix_rebuilding: string;\n doctor_fix_done: string;\n info_title: string;\n info_description: string;\n info_skills: string;\n info_agents: string;\n info_status: string;\n info_quickstart: string;\n info_not_found: string;\n lang_title: string;\n lang_current: string;\n lang_set: string;\n lang_invalid: string;\n list_title: string;\n list_id: string;\n list_name: string;\n list_status: string;\n list_skills: string;\n list_agents: string;\n status_installed: string;\n status_not_installed: string;\n error_tool_not_found: string;\n error_plugin_not_found: string;\n error_repo_not_found: string;\n quick_start: string;\n quick_start_hint: string;\n skill_select_category: string;\n skill_select_items: string;\n skill_already_installed: string;\n skill_install_progress: string;\n skill_install_done: string;\n skill_uninstall_done: string;\n skill_list_title: string;\n wizard_select_mode: string;\n wizard_mode_plugin: string;\n wizard_mode_plugin_desc: string;\n wizard_mode_skill: string;\n wizard_mode_skill_desc: string;\n wizard_back: string;\n wizard_cancel: string;\n wizard_no_selection: string;\n wizard_back_to_reselect: string;\n status_title: string;\n status_none: string;\n status_hint: string;\n status_install_time: string;\n install_installed_to: string;\n install_skills_count: string;\n install_agents_count: string;\n};\n\nconst zh_CN: Messages = {\n wizard_title: \"CANNBot Install Helper\",\n wizard_detect: \"正在检测已安装的 AI 编程工具...\",\n wizard_select_tool: \"选择 AI 编程工具\",\n wizard_select_level: \"选择安装位置\",\n wizard_select_plugins: \"选择要安装的插件\",\n wizard_confirm: \"确认安装\",\n wizard_detected_tool: \"检测到\",\n wizard_confirm_tool: \"使用\",\n wizard_last_used: \"上次使用\",\n wizard_already_installed: \"已安装\",\n install_cloning: \"正在克隆 cannbot-skills 仓库...\",\n install_repo_ready: \"仓库就绪\",\n install_progress: \"正在安装\",\n install_done: \"安装完成\",\n install_success: \"成功\",\n install_failed: \"失败\",\n install_already_installed: \"已安装\",\n install_reinstall_confirm: \"是否重新安装(覆盖)\",\n install_skip: \"跳过\",\n install_enhanced_next_steps: \"下一步\",\n install_enhanced_launch: \"启动\",\n install_enhanced_try: \"试试\",\n install_enhanced_more: \"更多\",\n install_enhanced_check: \"检查\",\n install_enhanced_docs: \"文档\",\n update_title: \"更新已安装的 Skills\",\n update_updating: \"正在更新\",\n update_done: \"更新完成\",\n update_no_plugins: \"暂无已安装的插件\",\n doctor_title: \"CANNBot Doctor\",\n doctor_tools: \"AI 工具\",\n doctor_plugins: \"已安装插件\",\n doctor_links: \"链接完整性\",\n doctor_config: \"配置文件\",\n doctor_result: \"结果\",\n doctor_fix_title: \"自动修复\",\n doctor_fix_cleaning: \"清理失效链接\",\n doctor_fix_rebuilding: \"重建目录\",\n doctor_fix_done: \"修复完成\",\n info_title: \"插件详情\",\n info_description: \"描述\",\n info_skills: \"Skills\",\n info_agents: \"Agents\",\n info_status: \"状态\",\n info_quickstart: \"快速开始\",\n info_not_found: \"未找到插件\",\n lang_title: \"语言设置\",\n lang_current: \"当前语言\",\n lang_set: \"语言已设置为\",\n lang_invalid: \"无效的语言,支持: zh_CN, en_US\",\n list_title: \"可用场景\",\n list_id: \"序号\",\n list_name: \"场景名\",\n list_status: \"状态\",\n list_skills: \"Skills\",\n list_agents: \"Agents\",\n status_installed: \"已装\",\n status_not_installed: \"未装\",\n error_tool_not_found: \"未检测到任何 AI 编程工具\",\n error_plugin_not_found: \"未找到插件\",\n error_repo_not_found: \"仓库未找到\",\n quick_start: \"启动命令\",\n quick_start_hint: \"试试输入: 帮我开发一个 Abs 算子\",\n skill_select_category: \"选择 Skill 类别\",\n skill_select_items: \"选择要安装的 Skills\",\n skill_already_installed: \"已安装\",\n skill_install_progress: \"正在安装\",\n skill_install_done: \"Skill 安装完成\",\n skill_uninstall_done: \"Skill 卸载完成\",\n skill_list_title: \"可用 Skills\",\n wizard_select_mode: \"选择安装类型\",\n wizard_mode_plugin: \"安装 Plugin\",\n wizard_mode_plugin_desc: \"完整开发工作流(Skills + Agents + 配置文件)\",\n wizard_mode_skill: \"安装 Skill\",\n wizard_mode_skill_desc: \"仅安装领域知识技能,让 AI 掌握特定能力\",\n wizard_back: \"返回\",\n wizard_cancel: \"退出\",\n wizard_no_selection: \"未选择任何项,请选择操作\",\n wizard_back_to_reselect: \"返回\",\n status_title: \"已安装插件\",\n status_none: \"暂无已安装的插件\",\n status_hint: \"运行 install-helper init 开始安装\",\n status_install_time: \"安装时间\",\n install_installed_to: \"安装到\",\n install_skills_count: \"Skills\",\n install_agents_count: \"Agents\",\n};\n\nconst en_US: Messages = {\n wizard_title: \"CANNBot Skills Setup Wizard\",\n wizard_detect: \"Detecting installed AI coding tools...\",\n wizard_select_tool: \"Select AI coding tool\",\n wizard_select_level: \"Select install level\",\n wizard_select_plugins: \"Select scenarios to install\",\n wizard_confirm: \"Confirm installation\",\n wizard_detected_tool: \"Detected\",\n wizard_confirm_tool: \"Confirm using\",\n wizard_last_used: \"last used\",\n wizard_already_installed: \"installed\",\n install_cloning: \"Cloning cannbot-skills repository...\",\n install_repo_ready: \"Repository ready\",\n install_progress: \"Installing\",\n install_done: \"Installation complete\",\n install_success: \"success\",\n install_failed: \"failed\",\n install_already_installed: \"already installed\",\n install_reinstall_confirm: \"Reinstall (overwrite)\",\n install_skip: \"skipped\",\n install_enhanced_next_steps: \"Next steps\",\n install_enhanced_launch: \"Launch\",\n install_enhanced_try: \"Try\",\n install_enhanced_more: \"More\",\n install_enhanced_check: \"Check\",\n install_enhanced_docs: \"Docs\",\n update_title: \"Update installed Skills\",\n update_updating: \"Updating\",\n update_done: \"Update complete\",\n update_no_plugins: \"No installed plugins\",\n doctor_title: \"CANNBot Doctor\",\n doctor_tools: \"AI Tools\",\n doctor_plugins: \"Installed Plugins\",\n doctor_links: \"Link Integrity\",\n doctor_config: \"Configuration\",\n doctor_result: \"Result\",\n doctor_fix_title: \"Auto-fix\",\n doctor_fix_cleaning: \"Cleaning broken links\",\n doctor_fix_rebuilding: \"Rebuilding directories\",\n doctor_fix_done: \"Fix complete\",\n info_title: \"Plugin Details\",\n info_description: \"Description\",\n info_skills: \"Skills\",\n info_agents: \"Agents\",\n info_status: \"Status\",\n info_quickstart: \"Quick Start\",\n info_not_found: \"Plugin not found\",\n lang_title: \"Language Settings\",\n lang_current: \"Current language\",\n lang_set: \"Language set to\",\n lang_invalid: \"Invalid language, supported: zh_CN, en_US\",\n list_title: \"Available Scenarios\",\n list_id: \"#\",\n list_name: \"Name\",\n list_status: \"Status\",\n list_skills: \"Skills\",\n list_agents: \"Agents\",\n status_installed: \"installed\",\n status_not_installed: \"not installed\",\n error_tool_not_found: \"No AI coding tool detected\",\n error_plugin_not_found: \"Plugin not found\",\n error_repo_not_found: \"Repository not found\",\n quick_start: \"Launch command\",\n quick_start_hint: \"Try: help me develop an Abs operator\",\n skill_select_category: \"Select Skill category\",\n skill_select_items: \"Select Skills to install (space to toggle, enter to confirm)\",\n skill_already_installed: \"installed\",\n skill_install_progress: \"Installing\",\n skill_install_done: \"Skill installation complete\",\n skill_uninstall_done: \"Skill uninstallation complete\",\n skill_list_title: \"Available Skills\",\n wizard_select_mode: \"Select installation mode\",\n wizard_mode_plugin: \"Install Plugin\",\n wizard_mode_plugin_desc: \"Full development workflow (Skills + Agents + config)\",\n wizard_mode_skill: \"Install Skill\",\n wizard_mode_skill_desc: \"Domain knowledge only, give AI specific capabilities\",\n wizard_back: \"Go back\",\n wizard_cancel: \"Cancel installation\",\n wizard_no_selection: \"No items selected, please choose an action\",\n wizard_back_to_reselect: \"Go back\",\n status_title: \"Installed Plugins\",\n status_none: \"No installed plugins\",\n status_hint: \"Run install-helper init to start\",\n status_install_time: \"Installed at\",\n install_installed_to: \"Installed to\",\n install_skills_count: \"Skills\",\n install_agents_count: \"Agents\",\n};\n\nlet currentLang: \"zh_CN\" | \"en_US\" = \"zh_CN\";\n\nexport function setLanguage(lang: \"zh_CN\" | \"en_US\"): void {\n currentLang = lang;\n}\n\nexport function getLanguage(): \"zh_CN\" | \"en_US\" {\n return currentLang;\n}\n\nexport function t(key: keyof Messages): string {\n return currentLang === \"zh_CN\" ? zh_CN[key] : en_US[key];\n}\n\nexport const i18n = {\n setLanguage,\n getLanguage,\n t,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\n\nexport const logger = {\n success: (msg: string) => console.log(chalk.green(\"✓\") + \" \" + msg),\n error: (msg: string) => console.log(chalk.red(\"✗\") + \" \" + msg),\n warn: (msg: string) => console.log(chalk.yellow(\"⚠\") + \" \" + msg),\n info: (msg: string) => console.log(chalk.cyan(\"→\") + \" \" + msg),\n step: (msg: string) => console.log(chalk.dim(msg)),\n blank: () => console.log(),\n};\n\nexport function createSpinner(text: string): Ora {\n return ora({ text, color: \"cyan\" });\n}\n\nexport function printBanner(subtitle?: string): void {\n console.log(chalk.cyan(`\n ____ _ _ _ _ _ ____ _\n / ___| / \\\\ | \\\\ | | \\\\ | | __ ) ___ | |_\n | | / _ \\\\ | \\\\| | \\\\| | _ \\\\ / _ \\\\| __|\n | |___ / ___ \\\\| |\\\\ | |\\\\ | |_) | (_) | |_\n \\\\____/_/ \\\\_\\\\_| \\\\_|_| \\\\_|____/ \\\\___/ \\\\__|\n`));\n if (subtitle) {\n console.log(chalk.bold(` ${subtitle}`));\n console.log();\n }\n}\n\nfunction getDisplayWidth(str: string): number {\n let width = 0;\n for (const ch of str) {\n const code = ch.codePointAt(0)!;\n if (\n (code >= 0x2E80 && code <= 0x9FFF) ||\n (code >= 0xF900 && code <= 0xFAFF) ||\n (code >= 0xFE30 && code <= 0xFE4F) ||\n (code >= 0xFF00 && code <= 0xFFEF) ||\n (code >= 0x3400 && code <= 0x4DBF) ||\n (code >= 0x20000 && code <= 0x2A6DF) ||\n (code >= 0x2A700 && code <= 0x2B73F) ||\n (code >= 0x2B740 && code <= 0x2B81F) ||\n (code >= 0x2B820 && code <= 0x2CEAF)\n ) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nexport function printBoxTitle(title: string, width: number = 65): void {\n const border = \"═\".repeat(width);\n const displayWidth = getDisplayWidth(title);\n const totalPadding = width - displayWidth;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n const paddedTitle = \" \".repeat(Math.max(0, leftPadding)) + title + \" \".repeat(Math.max(0, rightPadding));\n console.log();\n console.log(chalk.cyan.bold(` ╔${border}╗`));\n console.log(chalk.cyan.bold(` ║`) + chalk.cyan.bold(paddedTitle) + chalk.cyan.bold(`║`));\n console.log(chalk.cyan.bold(` ╚${border}╝`));\n console.log();\n}\n\nexport function showOperationHints(isCheckbox: boolean = false): void {\n if (isCheckbox) {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m 移动 | \\x1b[36m空格\\x1b[0m 选择 | \\x1b[36m⏎\\x1b[0m 确认\\n`);\n } else {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m 移动 | \\x1b[36m⏎\\x1b[0m 确认\\n`);\n }\n}\n\nexport function printBox(content: string[]): void {\n const maxLen = Math.max(...content.map((line) => line.length));\n const border = \"─\".repeat(maxLen + 2);\n console.log(chalk.cyan(` ┌${border}┐`));\n for (const line of content) {\n console.log(chalk.cyan(\" │ \") + line.padEnd(maxLen) + chalk.cyan(\" │\"));\n }\n console.log(chalk.cyan(` └${border}┘`));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { parse, stringify } from \"yaml\";\nimport type { AppConfig } from \"../types/index.js\";\n\nexport function getConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.yaml\");\n}\n\nexport function readConfig(): AppConfig {\n const configPath = getConfigPath();\n if (!existsSync(configPath)) {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const parsed = parse(content) as Partial<AppConfig>;\n return {\n language: parsed.language || \"zh_CN\",\n lastTool: parsed.lastTool,\n lastLevel: parsed.lastLevel,\n repoPath: parsed.repoPath,\n installedPlugins: parsed.installedPlugins || [],\n };\n } catch {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n}\n\nexport function writeConfig(config: AppConfig): void {\n const configDir = getConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const configPath = getConfigPath();\n const content = stringify(config);\n writeFileSync(configPath, content, \"utf-8\");\n}\n\nexport function updateConfig(updates: Partial<AppConfig>): AppConfig {\n const config = readConfig();\n const updated = { ...config, ...updates };\n writeConfig(updated);\n return updated;\n}\n\nexport function addInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n if (!config.installedPlugins.includes(pluginId)) {\n config.installedPlugins.push(pluginId);\n writeConfig(config);\n }\n}\n\nexport function removeInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n config.installedPlugins = config.installedPlugins.filter(\n (id) => id !== pluginId\n );\n writeConfig(config);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nexport const selectTheme = {\n helpMode: \"never\" as const,\n};\n\nexport const checkboxTheme = {\n icon: {\n checked: \"\\x1b[32m☑\\x1b[22m\",\n unchecked: \"☐\",\n cursor: \"❯\",\n },\n helpMode: \"never\" as const,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { execa } from \"execa\";\nimport { getCannbotConfigDir, getCannbotRepoPath } from \"../utils/paths.js\";\nimport {\n scanSkills,\n getCurrentCommit,\n readScanCache,\n writeScanCache,\n} from \"./scanner.js\";\nimport { initFromScan } from \"./skill-registry.js\";\n\nconst REPO_URL = \"https://gitcode.com/cann/cannbot-skills.git\";\n\nexport class RepositoryManager {\n private repoPath: string | undefined;\n\n constructor(customPath?: string) {\n this.repoPath = customPath;\n }\n\n async ensureRepo(): Promise<string> {\n if (this.repoPath && this.isValidRepo(this.repoPath)) {\n return this.repoPath;\n }\n\n const cwd = process.cwd();\n if (this.isValidRepo(cwd)) {\n this.repoPath = cwd;\n return cwd;\n }\n\n const envPath = process.env.CANNBOT_REPO_PATH;\n if (envPath && this.isValidRepo(envPath)) {\n this.repoPath = envPath;\n return envPath;\n }\n\n const cachedPath = getCannbotRepoPath();\n if (this.isValidRepo(cachedPath)) {\n this.repoPath = cachedPath;\n return cachedPath;\n }\n\n return await this.cloneRepo();\n }\n\n async ensureRepoAndScan(): Promise<string> {\n const repoPath = await this.ensureRepo();\n\n const cache = readScanCache();\n if (cache && cache.repoCommit === getCurrentCommit(repoPath)) {\n initFromScan(cache.skills);\n return repoPath;\n }\n\n const skills = scanSkills(repoPath);\n initFromScan(skills);\n\n writeScanCache({\n skills,\n repoCommit: getCurrentCommit(repoPath),\n timestamp: Date.now(),\n });\n\n return repoPath;\n }\n\n async updateRepo(): Promise<void> {\n const repoPath = await this.ensureRepo();\n try {\n await execa(\"git\", [\"pull\", \"--quiet\"], { cwd: repoPath, timeout: 30000 });\n } catch {\n // Ignore update failures\n }\n }\n\n getRepoPath(): string {\n if (!this.repoPath) {\n throw new Error(\"Repository not initialized. Call ensureRepo() first.\");\n }\n return this.repoPath;\n }\n\n private isValidRepo(path: string): boolean {\n if (!existsSync(path)) return false;\n const gitDir = join(path, \".git\");\n const pluginsDir = join(path, \"plugins-official\");\n return existsSync(gitDir) && existsSync(pluginsDir);\n }\n\n private async cloneRepo(): Promise<string> {\n const configDir = getCannbotConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const targetPath = getCannbotRepoPath();\n if (existsSync(targetPath)) {\n if (this.isValidRepo(targetPath)) {\n this.repoPath = targetPath;\n return targetPath;\n }\n }\n\n try {\n await execa(\n \"git\",\n [\"clone\", \"--depth\", \"1\", REPO_URL, targetPath],\n { timeout: 120000 }\n );\n this.repoPath = targetPath;\n return targetPath;\n } catch (error) {\n throw new Error(\n `Failed to clone repository: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n}\n\nexport function createRepositoryManager(customPath?: string): RepositoryManager {\n return new RepositoryManager(customPath);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join, relative, dirname, basename } from \"path\";\nimport { parse as parseYaml } from \"yaml\";\n\nexport interface ScannedSkill {\n id: string;\n description: string;\n source: string;\n filePath: string;\n}\n\nexport interface ScanCache {\n skills: ScannedSkill[];\n repoCommit: string;\n timestamp: number;\n}\n\nconst EXCLUDE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"asc-devkit\",\n \"cann-samples\",\n \"tilelang-ascend\",\n \".agents\",\n \".opencode\",\n \".claude\",\n \".claude-plugin\",\n \"dist\",\n \"build\",\n \"references\",\n \"hooks\",\n \"operators\",\n \"workflows\",\n \"tests\",\n \"docs\",\n \"scripts\",\n]);\n\nconst SKILL_SCAN_DIRS = [\n \"ops\",\n \"model\",\n \"graph\",\n \"infra\",\n \"ops-lab\",\n];\n\nconst PLUGIN_SCAN_DIRS = [\n \"plugins-official\",\n \"plugins-community\",\n];\n\nexport function scanSkills(repoPath: string): ScannedSkill[] {\n const skills: ScannedSkill[] = [];\n const seen = new Set<string>();\n\n for (const dir of SKILL_SCAN_DIRS) {\n const fullPath = join(repoPath, dir);\n if (!existsSync(fullPath)) continue;\n scanDirectory(fullPath, repoPath, dir, skills, seen);\n }\n\n for (const pluginDir of PLUGIN_SCAN_DIRS) {\n const pluginParent = join(repoPath, pluginDir);\n if (!existsSync(pluginParent)) continue;\n \n for (const plugin of safeReaddir(pluginParent)) {\n const pluginPath = join(pluginParent, plugin);\n if (!isDirectory(pluginPath)) continue;\n\n const skillsDir = join(pluginPath, \"skills\");\n if (existsSync(skillsDir)) {\n scanDirectory(skillsDir, repoPath, `${pluginDir}/${plugin}/skills`, skills, seen);\n }\n\n const skillDir = join(pluginPath, \"skill\");\n if (existsSync(skillDir)) {\n scanDirectory(skillDir, repoPath, `${pluginDir}/${plugin}/skill`, skills, seen);\n }\n }\n }\n\n return skills;\n}\n\nexport function parseFrontmatter(filePath: string): { name: string; description: string } | null {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n \n if (lines.length < 3) return null;\n if (lines[0].trim() !== \"---\") return null;\n\n let endIndex = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === \"---\") {\n endIndex = i;\n break;\n }\n }\n\n if (endIndex === -1) return null;\n\n const yamlBlock = lines.slice(1, endIndex).map(l => l.replace(/\\r$/, \"\")).join(\"\\n\");\n const parsed = parseYaml(yamlBlock);\n\n if (!parsed || typeof parsed !== \"object\") return null;\n if (!parsed.name || typeof parsed.name !== \"string\") return null;\n\n return {\n name: parsed.name.trim(),\n description: (parsed.description || \"\").trim(),\n };\n } catch {\n return null;\n }\n}\n\nexport function getCurrentCommit(repoPath: string): string {\n try {\n const headFile = join(repoPath, \".git\", \"HEAD\");\n if (!existsSync(headFile)) return \"unknown\";\n \n const headContent = readFileSync(headFile, \"utf-8\").trim();\n if (headContent.startsWith(\"ref: \")) {\n const refPath = join(repoPath, \".git\", headContent.slice(5));\n if (existsSync(refPath)) {\n return readFileSync(refPath, \"utf-8\").trim();\n }\n // Fallback to packed-refs for shallow clones\n const packedRefsPath = join(repoPath, \".git\", \"packed-refs\");\n if (existsSync(packedRefsPath)) {\n const packedRefs = readFileSync(packedRefsPath, \"utf-8\");\n const refName = headContent.slice(5);\n const lines = packedRefs.split(\"\\n\");\n for (const line of lines) {\n if (line.endsWith(refName)) {\n return line.split(\" \")[0];\n }\n }\n }\n }\n return headContent;\n } catch {\n return \"unknown\";\n }\n}\n\nexport function readScanCache(): ScanCache | null {\n try {\n const cachePath = getCachePath();\n if (!existsSync(cachePath)) return null;\n \n const content = readFileSync(cachePath, \"utf-8\");\n const cache = JSON.parse(content) as ScanCache;\n \n if (!cache.skills || !cache.timestamp) return null;\n \n const age = Date.now() - cache.timestamp;\n if (age > 24 * 60 * 60 * 1000) return null;\n \n return cache;\n } catch {\n return null;\n }\n}\n\nexport function writeScanCache(cache: ScanCache): void {\n try {\n const cachePath = getCachePath();\n const cacheDir = dirname(cachePath);\n if (!existsSync(cacheDir)) {\n mkdirSync(cacheDir, { recursive: true });\n }\n writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n }\n}\n\nfunction getCachePath(): string {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"/tmp\";\n return join(homeDir, \".cannbot\", \"scan-cache.json\");\n}\n\nfunction scanDirectory(\n dirPath: string,\n repoPath: string,\n sourcePrefix: string,\n skills: ScannedSkill[],\n seen: Set<string>\n): void {\n // Check if dirPath itself contains SKILL.md (for skill/ directories)\n const selfSkillMd = join(dirPath, \"SKILL.md\");\n if (existsSync(selfSkillMd)) {\n const frontmatter = parseFrontmatter(selfSkillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: selfSkillMd,\n });\n }\n return; // Don't recurse into subdirectories\n }\n\n for (const entry of safeReaddir(dirPath)) {\n const fullPath = join(dirPath, entry);\n \n if (EXCLUDE_DIRS.has(entry)) continue;\n \n if (!isDirectory(fullPath)) continue;\n\n const skillMd = join(fullPath, \"SKILL.md\");\n if (existsSync(skillMd)) {\n const frontmatter = parseFrontmatter(skillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: skillMd,\n });\n }\n continue;\n }\n\n scanDirectory(fullPath, repoPath, sourcePrefix, skills, seen);\n }\n}\n\nfunction safeReaddir(dir: string): string[] {\n try {\n return readdirSync(dir);\n } catch {\n return [];\n }\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport type { ScannedSkill } from \"./scanner.js\";\n\nexport interface SkillEntry {\n id: string;\n description: string;\n source: string;\n}\n\nexport interface SkillCategory {\n id: string;\n name: string;\n skills: SkillEntry[];\n}\n\nconst CATEGORY_DEFS: { id: string; name: string }[] = [\n { id: \"knowledge\", name: \"知识与参考\" },\n { id: \"env-tools\", name: \"环境与工具\" },\n { id: \"debug\", name: \"调试与诊断\" },\n { id: \"testing\", name: \"测试与质量\" },\n { id: \"ascendc\", name: \"AscendC 开发\" },\n { id: \"pypto\", name: \"PyPTO 开发\" },\n { id: \"tilelang\", name: \"TileLang 开发\" },\n { id: \"triton\", name: \"Triton 开发\" },\n { id: \"model\", name: \"模型推理优化\" },\n { id: \"graph\", name: \"图模式\" },\n { id: \"platform\", name: \"平台工具\" },\n { id: \"other\", name: \"其他 Skills\" },\n];\n\nlet dynamicSkills: SkillEntry[] = [];\nlet initialized = false;\n\nexport function initFromScan(scanned: ScannedSkill[]): void {\n dynamicSkills = scanned.map((s) => ({\n id: s.id,\n description: s.description,\n source: s.source,\n }));\n initialized = true;\n}\n\nexport function isScanInitialized(): boolean {\n return initialized;\n}\n\nconst STATIC_SKILL_CATEGORIES: SkillCategory[] = [\n {\n id: \"knowledge\",\n name: \"知识与参考\",\n skills: [\n { id: \"npu-arch\", description: \"NPU 架构知识、芯片型号映射\", source: \"ops\" },\n { id: \"ascendc-api-best-practices\", description: \"API 使用最佳实践\", source: \"ops\" },\n { id: \"ascendc-tiling-design\", description: \"Tiling 和 Kernel 设计方法论\", source: \"ops\" },\n { id: \"ascendc-docs-search\", description: \"API 文档索引 + 在线搜索\", source: \"ops\" },\n { id: \"ascendc-docs-gen\", description: \"算子文档写作参考\", source: \"ops\" },\n { id: \"ascendc-performance-best-practices\", description: \"性能优化经验总结\", source: \"ops\" },\n { id: \"ascendc-regbase-best-practice\", description: \"RegBase 算子 API 约束\", source: \"ops\" },\n { id: \"ops-precision-standard\", description: \"算子精度标准(atol/rtol)\", source: \"ops\" },\n { id: \"ops-spec-gen\", description: \"算子 spec.yaml 生成与校验\", source: \"ops\" },\n ],\n },\n {\n id: \"env-tools\",\n name: \"环境与工具\",\n skills: [\n { id: \"ascendc-env-check\", description: \"NPU 设备查询、CANN 环境验证\", source: \"ops\" },\n { id: \"cann-env-setup\", description: \"CANN 安装与环境配置指导\", source: \"ops\" },\n { id: \"ops-profiling\", description: \"NPU 性能采集与分析\", source: \"ops\" },\n { id: \"ops-simulator\", description: \"CANN Simulator 精度/性能仿真\", source: \"ops\" },\n { id: \"torch-ops-profiler\", description: \"torch_npu.profiler 性能报告\", source: \"ops\" },\n { id: \"aiss-tiling-solver\", description: \"AISS-TilingSolver 自动求解 Tiling 参数\", source: \"ops\" },\n ],\n },\n {\n id: \"debug\",\n name: \"调试与诊断\",\n skills: [\n { id: \"ascendc-precision-debug\", description: \"精度调试、症状-原因速查\", source: \"ops\" },\n { id: \"ascendc-runtime-debug\", description: \"运行时错误码解析\", source: \"ops\" },\n { id: \"ascendc-crash-debug\", description: \"卡死/崩溃调试、Coredump 分析\", source: \"ops\" },\n { id: \"ascendc-perf-optimize\", description: \"性能优化策略制定\", source: \"ops\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"npugraph_ex DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"npugraph_ex 编译期报错诊断\", source: \"graph\" },\n ],\n },\n {\n id: \"testing\",\n name: \"测试与质量\",\n skills: [\n { id: \"ascendc-code-review\", description: \"代码检视方法论\", source: \"ops\" },\n { id: \"ascendc-ut-develop\", description: \"UT 开发与覆盖率增强\", source: \"ops\" },\n { id: \"ascendc-st-design\", description: \"ST 测试用例设计\", source: \"ops\" },\n { id: \"ascendc-whitebox-design\", description: \"白盒测试用例生成\", source: \"ops\" },\n { id: \"ascendc-task-focus\", description: \"长任务聚焦防迷失\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"TileLang 测试设计\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"TileLang 代码格式检查\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"Triton 算子验证\", source: \"ops\" },\n ],\n },\n {\n id: \"ascendc\",\n name: \"AscendC 开发\",\n skills: [\n { id: \"ascendc-direct-invoke-template\", description: \"Kernel 直调工程模板\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-template\", description: \"自定义算子工程模板\", source: \"ops\" },\n { id: \"ascendc-direct-invoke-to-registry-invoke\", description: \"直调转注册调用\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-to-direct-invoke\", description: \"注册调用转直调\", source: \"ops\" },\n { id: \"ascendc-blaze-best-practice\", description: \"Matmul/GEMM Blaze 直调生成\", source: \"ops\" },\n { id: \"ascendc-simt-best-practices\", description: \"SIMT 最佳实践与 API 导航\", source: \"ops\" },\n { id: \"ascendc-simt-tiling-design\", description: \"SIMT 算子切分设计\", source: \"ops\" },\n { id: \"torch-ascendc-op-extension\", description: \"Ascend C 对接 PyTorch\", source: \"ops\" },\n { id: \"catlass-op-design\", description: \"Catlass 算子设计\", source: \"ops\" },\n { id: \"catlass-op-develop\", description: \"Catlass 算子开发\", source: \"ops\" },\n { id: \"catlass-op-perf-tune\", description: \"Catlass 性能调优\", source: \"ops\" },\n { id: \"cuda2ascend-simt\", description: \"CUDA 迁移到 Ascend C SIMT\", source: \"ops-lab\" },\n { id: \"ops-direct-invoke-flash\", description: \"从零构建 Ascend C 核函数\", source: \"plugins-official/ops-direct-invoke-flash/skills\" },\n { id: \"ops-registry-invoke-workflow\", description: \"注册调用工作流\", source: \"plugins-official/ops-registry-invoke\" },\n { id: \"ops-easyasc-dsl\", description: \"EasyASC DSL 算子开发\", source: \"plugins-community/ops-easyasc-dsl/skill\" },\n ],\n },\n {\n id: \"pypto\",\n name: \"PyPTO 开发\",\n skills: [\n { id: \"pypto-intent-understand\", description: \"需求意图理解与规格生成\", source: \"ops\" },\n { id: \"pypto-api-explore\", description: \"API 可行性探索与分析\", source: \"ops\" },\n { id: \"pypto-op-design\", description: \"算子方案设计生成\", source: \"ops\" },\n { id: \"pypto-golden-generate\", description: \"Golden 参考实现生成\", source: \"ops\" },\n { id: \"pypto-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"pypto-precision-debug\", description: \"精度问题排查\", source: \"ops\" },\n { id: \"pypto-precision-compare\", description: \"精度对比分析\", source: \"ops\" },\n { id: \"pypto-op-perf-tune\", description: \"性能分析与调优\", source: \"ops\" },\n ],\n },\n {\n id: \"tilelang\",\n name: \"TileLang 开发\",\n skills: [\n { id: \"tilelang-env-check\", description: \"环境检查与配置验证\", source: \"ops\" },\n { id: \"tilelang-submodule-pull\", description: \"三方库与子模块拉取\", source: \"ops\" },\n { id: \"tilelang-api-best-practices\", description: \"TileLang API 最佳实践\", source: \"ops\" },\n { id: \"tilelang-programming-model-guide\", description: \"Developer/Expert 模式选择\", source: \"ops\" },\n { id: \"tilelang-op-design\", description: \"算子设计文档生成\", source: \"ops\" },\n { id: \"tilelang-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"测试设计与覆盖率分析\", source: \"ops\" },\n { id: \"tilelang-perf-optimization\", description: \"性能调优与劣化检查\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"代码格式检查与修复\", source: \"ops\" },\n ],\n },\n {\n id: \"triton\",\n name: \"Triton 开发\",\n skills: [\n { id: \"triton-task-extractor\", description: \"算子任务提取与构建\", source: \"ops\" },\n { id: \"triton-op-designer\", description: \"算法草图设计\", source: \"ops\" },\n { id: \"triton-op-coding\", description: \"Triton 内核代码生成\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"算子精度和性能验证\", source: \"ops\" },\n { id: \"triton-latency-optimizer\", description: \"Triton 代码性能优化\", source: \"ops\" },\n ],\n },\n {\n id: \"model\",\n name: \"模型推理优化\",\n skills: [\n { id: \"model-infer-migrator\", description: \"框架适配与部署基线\", source: \"model\" },\n { id: \"model-infer-parallel-analysis\", description: \"并行策略分析(TP/EP/DP)\", source: \"model\" },\n { id: \"model-infer-parallel-impl\", description: \"并行切分实施\", source: \"model\" },\n { id: \"model-infer-kvcache\", description: \"KVCache 优化 + FA 替换\", source: \"model\" },\n { id: \"model-infer-fusion\", description: \"torch_npu 融合算子替换\", source: \"model\" },\n { id: \"model-infer-graph-mode\", description: \"torch.compile 图模式适配\", source: \"model\" },\n { id: \"model-infer-multi-stream\", description: \"多流并行优化\", source: \"model\" },\n { id: \"model-infer-prefetch\", description: \"权重预取适配\", source: \"model\" },\n { id: \"model-infer-superkernel\", description: \"SuperKernel 适配\", source: \"model\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n ],\n },\n {\n id: \"graph\",\n name: \"图模式\",\n skills: [\n { id: \"torch-npugraph-ex-knowledge\", description: \"npugraph_ex 使用指南\", source: \"graph\" },\n { id: \"torch-npugraph-ex-template\", description: \"npugraph_ex MRE 代码模板\", source: \"graph\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"编译期报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-runtime-error-diagnosis\", description: \"运行时报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-performance-diagnosis\", description: \"性能诊断\", source: \"graph\" },\n { id: \"torch-custom-ops-guide\", description: \"自定义算子入图指南\", source: \"graph\" },\n ],\n },\n {\n id: \"platform\",\n name: \"平台工具\",\n skills: [\n { id: \"gitcode-pr-handler\", description: \"GitCode PR 标题/描述生成\", source: \"infra\" },\n { id: \"gitcode-issue-gen\", description: \"GitCode Issue 生成与关联\", source: \"infra\" },\n { id: \"gitcode-issue-handler\", description: \"GitCode Issue 端到端处置\", source: \"infra\" },\n { id: \"gitcode-toolkit\", description: \"GitCode 协作通用参考\", source: \"infra\" },\n { id: \"cannbot-skill-reviewer\", description: \"Skill 入库质量审查\", source: \"infra\" },\n ],\n },\n];\n\nconst CATEGORY_MAP: Record<string, string> = {};\nfor (const cat of STATIC_SKILL_CATEGORIES) {\n for (const skill of cat.skills) {\n CATEGORY_MAP[skill.id] = cat.id;\n }\n}\n\nfunction getActiveSkills(): SkillEntry[] {\n if (initialized) return deduplicate(dynamicSkills);\n return deduplicate(STATIC_SKILL_CATEGORIES.flatMap((c) => c.skills));\n}\n\nfunction deduplicate(skills: SkillEntry[]): SkillEntry[] {\n const seen = new Set<string>();\n const result: SkillEntry[] = [];\n for (const skill of skills) {\n if (!seen.has(skill.id)) {\n result.push(skill);\n seen.add(skill.id);\n }\n }\n return result;\n}\n\nexport function findSkill(query: string): SkillEntry | undefined {\n const normalized = query.toLowerCase().trim();\n const pool = getActiveSkills();\n return pool.find((s) => s.id === normalized);\n}\n\nexport function getAllSkills(): SkillEntry[] {\n return getActiveSkills();\n}\n\nexport function getSkillsByCategory(categoryId: string): SkillEntry[] {\n return getAllCategories().find((c) => c.id === categoryId)?.skills ?? [];\n}\n\nexport function getAllCategories(): SkillCategory[] {\n const skills = getActiveSkills();\n return CATEGORY_DEFS.map((def) => ({\n id: def.id,\n name: def.name,\n skills: skills.filter((s) => {\n const catId = CATEGORY_MAP[s.id];\n if (catId) return catId === def.id;\n return def.id === \"other\";\n }),\n })).filter((cat) => cat.skills.length > 0);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult } from \"../types/index.js\";\nimport { getPluginById } from \"./registry.js\";\nimport { readManifest } from \"./manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { scanInstalledFiles, writeRecord } from \"./record.js\";\n\nexport async function installPlugin(\n opts: InstallOptions\n): Promise<InstallResult> {\n const plugin = getPluginById(opts.pluginId);\n if (!plugin) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Plugin not found: ${opts.pluginId}`],\n warnings: [],\n };\n }\n\n const scriptPath = join(opts.repoPath, plugin.dir, plugin.script);\n if (!existsSync(scriptPath)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Script not found: ${scriptPath}`],\n warnings: [],\n };\n }\n\n const args = [opts.level, opts.tool];\n if (opts.installPath) {\n args.push(opts.installPath);\n }\n\n const cwd = opts.installPath || process.cwd();\n\n try {\n await execa(\"bash\", [scriptPath, ...args], {\n cwd,\n timeout: 300000,\n stdio: \"pipe\",\n });\n\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n const manifest = readManifest(configRoot);\n\n let skillsCount = 0;\n let agentsCount = 0;\n\n if (manifest) {\n skillsCount = manifest.installed_skills?.length || 0;\n agentsCount = manifest.installed_agents?.length || 0;\n } else {\n skillsCount = plugin.skills;\n agentsCount = plugin.agents;\n }\n\n try {\n const record = scanInstalledFiles(\n opts.pluginId,\n plugin.displayName,\n opts.tool,\n opts.level,\n cwd,\n configRoot,\n manifest\n );\n writeRecord(record);\n } catch {\n // Record writing is best-effort, don't fail install\n }\n\n return {\n success: true,\n pluginId: opts.pluginId,\n skillsCount,\n agentsCount,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [errorMessage],\n warnings: [],\n };\n }\n}\n\nexport async function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string,\n installPath?: string\n): Promise<InstallResult[]> {\n const results: InstallResult[] = [];\n\n for (const pluginId of pluginIds) {\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n installPath,\n });\n results.push(result);\n }\n\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, lstatSync, readlinkSync, unlinkSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel, CannbotManifest } from \"../types/index.js\";\n\nexport interface InstallRecord {\n pluginId: string;\n displayName: string;\n tool: AITool;\n level: InstallLevel;\n installPath: string;\n configRoot: string;\n installTime: string;\n files: string[];\n directories: string[];\n}\n\nfunction getInstallsDir(): string {\n return join(getCannbotConfigDir(), \"installs\");\n}\n\nexport function getRecordPath(pluginId: string): string {\n return join(getInstallsDir(), `${pluginId}.json`);\n}\n\nexport function readRecord(pluginId: string): InstallRecord | null {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as InstallRecord;\n } catch {\n return null;\n }\n}\n\nexport function writeRecord(record: InstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n\n const recordPath = getRecordPath(record.pluginId);\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function deleteRecord(pluginId: string): void {\n const recordPath = getRecordPath(pluginId);\n if (existsSync(recordPath)) {\n unlinkSync(recordPath);\n }\n}\n\nexport function scanInstalledFiles(\n pluginId: string,\n displayName: string,\n tool: AITool,\n level: InstallLevel,\n installPath: string,\n configRoot: string,\n manifest: CannbotManifest | null\n): InstallRecord {\n const files: string[] = [];\n const directories: string[] = [];\n\n if (manifest) {\n const skillsDir = join(configRoot, \"skills\");\n if (existsSync(skillsDir)) {\n directories.push(skillsDir);\n for (const skillName of manifest.installed_skills || []) {\n const skillPath = join(skillsDir, skillName);\n if (existsSync(skillPath) || isSymlink(skillPath)) {\n files.push(skillPath);\n }\n }\n }\n\n const agentsDir = join(configRoot, \"agents\");\n if (existsSync(agentsDir)) {\n directories.push(agentsDir);\n for (const agentName of manifest.installed_agents || []) {\n const agentPath = join(agentsDir, agentName);\n const agentPathMd = join(agentsDir, agentName + \".md\");\n if (existsSync(agentPath) || isSymlink(agentPath)) {\n files.push(agentPath);\n } else if (existsSync(agentPathMd) || isSymlink(agentPathMd)) {\n files.push(agentPathMd);\n }\n }\n }\n }\n\n const workflowsLink = join(configRoot, \"workflows\");\n if (isSymlink(workflowsLink)) {\n files.push(workflowsLink);\n }\n\n const manifestPath = join(configRoot, \"cannbot-manifest.json\");\n if (existsSync(manifestPath)) {\n files.push(manifestPath);\n }\n\n const pluginManifestPath = join(configRoot, `${pluginId}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n files.push(pluginManifestPath);\n }\n\n const configFileName = tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n const configFilePath = level === \"project\"\n ? join(installPath, configFileName)\n : join(configRoot, configFileName);\n if (existsSync(configFilePath)) {\n files.push(configFilePath);\n }\n\n const repoLinks = [\"asc-devkit\", \"pypto\", \"tilelang-ascend\", \"cann-recipes-infer\", \"cann-samples\"];\n for (const repoName of repoLinks) {\n const repoLinkPath = join(installPath, repoName);\n if (isSymlink(repoLinkPath)) {\n files.push(repoLinkPath);\n }\n const repoLinkInConfig = join(configRoot, repoName);\n if (isSymlink(repoLinkInConfig)) {\n files.push(repoLinkInConfig);\n }\n }\n\n directories.push(configRoot);\n\n return {\n pluginId,\n displayName,\n tool,\n level,\n installPath,\n configRoot,\n installTime: new Date().toISOString(),\n files,\n directories,\n };\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n// === Skill-level install records ===\n\nexport interface SkillInstallEntry {\n skills: string[];\n installTime: string;\n}\n\nexport interface SkillInstallRecord {\n [tool: string]: {\n [level: string]: {\n [installPath: string]: SkillInstallEntry;\n };\n };\n}\n\nfunction getSkillRecordPath(): string {\n return join(getInstallsDir(), \"skills.json\");\n}\n\nexport function readSkillRecord(): SkillInstallRecord {\n const recordPath = getSkillRecordPath();\n if (!existsSync(recordPath)) {\n return {};\n }\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as SkillInstallRecord;\n } catch {\n return {};\n }\n}\n\nexport function writeSkillRecord(record: SkillInstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n const recordPath = getSkillRecordPath();\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function addSkillsToRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]) record[tool] = {};\n if (!record[tool][level]) record[tool][level] = {};\n if (!record[tool][level][installPath]) {\n record[tool][level][installPath] = { skills: [], installTime: \"\" };\n }\n const entry = record[tool][level][installPath];\n for (const id of skillIds) {\n if (!entry.skills.includes(id)) {\n entry.skills.push(id);\n }\n }\n entry.installTime = new Date().toISOString();\n writeSkillRecord(record);\n}\n\nexport function removeSkillsFromRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]?.[level]?.[installPath]) return;\n const entry = record[tool][level][installPath];\n entry.skills = entry.skills.filter((id) => !skillIds.includes(id));\n if (entry.skills.length === 0) {\n delete record[tool][level][installPath];\n if (Object.keys(record[tool][level]).length === 0) {\n delete record[tool][level];\n if (Object.keys(record[tool]).length === 0) {\n delete record[tool];\n }\n }\n }\n writeSkillRecord(record);\n}\n\nexport function getInstalledSkills(\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): string[] {\n const record = readSkillRecord();\n return record[tool]?.[level]?.[installPath]?.skills || [];\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, symlinkSync, unlinkSync, readdirSync, rmdirSync, realpathSync, lstatSync } from \"fs\";\nimport { join } from \"path\";\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getAllCategories, findSkill, getAllSkills } from \"./skill-registry.js\";\nimport { addSkillsToRecord, removeSkillsFromRecord, getInstalledSkills } from \"./record.js\";\nimport { selectTheme, checkboxTheme } from \"../ui/theme.js\";\n\nexport interface SkillInstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport interface SkillUninstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport async function installSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n): Promise<SkillInstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n const results: SkillInstallResult[] = [];\n const installedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const skill = findSkill(skillId);\n if (!skill) {\n results.push({ skillId, success: false, error: \"Skill not found in registry\" });\n continue;\n }\n\n const sourcePath = join(repoPath, skill.source, skill.id);\n const targetPath = join(skillsDir, skillId);\n\n if (!existsSync(sourcePath)) {\n results.push({ skillId, success: false, error: `Source not found: ${sourcePath}` });\n continue;\n }\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n }\n symlinkSync(realpathSync(sourcePath), targetPath);\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (installedIds.length > 0) {\n addSkillsToRecord(installedIds, tool, level, installPath);\n }\n\n return results;\n}\n\nexport async function uninstallSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel\n): Promise<SkillUninstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n const results: SkillUninstallResult[] = [];\n const removedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const targetPath = join(skillsDir, skillId);\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n results.push({ skillId, success: true });\n removedIds.push(skillId);\n logger.step(` 移除: ${skillId}`);\n } else {\n results.push({ skillId, success: false, error: \"Not installed\" });\n logger.warn(`${skillId} 未安装`);\n }\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (removedIds.length > 0) {\n removeSkillsFromRecord(removedIds, tool, level, installPath);\n }\n\n // Clean up empty skills directory\n if (existsSync(skillsDir)) {\n try {\n const entries = readdirSync(skillsDir);\n if (entries.length === 0) {\n rmdirSync(skillsDir);\n logger.step(` 清理空目录: skills/`);\n }\n } catch {\n // ignore\n }\n }\n\n // Clean up empty config root\n if (existsSync(configRoot)) {\n try {\n const entries = readdirSync(configRoot);\n if (entries.length === 0) {\n rmdirSync(configRoot);\n logger.step(` 清理空目录: ${configRoot.split(\"/\").pop()}/`);\n }\n } catch {\n // ignore\n }\n }\n\n return results;\n}\n\nexport async function interactiveSkillSelect(): Promise<string[] | \"back\" | \"cancel\"> {\n const BACK = \"__back__\";\n const CANCEL = \"__cancel__\";\n const categories = getAllCategories();\n\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n printBoxTitle(\"[3/4] 选择 Skill 类别\");\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n ...categories.map((cat) => ({\n name: `> ${cat.name} (${cat.skills.length} skills)`,\n value: cat.id,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n\n showOperationHints();\n selectedCategoryId = await select({\n message: t(\"skill_select_category\"),\n choices: categoryChoices,\n loop: false,\n theme: selectTheme,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n step = 1;\n break;\n }\n case 1: {\n const category = categories.find((c) => c.id === selectedCategoryId);\n if (!category) return [];\n\n printBoxTitle(`[4/4] 选择要安装的 Skills — ${category.name}`);\n\n const tools: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n const levels: InstallLevel[] = [\"project\", \"global\"];\n const installedSkills: string[] = [];\n for (const tk of tools) {\n for (const l of levels) {\n const path = l === \"project\" ? process.cwd() : getConfigRoot(tk, l);\n installedSkills.push(...getInstalledSkills(tk, l, path));\n }\n }\n const installedSet = new Set(installedSkills);\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean } | Separator> = category.skills.map((skill) => {\n const isInstalled = installedSet.has(skill.id);\n const suffix = isInstalled ? ` [${t(\"skill_already_installed\")}]` : \"\";\n return {\n name: `${skill.id}${suffix} — ${skill.description}`,\n value: skill.id,\n checked: false,\n };\n });\n skillChoices.push(new Separator(\"──────────────\"));\n skillChoices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK, checked: false });\n skillChoices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL, checked: false });\n\n showOperationHints(true);\n const selectedSkills = await checkbox({\n message: t(\"skill_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n });\n\n if (selectedSkills.includes(BACK)) { step = 0; break; }\n if (selectedSkills.includes(CANCEL)) return \"cancel\";\n\n const skillIds = selectedSkills.filter((v) => v !== BACK && v !== CANCEL);\n\n if (skillIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") { step = 0; break; }\n return \"cancel\";\n }\n\n return skillIds;\n }\n }\n }\n}\n\nexport function listAllSkills(): void {\n const categories = getAllCategories();\n\n console.log();\n console.log(chalk.bold(` ${t(\"skill_list_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(60)));\n\n for (const category of categories) {\n console.log();\n console.log(chalk.bold(` ${category.name}`) + chalk.dim(` (${category.skills.length} skills)`));\n\n const table = new Table({\n style: { head: [], border: [] },\n colWidths: [35, 45],\n wordWrap: true,\n });\n\n for (const skill of category.skills) {\n table.push([\n chalk.cyan(skill.id),\n skill.description,\n ]);\n }\n\n console.log(table.toString());\n }\n\n console.log();\n console.log(chalk.dim(` 共 ${getAllSkills().length} 个 Skills`));\n console.log();\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { PluginEntry, InstalledPlugin, AITool } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getToolDisplayName } from \"../core/detector.js\";\n\nexport function printPluginList(\n plugins: PluginEntry[],\n installed: Map<string, InstalledPlugin>\n): void {\n const table = new Table({\n head: [\n chalk.cyan(t(\"list_id\")),\n chalk.cyan(t(\"list_name\")),\n chalk.cyan(t(\"list_status\")),\n chalk.cyan(t(\"list_skills\")),\n chalk.cyan(t(\"list_agents\")),\n ],\n style: { head: [], border: [] },\n });\n\n plugins.forEach((plugin, index) => {\n const isInstalled = installed.has(plugin.id);\n const status = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`—`);\n\n table.push([\n String(index + 1),\n plugin.displayName,\n status,\n String(plugin.skills),\n String(plugin.agents),\n ]);\n });\n\n console.log();\n console.log(chalk.bold(` ${t(\"list_title\")} (${plugins.length} 个)`));\n console.log(table.toString());\n console.log();\n}\n\nexport function printInstallSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>\n): void {\n const successCount = results.filter((r) => r.success).length;\n const totalCount = results.length;\n\n console.log();\n console.log(\n chalk.bold(\n ` ${t(\"install_done\")}! ${successCount}/${totalCount} ${t(\"install_success\")}`\n )\n );\n console.log();\n\n for (const result of results) {\n if (result.success) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${result.displayName} (${result.skillsCount} skills, ${result.agentsCount} agents)`\n );\n } else {\n console.log(chalk.red(\" ✗\") + ` ${result.displayName}`);\n }\n }\n console.log();\n}\n\nexport function printEnhancedSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>,\n tool: AITool,\n configRoot: string\n): void {\n const successResults = results.filter((r) => r.success);\n const totalSkills = successResults.reduce((sum, r) => sum + r.skillsCount, 0);\n const totalAgents = successResults.reduce((sum, r) => sum + r.agentsCount, 0);\n\n if (successResults.length === 0) {\n return;\n }\n\n const toolName = getToolDisplayName(tool);\n const lines = [\n chalk.bold(` ${t(\"install_done\")}!`),\n \"\",\n ` ${chalk.dim(t(\"install_installed_to\") + \":\")} ${configRoot}`,\n ` ${chalk.dim(t(\"install_skills_count\") + \":\")} ${totalSkills} 个 ${chalk.dim(\"|\")} ${chalk.dim(t(\"install_agents_count\") + \":\")} ${totalAgents} 个`,\n \"\",\n chalk.bold(` ${t(\"install_enhanced_next_steps\")}:`),\n ` ${chalk.cyan(\"1.\")} ${t(\"install_enhanced_launch\")}: ${chalk.green(toolName.toLowerCase())}`,\n ` ${chalk.cyan(\"2.\")} ${t(\"install_enhanced_try\")}: ${chalk.green(\"帮我开发一个 Abs 算子\")}`,\n ` ${chalk.cyan(\"3.\")} ${t(\"install_enhanced_more\")}: ${chalk.green(\"install-helper list\")}`,\n ` ${chalk.cyan(\"4.\")} ${t(\"install_enhanced_check\")}: ${chalk.green(\"install-helper doctor\")}`,\n \"\",\n ];\n\n if (successResults.length === 1) {\n lines.push(\n ` ${chalk.dim(t(\"install_enhanced_docs\"))}: ${chalk.dim(`plugins-official/${successResults[0].pluginId}/quickstart.md`)}`\n );\n }\n\n console.log();\n for (const line of lines) {\n console.log(line);\n }\n console.log();\n}\n\nexport function printQuickStart(tool: string): void {\n console.log(chalk.bold(` ${t(\"quick_start\")}: ${tool}`));\n console.log(chalk.dim(` ${t(\"quick_start_hint\")}`));\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { printPluginList } from \"../ui/display.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\n\nexport async function listCommand(): Promise<void> {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n printPluginList(plugins, installedMap);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync, lstatSync, unlinkSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { detectTools, getToolDisplayName, getAllTools } from \"../core/detector.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { getConfigRoot, getSkillsDir, getAgentsDir, getConfigFileName } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool } from \"../types/index.js\";\n\nexport async function doctorCommand(options: { fix?: boolean } = {}): Promise<void> {\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n\n let errors = 0;\n let warnings = 0;\n let fixes = 0;\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_tools\")}`));\n const detectedTools = await detectTools();\n const allTools = getAllTools();\n\n for (const tool of allTools) {\n const detected = detectedTools.find((d) => d.name === tool);\n if (detected) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${getToolDisplayName(tool)}${detected.version ? ` v${detected.version}` : \"\"}`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${getToolDisplayName(tool)} — 未安装`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_plugins\")}`));\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n for (const plugin of plugins) {\n const inst = installedMap.get(plugin.id);\n if (inst) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${plugin.id.padEnd(30)} ${inst.skillsCount} skills, ${inst.agentsCount} agents`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${plugin.id.padEnd(30)} — 未安装`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_links\")}`));\n\n const primaryTool = detectedTools[0]?.name || \"opencode\";\n const configRoot = getConfigRoot(primaryTool, \"project\");\n\n const skillsDir = getSkillsDir(configRoot);\n const agentsDir = getAgentsDir(configRoot);\n\n if (existsSync(skillsDir)) {\n const brokenLinks = checkBrokenLinks(skillsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(skillsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${skillsDir} — ${count} 个软链接均有效`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${skillsDir} — ${brokenLinks} 个失效链接`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(skillsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: 已清理 ${fixed} 个失效链接`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${skillsDir} — 不存在`);\n if (options.fix) {\n mkdirSync(skillsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: 已创建 ${skillsDir}`);\n }\n }\n\n if (existsSync(agentsDir)) {\n const brokenLinks = checkBrokenLinks(agentsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(agentsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${agentsDir} — ${count} 个软链接均有效`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${agentsDir} — ${brokenLinks} 个失效链接`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(agentsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: 已清理 ${fixed} 个失效链接`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${agentsDir} — 不存在`);\n if (options.fix) {\n mkdirSync(agentsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: 已创建 ${agentsDir}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_config\")}`));\n const configFile = getConfigFileName(primaryTool);\n const configPath = join(process.cwd(), configFile);\n if (existsSync(configPath)) {\n console.log(chalk.green(\" ✓\") + ` ${configFile} 存在`);\n } else {\n console.log(chalk.dim(\" —\") + ` ${configFile} 不存在`);\n }\n\n console.log();\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n if (options.fix && fixes > 0) {\n console.log(\n ` ${t(\"doctor_result\")}: ${warnings} 个警告, ${errors} 个错误, ${fixes} 项已修复`\n );\n } else {\n console.log(\n ` ${t(\"doctor_result\")}: ${warnings} 个警告, ${errors} 个错误`\n );\n }\n console.log();\n}\n\nfunction checkBrokenLinks(dir: string): number {\n let broken = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n broken++;\n }\n }\n } catch {\n broken++;\n }\n }\n } catch {\n // ignore\n }\n return broken;\n}\n\nfunction fixBrokenLinks(dir: string): number {\n let fixed = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n unlinkSync(fullPath);\n fixed++;\n }\n }\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n return fixed;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function statusCommand(): Promise<void> {\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n console.log();\n console.log(chalk.bold(` ${t(\"status_title\")}`));\n console.log();\n\n if (installed.length === 0) {\n console.log(chalk.dim(` ${t(\"status_none\")}`));\n console.log(chalk.dim(` ${t(\"status_hint\")}`));\n console.log();\n return;\n }\n\n for (const inst of installed) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${inst.displayName}` +\n chalk.dim(` (${inst.tool}, ${inst.level})`)\n );\n console.log(\n chalk.dim(` ${inst.skillsCount} skills, ${inst.agentsCount} agents`)\n );\n console.log(chalk.dim(` ${inst.configRoot}`));\n console.log(chalk.dim(` ${t(\"status_install_time\")}: ${inst.installTime}`));\n console.log();\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { installSkills, interactiveSkillSelect, listAllSkills } from \"../core/skill-installer.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function installCommand(\n names: string[],\n options: { tool?: string; level?: string; yes?: boolean; list?: boolean }\n): Promise<void> {\n // Handle --list flag\n if (options.list) {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n listAllSkills();\n return;\n }\n\n // If no names provided, enter interactive skill selection\n if (names.length === 0) {\n // Scan repo for dynamic skill discovery\n const scanSpinner = createSpinner(\"正在加载 Skills 列表...\");\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(\"Skills 列表加载完成\");\n } catch {\n scanSpinner.warn(\"Skills 列表加载失败,将使用内置数据\");\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = options.tool as AITool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\") return;\n tool = detected;\n }\n\n let step = 1;\n while (true) {\n switch (step) {\n case 1: {\n const selectedSkills = await interactiveSkillSelect();\n if (selectedSkills === \"back\") {\n const redetected = await selectToolWithDetection();\n if (redetected === \"back\") return;\n tool = redetected;\n break;\n }\n if (selectedSkills.length === 0) {\n logger.info(\"未选择任何 Skill\");\n return;\n }\n names = selectedSkills;\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${chalk.bold(names.length)} 个 Skills...`);\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n const results = await installSkills(names, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n for (const result of results) {\n if (result.success) { logger.success(`${result.skillId}`); successCount++; }\n else { logger.error(`${result.skillId}: ${result.error}`); failCount++; }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n logger.info(`安装到: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`启动 ${chalk.green(tool)} 即可使用`);\n logger.blank();\n return;\n }\n }\n }\n }\n\n // Scan repo for dynamic skill/plugin discovery\n const scanSpinner = createSpinner(\"正在加载 Skills 列表...\");\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(\"Skills 列表加载完成\");\n } catch {\n scanSpinner.warn(\"Skills 列表加载失败,将使用内置数据\");\n }\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n // Not found\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n const allPlugins = getAllPlugins();\n logger.info(\"可用插件:\");\n for (const p of allPlugins) {\n logger.step(` ${p.id} (${p.aliases.join(\", \")})`);\n }\n logger.info(`可用 Skills: ${chalk.cyan(\"install-helper install --list\")}`);\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = options.tool as AITool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\") return;\n tool = detected;\n }\n\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n\n // Install plugins\n if (plugins.length > 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n const pluginsToInstall: string[] = [];\n const skippedPlugins: string[] = [];\n\n for (const pluginId of plugins) {\n if (installedSet.has(pluginId) && !options.yes) {\n const plugin = findPlugin(pluginId);\n const displayName = plugin?.displayName || pluginId;\n logger.warn(`${displayName} [${t(\"install_already_installed\")}]`);\n const shouldReinstall = await confirm({\n message: `${t(\"install_reinstall_confirm\")}?`,\n default: false,\n });\n if (shouldReinstall) {\n pluginsToInstall.push(pluginId);\n } else {\n skippedPlugins.push(pluginId);\n logger.info(`${displayName} ${t(\"install_skip\")}`);\n }\n } else {\n pluginsToInstall.push(pluginId);\n }\n }\n\n if (pluginsToInstall.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n const allPlugins = getAllPlugins();\n const results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath\n );\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n printEnhancedSummary(summary, tool, configRoot);\n }\n }\n\n // Install skills\n if (skills.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"install_cloning\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"install_repo_ready\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${chalk.bold(skills.length)} 个 Skills...`);\n\n const results = await installSkills(skills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n if (result.success) {\n logger.success(`${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n logger.info(`安装到: ${chalk.cyan(getConfigRoot(tool, level) + \"/skills/\")}`);\n logger.info(`启动 ${chalk.green(tool)} 即可使用`);\n logger.blank();\n }\n}\n\nasync function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n) {\n const results = [];\n const total = pluginIds.length;\n\n for (let i = 0; i < pluginIds.length; i++) {\n const pluginId = pluginIds[i];\n const progress = `[${i + 1}/${total}]`;\n const spinner = createSpinner(`${progress} ${t(\"install_progress\")} ${pluginId}...`);\n spinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n spinner.succeed(\n `${progress} ${pluginId} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n spinner.fail(`${progress} ${pluginId} — ${result.errors.join(\", \")}`);\n }\n\n results.push(result);\n }\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, unlinkSync, rmdirSync, readdirSync, lstatSync } from \"fs\";\nimport chalk from \"chalk\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { uninstallSkills } from \"../core/skill-installer.js\";\nimport { readRecord, deleteRecord } from \"../core/record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function uninstallCommand(\n names: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n const tool: AITool = (options.tool as AITool) || \"opencode\";\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n logger.error(`未找到: ${name}`);\n }\n\n // Uninstall plugins\n for (const pluginId of plugins) {\n const plugin = findPlugin(pluginId);\n if (!plugin) continue;\n\n const record = readRecord(plugin.id);\n if (!record) {\n logger.warn(`${plugin.displayName} 未找到安装记录,可能未安装或安装记录已损坏`);\n logger.info(`如需强制清理,请手动删除 .opencode/ 或 .claude/ 目录中的相关文件`);\n continue;\n }\n\n logger.info(`正在卸载 ${plugin.displayName}...`);\n\n let removedFiles = 0;\n let removedDirs = 0;\n\n for (const filePath of record.files) {\n try {\n if (existsSync(filePath) || isSymlink(filePath)) {\n unlinkSync(filePath);\n const name = filePath.split(\"/\").pop() || filePath;\n logger.step(` 移除: ${name}`);\n removedFiles++;\n }\n } catch {\n // ignore\n }\n }\n\n const sortedDirs = [...record.directories].sort((a, b) => b.length - a.length);\n for (const dirPath of sortedDirs) {\n try {\n if (existsSync(dirPath)) {\n const entries = readdirSync(dirPath);\n if (entries.length === 0) {\n rmdirSync(dirPath);\n const name = dirPath.split(\"/\").pop() || dirPath;\n logger.step(` 清理空目录: ${name}/`);\n removedDirs++;\n }\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id);\n removeInstalledPlugin(plugin.id);\n\n const totalRemoved = removedFiles + removedDirs;\n if (totalRemoved > 0) {\n logger.success(`已卸载 ${plugin.displayName}(移除 ${removedFiles} 个文件,${removedDirs} 个目录)`);\n } else {\n logger.warn(`${plugin.displayName} 的文件已不存在,已清理安装记录`);\n }\n }\n\n // Uninstall skills\n if (skills.length > 0) {\n logger.info(`正在卸载 ${skills.length} 个 Skills...`);\n\n const results = await uninstallSkills(skills, tool, level);\n\n let successCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n if (result.success) {\n successCount++;\n } else {\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_uninstall_done\")}: ${chalk.green(successCount + \" 成功\")}, ${failCount > 0 ? chalk.red(failCount + \" 失败\") : chalk.dim(failCount + \" 失败\")}`);\n logger.blank();\n }\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function updateCommand(\n pluginNames: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n let tool: AITool;\n if (options.tool) {\n tool = options.tool as AITool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\") return;\n tool = detected;\n }\n\n const level: InstallLevel = (options.level as InstallLevel) || \"project\";\n\n let pluginsToUpdate: string[] = [];\n\n if (pluginNames.length === 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n pluginsToUpdate = manifests.map((m) => m.team);\n if (pluginsToUpdate.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n logger.info(`使用 ${chalk.cyan(\"install-helper install <plugin>\")} 安装插件`);\n return;\n }\n } else {\n for (const name of pluginNames) {\n const plugin = findPlugin(name);\n if (!plugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n return;\n }\n pluginsToUpdate.push(plugin.id);\n }\n }\n\n const repoManager = createRepositoryManager();\n const updateSpinner = createSpinner(t(\"update_updating\") + \"...\");\n updateSpinner.start();\n\n await repoManager.updateRepo();\n const repoPath = repoManager.getRepoPath();\n await repoManager.ensureRepoAndScan();\n updateSpinner.succeed(t(\"install_repo_ready\"));\n\n const allPlugins = getAllPlugins();\n const results = [];\n const total = pluginsToUpdate.length;\n\n for (let i = 0; i < pluginsToUpdate.length; i++) {\n const pluginId = pluginsToUpdate[i];\n const plugin = allPlugins.find((p) => p.id === pluginId);\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"update_updating\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n logger.success(t(\"update_done\"));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function infoCommand(pluginName: string): Promise<void> {\n const plugin = findPlugin(pluginName);\n if (!plugin) {\n console.log(chalk.red(` ${t(\"info_not_found\")}: ${pluginName}`));\n return;\n }\n\n const installed = scanInstalled();\n const isInstalled = installed.some((p) => p.id === plugin.id);\n const statusText = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`— ${t(\"status_not_installed\")}`);\n\n console.log();\n console.log(chalk.bold(` ${plugin.displayName}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"info_description\") + \":\")} ${plugin.description}`);\n console.log(` ${chalk.dim(\"ID:\")} ${plugin.id}`);\n console.log(` ${chalk.dim(t(\"info_status\") + \":\")} ${statusText}`);\n console.log(` ${chalk.dim(t(\"info_skills\") + \":\")} ${plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${plugin.agents}`);\n console.log(` ${chalk.dim(\"别名:\")} ${plugin.aliases.join(\", \")}`);\n console.log();\n\n try {\n const repoManager = createRepositoryManager();\n const repoPath = await repoManager.ensureRepo();\n const quickstartPath = join(repoPath, plugin.dir, \"quickstart.md\");\n\n if (existsSync(quickstartPath)) {\n console.log(` ${chalk.dim(t(\"info_quickstart\") + \":\")} ${quickstartPath}`);\n }\n\n const agentsDir = join(repoPath, plugin.dir, \"agents\");\n if (existsSync(agentsDir)) {\n const agentFiles = readdirSync(agentsDir).filter((f: string) => f.endsWith(\".md\"));\n if (agentFiles.length > 0) {\n console.log();\n console.log(` ${chalk.bold(\"Agents:\")}`);\n for (const agent of agentFiles) {\n console.log(` • ${agent.replace(\".md\", \"\")}`);\n }\n }\n }\n } catch {\n // ignore if repo not available\n }\n\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { setLanguage, t } from \"../utils/i18n.js\";\n\nexport async function langCommand(\n action?: string,\n value?: string\n): Promise<void> {\n const config = readConfig();\n\n if (!action || action === \"show\") {\n console.log();\n console.log(chalk.bold(` ${t(\"lang_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"lang_current\") + \":\")} ${config.language}`);\n console.log();\n console.log(chalk.dim(\" 支持的语言: zh_CN, en_US\"));\n console.log(chalk.dim(\" 用法: install-helper lang set <language>\"));\n console.log();\n return;\n }\n\n if (action === \"set\") {\n if (!value) {\n console.log(chalk.red(\" 请指定语言: install-helper lang set zh_CN\"));\n return;\n }\n\n if (value !== \"zh_CN\" && value !== \"en_US\") {\n console.log(chalk.red(` ${t(\"lang_invalid\")}`));\n return;\n }\n\n updateConfig({ language: value });\n setLanguage(value);\n console.log();\n console.log(chalk.green(` ✓ ${t(\"lang_set\")} ${value}`));\n console.log();\n return;\n }\n\n console.log(chalk.red(` 未知操作: ${action}`));\n console.log(chalk.dim(\" 支持的操作: show, set\"));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createCLI } from \"./cli.js\";\n\nprocess.on(\"uncaughtException\", (error: any) => {\n if (error.name === \"ExitPromptError\") {\n console.log(\"\\n已取消安装\");\n process.exit(0);\n }\n throw error;\n});\n\nconst program = createCLI();\nprogram.parse();\n"],"mappings":"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","names":["select","Separator","chalk","chalk","existsSync","homedir","join","homedir","existsSync","join","existsSync","join","existsSync","join","existsSync","readFileSync","join","homedir","choices","result","chalk","existsSync","mkdirSync","join","execa","existsSync","readFileSync","writeFileSync","mkdirSync","join","execa","existsSync","join","mkdirSync","existsSync","join","execa","existsSync","mkdirSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","join","existsSync","execa","existsSync","mkdirSync","unlinkSync","readdirSync","lstatSync","join","select","checkbox","Separator","chalk","join","existsSync","mkdirSync","isSymlink","unlinkSync","readdirSync","BACK","CANCEL","Separator","select","checkbox","chalk","lstatSync","chalk","Table","Table","chalk","existsSync","readFileSync","join","BACK","CANCEL","existsSync","join","readFileSync","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","join","chalk","existsSync","readdirSync","mkdirSync","join","lstatSync","unlinkSync","chalk","chalk","chalk","scanSpinner","tool","level","existsSync","unlinkSync","rmdirSync","readdirSync","lstatSync","chalk","existsSync","isSymlink","unlinkSync","readdirSync","rmdirSync","chalk","lstatSync","chalk","chalk","existsSync","readdirSync","join","chalk","join","existsSync","readdirSync","chalk","chalk","program"]}
|