@cannbot-ai/install-helper 1.1.6 → 1.1.7

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/fs-helpers.ts","../src/embedded-plugins.json","../src/core/registry.ts","../src/locales/zh_CN.json","../src/locales/en_US.json","../src/utils/i18n.ts","../src/utils/paths.ts","../src/core/detector.ts","../src/core/manifest.ts","../src/ui/theme.ts","../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/config.ts","../src/utils/constants.ts","../src/ui/wizard.ts","../src/cli.ts","../src/commands/init.ts","../src/core/repository.ts","../src/core/scanner.ts","../src/core/skill-registry.ts","../src/core/metadata-sync.ts","../src/core/installer.ts","../src/core/record.ts","../src/core/backup.ts","../src/ui/backup-prompts.ts","../src/core/plugin-installer.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 { lstatSync, statSync, unlinkSync, rmSync } from \"fs\";\n\nexport function isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nexport function isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function removePath(p: string): void {\n try {\n const stat = lstatSync(p);\n if (stat.isDirectory()) {\n rmSync(p, { recursive: true, force: true });\n } else {\n unlinkSync(p);\n }\n } catch {\n // path doesn't exist, nothing to remove\n }\n}\n","[\n {\n \"id\": \"ops-direct-invoke\",\n \"dir\": \"plugins-official/ops-direct-invoke\",\n \"displayName\": \"AscendC Kernel 直调\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"ops-direct\",\n \"ascendc-direct\",\n \"direct\",\n \"kernel\"\n ],\n \"skills\": 20,\n \"agents\": 4,\n \"description\": \"Ascend C 直调全流程:环境→设计→开发→审查→性能验收\",\n \"version\": \"1.2.4\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-tiling-design\",\n \"npu-arch\",\n \"ascendc-api-best-practices\",\n \"ascendc-regbase-best-practice\",\n \"ascendc-blaze-best-practice\",\n \"ops-precision-standard\",\n \"ascendc-docs-search\",\n \"ascendc-env-check\",\n \"ascendc-precision-debug\",\n \"ops-profiling\",\n \"ascendc-direct-invoke-template\",\n \"torch-ascendc-op-extension\",\n \"ascendc-runtime-debug\",\n \"ascendc-crash-debug\",\n \"ascendc-code-review\",\n \"ascendc-mc2-best-practice\"\n ]\n },\n {\n \"dir\": \"infra\",\n \"skills\": [\n \"gitcode-toolkit\",\n \"gitcode-pr-handler\",\n \"gitcode-issue-gen\",\n \"gitcode-issue-handler\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-kernel-architect\",\n \"ascendc-kernel-design-reviewer\",\n \"ascendc-kernel-developer\",\n \"ascendc-kernel-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/ops-direct-invoke/asc-devkit\",\n \"configRootLink\": false\n }\n ]\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\": [\n \"flash\",\n \"kernel-flash\"\n ],\n \"skills\": 7,\n \"agents\": 1,\n \"description\": \"从数学公式或代码片段快速构建并验证 Ascend NPU 核函数\",\n \"version\": \"1.2.2\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"plugins-official/ops-direct-invoke-flash/skills\",\n \"skills\": [\n \"ops-direct-invoke-flash\"\n ]\n },\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-st-design\",\n \"ascendc-whitebox-design\"\n ]\n },\n {\n \"dir\": \"infra\",\n \"skills\": [\n \"gitcode-toolkit\",\n \"gitcode-pr-handler\",\n \"gitcode-issue-gen\",\n \"gitcode-issue-handler\"\n ]\n }\n ],\n \"installAgents\": [\n \"ops-direct-invoke-flash-reviewer\"\n ]\n },\n {\n \"id\": \"ops-registry-invoke\",\n \"dir\": \"plugins-official/ops-registry-invoke\",\n \"displayName\": \"AscendC 算子注册调用\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"ops-registry\",\n \"ascendc-registry\",\n \"registry\"\n ],\n \"skills\": 28,\n \"agents\": 3,\n \"description\": \"生产级 ACLNN 注册算子全流程:代码→UT/ST→上库\",\n \"version\": \"1.2.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-blaze-best-practice\",\n \"ascendc-api-best-practices\",\n \"ascendc-code-review\",\n \"ascendc-crash-debug\",\n \"ascendc-direct-invoke-template\",\n \"ascendc-docs-gen\",\n \"ascendc-docs-search\",\n \"ascendc-env-check\",\n \"npu-arch\",\n \"ascendc-performance-best-practices\",\n \"ascendc-precision-debug\",\n \"ascendc-regbase-best-practice\",\n \"ascendc-registry-invoke-template\",\n \"ascendc-runtime-debug\",\n \"ascendc-st-design\",\n \"ascendc-tiling-design\",\n \"ascendc-ut-develop\",\n \"ascendc-whitebox-design\",\n \"ops-precision-standard\",\n \"ops-profiling\",\n \"ops-spec-gen\",\n \"ascendc-perf-optimize\",\n \"ops-simulator\"\n ]\n },\n {\n \"dir\": \"infra\",\n \"skills\": [\n \"gitcode-toolkit\",\n \"gitcode-pr-handler\",\n \"gitcode-issue-gen\",\n \"gitcode-issue-handler\"\n ]\n },\n {\n \"dir\": \"plugins-official/ops-registry-invoke\",\n \"skills\": [\n {\n \"name\": \"workflow\",\n \"as\": \"ops-registry-invoke-workflow\"\n }\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-ops-architect\",\n \"ascendc-ops-developer\",\n \"ascendc-ops-tester\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/ops-registry-invoke/asc-devkit\",\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"catlass-op-generator\",\n \"dir\": \"plugins-official/catlass-op-generator\",\n \"displayName\": \"Catlass 算子直调\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"catlass\"\n ],\n \"skills\": 14,\n \"agents\": 3,\n \"description\": \"Catlass 模板拼装 GEMM/Matmul/Epilogue 算子开发\",\n \"version\": \"1.0.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"catlass-op-design\",\n \"catlass-op-develop\",\n \"catlass-op-perf-tune\",\n \"ascendc-tiling-design\",\n \"npu-arch\",\n \"ascendc-api-best-practices\",\n \"ops-precision-standard\",\n \"ascendc-docs-search\",\n \"ascendc-env-check\",\n \"ascendc-precision-debug\",\n \"ops-profiling\",\n \"ascendc-runtime-debug\",\n \"ascendc-code-review\",\n \"torch-ascendc-op-extension\"\n ]\n }\n ],\n \"installAgents\": [\n \"catlass-op-architect\",\n \"catlass-op-generator\",\n \"catlass-op-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/catlass-op-generator/asc-devkit\",\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"model-infer-sota-approach\",\n \"dir\": \"plugins-official/model-infer-sota-approach\",\n \"displayName\": \"NPU 推理 SOTA 优化\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"sota\",\n \"sota-approach\",\n \"model-infer-sota\"\n ],\n \"skills\": 14,\n \"agents\": 6,\n \"description\": \"NPU 推理 baseline 之上 profiling 驱动的探索式优化编排(Plan/round 自循环,与 model-infer-optimize 前后衔接)\",\n \"version\": \"1.0.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"model\",\n \"skills\": [\n \"model-infer-migrator\",\n \"model-infer-parallel-analysis\",\n \"model-infer-parallel-impl\",\n \"model-infer-kvcache\",\n \"model-infer-fusion\",\n \"model-infer-quantization\",\n \"model-infer-graph-mode\",\n \"model-infer-precision-debug\",\n \"model-infer-runtime-debug\",\n \"model-infer-multi-stream\",\n \"model-infer-prefetch\",\n \"model-infer-superkernel\",\n \"model-infer-profiling\",\n \"model-infer-perf-breakdown\"\n ]\n }\n ],\n \"installAgents\": [\n \"model-infer-sota-scenario\",\n \"model-infer-sota-profiling-instrumenter\",\n \"model-infer-sota-profile-analyzer\",\n \"model-infer-sota-candidate\",\n \"model-infer-sota-implementer\",\n \"model-infer-sota-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/cann-recipes-infer.git\",\n \"dir\": \"plugins-official/model-infer-sota-approach/cann-recipes-infer\",\n \"depth\": 1,\n \"configRootLink\": true\n }\n ]\n },\n {\n \"id\": \"model-infer-optimize\",\n \"dir\": \"plugins-official/model-infer-optimize\",\n \"displayName\": \"NPU 推理优化\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"model-infer\",\n \"infer\",\n \"inference\"\n ],\n \"skills\": 14,\n \"agents\": 3,\n \"description\": \"NPU 模型推理端到端优化(并行/KVCache/融合/量化/图模式/多流/SuperKernel)\",\n \"version\": \"1.0.5\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"model\",\n \"skills\": [\n \"model-infer-migrator\",\n \"model-infer-parallel-analysis\",\n \"model-infer-parallel-impl\",\n \"model-infer-kvcache\",\n \"model-infer-fusion\",\n \"model-infer-quantization\",\n \"model-infer-graph-mode\",\n \"model-infer-precision-debug\",\n \"model-infer-runtime-debug\",\n \"model-infer-multi-stream\",\n \"model-infer-prefetch\",\n \"model-infer-superkernel\",\n \"model-infer-profiling\",\n \"model-infer-perf-breakdown\"\n ]\n }\n ],\n \"installAgents\": [\n \"model-infer-analyzer\",\n \"model-infer-implementer\",\n \"model-infer-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/cann-recipes-infer.git\",\n \"dir\": \"plugins-official/model-infer-optimize/cann-recipes-infer\",\n \"depth\": 1,\n \"configRootLink\": true\n }\n ]\n },\n {\n \"id\": \"pypto-op-orchestrator\",\n \"dir\": \"plugins-official/pypto-op-orchestrator\",\n \"displayName\": \"PyPTO 算子开发\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"pypto\",\n \"pytorch\"\n ],\n \"skills\": 8,\n \"agents\": 3,\n \"description\": \"PyPTO Python API 算子全流程开发,覆盖需求理解、API 探索、实现与调优\",\n \"version\": \"1.1.9\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"pypto-intent-understand\",\n \"pypto-api-explore\",\n \"pypto-op-design\",\n \"pypto-op-develop\",\n \"pypto-precision-debug\",\n \"pypto-precision-compare\",\n \"pypto-op-perf-tune\",\n \"pypto-golden-generate\"\n ]\n }\n ],\n \"installAgents\": [\n \"pypto-op-analyst\",\n \"pypto-op-developer\",\n \"pypto-op-perf-tuner\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/pypto.git\",\n \"dir\": \"plugins-official/pypto-op-orchestrator/pypto\",\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"tilelang-op-orchestrator\",\n \"dir\": \"plugins-official/tilelang-op-orchestrator\",\n \"displayName\": \"TileLang 算子开发\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"tilelang\"\n ],\n \"skills\": 9,\n \"agents\": 3,\n \"description\": \"TileLang Python DSL + @tilelang.jit 算子开发(支持 Developer/Expert 双模式)\",\n \"version\": \"1.1.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"tilelang-api-best-practices\",\n \"tilelang-env-check\",\n \"tilelang-op-design\",\n \"tilelang-op-develop\",\n \"tilelang-op-test-design\",\n \"tilelang-perf-optimization\",\n \"tilelang-programming-model-guide\",\n \"tilelang-review\",\n \"tilelang-submodule-pull\"\n ]\n }\n ],\n \"installAgents\": [\n \"tilelang-op-analyst\",\n \"tilelang-op-developer\",\n \"tilelang-op-perf-tuner\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://github.com/tile-ai/tilelang-ascend.git\",\n \"dir\": \"plugins-official/tilelang-op-orchestrator/tilelang-ascend\",\n \"depth\": 1,\n \"recursive\": true,\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"triton-op-generator\",\n \"dir\": \"plugins-official/triton-op-generator\",\n \"displayName\": \"Triton 算子开发\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"triton\"\n ],\n \"skills\": 7,\n \"agents\": 0,\n \"description\": \"Triton-Ascend 算子 6 阶段自动生成与优化(描述→代码→验证→优化)\",\n \"version\": \"1.0.2\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"triton-task-extractor\",\n \"triton-op-designer\",\n \"triton-op-coding\",\n \"triton-op-verifier\",\n \"triton-latency-optimizer\",\n \"npu-arch\",\n \"triton-precision-debug\"\n ]\n }\n ],\n \"installAgents\": []\n },\n {\n \"id\": \"torch-compile\",\n \"dir\": \"plugins-official/torch-compile\",\n \"displayName\": \"torch.compile 图模式\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"torch\",\n \"compile\",\n \"graph\"\n ],\n \"skills\": 6,\n \"agents\": 1,\n \"description\": \"NPU 图模式 npugraph_ex 配置、脚本迁移、编译诊断与自定义算子入图\",\n \"version\": \"1.0.4\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"graph\",\n \"skills\": [\n \"torch-npugraph-ex-knowledge\",\n \"torch-npugraph-ex-template\",\n \"torch-npugraph-ex-dfx-triage\",\n \"torch-npugraph-ex-compile-error-diagnosis\",\n \"torch-npugraph-ex-runtime-error-diagnosis\",\n \"torch-custom-ops-guide\"\n ]\n }\n ],\n \"installAgents\": [\n \"torch-npugraph-ex\"\n ]\n },\n {\n \"id\": \"ops-code-reviewer\",\n \"dir\": \"plugins-official/ops-code-reviewer\",\n \"displayName\": \"代码检视\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"code-review\",\n \"reviewer\",\n \"review\"\n ],\n \"skills\": 5,\n \"agents\": 2,\n \"description\": \"Ascend C 算子代码 4 阶段全量检视(主 Agent 编排 + 子 Agent 并行检视)\",\n \"version\": \"1.1.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-code-review\",\n \"ascendc-docs-search\",\n \"ascendc-task-focus\",\n \"ascendc-api-best-practices\",\n \"npu-arch\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-code-summarizer\",\n \"ascendc-ops-reviewer\"\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 { readdirSync, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport type { PluginEntry } from \"../types/index.js\";\nimport { isDirectory } from \"../utils/fs-helpers.js\";\nimport embeddedPlugins from \"../embedded-plugins.json\" with { type: \"json\" };\n\nfunction loadPlugins(): PluginEntry[] {\n const plugins = [...embeddedPlugins] as PluginEntry[];\n plugins.sort((a, b) =>\n a.displayName < b.displayName ? -1 : a.displayName > b.displayName ? 1 : 0\n );\n return plugins;\n}\n\nexport let PLUGIN_REGISTRY: PluginEntry[] = loadPlugins();\n\nconst PLUGIN_DIRS = [\"plugins-official\", \"plugins-community\"];\n\nexport function mergeDynamicPlugins(repoPath: string): void {\n if (!existsSync(repoPath)) return;\n\n const existingIds = new Set(PLUGIN_REGISTRY.map((p) => p.id));\n const dynamic: PluginEntry[] = [];\n\n for (const pluginDir of PLUGIN_DIRS) {\n const parent = join(repoPath, pluginDir);\n if (!existsSync(parent)) continue;\n\n let entries: string[] = [];\n try {\n entries = readdirSync(parent);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const pluginPath = join(parent, entry);\n if (!isDirectory(pluginPath)) continue;\n if (entry === \"install-helper\") continue;\n\n const initSh = join(pluginPath, \"init.sh\");\n if (!existsSync(initSh)) continue;\n\n const pluginId = entry;\n if (existingIds.has(pluginId)) continue;\n\n dynamic.push({\n id: pluginId,\n dir: `${pluginDir}/${entry}`,\n displayName: entry,\n script: \"init.sh\",\n aliases: [],\n skills: 0,\n agents: 0,\n description: \"\",\n });\n existingIds.add(pluginId);\n }\n }\n\n if (dynamic.length > 0) {\n PLUGIN_REGISTRY = [...PLUGIN_REGISTRY, ...dynamic].sort((a, b) =>\n a.displayName < b.displayName ? -1 : a.displayName > b.displayName ? 1 : 0\n );\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 prefixMatches = PLUGIN_REGISTRY.filter((p) => p.id.startsWith(normalized));\n if (prefixMatches.length === 1) return prefixMatches[0];\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 \"wizard_title\": \"CANNBot Install Helper\",\n \"wizard_detect\": \"正在检测已安装的 AI 编程工具...\",\n \"wizard_select_tool\": \"选择 AI 编程工具\",\n \"wizard_select_level\": \"选择安装位置\",\n \"wizard_select_plugin\": \"选择要安装的插件\",\n \"wizard_confirm\": \"确认安装\",\n \"wizard_detected_tool\": \"检测到\",\n \"wizard_confirm_tool\": \"使用\",\n \"wizard_last_used\": \"上次使用\",\n \"wizard_already_installed\": \"已安装\",\n \"install_repo_ready\": \"仓库就绪\",\n \"install_progress\": \"正在安装\",\n \"install_done\": \"安装完成\",\n \"install_success\": \"成功\",\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_updating\": \"正在更新\",\n \"update_done\": \"更新完成\",\n \"update_no_plugins\": \"暂无已安装的插件\",\n \"update_skipped\": \"已跳过\",\n \"doctor_title\": \"CANNBot Doctor\",\n \"doctor_tools\": \"AI 工具\",\n \"doctor_plugins\": \"已安装插件\",\n \"doctor_links\": \"链接完整性\",\n \"doctor_config\": \"配置文件\",\n \"doctor_result\": \"结果\",\n \"doctor_fix_cleaning\": \"清理失效链接\",\n \"doctor_fix_rebuilding\": \"重建目录\",\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_description\": \"描述\",\n \"status_installed\": \"已装\",\n \"status_not_installed\": \"未装\",\n \"error_tool_not_found\": \"未检测到任何 AI 编程工具\",\n \"error_plugin_not_found\": \"未找到插件\",\n \"error_invalid_tool\": \"暂不支持的 AI 工具: {tool}\\n支持的工具: {tools}\",\n \"error_invalid_level\": \"暂不支持的安装级别: {level}\\n支持的级别: {levels}\",\n \"error_skill_not_found\": \"未在注册表中找到 Skill\",\n \"error_source_not_found\": \"未找到源文件: {path}\",\n \"error_script_not_found\": \"未找到安装脚本: {path}\",\n \"error_unknown\": \"未知错误\",\n \"error_not_installed\": \"未安装\",\n \"error_no_shell\": \"未找到 bash 或 sh,无法执行安装脚本。请安装 Git Bash 或 WSL\",\n \"error_symlink_windows\": \"创建符号链接失败,请以管理员身份运行或开启 Windows 开发者模式\",\n \"skill_select_category\": \"选择 Skill 类别\",\n \"skill_select_items\": \"选择要安装的 Skills\",\n \"skill_already_installed\": \"已安装\",\n \"skill_select_all\": \"全选所有 Skills(共 {count} 个)\",\n \"skill_select_all_category\": \"全选当前类别\",\n \"skill_continue_or_install\": \"已选 {count} 个 Skills,请选择操作\",\n \"skill_continue_select\": \"继续选择其他类别\",\n \"skill_confirm_install_count\": \"确认安装(已选 {count} 个 Skills)\",\n \"skill_all_install_progress\": \"正在安装全部 {count} 个 Skills...\",\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 \"lang_supported\": \"支持的语言: zh_CN, en_US\",\n \"lang_usage\": \"用法: install-helper lang set <language>\",\n \"lang_specify\": \"请指定语言: install-helper lang set zh_CN\",\n \"lang_unknown_action\": \"未知操作\",\n \"lang_supported_actions\": \"支持的操作: show, set\",\n \"info_aliases\": \"别名\",\n \"uninstall_not_found\": \"未找到\",\n \"uninstall_no_record\": \"未找到安装记录,可能未安装或安装记录已损坏\",\n \"uninstall_no_record_hint\": \"如需强制清理,请手动删除 .opencode/ 或 .claude/ 目录中的相关文件\",\n \"uninstall_in_progress\": \"正在卸载\",\n \"uninstall_summary_format\": \"{name}(移除 {files} 个文件,{dirs} 个目录)\",\n \"uninstall_files_gone\": \"的文件已不存在,已清理安装记录\",\n \"uninstall_skills_in_progress\": \"正在卸载\",\n \"init_pkg_dir_warn\": \"当前目录看起来是 install-helper 包目录\",\n \"init_pkg_dir_hint\": \"请在你的项目目录中运行此命令,而不是在 install-helper 安装目录中\",\n \"init_pkg_dir_example\": \"示例:cd ~/my-project && install-helper\",\n \"init_cancelled\": \"已取消安装\",\n \"backup_detected\": \"检测到当前目录已安装插件\",\n \"backup_current\": \"当前安装\",\n \"backup_installing\": \"即将安装\",\n \"backup_overwrite_warning\": \"继续安装将覆盖现有的 AGENTS.md 配置文件。\",\n \"backup_auto_create\": \"系统会自动创建备份,以便后续恢复。\",\n \"backup_overwrite\": \"覆盖安装(自动备份)\",\n \"backup_cancel\": \"取消安装\",\n \"backup_restore_prompt\": \"检测到备份配置,是否恢复?\",\n \"backup_restore\": \"恢复\",\n \"backup_only_uninstall\": \"仅卸载(不恢复)\",\n \"backup_select_action\": \"请选择操作\",\n \"backup_restore_success\": \"已恢复配置\",\n \"backup_created\": \"已创建备份\",\n \"backup_failed\": \"备份创建失败,安装已中止以保护现有配置\",\n \"loading_skills_list\": \"正在加载 Skills 列表...\",\n \"loading_skills_list_complete\": \"Skills 列表加载完成\",\n \"loading_plugin_data\": \"正在加载插件数据...\",\n \"loading_plugin_data_complete\": \"插件数据加载完成\",\n \"loading_skills_list_failed\": \"Skills 列表加载失败,将使用内置数据\",\n \"repo_pull_failed\": \"无法拉取最新内容,使用缓存数据\",\n \"repo_cloning\": \"首次使用,正在克隆 cannbot-skills 仓库...\",\n \"repo_clone_failed\": \"克隆仓库失败: {error}\\n请手动克隆: git clone {url} {dir}\",\n \"external_repo_update_failed\": \"外部仓库更新失败,使用现有版本: {dir}\",\n \"config_corrupted\": \"配置文件已损坏,使用默认配置\",\n \"record_corrupted\": \"安装记录已损坏:{file}\",\n \"skill_record_corrupted\": \"Skill 安装记录已损坏\",\n \"record_write_failed\": \"安装记录写入失败,卸载时可能无法自动清理\",\n \"install_config_failed\": \"配置文件安装失败: {error}\",\n \"install_clone_failed\": \"git clone 失败: {url},请手动克隆: git clone {url} {dir}\",\n \"install_link_config_failed\": \"链接 {name} 到配置目录失败\",\n \"install_link_project_failed\": \"链接 {name} 到项目目录失败\",\n \"install_link_workflows_failed\": \"链接 workflows 到配置目录失败\",\n \"install_skill_source_not_found\": \"Skill 源目录未找到: {dir}\",\n \"install_skill_not_found\": \"Skill 未找到: {name} (在 {dir})\",\n \"install_skill_failed\": \"Skill 安装失败: {name}\",\n \"install_agent_not_found\": \"Agent 未找到: {name}\",\n \"install_agent_failed\": \"Agent 安装失败: {name}\",\n \"install_no_skill_selected\": \"未选择任何 Skill\",\n \"install_to\": \"安装到\",\n \"start_to_use\": \"启动 {tool} 即可使用\",\n \"wizard_step_1_title\": \"[1/4] 选择 AI 编程工具\",\n \"wizard_step_2_title\": \"[2/4] 选择安装位置\",\n \"wizard_step_3_title\": \"[3/4] 选择要安装的插件\",\n \"wizard_step_4_title\": \"[4/4] 确认安装\",\n \"wizard_step_3_skill_title\": \"[3/4] 选择 Skill 类别\",\n \"wizard_step_4_skill_title\": \"[4/4] 选择要安装的 Skills — {category}\",\n \"install_level_project\": \"安装到当前目录(推荐,仅当前项目可用)\",\n \"install_level_global\": \"安装到全局(所有项目共享)\",\n \"wizard_select_mode_title\": \"选择安装类型\",\n \"skill_count_format\": \"{count} 个 Skills\",\n \"result_success_format\": \"{count} 成功\",\n \"result_failed_format\": \"{count} 失败\",\n \"uninstall_remove_label\": \"移除\",\n \"uninstall_clean_empty_dir\": \"清理空目录\",\n \"uninstall_skill_not_installed\": \"未安装\",\n \"available_plugins\": \"可用插件\",\n \"available_skills\": \"可用 Skills\",\n \"skill_total_count\": \"共 {count} 个 Skills\",\n \"wizard_confirm_install_format\": \"即将安装 {count} 个插件到 {tool}({level} 级别):\",\n \"wizard_install_path\": \"安装路径\",\n \"update_install_hint\": \"使用 {cmd} 安装插件\",\n \"hint_select_move\": \"移动\",\n \"hint_select_space\": \"空格\",\n \"hint_select_check\": \"勾选\",\n \"hint_select_confirm\": \"确认\",\n \"hint_checkbox_suffix\": \"不选按回车可返回\",\n \"doctor_not_installed\": \"未安装\",\n \"doctor_links_valid\": \"{count} 个软链接均有效\",\n \"doctor_broken_links\": \"{count} 个失效链接\",\n \"doctor_fixed\": \"已清理 {count} 个失效链接\",\n \"doctor_not_exist\": \"不存在\",\n \"doctor_created\": \"已创建 {path}\",\n \"doctor_config_exists\": \"存在\",\n \"doctor_config_not_exist\": \"不存在\",\n \"doctor_result_with_fix\": \"{warnings} 个警告, {fixes} 项已修复\",\n \"doctor_result_without_fix\": \"{warnings} 个警告\",\n \"count_suffix\": \"个\",\n \"try_prompt\": \"帮我开发一个 Abs 算子\",\n \"uninstall_interactive_title\": \"管理已安装的内容 — 勾选要卸载的项\",\n \"uninstall_select_type\": \"选择要卸载的类型\",\n \"uninstall_type_skill\": \"卸载 Skills\",\n \"uninstall_type_plugin\": \"卸载 Plugins\",\n \"uninstall_checkbox_hint\": \"勾选=保留,取消勾选=卸载\",\n \"uninstall_checkbox_hint_select\": \"勾选要卸载的项,不选按回车可返回\",\n \"uninstall_uncheck_all\": \"卸载全部\",\n \"uninstall_confirm_count\": \"确认卸载({count} 个将卸载)\",\n \"uninstall_no_installed\": \"没有已安装的 Skills 或 Plugins\",\n \"uninstall_no_installed_skills\": \"没有已安装的 Skills\",\n \"uninstall_no_installed_plugins\": \"没有已安装的 Plugins\",\n \"uninstall_nothing_to_uninstall\": \"没有需要卸载的项目\",\n \"uninstall_all_progress\": \"正在卸载全部 {count} 个 Skills...\",\n \"uninstall_all_summary\": \"即将卸载 {skills} 个 Skills 和 {plugins} 个 Plugins:\",\n \"uninstall_all_done\": \"批量卸载完成\",\n \"uninstall_recent_no_history\": \"无安装批次记录,无法识别最近安装的 Skills\",\n \"uninstall_recent_progress\": \"即将卸载最近安装的 {count} 个 Skills:\",\n \"uninstall_plugin_batch_progress\": \"正在批量卸载 {count} 个插件...\",\n \"uninstall_plugin_batch_skip_restore\": \"批量卸载模式:跳过备份恢复\",\n \"uninstall_confirm_prompt\": \"即将卸载 {count} 项,确认?\",\n \"uninstall_select_items\": \"管理已安装的 Skills(空格切换,回车确认)\",\n \"uninstall_select_plugins\": \"管理已安装的 Plugins(空格切换,回车确认)\",\n \"uninstall_select_category\": \"选择要管理的 Skill 类别\",\n \"uninstall_uncheck_all_category\": \"卸载本类别全部\",\n \"uninstall_continue_or_confirm\": \"已标记 {count} 个待卸载,请选择操作\",\n \"uninstall_marked_count\": \"已标记 {count} 个待卸载\",\n \"uninstall_uncategorized\": \"未分类\"\n}\n","{\n \"wizard_title\": \"CANNBot Install Helper\",\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_plugin\": \"Select a scenario 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_repo_ready\": \"Repository ready\",\n \"install_progress\": \"Installing\",\n \"install_done\": \"Installation complete\",\n \"install_success\": \"success\",\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_updating\": \"Updating\",\n \"update_done\": \"Update complete\",\n \"update_no_plugins\": \"No installed plugins\",\n \"update_skipped\": \"skipped\",\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_cleaning\": \"Cleaning broken links\",\n \"doctor_fix_rebuilding\": \"Rebuilding directories\",\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_description\": \"Description\",\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_invalid_tool\": \"Unsupported AI tool: {tool}\\nSupported tools: {tools}\",\n \"error_invalid_level\": \"Unsupported install level: {level}\\nSupported levels: {levels}\",\n \"error_skill_not_found\": \"Skill not found in registry\",\n \"error_source_not_found\": \"Source not found: {path}\",\n \"error_script_not_found\": \"Script not found: {path}\",\n \"error_unknown\": \"Unknown error\",\n \"error_not_installed\": \"Not installed\",\n \"error_no_shell\": \"bash or sh not found, cannot execute install script. Please install Git Bash or WSL\",\n \"error_symlink_windows\": \"Failed to create symlink, please run as administrator or enable Windows Developer Mode\",\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_select_all\": \"Select ALL Skills ({count} total)\",\n \"skill_select_all_category\": \"Select all in this category\",\n \"skill_continue_or_install\": \"{count} Skills selected, choose an action\",\n \"skill_continue_select\": \"Continue selecting from other categories\",\n \"skill_confirm_install_count\": \"Install now ({count} Skills selected)\",\n \"skill_all_install_progress\": \"Installing all {count} Skills...\",\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 \"lang_supported\": \"Supported languages: zh_CN, en_US\",\n \"lang_usage\": \"Usage: install-helper lang set <language>\",\n \"lang_specify\": \"Please specify language: install-helper lang set zh_CN\",\n \"lang_unknown_action\": \"Unknown action\",\n \"lang_supported_actions\": \"Supported actions: show, set\",\n \"info_aliases\": \"Aliases\",\n \"uninstall_not_found\": \"Not found\",\n \"uninstall_no_record\": \"No install record found, may not be installed or record is corrupted\",\n \"uninstall_no_record_hint\": \"For manual cleanup, delete related files in .opencode/ or .claude/ directory\",\n \"uninstall_in_progress\": \"Uninstalling\",\n \"uninstall_summary_format\": \"{name} (removed {files} files, {dirs} directories)\",\n \"uninstall_files_gone\": \" files no longer exist, install record cleaned\",\n \"uninstall_skills_in_progress\": \"Uninstalling\",\n \"init_pkg_dir_warn\": \"Current directory appears to be the install-helper package directory\",\n \"init_pkg_dir_hint\": \"Please run this command in your project directory, not in the install-helper package directory\",\n \"init_pkg_dir_example\": \"Example: cd ~/my-project && install-helper\",\n \"init_cancelled\": \"Installation cancelled\",\n \"backup_detected\": \"Plugin already installed in current directory\",\n \"backup_current\": \"Currently installed\",\n \"backup_installing\": \"About to install\",\n \"backup_overwrite_warning\": \"Continuing will overwrite existing AGENTS.md configuration.\",\n \"backup_auto_create\": \"System will automatically create backup for future restoration.\",\n \"backup_overwrite\": \"Overwrite (auto backup)\",\n \"backup_cancel\": \"Cancel installation\",\n \"backup_restore_prompt\": \"Backup configuration detected, restore?\",\n \"backup_restore\": \"Restore\",\n \"backup_only_uninstall\": \"Uninstall only (no restore)\",\n \"backup_select_action\": \"Please select an action\",\n \"backup_restore_success\": \"Configuration restored\",\n \"backup_created\": \"Backup created\",\n \"backup_failed\": \"Backup creation failed, installation aborted to protect existing config\",\n \"loading_skills_list\": \"Loading Skills list...\",\n \"loading_skills_list_complete\": \"Skills list loaded\",\n \"loading_plugin_data\": \"Loading plugin data...\",\n \"loading_plugin_data_complete\": \"Plugin data loaded\",\n \"loading_skills_list_failed\": \"Failed to load Skills list, using built-in data\",\n \"repo_pull_failed\": \"Failed to pull latest updates, using cached data\",\n \"repo_cloning\": \"First-time setup: cloning cannbot-skills repository...\",\n \"repo_clone_failed\": \"Failed to clone repository: {error}\\nClone manually: git clone {url} {dir}\",\n \"external_repo_update_failed\": \"External repo update failed, using existing version: {dir}\",\n \"config_corrupted\": \"Config file corrupted, using defaults\",\n \"record_corrupted\": \"Install record corrupted: {file}\",\n \"skill_record_corrupted\": \"Skill install record corrupted\",\n \"record_write_failed\": \"Install record write failed, uninstall may not work properly\",\n \"install_config_failed\": \"Failed to install config file: {error}\",\n \"install_clone_failed\": \"git clone failed: {url}, clone manually: git clone {url} {dir}\",\n \"install_link_config_failed\": \"Failed to link {name} to config directory\",\n \"install_link_project_failed\": \"Failed to link {name} to project directory\",\n \"install_link_workflows_failed\": \"Failed to link workflows to config directory\",\n \"install_skill_source_not_found\": \"Skill source not found: {dir}\",\n \"install_skill_not_found\": \"Skill not found: {name} in {dir}\",\n \"install_skill_failed\": \"Failed to install skill: {name}\",\n \"install_agent_not_found\": \"Agent not found: {name}\",\n \"install_agent_failed\": \"Failed to install agent: {name}\",\n \"install_no_skill_selected\": \"No Skill selected\",\n \"install_to\": \"Install to\",\n \"start_to_use\": \"Start {tool} to use\",\n \"wizard_step_1_title\": \"[1/4] Select AI coding tool\",\n \"wizard_step_2_title\": \"[2/4] Select installation location\",\n \"wizard_step_3_title\": \"[3/4] Select plugins to install\",\n \"wizard_step_4_title\": \"[4/4] Confirm installation\",\n \"wizard_step_3_skill_title\": \"[3/4] Select Skill category\",\n \"wizard_step_4_skill_title\": \"[4/4] Select Skills to install — {category}\",\n \"install_level_project\": \"Install to current directory (recommended, current project only)\",\n \"install_level_global\": \"Install globally (all projects)\",\n \"wizard_select_mode_title\": \"Select installation type\",\n \"skill_count_format\": \"{count} Skills\",\n \"result_success_format\": \"{count} succeeded\",\n \"result_failed_format\": \"{count} failed\",\n \"uninstall_remove_label\": \"Removed\",\n \"uninstall_clean_empty_dir\": \"Cleaned empty directory\",\n \"uninstall_skill_not_installed\": \"Not installed\",\n \"available_plugins\": \"Available plugins\",\n \"available_skills\": \"Available Skills\",\n \"skill_total_count\": \"Total {count} Skills\",\n \"wizard_confirm_install_format\": \"About to install {count} plugins to {tool} ({level} level):\",\n \"wizard_install_path\": \"Install path\",\n \"update_install_hint\": \"Use {cmd} to install plugins\",\n \"hint_select_move\": \"Navigate\",\n \"hint_select_space\": \"Space\",\n \"hint_select_check\": \"Toggle\",\n \"hint_select_confirm\": \"Confirm\",\n \"hint_checkbox_suffix\": \"Press enter without selection to go back\",\n \"doctor_not_installed\": \"Not installed\",\n \"doctor_links_valid\": \"{count} symlinks all valid\",\n \"doctor_broken_links\": \"{count} broken links\",\n \"doctor_fixed\": \"Cleaned {count} broken links\",\n \"doctor_not_exist\": \"Does not exist\",\n \"doctor_created\": \"Created {path}\",\n \"doctor_config_exists\": \"Exists\",\n \"doctor_config_not_exist\": \"Does not exist\",\n \"doctor_result_with_fix\": \"{warnings} warnings, {fixes} fixed\",\n \"doctor_result_without_fix\": \"{warnings} warnings\",\n \"count_suffix\": \"\",\n \"try_prompt\": \"help me develop an Abs operator\",\n \"uninstall_interactive_title\": \"Manage installed items — check to uninstall\",\n \"uninstall_select_type\": \"Select type to uninstall\",\n \"uninstall_type_skill\": \"Uninstall Skills\",\n \"uninstall_type_plugin\": \"Uninstall Plugins\",\n \"uninstall_checkbox_hint\": \"Checked = keep, unchecked = uninstall\",\n \"uninstall_checkbox_hint_select\": \"Check items to uninstall, press enter without selection to go back\",\n \"uninstall_uncheck_all\": \"Uninstall all\",\n \"uninstall_confirm_count\": \"Confirm uninstall ({count} will be removed)\",\n \"uninstall_no_installed\": \"No installed Skills or Plugins\",\n \"uninstall_no_installed_skills\": \"No installed Skills\",\n \"uninstall_no_installed_plugins\": \"No installed Plugins\",\n \"uninstall_nothing_to_uninstall\": \"Nothing to uninstall\",\n \"uninstall_all_progress\": \"Uninstalling all {count} Skills...\",\n \"uninstall_all_summary\": \"About to uninstall {skills} Skills and {plugins} Plugins:\",\n \"uninstall_all_done\": \"Batch uninstall complete\",\n \"uninstall_recent_no_history\": \"No install batch history, cannot identify recently installed Skills\",\n \"uninstall_recent_progress\": \"About to uninstall {count} recently installed Skills:\",\n \"uninstall_plugin_batch_progress\": \"Batch uninstalling {count} plugins...\",\n \"uninstall_plugin_batch_skip_restore\": \"Batch mode: skipping backup restore\",\n \"uninstall_confirm_prompt\": \"About to uninstall {count} items, confirm?\",\n \"uninstall_select_items\": \"Manage installed Skills (space to toggle, enter to confirm)\",\n \"uninstall_select_plugins\": \"Manage installed Plugins (space to toggle, enter to confirm)\",\n \"uninstall_select_category\": \"Select Skill category to manage\",\n \"uninstall_uncheck_all_category\": \"Uninstall all in this category\",\n \"uninstall_continue_or_confirm\": \"{count} marked for uninstall, choose an action\",\n \"uninstall_marked_count\": \"{count} marked for uninstall\",\n \"uninstall_uncategorized\": \"Uncategorized\"\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 { readFileSync, existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport zhCN from \"../locales/zh_CN.json\" with { type: \"json\" };\nimport enUS from \"../locales/en_US.json\" with { type: \"json\" };\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ntype Messages = Record<string, string>;\n\nconst EMBEDDED_LOCALES: Record<string, Messages> = {\n zh_CN: zhCN as Messages,\n en_US: enUS as Messages,\n};\n\nfunction loadLocale(locale: string): Messages {\n const embedded = EMBEDDED_LOCALES[locale];\n if (embedded) return embedded;\n\n const localePath = join(__dirname, \"locales\", `${locale}.json`);\n if (existsSync(localePath)) {\n try {\n const content = readFileSync(localePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n }\n }\n\n const fallbackPath = join(__dirname, \"locales\", \"zh_CN.json\");\n if (existsSync(fallbackPath)) {\n try {\n const content = readFileSync(fallbackPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n }\n }\n\n return EMBEDDED_LOCALES.zh_CN || {};\n}\n\nlet currentLang: \"zh_CN\" | \"en_US\" = \"zh_CN\";\nlet messages: Messages = loadLocale(\"zh_CN\");\n\nexport function setLanguage(lang: \"zh_CN\" | \"en_US\"): void {\n currentLang = lang;\n messages = loadLocale(lang);\n}\n\nexport function t(key: string): string {\n return messages[key] !== undefined ? messages[key] : key;\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\";\nimport { t } from \"./i18n.js\";\n\nexport const VALID_TOOLS: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\", \"codearts\"];\nconst VALID_LEVELS: InstallLevel[] = [\"project\", \"global\"];\n\nexport function validateTool(tool: string): AITool {\n if (!VALID_TOOLS.includes(tool as AITool)) {\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n return tool as AITool;\n}\n\nexport function validateLevel(level: string): InstallLevel {\n if (!VALID_LEVELS.includes(level as InstallLevel)) {\n throw new Error(\n t(\"error_invalid_level\")\n .replace(\"{level}\", level)\n .replace(\"{levels}\", VALID_LEVELS.join(\", \"))\n );\n }\n return level as InstallLevel;\n}\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 case \"codearts\":\n return join(home, \".codeartsdoer\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\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 case \"codearts\":\n return join(baseDir, \".codeartsdoer\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n}\n\nexport function getConfigFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function getAgentsFileName(tool: AITool): string {\n return getConfigFileName(tool);\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 { 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, VALID_TOOLS } 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 whichCmd = process.platform === \"win32\" ? \"where\" : \"which\";\n const result = await execa(whichCmd, [cmd], { timeout: 5000 });\n return result.stdout.trim().split(\"\\n\")[0];\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\nasync function detectCodeArts(): Promise<DetectedTool | undefined> {\n const home = homedir();\n const configDir = join(home, \".codeartsdoer\");\n if (existsSync(configDir)) {\n return { name: \"codearts\", path: configDir };\n }\n return undefined;\n}\n\nexport async function detectTools(): Promise<DetectedTool[]> {\n const detectors = [\n detectOpenCode,\n detectClaude,\n detectTrae,\n detectCursor,\n detectCopilot,\n detectCodeArts,\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 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 codearts: \"CodeArts\",\n };\n return names[tool];\n}\n\nexport function getAllTools(): AITool[] {\n return VALID_TOOLS;\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, getAgentsFileName, VALID_TOOLS } from \"../utils/paths.js\";\nimport { getAllPlugins } from \"./registry.js\";\nimport { isSymlink } from \"../utils/fs-helpers.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[] = VALID_TOOLS;\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 // 验证实际文件是否存在\n if (!verifyPluginFilesExist(configRoot, manifest, tool, level)) {\n continue;\n }\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\nfunction verifyPluginFilesExist(configRoot: string, manifest: CannbotManifest, tool: AITool, level: InstallLevel): boolean {\n const skillsDir = join(configRoot, \"skills\");\n const agentsDir = join(configRoot, \"agents\");\n \n let hasAnyComponent = false;\n \n // 验证 skills\n if (manifest.installed_skills && manifest.installed_skills.length > 0) {\n const hasAnySkill = manifest.installed_skills.some((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\n });\n if (hasAnySkill) hasAnyComponent = true;\n }\n \n // 验证 agents\n if (manifest.installed_agents && manifest.installed_agents.length > 0) {\n const hasAnyAgent = manifest.installed_agents.some((agentId) => {\n const agentPath = join(agentsDir, agentId);\n const agentPathMd = join(agentsDir, agentId + \".md\");\n return existsSync(agentPath) || isSymlink(agentPath) ||\n existsSync(agentPathMd) || isSymlink(agentPathMd);\n });\n if (hasAnyAgent) hasAnyComponent = true;\n }\n \n // 验证配置文件(AGENTS.md / CLAUDE.md)\n const agentsFileName = getAgentsFileName(tool);\n const configFilePath = level === \"project\"\n ? join(configRoot, \"..\", agentsFileName)\n : join(configRoot, agentsFileName);\n if (existsSync(configFilePath) || isSymlink(configFilePath)) hasAnyComponent = true;\n \n // 验证 per-plugin manifest 文件\n const pluginManifestPath = join(configRoot, `${manifest.team}-manifest.json`);\n if (existsSync(pluginManifestPath)) hasAnyComponent = true;\n \n return hasAnyComponent;\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\";\n\nexport const selectTheme = {\n helpMode: \"never\" as const,\n};\n\nexport function isCJK(code: number): boolean {\n return (\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}\n\nfunction isEmoji(code: number): boolean {\n return (\n (code >= 0x1F300 && code <= 0x1FAFF) ||\n (code >= 0x2600 && code <= 0x27BF)\n );\n}\n\nexport function getDisplayWidth(str: string): number {\n let width = 0;\n for (const ch of str) {\n const code = ch.codePointAt(0)!;\n if (isCJK(code) || isEmoji(code)) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nfunction wrapDescription(text: string): string {\n const prefix = \" 💡 \";\n const indent = \" \";\n const cols = process.stdout.columns || 120;\n const maxLen = Math.max(20, cols - getDisplayWidth(prefix) - 2);\n\n const tokens: { text: string; width: number }[] = [];\n let i = 0;\n while (i < text.length) {\n const code = text[i].codePointAt(0)!;\n if (isCJK(code)) {\n tokens.push({ text: text[i], width: 2 });\n i++;\n } else {\n let j = i;\n while (j < text.length) {\n const c = text[j].codePointAt(0)!;\n if (isCJK(c)) break;\n j++;\n }\n const word = text.slice(i, j);\n tokens.push({ text: word, width: getDisplayWidth(word) });\n i = j;\n }\n }\n\n const lines: string[] = [];\n let line = \"\";\n let lineWidth = 0;\n for (const token of tokens) {\n if (lineWidth + token.width > maxLen && line) {\n lines.push(line.trimEnd());\n line = token.text;\n lineWidth = token.width;\n } else {\n line += token.text;\n lineWidth += token.width;\n }\n }\n if (line) lines.push(line.trimEnd());\n\n return lines\n .map((l, i) => chalk.cyan(i === 0 ? prefix + l : indent + l))\n .join(\"\\n\");\n}\n\nexport const checkboxTheme = {\n icon: {\n checked: \"\\x1b[32m☑\\x1b[22m\",\n unchecked: \"☐\",\n cursor: \"❯\",\n },\n helpMode: \"never\" as const,\n style: {\n description: (text: string) => wrapDescription(text),\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 ora, { type Ora } from \"ora\";\nimport { t } from \"./i18n.js\";\nimport { getDisplayWidth } from \"../ui/theme.js\";\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\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 ${t(\"hint_select_move\")} | \\x1b[36m${t(\"hint_select_space\")}\\x1b[0m ${t(\"hint_select_check\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}(${t(\"hint_checkbox_suffix\")})\\n`);\n } else {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m ${t(\"hint_select_move\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}\\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 { writeFileSync, renameSync, existsSync, unlinkSync } from \"fs\";\nimport { dirname } from \"path\";\n\nexport function atomicWriteFileSync(filePath: string, data: string, encoding: BufferEncoding = \"utf-8\"): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n throw new Error(`Directory does not exist: ${dir}`);\n }\n\n const tmpPath = `${filePath}.tmp`;\n writeFileSync(tmpPath, data, encoding);\n try {\n renameSync(tmpPath, filePath);\n } catch (e) {\n try { unlinkSync(tmpPath); } catch {}\n throw e;\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 { existsSync, mkdirSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { parse, stringify } from \"yaml\";\nimport type { AppConfig } from \"../types/index.js\";\nimport { atomicWriteFileSync } from \"./fs.js\";\nimport { logger } from \"./logger.js\";\nimport { t } from \"./i18n.js\";\nimport { getCannbotConfigDir } from \"./paths.js\";\n\nexport function getConfigDir(): string {\n return getCannbotConfigDir();\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 logger.warn(t(\"config_corrupted\"));\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 atomicWriteFileSync(configPath, content);\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 BACK = \"__back__\";\nexport const CANCEL = \"__cancel__\";\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 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, VALID_TOOLS } 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 } from \"./theme.js\";\nimport { BACK, CANCEL } from \"../utils/constants.js\";\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) {\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(t(\"wizard_step_1_title\"));\n\n if (detectedTools.length === 0) {\n logger.error(t(\"error_tool_not_found\"));\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...VALID_TOOLS.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 ...VALID_TOOLS.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(t(\"wizard_step_2_title\"));\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> project — ${t(\"install_level_project\")}`, value: \"project\" },\n { name: `> global — ${t(\"install_level_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(t(\"wizard_step_3_title\"));\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; description?: string } | Separator> = plugins.map((p) => {\n const isInstalled = installedSet.has(p.id);\n const suffix = isInstalled ? ` [${t(\"wizard_already_installed\")}]` : \"\";\n return {\n name: `> ${chalk.cyan(p.displayName)}${suffix}`,\n value: p.id,\n description: p.description,\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 selected = await select({\n message: t(\"wizard_select_plugin\"),\n choices,\n loop: false,\n theme: selectTheme,\n pageSize: 15,\n });\n\n if (selected === BACK) return BACK;\n if (selected === CANCEL) return CANCEL;\n return [selected];\n}\n\nasync function stepConfirm(\n tool: AITool,\n level: InstallLevel,\n plugins: string[]\n): Promise<true | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_4_title\"));\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(t(\"wizard_confirm_install_format\").replace(\"{count}\", chalk.bold(String(plugins.length))).replace(\"{tool}\", chalk.green(toolName)).replace(\"{level}\", chalk.cyan(levelText)));\n logger.info(`${t(\"wizard_install_path\")}: ${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 { 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\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\ndeclare const INSTALL_HELPER_VERSION: string | undefined;\n\nfunction readVersion(): string {\n try {\n if (typeof INSTALL_HELPER_VERSION !== \"undefined\" && INSTALL_HELPER_VERSION) {\n return INSTALL_HELPER_VERSION;\n }\n } catch {\n }\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const candidates = [\n join(__dirname, \"..\", \"package.json\"),\n join(__dirname, \"package.json\"),\n join(process.cwd(), \"package.json\"),\n ];\n for (const pkgPath of candidates) {\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n if (pkg.version && (pkg.name === \"@cannbot-ai/install-helper\" || pkg.name?.startsWith(\"@cannbot-ai/install-helper-\"))) {\n return pkg.version;\n }\n }\n }\n return \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\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(\"CANNBot Install Helper - Interactive installer for CANN operator development skills\")\n .version(readVersion());\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, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-a, --all\", \"Install ALL available skills\")\n .option(\"--list\", \"List all available skills by category\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; all?: 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, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-a, --all\", \"Uninstall ALL installed skills and plugins\")\n .option(\"--recent\", \"Uninstall the most recently installed skill batch\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; all?: boolean; recent?: boolean }) => {\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, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .action(async (plugins: string[], options: { tool?: string; level?: string; yes?: boolean }) => {\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, printBoxTitle, showOperationHints } 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 { BACK, CANCEL } from \"../utils/constants.js\";\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(t(\"init_pkg_dir_warn\"));\n logger.info(t(\"init_pkg_dir_hint\"));\n logger.info(t(\"init_pkg_dir_example\"));\n return;\n }\n\n printBanner(t(\"wizard_title\"));\n\n const spinner = createSpinner(t(\"loading_skills_list\"));\n spinner.start();\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n spinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n spinner.warn(t(\"loading_skills_list_failed\"));\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(t(\"wizard_select_mode_title\"));\n\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(t(\"init_cancelled\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return \"done\";\n }\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(t(\"init_cancelled\"));\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(t(\"init_cancelled\"));\n return \"done\";\n }\n level = result;\n step = 2;\n break;\n }\n case 2: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") { step = 1; break; }\n if (selectedSkills === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return \"done\";\n }\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(selectedSkills.length)))}...`);\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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(configRoot, \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", 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 { existsSync, mkdirSync, readFileSync, rmSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execa } from \"execa\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir, getCannbotRepoPath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport {\n scanSkills,\n getCurrentCommit,\n readScanCache,\n writeScanCache,\n} from \"./scanner.js\";\nimport { initFromScan } from \"./skill-registry.js\";\nimport { mergeDynamicPlugins } from \"./registry.js\";\nimport { enrichPluginMetadata } from \"./metadata-sync.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction loadRepoUrl(): string {\n if (process.env.CANNBOT_REPO_URL) {\n return process.env.CANNBOT_REPO_URL;\n }\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n return config.repository?.url || \"https://gitcode.com/cann/cannbot-skills.git\";\n } catch {\n return \"https://gitcode.com/cann/cannbot-skills.git\";\n }\n}\n\nconst REPO_URL = loadRepoUrl();\n\nexport class RepositoryManager {\n private repoPath: string | undefined;\n private customPath?: string;\n\n constructor(customPath?: string) {\n this.repoPath = customPath;\n this.customPath = 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 const clonedPath = await this.cloneRepo();\n return clonedPath;\n }\n\n async ensureRepoAndScan(): Promise<string> {\n const repoPath = await this.ensureRepo();\n\n const isUserProvided = !!this.customPath || !!process.env.CANNBOT_REPO_PATH;\n if (!isUserProvided) {\n await this.updateRepo();\n }\n mergeDynamicPlugins(repoPath);\n enrichPluginMetadata(repoPath);\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 logger.warn(t(\"repo_pull_failed\"));\n }\n mergeDynamicPlugins(repoPath);\n enrichPluginMetadata(repoPath);\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 rmSync(targetPath, { recursive: true, force: true });\n }\n\n try {\n logger.info(t(\"repo_cloning\"));\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 t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", REPO_URL)\n .replace(\"{dir}\", targetPath)\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, mkdirSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport { atomicWriteFileSync } from \"../utils/fs.js\";\nimport { isDirectory } from \"../utils/fs-helpers.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\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\nfunction loadScanConfig(): { skillDirs: string[]; pluginDirs: string[]; cacheTtlMs: number } {\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n const ttlHours = config.scanCacheTtlHours || 24;\n return {\n skillDirs: config.scanDirs || [\"ops\", \"model\", \"graph\", \"infra\", \"runtime\"],\n pluginDirs: config.pluginDirs || [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: ttlHours * 60 * 60 * 1000,\n };\n } catch {\n return {\n skillDirs: [\"ops\", \"model\", \"graph\", \"infra\", \"runtime\"],\n pluginDirs: [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: 24 * 60 * 60 * 1000,\n };\n }\n}\n\nconst scanConfig = loadScanConfig();\nconst SKILL_SCAN_DIRS = scanConfig.skillDirs;\nconst PLUGIN_SCAN_DIRS = scanConfig.pluginDirs;\n\nexport function getScanDirs(): string[] {\n return [...SKILL_SCAN_DIRS];\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 const rootSkillMd = join(pluginPath, \"SKILL.md\");\n const initSh = join(pluginPath, \"init.sh\");\n if (existsSync(rootSkillMd) && !existsSync(initSh)) {\n const frontmatter = parseFrontmatter(rootSkillMd);\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: `${pluginDir}/${plugin}`,\n filePath: rootSkillMd,\n });\n }\n }\n }\n }\n\n return skills;\n}\n\nfunction 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 const trimmedName = parsed.name.trim();\n if (!trimmedName || /[\\/\\\\]|\\.\\./.test(trimmedName) || !/^[a-zA-Z0-9._-]+$/.test(trimmedName)) {\n return null;\n }\n\n return {\n name: trimmedName,\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 > scanConfig.cacheTtlMs) 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 atomicWriteFileSync(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n }\n}\n\nfunction getCachePath(): string {\n return join(getCannbotConfigDir(), \"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 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 + \"/\" + entry, skills, seen);\n }\n}\n\nfunction safeReaddir(dir: string): string[] {\n try {\n return readdirSync(dir);\n } catch {\n return [];\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\";\nimport { t } from \"../utils/i18n.js\";\n\nexport interface SkillEntry {\n id: string;\n description: string;\n source: string;\n filePath?: string;\n}\n\nexport interface SkillCategory {\n id: string;\n name: string;\n skills: SkillEntry[];\n}\n\nconst CATEGORY_DEFS: { id: string; name: string; nameEn: string }[] = [\n { id: \"knowledge\", name: \"知识与参考\", nameEn: \"Knowledge & Reference\" },\n { id: \"env-tools\", name: \"环境与工具\", nameEn: \"Environment & Tools\" },\n { id: \"debug\", name: \"调试与诊断\", nameEn: \"Debug & Diagnostics\" },\n { id: \"testing\", name: \"测试与质量\", nameEn: \"Testing & Quality\" },\n { id: \"ascendc\", name: \"AscendC 开发\", nameEn: \"AscendC Development\" },\n { id: \"pypto\", name: \"PyPTO 开发\", nameEn: \"PyPTO Development\" },\n { id: \"tilelang\", name: \"TileLang 开发\", nameEn: \"TileLang Development\" },\n { id: \"triton\", name: \"Triton 开发\", nameEn: \"Triton Development\" },\n { id: \"model\", name: \"模型推理优化\", nameEn: \"Model Inference Optimization\" },\n { id: \"runtime\", name: \"Runtime 迁移\", nameEn: \"Runtime Migration\" },\n { id: \"graph\", name: \"图模式\", nameEn: \"Graph Mode\" },\n { id: \"platform\", name: \"平台工具\", nameEn: \"Platform Tools\" },\n { id: \"other\", name: \"其他 Skills\", nameEn: \"Other 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 filePath: s.filePath,\n }));\n initialized = true;\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 ],\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 { id: \"model-infer-harmony\", description: \"端侧鸿蒙 ASR 量化转换与打包\", source: \"model\" },\n { id: \"science-model-npu-migration\", description: \"NPU 代码级迁移(环境门禁/脚本适配/精度性能对比)\", source: \"plugins-community/science-model-npu-migration\", filePath: \"plugins-community/science-model-npu-migration/SKILL.md\" },\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: \"runtime\",\n name: \"Runtime 迁移\",\n skills: [\n { id: \"runtime_migration\", description: \"CUDA 应用迁移到 CANN 平台指南\", source: \"runtime\" },\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 getAllCategories(): SkillCategory[] {\n const skills = getActiveSkills();\n const isEn = t(\"list_name\") === \"Name\";\n return CATEGORY_DEFS.map((def) => ({\n id: def.id,\n name: isEn ? def.nameEn : 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, readFileSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport type { PluginEntry, PluginManifestSkillEntry, PluginManifestSkillSource } from \"../types/index.js\";\nimport { PLUGIN_REGISTRY } from \"./registry.js\";\nimport { getScanDirs } from \"./scanner.js\";\n\ninterface PluginJson {\n name?: string;\n version?: string;\n description?: string;\n agents?: string[];\n}\n\nfunction readPluginJson(pluginDir: string): PluginJson | null {\n const pjPath = join(pluginDir, \".claude-plugin\", \"plugin.json\");\n try {\n return JSON.parse(readFileSync(pjPath, \"utf-8\")) as PluginJson;\n } catch {\n return null;\n }\n}\n\nfunction parseIncludedSkills(pluginDir: string): string[] {\n const initPath = join(pluginDir, \"init.sh\");\n try {\n const text = readFileSync(initPath, \"utf-8\");\n const m = text.match(/INCLUDED_SKILLS=\"([^\"]*)\"/);\n if (!m) return [];\n return m[1].split(/\\s+/).filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction findSkillSourceDir(skillName: string, repoRoot: string, scanDirs: string[]): string | null {\n for (const dir of scanDirs) {\n const candidate = join(repoRoot, dir, skillName);\n if (existsSync(candidate) && statSync(candidate).isDirectory()) {\n return dir;\n }\n }\n return null;\n}\n\nfunction collectDeclaredSkillNames(\n installSkills: PluginManifestSkillSource[] | undefined\n): Set<string> {\n const set = new Set<string>();\n if (!installSkills) return set;\n for (const src of installSkills) {\n for (const sk of src.skills) {\n const name = typeof sk === \"string\" ? sk : sk.name;\n const as = typeof sk === \"string\" ? sk : (sk.as || sk.name);\n set.add(name);\n if (as !== name) set.add(as);\n }\n }\n return set;\n}\n\nfunction resolveAgentsFromPluginJson(pj: PluginJson | null): string[] {\n if (!pj || !Array.isArray(pj.agents)) return [];\n return pj.agents\n .map((a) => a.replace(/^\\.\\/agents\\//, \"\").replace(/\\.md$/, \"\"))\n .filter(Boolean);\n}\n\nfunction countSkills(installSkills: PluginManifestSkillSource[] | undefined): number {\n if (!installSkills) return 0;\n let n = 0;\n for (const src of installSkills) n += src.skills.length;\n return n;\n}\n\n/**\n * Merge init.sh INCLUDED_SKILLS into existing installSkills.\n * Existing skills (including `as` aliases) are preserved; init.sh-only skills\n * are appended to the matching source bucket (or a new bucket is created).\n */\nfunction mergeInitSkills(\n existing: PluginManifestSkillSource[] | undefined,\n pluginDir: string,\n repoRoot: string,\n scanDirs: string[]\n): PluginManifestSkillSource[] {\n const base = existing || [];\n const seen = collectDeclaredSkillNames(base);\n const initSkills = parseIncludedSkills(pluginDir);\n if (initSkills.length === 0) return base;\n\n const merged: PluginManifestSkillSource[] = base.map((s) => ({ ...s, skills: [...s.skills] }));\n\n for (const skill of initSkills) {\n if (seen.has(skill)) continue;\n const srcDir = findSkillSourceDir(skill, repoRoot, scanDirs);\n if (!srcDir) continue;\n let bucket = merged.find((b) => b.dir === srcDir);\n if (!bucket) {\n bucket = { dir: srcDir, skills: [] };\n merged.push(bucket);\n }\n bucket.skills.push(skill);\n seen.add(skill);\n }\n return merged;\n}\n\n/**\n * Enrich PLUGIN_REGISTRY in-place by reading the latest plugin.json and\n * init.sh INCLUDED_SKILLS from the freshly-pulled repository.\n *\n * Fields updated at runtime:\n * - version ← plugin.json version\n * - description ← plugin.json description (only if currently empty)\n * - displayName ← plugin.json name (only for dynamically discovered plugins with bare dir name)\n * - installAgents ← plugin.json agents (only if currently empty)\n * - installSkills ← existing + init.sh INCLUDED_SKILLS supplement\n * - skills / agents ← recomputed counts\n *\n * Fields NOT updated (require npm republish): aliases, externalRepos,\n * configRootConfigLink, configFile — these rarely change.\n */\nexport function enrichPluginMetadata(repoPath: string): void {\n const scanDirs = getScanDirs();\n\n for (const plugin of PLUGIN_REGISTRY) {\n const pluginDir = join(repoPath, plugin.dir);\n if (!existsSync(pluginDir)) continue;\n\n const pj = readPluginJson(pluginDir);\n\n // version: plugin.json overrides embedded hardcoded value\n if (pj && pj.version) {\n plugin.version = pj.version;\n }\n\n // description: fill from plugin.json if currently empty\n if ((!plugin.description || plugin.description === \"\") && pj && pj.description) {\n plugin.description = pj.description;\n }\n\n // displayName: for dynamically discovered plugins, upgrade from bare dir name\n if (pj && pj.name && (plugin.displayName === plugin.id)) {\n plugin.displayName = pj.name;\n }\n\n // installAgents: fill from plugin.json if currently empty\n if ((!plugin.installAgents || plugin.installAgents.length === 0)) {\n const agents = resolveAgentsFromPluginJson(pj);\n if (agents.length > 0) {\n plugin.installAgents = agents;\n }\n }\n\n // installSkills: merge init.sh INCLUDED_SKILLS into existing\n const merged = mergeInitSkills(plugin.installSkills, pluginDir, repoPath, scanDirs);\n plugin.installSkills = merged;\n\n // recompute counts\n plugin.skills = countSkills(merged);\n plugin.agents = plugin.installAgents ? plugin.installAgents.length : 0;\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 { existsSync } from \"fs\";\nimport { join, basename } from \"path\";\nimport { execa, execaSync } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult, BackupInfo } 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\";\nimport { detectCurrentPlugin, createBackup, getAgentsFileName } from \"./backup.js\";\nimport { showOverwriteWarning } from \"../ui/backup-prompts.js\";\nimport { installViaManifest } from \"./plugin-installer.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger } from \"../utils/logger.js\";\n\nfunction findShell(): string | null {\n const candidates = [\"bash\", \"sh\"];\n for (const cmd of candidates) {\n try {\n const detectCmd = process.platform === \"win32\" ? \"where\" : \"which\";\n execaSync(detectCmd, [cmd], { timeout: 3000 });\n return cmd;\n } catch {}\n }\n return null;\n}\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: [t(\"error_plugin_not_found\") + \": \" + opts.pluginId],\n warnings: [],\n };\n }\n\n const pluginDir = join(opts.repoPath, plugin.dir);\n const cwd = opts.installPath || process.cwd();\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n const agentsFile = join(configRoot, getAgentsFileName(opts.tool));\n let backupInfo: BackupInfo | null = null;\n\n if (existsSync(agentsFile)) {\n const currentPlugin = detectCurrentPlugin(configRoot, opts.tool, opts.installPath);\n\n if (currentPlugin && currentPlugin.pluginId !== opts.pluginId) {\n let choice: \"overwrite\" | \"cancel\" = \"overwrite\";\n \n if (!opts.yes) {\n choice = await showOverwriteWarning(\n currentPlugin.pluginName,\n plugin.displayName\n );\n }\n\n if (choice === \"cancel\") {\n logger.info(t(\"backup_cancel\"));\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"backup_cancel\")],\n warnings: [],\n };\n }\n }\n\n if (currentPlugin) {\n backupInfo = createBackup(\n configRoot,\n opts.tool,\n currentPlugin.pluginId,\n currentPlugin.pluginName\n );\n\n if (!backupInfo) {\n logger.error(t(\"backup_failed\"));\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"backup_failed\")],\n warnings: [],\n };\n }\n\n logger.success(`${t(\"backup_created\")}: ${backupInfo.filePath}`);\n }\n }\n\n if (plugin.installSkills && plugin.installSkills.length > 0) {\n const result = await installViaManifest(\n plugin,\n opts.repoPath,\n opts.tool,\n opts.level,\n opts.installPath\n );\n\n if (result.success) {\n try {\n const record = scanInstalledFiles(\n opts.pluginId,\n plugin.displayName,\n opts.tool,\n opts.level,\n cwd,\n configRoot,\n result.manifest,\n plugin.externalRepos?.map(r => basename(r.dir)),\n plugin.configRootConfigLink\n );\n \n if (backupInfo) {\n record.backup = {\n filePath: backupInfo.filePath,\n fromPluginId: backupInfo.pluginId,\n fromPluginName: backupInfo.pluginName,\n backupTime: backupInfo.backupTime,\n };\n }\n \n writeRecord(record);\n } catch {\n logger.warn(t(\"record_write_failed\"));\n }\n\n return {\n success: true,\n pluginId: opts.pluginId,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n errors: result.errors,\n warnings: [],\n };\n } else {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: result.errors,\n warnings: [],\n };\n }\n }\n\n const scriptPath = join(pluginDir, plugin.script);\n if (!existsSync(scriptPath)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_script_not_found\").replace(\"{path}\", scriptPath)],\n warnings: [],\n };\n }\n\n const args: string[] = [opts.level, opts.tool];\n if (opts.installPath) {\n args.push(opts.installPath);\n }\n\n try {\n const shell = findShell();\n if (!shell) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_no_shell\")],\n warnings: [],\n };\n }\n const execOptions: any = {\n cwd,\n timeout: 300000,\n stdio: \"pipe\",\n input: opts.yes ? \"y\\n\" : undefined,\n };\n \n await execa(shell, [scriptPath, ...args], execOptions);\n\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 plugin.externalRepos?.map(r => basename(r.dir)),\n plugin.configRootConfigLink\n );\n \n if (backupInfo) {\n record.backup = {\n filePath: backupInfo.filePath,\n fromPluginId: backupInfo.pluginId,\n fromPluginName: backupInfo.pluginName,\n backupTime: backupInfo.backupTime,\n };\n }\n \n writeRecord(record);\n } catch {\n logger.warn(t(\"record_write_failed\"));\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 : t(\"error_unknown\");\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [errorMessage],\n warnings: [],\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 { existsSync, mkdirSync, readFileSync, unlinkSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { getCannbotConfigDir, getConfigRoot } from \"../utils/paths.js\";\nimport { atomicWriteFileSync } from \"../utils/fs.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel, CannbotManifest, SkillBatchRecord } 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 backup?: {\n filePath: string;\n fromPluginId: string;\n fromPluginName: string;\n backupTime: string;\n };\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 logger.warn(t(\"record_corrupted\").replace(\"{file}\", recordPath));\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 atomicWriteFileSync(recordPath, JSON.stringify(record, null, 2));\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 externalRepoNames?: string[],\n configRootConfigLink?: boolean\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) || isSymlink(configFilePath)) {\n files.push(configFilePath);\n }\n\n if (level === \"project\" && configRootConfigLink !== false) {\n const configRootConfigPath = join(configRoot, configFileName);\n if (configRootConfigPath !== configFilePath && (existsSync(configRootConfigPath) || isSymlink(configRootConfigPath))) {\n files.push(configRootConfigPath);\n }\n }\n\n const repoLinks = externalRepoNames && externalRepoNames.length > 0\n ? externalRepoNames\n : [\"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 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\n// === Skill-level install records ===\n\nexport interface SkillInstallEntry {\n skills: string[];\n installTime: string;\n batches?: SkillBatchRecord[];\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 logger.warn(t(\"skill_record_corrupted\"));\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 atomicWriteFileSync(recordPath, JSON.stringify(record, null, 2));\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 const now = new Date().toISOString();\n const newSkills: string[] = [];\n for (const id of skillIds) {\n if (!entry.skills.includes(id)) {\n entry.skills.push(id);\n newSkills.push(id);\n }\n }\n entry.installTime = now;\n if (newSkills.length > 0) {\n if (!entry.batches) entry.batches = [];\n entry.batches.push({\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n installedAt: now,\n skills: newSkills,\n });\n }\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.batches) {\n for (const batch of entry.batches) {\n batch.skills = batch.skills.filter((id) => !skillIds.includes(id));\n }\n entry.batches = entry.batches.filter((b) => b.skills.length > 0);\n if (entry.batches.length === 0) {\n delete entry.batches;\n }\n }\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 const recordedSkills = record[tool]?.[level]?.[installPath]?.skills || [];\n\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n\n const fromRecord = recordedSkills.filter((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\n });\n\n const fromFs: string[] = [];\n if (existsSync(skillsDir)) {\n try {\n const entries = readdirSync(skillsDir);\n for (const entry of entries) {\n if (entry === \".\" || entry === \"..\") continue;\n const entryPath = join(skillsDir, entry);\n if (isSymlink(entryPath) && !fromRecord.includes(entry)) {\n fromFs.push(entry);\n }\n }\n } catch {\n // ignore\n }\n }\n\n return [...fromRecord, ...fromFs];\n}\n\nexport function getLastBatchSkills(\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): string[] | null {\n const record = readSkillRecord();\n const entry = record[tool]?.[level]?.[installPath];\n if (!entry || !entry.batches || entry.batches.length === 0) {\n return null;\n }\n const lastBatch = entry.batches[entry.batches.length - 1];\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n return lastBatch.skills.filter((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\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 { existsSync, copyFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport type { AITool, BackupInfo } from \"../types/index.js\";\nimport { readAllManifests } from \"./manifest.js\";\nimport { readRecord } from \"./record.js\";\nimport { findPlugin, getAllPlugins } from \"./registry.js\";\nimport { getAgentsFileName } from \"../utils/paths.js\";\n\nexport { getAgentsFileName };\n\nexport function detectCurrentPlugin(\n configRoot: string,\n tool: AITool,\n installPath?: string\n): { pluginId: string; pluginName: string } | null {\n const manifests = readAllManifests(configRoot);\n if (manifests.length > 0) {\n const sorted = [...manifests].sort((a, b) =>\n (b.install_time || \"\").localeCompare(a.install_time || \"\")\n );\n const manifest = sorted[0];\n if (manifest.team) {\n const plugin = findPlugin(manifest.team);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n }\n\n const agentsFileName = getAgentsFileName(tool);\n const configRootAgentsFile = join(configRoot, agentsFileName);\n const installPathAgentsFile = installPath ? join(installPath, agentsFileName) : null;\n\n if (!existsSync(configRootAgentsFile) && !(installPathAgentsFile && existsSync(installPathAgentsFile))) {\n return null;\n }\n\n const allRecords = readAllRecords();\n for (const record of allRecords) {\n if (record.configRoot === configRoot && record.tool === tool) {\n const plugin = findPlugin(record.pluginId);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n }\n\n return null;\n}\n\nexport function createBackup(\n configRoot: string,\n tool: AITool,\n fromPluginId: string,\n fromPluginName: string\n): BackupInfo | null {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n if (!existsSync(agentsFile)) {\n return null;\n }\n\n const timestamp = formatTimestamp(new Date());\n const backupFileName = `${getAgentsFileName(tool)}.cannbot-backup.${fromPluginId}.${timestamp}`;\n const backupPath = join(configRoot, backupFileName);\n\n try {\n copyFileSync(agentsFile, backupPath);\n return {\n filePath: backupPath,\n pluginId: fromPluginId,\n pluginName: fromPluginName,\n backupTime: timestamp,\n };\n } catch {\n return null;\n }\n}\n\nexport function findBackups(configRoot: string): BackupInfo[] {\n if (!existsSync(configRoot)) {\n return [];\n }\n\n const files = readdirSync(configRoot);\n const backups: BackupInfo[] = [];\n\n for (const file of files) {\n if (file.includes(\".cannbot-backup.\")) {\n const parts = file.split(\".cannbot-backup.\");\n if (parts.length === 2) {\n const pluginIdAndTime = parts[1];\n const lastDotIndex = pluginIdAndTime.lastIndexOf(\".\");\n if (lastDotIndex > 0) {\n const pluginId = pluginIdAndTime.substring(0, lastDotIndex);\n const timestamp = pluginIdAndTime.substring(lastDotIndex + 1);\n const plugin = findPlugin(pluginId);\n\n backups.push({\n filePath: join(configRoot, file),\n pluginId,\n pluginName: plugin?.displayName || pluginId,\n backupTime: timestamp,\n });\n }\n }\n }\n }\n\n return backups.sort((a, b) => b.backupTime.localeCompare(a.backupTime));\n}\n\nexport function restoreBackup(\n backupPath: string,\n configRoot: string,\n tool: AITool\n): boolean {\n try {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n copyFileSync(backupPath, agentsFile);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function deleteBackup(backupPath: string): boolean {\n try {\n if (existsSync(backupPath)) {\n unlinkSync(backupPath);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction formatTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}${month}${day}-${hours}${minutes}${seconds}`;\n}\n\nfunction readAllRecords(): any[] {\n const records: any[] = [];\n const plugins = getAllPlugins();\n\n for (const plugin of plugins) {\n const record = readRecord(plugin.id);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\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 } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { BackupInfo } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function showOverwriteWarning(\n currentPluginName: string,\n newPluginName: string\n): Promise<\"overwrite\" | \"cancel\"> {\n console.log();\n console.log(chalk.yellow(` ⚠️ ${t(\"backup_detected\")}`));\n console.log();\n console.log(` ${t(\"backup_current\")}: ${chalk.cyan(currentPluginName)}`);\n console.log(` ${t(\"backup_installing\")}: ${chalk.cyan(newPluginName)}`);\n console.log();\n console.log(` ${t(\"backup_overwrite_warning\")}`);\n console.log(` ${t(\"backup_auto_create\")}`);\n console.log();\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices: [\n { name: t(\"backup_overwrite\"), value: \"overwrite\" },\n { name: t(\"backup_cancel\"), value: \"cancel\" },\n ],\n });\n\n return choice as \"overwrite\" | \"cancel\";\n}\n\nexport async function showRestorePrompt(\n backups: BackupInfo[]\n): Promise<string | \"none\"> {\n console.log();\n console.log(chalk.cyan(` ${t(\"backup_restore_prompt\")}`));\n console.log();\n\n const choices = backups.map((b) => ({\n name: `${t(\"backup_restore\")} ${b.pluginName} (${b.backupTime})`,\n value: b.filePath,\n }));\n\n choices.push({ name: t(\"backup_only_uninstall\"), value: \"none\" });\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices,\n });\n\n return choice;\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// ----------------------------------------------------------------------------------------------------------\nimport { existsSync, mkdirSync, symlinkSync, realpathSync, readlinkSync, copyFileSync, cpSync, writeFileSync, rmSync } from \"fs\";\nimport { join, basename } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, PluginEntry, PluginManifestExternalRepo, CannbotManifest } from \"../types/index.js\";\nimport { getConfigRoot, getAgentsFileName } from \"../utils/paths.js\";\nimport { isSymlink, removePath } from \"../utils/fs-helpers.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport interface ManifestInstallResult {\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n errors: string[];\n manifest: CannbotManifest | null;\n}\n\nfunction installLink(source: string, target: string): \"symlink\" | \"copy\" | \"skipped\" | \"failed\" {\n try {\n const resolved = realpathSync(source);\n\n if (isSymlink(target)) {\n try {\n const currentTarget = readlinkSync(target);\n const normCurrent = currentTarget.replace(/\\\\/g, \"/\").toLowerCase();\n const normSource = resolved.replace(/\\\\/g, \"/\").toLowerCase();\n if (normCurrent === normSource) {\n return \"skipped\";\n }\n } catch {\n return \"skipped\";\n }\n }\n\n if (existsSync(target) || isSymlink(target)) {\n removePath(target);\n }\n try {\n symlinkSync(resolved, target);\n return \"symlink\";\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, target, { recursive: true });\n return \"copy\";\n }\n throw e;\n }\n } catch {\n return \"failed\";\n }\n}\n\nfunction installConfigFile(\n pluginDir: string,\n configFile: string,\n tool: AITool,\n level: InstallLevel,\n configRoot: string,\n installPath: string,\n configRootConfigLink?: boolean\n): void {\n const sourcePath = join(pluginDir, configFile);\n if (!existsSync(sourcePath)) return;\n\n const agentsFileName = getAgentsFileName(tool);\n const isProjectLevel = level === \"project\";\n\n let primaryTarget: string;\n if (isProjectLevel) {\n primaryTarget = join(installPath, agentsFileName);\n } else {\n primaryTarget = join(configRoot, agentsFileName);\n }\n\n try {\n const resolvedSource = realpathSync(sourcePath);\n\n if (existsSync(primaryTarget) || isSymlink(primaryTarget)) {\n removePath(primaryTarget);\n }\n\n try {\n symlinkSync(resolvedSource, primaryTarget);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n copyFileSync(sourcePath, primaryTarget);\n } else {\n throw e;\n }\n }\n } catch (e: any) {\n logger.warn(t(\"install_config_failed\").replace(\"{error}\", e.message));\n }\n\n if (isProjectLevel && primaryTarget !== join(configRoot, agentsFileName)) {\n if (configRootConfigLink === false) return;\n const configRootTarget = join(configRoot, agentsFileName);\n if (existsSync(configRootTarget) || isSymlink(configRootTarget)) {\n removePath(configRootTarget);\n }\n try {\n symlinkSync(realpathSync(sourcePath), configRootTarget);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n copyFileSync(sourcePath, configRootTarget);\n }\n }\n }\n}\n\nasync function installExternalRepos(\n repos: PluginManifestExternalRepo[] | undefined,\n repoPath: string,\n configRoot: string,\n installPath: string,\n level: InstallLevel\n): Promise<void> {\n if (!repos || repos.length === 0) return;\n\n for (const repo of repos) {\n const targetDir = join(repoPath, repo.dir);\n const gitDir = join(targetDir, \".git\");\n\n if (existsSync(gitDir)) {\n try {\n await execa(\"git\", [\"pull\", \"--quiet\"], { cwd: targetDir, timeout: 120000 });\n } catch {\n logger.warn(t(\"external_repo_update_failed\").replace(\"{dir}\", repo.dir));\n continue;\n }\n } else if (!existsSync(targetDir)) {\n const args = [\"clone\"];\n if (repo.depth) {\n args.push(\"--depth\", String(repo.depth));\n }\n if (repo.recursive) {\n args.push(\"--recursive\");\n }\n args.push(repo.url, targetDir);\n\n try {\n await execa(\"git\", args, { timeout: 120000 });\n } catch {\n logger.warn(t(\"install_clone_failed\").replace(\"{url}\", repo.url).replace(\"{dir}\", repo.dir));\n try { rmSync(targetDir, { recursive: true, force: true }); } catch {}\n continue;\n }\n }\n\n const linkName = basename(repo.dir);\n const resolved = realpathSync(targetDir);\n const shouldConfigRootLink = repo.configRootLink !== false && (level === \"global\" || repo.configRootLink === true);\n\n if (shouldConfigRootLink) {\n const configRootLink = join(configRoot, linkName);\n try {\n if (existsSync(configRootLink) || isSymlink(configRootLink)) {\n removePath(configRootLink);\n }\n try {\n symlinkSync(resolved, configRootLink);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, configRootLink, { recursive: true });\n }\n }\n } catch {\n logger.warn(t(\"install_link_config_failed\").replace(\"{name}\", linkName));\n }\n }\n\n if (level === \"project\") {\n const projectLink = join(installPath, linkName);\n try {\n if (existsSync(projectLink) || isSymlink(projectLink)) {\n removePath(projectLink);\n }\n try {\n symlinkSync(resolved, projectLink);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, projectLink, { recursive: true });\n }\n }\n } catch {\n logger.warn(t(\"install_link_project_failed\").replace(\"{name}\", linkName));\n }\n }\n }\n}\n\nfunction installWorkflows(pluginDir: string, configRoot: string): void {\n const workflowsDir = join(pluginDir, \"workflows\");\n if (!existsSync(workflowsDir)) return;\n\n const targetPath = join(configRoot, \"workflows\");\n try {\n const resolved = realpathSync(workflowsDir);\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n removePath(targetPath);\n }\n try {\n symlinkSync(resolved, targetPath);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, targetPath, { recursive: true });\n }\n }\n } catch {\n logger.warn(t(\"install_link_workflows_failed\"));\n }\n}\n\nexport function writeCannbotManifest(\n configRoot: string,\n pluginId: string,\n version: string,\n level: InstallLevel,\n tool: AITool,\n skills: string[],\n agents: string[]\n): CannbotManifest {\n const manifest: CannbotManifest = {\n brand: \"CANNBot\",\n version,\n team: pluginId,\n level,\n tool,\n installed_skills: skills,\n installed_agents: agents,\n brand_dir: configRoot,\n install_time: new Date().toISOString(),\n };\n\n const manifestPath = join(configRoot, `${pluginId}-manifest.json`);\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n return manifest;\n}\n\nexport async function installViaManifest(\n plugin: PluginEntry,\n repoPath: string,\n tool: AITool,\n level: InstallLevel,\n installPath?: string\n): Promise<ManifestInstallResult> {\n const cwd = installPath || process.cwd();\n const configRoot = getConfigRoot(tool, level, installPath);\n const pluginDir = join(repoPath, plugin.dir);\n\n try {\n const skillsDir = join(configRoot, \"skills\");\n const agentsDir = join(configRoot, \"agents\");\n mkdirSync(skillsDir, { recursive: true });\n mkdirSync(agentsDir, { recursive: true });\n\n const installedSkills: string[] = [];\n const installedAgents: string[] = [];\n\n for (const source of plugin.installSkills || []) {\n const sourceDir = join(repoPath, source.dir);\n if (!existsSync(sourceDir)) {\n logger.warn(t(\"install_skill_source_not_found\").replace(\"{dir}\", source.dir));\n continue;\n }\n\n for (const skillEntry of source.skills) {\n const skillName = typeof skillEntry === \"string\" ? skillEntry : skillEntry.name;\n const skillAlias = typeof skillEntry === \"string\" ? skillName : (skillEntry.as || skillName);\n const skillPath = join(sourceDir, skillName);\n if (!existsSync(skillPath)) {\n logger.warn(t(\"install_skill_not_found\").replace(\"{name}\", skillName).replace(\"{dir}\", source.dir));\n continue;\n }\n\n const targetPath = join(skillsDir, skillAlias);\n const result = installLink(skillPath, targetPath);\n if (result !== \"failed\") {\n installedSkills.push(skillAlias);\n } else {\n logger.warn(t(\"install_skill_failed\").replace(\"{name}\", skillAlias));\n }\n }\n }\n\n for (const agentName of plugin.installAgents || []) {\n const agentFile = agentName.endsWith(\".md\") ? agentName : `${agentName}.md`;\n const agentPath = join(pluginDir, \"agents\", agentFile);\n if (!existsSync(agentPath)) {\n logger.warn(t(\"install_agent_not_found\").replace(\"{name}\", agentFile));\n continue;\n }\n\n const targetPath = join(agentsDir, agentFile);\n const result = installLink(agentPath, targetPath);\n if (result !== \"failed\") {\n installedAgents.push(agentFile);\n } else {\n logger.warn(t(\"install_agent_failed\").replace(\"{name}\", agentFile));\n }\n }\n\n installConfigFile(pluginDir, plugin.configFile || \"AGENTS.md\", tool, level, configRoot, cwd, plugin.configRootConfigLink);\n\n installWorkflows(pluginDir, configRoot);\n\n await installExternalRepos(plugin.externalRepos, repoPath, configRoot, cwd, level);\n\n const cannbotManifest = writeCannbotManifest(\n configRoot,\n plugin.id,\n plugin.version || \"1.0.0\",\n level,\n tool,\n installedSkills,\n installedAgents\n );\n\n return {\n success: true,\n skillsCount: installedSkills.length,\n agentsCount: installedAgents.length,\n errors: [],\n manifest: cannbotManifest,\n };\n } catch (error) {\n return {\n success: false,\n skillsCount: 0,\n agentsCount: 0,\n errors: [error instanceof Error ? error.message : t(\"error_unknown\")],\n manifest: null,\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 { existsSync, mkdirSync, symlinkSync, readdirSync, rmSync, realpathSync, readlinkSync, cpSync } from \"fs\";\nimport { join, dirname, isAbsolute } 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 { isSymlink, removePath } from \"../utils/fs-helpers.js\";\nimport { BACK, CANCEL } from \"../utils/constants.js\";\nimport { logger, 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\";\nimport { confirm } from \"@inquirer/prompts\";\n\ninterface SkillInstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\ninterface 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: t(\"error_skill_not_found\") });\n continue;\n }\n\n const sourcePath = resolveSkillSourcePath(skill, repoPath);\n const targetPath = join(skillsDir, skillId);\n\n if (!existsSync(sourcePath)) {\n results.push({ skillId, success: false, error: t(\"error_source_not_found\").replace(\"{path}\", sourcePath) });\n continue;\n }\n\n try {\n const resolvedSource = realpathSync(sourcePath);\n\n if (isSymlink(targetPath)) {\n try {\n const currentTarget = readlinkSync(targetPath);\n const normCurrent = currentTarget.replace(/\\\\/g, \"/\").toLowerCase();\n const normSource = resolvedSource.replace(/\\\\/g, \"/\").toLowerCase();\n if (normCurrent === normSource) {\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n continue;\n }\n } catch {\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n continue;\n }\n }\n\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n removePath(targetPath);\n }\n try {\n symlinkSync(resolvedSource, targetPath);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolvedSource, targetPath, { recursive: true });\n } else {\n throw e;\n }\n }\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n } catch (error) {\n let msg = error instanceof Error ? error.message : t(\"error_unknown\");\n if (process.platform === \"win32\" && msg.includes(\"EPERM\")) {\n msg = t(\"error_symlink_windows\");\n }\n results.push({ skillId, success: false, error: msg });\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 removePath(targetPath);\n results.push({ skillId, success: true });\n removedIds.push(skillId);\n logger.step(` ${t(\"uninstall_remove_label\")}: ${skillId}`);\n } else {\n results.push({ skillId, success: false, error: t(\"error_not_installed\") });\n logger.warn(`${skillId} ${t(\"uninstall_skill_not_installed\")}`);\n }\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : t(\"error_unknown\") });\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 rmSync(skillsDir, { recursive: true });\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: skills/`);\n }\n } catch {\n // ignore\n }\n }\n\n return results;\n}\n\nconst SELECT_ALL = \"__select_all__\";\nconst SELECT_ALL_CATEGORY = \"__select_all_category__\";\nconst CONTINUE_SELECT = \"__continue_select__\";\nconst UNSELECT_ALL = \"__unselect_all__\";\n\nexport async function interactiveSkillSelect(\n tool: AITool,\n level: InstallLevel\n): Promise<string[] | \"back\" | \"cancel\"> {\n const categories = getAllCategories();\n const allSkillIds = getAllSkills().map((s) => s.id);\n\n let accumulated: string[] = [];\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n const titleSuffix = accumulated.length > 0\n ? `${t(\"wizard_step_3_skill_title\")}(${t(\"skill_count_format\").replace(\"{count}\", String(accumulated.length))})`\n : t(\"wizard_step_3_skill_title\");\n printBoxTitle(titleSuffix);\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `>> ${t(\"skill_select_all\").replace(\"{count}\", String(allSkillIds.length))}`,\n value: SELECT_ALL,\n },\n new Separator(\"──────────────\"),\n ...categories.map((cat) => ({\n name: `> ${cat.name} (${cat.skills.length} skills)`,\n value: cat.id,\n })),\n new Separator(\"──────────────\"),\n ...(accumulated.length > 0\n ? [{ name: `>> ${t(\"skill_confirm_install_count\").replace(\"{count}\", String(accumulated.length))}`, value: \"install\" } as { name: string; value: string }]\n : []),\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 pageSize: 15,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n if (selectedCategoryId === SELECT_ALL) {\n return allSkillIds;\n }\n if (selectedCategoryId === \"install\") {\n return accumulated;\n }\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(t(\"wizard_step_4_skill_title\").replace(\"{category}\", category.name));\n\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath);\n const installedSet = new Set(installedSkills);\n const categorySkillIds = new Set(category.skills.map((s) => s.id));\n const accumulatedInCategory = new Set(accumulated.filter((id) => categorySkillIds.has(id)));\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n {\n name: `>> ${t(\"skill_select_all_category\")}`,\n value: SELECT_ALL_CATEGORY,\n checked: accumulatedInCategory.size === category.skills.length,\n description: t(\"skill_select_all_category\"),\n },\n new Separator(\"──────────────\"),\n ...category.skills.map((skill) => {\n const isInstalled = installedSet.has(skill.id);\n const isAccumulated = accumulatedInCategory.has(skill.id);\n const suffix = isInstalled ? ` [${t(\"skill_already_installed\")}]` : (isAccumulated ? \" [+]\" : \"\");\n return {\n name: `${chalk.cyan(skill.id)}${suffix}`,\n value: skill.id,\n checked: isAccumulated,\n description: skill.description,\n };\n }),\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 pageSize: 15,\n });\n\n let skillIds: string[];\n if (selectedSkills.includes(SELECT_ALL_CATEGORY)) {\n skillIds = category.skills.map((s) => s.id);\n } else {\n skillIds = selectedSkills.filter((id) => id !== SELECT_ALL_CATEGORY);\n }\n\n if (skillIds.length === 0) {\n accumulated = accumulated.filter((id) => !categorySkillIds.has(id));\n const action = await select({\n message: accumulated.length > 0\n ? t(\"skill_continue_or_install\").replace(\"{count}\", String(accumulated.length))\n : t(\"wizard_no_selection\"),\n choices: accumulated.length > 0\n ? [\n { name: \">> \" + t(\"skill_confirm_install_count\").replace(\"{count}\", String(accumulated.length)), value: \"install\" },\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ]\n : [\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 === \"install\") return accumulated;\n if (action === \"back\") { step = 0; break; }\n return \"cancel\";\n }\n\n accumulated = accumulated.filter((id) => !categorySkillIds.has(id));\n for (const id of skillIds) {\n if (!accumulated.includes(id)) {\n accumulated.push(id);\n }\n }\n\n const action = await select({\n message: t(\"skill_continue_or_install\").replace(\"{count}\", String(accumulated.length)),\n choices: [\n { name: \">> \" + t(\"skill_confirm_install_count\").replace(\"{count}\", String(accumulated.length)), value: \"install\" },\n { name: \"> \" + t(\"skill_continue_select\"), value: CONTINUE_SELECT },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n\n if (action === \"install\") {\n return accumulated;\n }\n if (action === CONTINUE_SELECT) {\n step = 0;\n break;\n }\n return \"cancel\";\n }\n }\n }\n}\n\nexport async function interactiveSkillUnselect(\n tool: AITool,\n level: InstallLevel\n): Promise<{ toUninstall: string[]; toKeep: string[] } | \"back\" | \"cancel\"> {\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath);\n\n if (installedSkills.length === 0) {\n logger.warn(t(\"uninstall_no_installed_skills\"));\n return \"back\";\n }\n\n if (installedSkills.length <= 15) {\n return await flatSkillUnselect(installedSkills);\n }\n\n return await categorySkillUnselect(installedSkills);\n}\n\nasync function flatSkillUnselect(\n installedSkills: string[]\n): Promise<{ toUninstall: string[]; toKeep: string[] } | \"back\" | \"cancel\"> {\n const categories = getAllCategories();\n const installedSet = new Set(installedSkills);\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n ...installedSkills.map((skillId) => {\n const skill = findSkill(skillId);\n const cat = categories.find((c) => c.skills.some((s) => s.id === skillId));\n const catName = cat ? cat.name : \"\";\n const desc = skill?.description || \"\";\n return {\n name: `${chalk.cyan(skillId)}${catName ? chalk.dim(` [${catName}]`) : \"\"}`,\n value: skillId,\n checked: false,\n description: desc,\n };\n }),\n ];\n\n printBoxTitle(t(\"uninstall_interactive_title\"));\n logger.info(chalk.dim(` ${t(\"uninstall_checkbox_hint_select\")}`));\n logger.blank();\n showOperationHints(true);\n\n const selected = await checkbox({\n message: t(\"uninstall_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 20,\n });\n\n if (selected.length === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return \"back\";\n }\n\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(selected.length))),\n default: false,\n });\n\n if (!confirmed) return \"cancel\";\n\n return {\n toUninstall: selected,\n toKeep: installedSkills.filter((id) => !selected.includes(id)),\n };\n}\n\nasync function categorySkillUnselect(\n installedSkills: string[]\n): Promise<{ toUninstall: string[]; toKeep: string[] } | \"back\" | \"cancel\"> {\n const allCategories = getAllCategories();\n const installedSet = new Set(installedSkills);\n\n const categoriesWithInstalled = allCategories\n .map((cat) => ({\n ...cat,\n skills: cat.skills.filter((s) => installedSet.has(s.id)),\n }))\n .filter((cat) => cat.skills.length > 0);\n\n const uncategorized = installedSkills.filter(\n (id) => !allCategories.some((cat) => cat.skills.some((s) => s.id === id))\n );\n if (uncategorized.length > 0) {\n categoriesWithInstalled.push({\n id: \"__uncategorized__\",\n name: t(\"uninstall_uncategorized\"),\n skills: uncategorized.map((id) => ({ id, description: \"\", source: \"\", filePath: \"\" }) as any),\n });\n }\n\n const uninstallSet = new Set<string>();\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n const titleSuffix = uninstallSet.size > 0\n ? `${t(\"wizard_step_3_skill_title\")}(${t(\"uninstall_marked_count\").replace(\"{count}\", String(uninstallSet.size))})`\n : t(\"wizard_step_3_skill_title\");\n printBoxTitle(titleSuffix);\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `>> ${t(\"uninstall_uncheck_all\")}`,\n value: UNSELECT_ALL,\n },\n new Separator(\"──────────────\"),\n ...categoriesWithInstalled.map((cat) => {\n const catSelectedCount = cat.skills.filter((s) => uninstallSet.has(s.id)).length;\n const suffix = catSelectedCount > 0 ? chalk.yellow(` (${catSelectedCount} selected)`) : \"\";\n return {\n name: `> ${cat.name} (${cat.skills.length} skills)${suffix}`,\n value: cat.id,\n };\n }),\n new Separator(\"──────────────\"),\n ...(uninstallSet.size > 0\n ? [{ name: `>> ${t(\"uninstall_confirm_count\").replace(\"{count}\", String(uninstallSet.size))}`, value: \"uninstall\" } as { name: string; value: string }]\n : []),\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(\"uninstall_select_category\"),\n choices: categoryChoices,\n loop: false,\n theme: selectTheme,\n pageSize: 15,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n if (selectedCategoryId === UNSELECT_ALL) {\n for (const id of installedSkills) {\n uninstallSet.add(id);\n }\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(installedSkills.length))),\n default: false,\n });\n if (!confirmed) return \"cancel\";\n return { toUninstall: [...uninstallSet], toKeep: [] };\n }\n if (selectedCategoryId === \"uninstall\") {\n if (uninstallSet.size === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return \"back\";\n }\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(uninstallSet.size))),\n default: false,\n });\n if (!confirmed) return \"cancel\";\n return { toUninstall: [...uninstallSet], toKeep: installedSkills.filter((id) => !uninstallSet.has(id)) };\n }\n step = 1;\n break;\n }\n case 1: {\n const category = categoriesWithInstalled.find((c) => c.id === selectedCategoryId);\n if (!category) return \"back\";\n\n printBoxTitle(t(\"wizard_step_4_skill_title\").replace(\"{category}\", category.name));\n\n const categorySkillIds = new Set(category.skills.map((s) => s.id));\n const selectedInCategory = new Set([...uninstallSet].filter((id) => categorySkillIds.has(id)));\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n {\n name: `>> ${t(\"uninstall_uncheck_all_category\")}`,\n value: SELECT_ALL_CATEGORY,\n checked: selectedInCategory.size === category.skills.length,\n description: t(\"uninstall_uncheck_all_category\"),\n },\n new Separator(\"──────────────\"),\n ...category.skills.map((skill) => {\n const isSelected = selectedInCategory.has(skill.id);\n return {\n name: `${chalk.cyan(skill.id)}`,\n value: skill.id,\n checked: isSelected,\n description: skill.description || \"\",\n };\n }),\n ];\n\n logger.info(chalk.dim(` ${t(\"uninstall_checkbox_hint_select\")}`));\n logger.blank();\n showOperationHints(true);\n\n const selectedSkills = await checkbox({\n message: t(\"uninstall_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n let selectedInCat: string[];\n if (selectedSkills.includes(SELECT_ALL_CATEGORY)) {\n selectedInCat = category.skills.map((s) => s.id);\n } else {\n selectedInCat = selectedSkills.filter((id) => id !== SELECT_ALL_CATEGORY);\n }\n\n for (const id of categorySkillIds) {\n if (selectedInCat.includes(id)) {\n uninstallSet.add(id);\n } else {\n uninstallSet.delete(id);\n }\n }\n\n const toUninstallCount = uninstallSet.size;\n const action = await select({\n message: toUninstallCount > 0\n ? t(\"uninstall_continue_or_confirm\").replace(\"{count}\", String(toUninstallCount))\n : t(\"wizard_no_selection\"),\n choices: toUninstallCount > 0\n ? [\n { name: \">> \" + t(\"uninstall_confirm_count\").replace(\"{count}\", String(toUninstallCount)), value: \"uninstall\" },\n { name: \"> \" + t(\"skill_continue_select\"), value: CONTINUE_SELECT },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ]\n : [\n new Separator(\"──────────────\"),\n { name: \"> \" + t(\"skill_continue_select\"), value: CONTINUE_SELECT },\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\n if (action === \"uninstall\") {\n if (uninstallSet.size === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return \"back\";\n }\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(uninstallSet.size))),\n default: false,\n });\n if (!confirmed) return \"cancel\";\n return { toUninstall: [...uninstallSet], toKeep: installedSkills.filter((id) => !uninstallSet.has(id)) };\n }\n if (action === CONTINUE_SELECT) {\n step = 0;\n break;\n }\n if (action === \"back\") {\n step = 0;\n break;\n }\n return \"cancel\";\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(` ${t(\"skill_total_count\").replace(\"{count}\", String(getAllSkills().length))}`));\n console.log();\n}\n\nfunction resolveSkillSourcePath(skill: { filePath?: string; source: string; id: string }, repoPath: string): string {\n if (skill.filePath) {\n const absPath = isAbsolute(skill.filePath) ? skill.filePath : join(repoPath, skill.filePath);\n if (existsSync(absPath)) {\n return dirname(absPath);\n }\n }\n return join(repoPath, skill.source, skill.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 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\";\nimport { findPlugin } from \"../core/registry.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_description\")),\n ],\n style: { head: [], border: [] },\n colWidths: [6, 32, 8, 50],\n wordWrap: true,\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 plugin.description || chalk.dim(\"—\"),\n ]);\n });\n\n console.log();\n const countSuffix = t(\"count_suffix\");\n console.log(chalk.bold(` ${t(\"list_title\")} (${plugins.length}${countSuffix ? \" \" + countSuffix : \"\"})`));\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 countSuffix = t(\"count_suffix\");\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}${countSuffix ? \" \" + countSuffix : \"\"} ${chalk.dim(\"|\")} ${chalk.dim(t(\"install_agents_count\") + \":\")} ${totalAgents}${countSuffix ? \" \" + countSuffix : \"\"}`,\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(t(\"try_prompt\"))}`,\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 const plugin = findPlugin(successResults[0].pluginId);\n const docsPath = plugin ? `${plugin.dir}/quickstart.md` : `${successResults[0].pluginId}/quickstart.md`;\n lines.push(\n ` ${chalk.dim(t(\"install_enhanced_docs\"))}: ${chalk.dim(docsPath)}`\n );\n }\n\n console.log();\n for (const line of lines) {\n console.log(line);\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 { 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 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)} — ${t(\"doctor_not_installed\")}`);\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)} — ${t(\"doctor_not_installed\")}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_links\")}`));\n\n const checkedRoots = new Set<string>();\n const configRootsToCheck: { configRoot: string; tool: AITool; level: \"project\" | \"global\" }[] = [];\n\n if (installed.length > 0) {\n for (const inst of installed) {\n if (!checkedRoots.has(inst.configRoot)) {\n checkedRoots.add(inst.configRoot);\n configRootsToCheck.push({ configRoot: inst.configRoot, tool: inst.tool, level: inst.level });\n }\n }\n } else {\n const primaryTool = detectedTools[0]?.name || \"opencode\";\n const configRoot = getConfigRoot(primaryTool, \"project\");\n configRootsToCheck.push({ configRoot, tool: primaryTool, level: \"project\" });\n }\n\n for (const { configRoot } of configRootsToCheck) {\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} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${skillsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(skillsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${skillsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(skillsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", 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} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${agentsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(agentsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${agentsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(agentsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", agentsDir)}`);\n }\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_config\")}`));\n for (const { configRoot, tool, level } of configRootsToCheck) {\n const configFile = getConfigFileName(tool);\n const configPath = level === \"project\"\n ? join(configRoot, \"..\", configFile)\n : join(configRoot, configFile);\n if (existsSync(configPath)) {\n console.log(chalk.green(\" ✓\") + ` ${configPath} ${t(\"doctor_config_exists\")}`);\n } else {\n console.log(chalk.dim(\" —\") + ` ${configPath} ${t(\"doctor_config_not_exist\")}`);\n }\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\")}: ${t(\"doctor_result_with_fix\").replace(\"{warnings}\", String(warnings)).replace(\"{fixes}\", String(fixes))}`\n );\n } else {\n console.log(\n ` ${t(\"doctor_result\")}: ${t(\"doctor_result_without_fix\").replace(\"{warnings}\", String(warnings))}`\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 { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function statusCommand(): Promise<void> {\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, getAllSkills } 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 { join } from \"path\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot, validateTool, validateLevel } 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; all?: 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 // Handle --all flag: install all available skills\n if (options.all) {\n const scanSpinner = createSpinner(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n const allSkills = getAllSkills();\n const skillIds = allSkills.map((s) => s.id);\n\n if (skillIds.length === 0) {\n logger.error(t(\"install_no_skill_selected\"));\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n logger.info(`${t(\"skill_all_install_progress\").replace(\"{count}\", chalk.bold(String(skillIds.length)))}`);\n\n const results = await installSkills(skillIds, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) { logger.success(`${progress} ${result.skillId}`); successCount++; }\n else { logger.error(`${progress} ${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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(configRoot, \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\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(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n let step = 1;\n while (true) {\n switch (step) {\n case 1: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") {\n const redetected = await selectToolWithDetection();\n if (redetected === \"back\" || redetected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = redetected;\n break;\n }\n if (selectedSkills === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return;\n }\n names = selectedSkills;\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(names.length)))}...`);\n const results = await installSkills(names, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) { logger.success(`${progress} ${result.skillId}`); successCount++; }\n else { logger.error(`${progress} ${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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(configRoot, \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", 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(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\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(t(\"available_plugins\") + \":\");\n for (const p of allPlugins) {\n logger.step(` ${p.id} (${p.aliases.join(\", \")})`);\n }\n logger.info(`${t(\"available_skills\")}: ${chalk.cyan(\"install-helper install --list\")}`);\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"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(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n const allPlugins = getAllPlugins();\n const results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath,\n undefined,\n options.yes\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(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(skills.length)))}...`);\n\n const results = await installSkills(skills, 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 logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(getConfigRoot(tool, level), \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", 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 installPath?: string,\n yes?: boolean\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 installPath,\n yes,\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, readFileSync } from \"fs\";\nimport { resolve, basename, sep, join } from \"path\";\nimport chalk from \"chalk\";\nimport { select, checkbox, Separator, confirm } from \"@inquirer/prompts\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { uninstallSkills, interactiveSkillUnselect } from \"../core/skill-installer.js\";\nimport { readRecord, deleteRecord, getInstalledSkills, getLastBatchSkills, scanInstalledFiles } from \"../core/record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { logger, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel, CannbotManifest } from \"../types/index.js\";\nimport { findBackups, restoreBackup, deleteBackup } from \"../core/backup.js\";\nimport { showRestorePrompt } from \"../ui/backup-prompts.js\";\nimport { getConfigRoot, validateTool, validateLevel, VALID_TOOLS } from \"../utils/paths.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { selectTheme, checkboxTheme } from \"../ui/theme.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\n\nexport async function uninstallCommand(\n names: string[],\n options: { tool?: string; level?: string; yes?: boolean; all?: boolean; recent?: boolean }\n): Promise<void> {\n const userSpecifiedTool = !!options.tool;\n const userSpecifiedLevel = !!options.level;\n const tool: AITool = options.tool ? validateTool(options.tool) : \"opencode\";\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n // --all mode: uninstall all installed skills + plugins\n if (options.all) {\n await uninstallAll(tool, level, options.yes || false);\n return;\n }\n\n // --recent mode: uninstall last batch of skills\n if (options.recent) {\n await uninstallRecent(tool, level, options.yes || false);\n return;\n }\n\n // Interactive mode: no names provided\n if (names.length === 0) {\n await uninstallInteractive(tool, level, userSpecifiedTool, userSpecifiedLevel);\n return;\n }\n\n // Name-driven mode (existing behavior)\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(`${t(\"uninstall_not_found\")}: ${name}`);\n }\n\n await uninstallPlugins(plugins, options.yes || false);\n await uninstallSkillsByName(skills, tool, level);\n}\n\nasync function uninstallAll(tool: AITool, level: InstallLevel, yes: boolean): Promise<void> {\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath);\n const installedPlugins = scanInstalled().filter((p) => p.tool === tool && p.level === level);\n\n const totalItems = installedSkills.length + installedPlugins.length;\n if (totalItems === 0) {\n logger.warn(t(\"uninstall_no_installed\"));\n return;\n }\n\n logger.info(t(\"uninstall_all_summary\")\n .replace(\"{skills}\", String(installedSkills.length))\n .replace(\"{plugins}\", String(installedPlugins.length)));\n logger.blank();\n\n for (const s of installedSkills) {\n logger.step(` • ${chalk.cyan(s)}`);\n }\n for (const p of installedPlugins) {\n logger.step(` • ${chalk.cyan(p.displayName)} ${chalk.dim(`(${p.id})`)}`);\n }\n logger.blank();\n\n if (!yes) {\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(totalItems))),\n default: false,\n });\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n }\n\n // Uninstall skills\n if (installedSkills.length > 0) {\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(installedSkills.length))}...`);\n await uninstallSkills(installedSkills, tool, level);\n }\n\n // Uninstall plugins\n if (installedPlugins.length > 0) {\n logger.info(`${t(\"uninstall_plugin_batch_progress\").replace(\"{count}\", String(installedPlugins.length))}...`);\n for (const inst of installedPlugins) {\n await uninstallPluginById(inst.id, true);\n }\n }\n\n logger.blank();\n logger.success(t(\"uninstall_all_done\"));\n logger.blank();\n}\n\nasync function uninstallRecent(tool: AITool, level: InstallLevel, yes: boolean): Promise<void> {\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const lastBatch = getLastBatchSkills(tool, level, installPath);\n\n if (!lastBatch || lastBatch.length === 0) {\n logger.warn(t(\"uninstall_recent_no_history\"));\n return;\n }\n\n logger.info(t(\"uninstall_recent_progress\").replace(\"{count}\", chalk.bold(String(lastBatch.length))));\n logger.blank();\n for (const s of lastBatch) {\n logger.step(` • ${chalk.cyan(s)}`);\n }\n logger.blank();\n\n if (!yes) {\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(lastBatch.length))),\n default: false,\n });\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n }\n\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(lastBatch.length))}...`);\n await uninstallSkills(lastBatch, tool, level);\n logger.blank();\n logger.success(t(\"skill_uninstall_done\"));\n logger.blank();\n}\n\nasync function uninstallInteractive(\n defaultTool: AITool,\n defaultLevel: InstallLevel,\n userSpecifiedTool: boolean,\n userSpecifiedLevel: boolean\n): Promise<void> {\n let tool = defaultTool;\n let level = defaultLevel;\n\n // Scan all tool×level combinations for installed content\n const allInstalledPlugins = scanInstalled();\n const toolsWithPlugins = new Set(allInstalledPlugins.map((p) => `${p.tool}:${p.level}`));\n\n // Check which tool×level combos have installed skills\n const toolsWithSkills = new Set<string>();\n for (const toolName of [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\", \"codearts\"] as AITool[]) {\n for (const lvl of [\"project\", \"global\"] as InstallLevel[]) {\n const ip = lvl === \"project\" ? process.cwd() : getConfigRoot(toolName, lvl);\n const skills = getInstalledSkills(toolName, lvl, ip);\n if (skills.length > 0) {\n toolsWithSkills.add(`${toolName}:${lvl}`);\n }\n }\n }\n\n const hasSkills = toolsWithSkills.size > 0;\n const hasPlugins = toolsWithPlugins.size > 0;\n\n if (!hasSkills && !hasPlugins) {\n logger.warn(t(\"uninstall_no_installed\"));\n return;\n }\n\n // Step: select type (skip if only one type has content)\n let uninstallType: string;\n if (hasSkills && hasPlugins) {\n printBoxTitle(t(\"uninstall_interactive_title\"));\n const skillCount = [...toolsWithSkills].reduce((sum, key) => {\n const [toolName, lvl] = key.split(\":\") as [AITool, InstallLevel];\n const ip = lvl === \"project\" ? process.cwd() : getConfigRoot(toolName, lvl);\n return sum + getInstalledSkills(toolName, lvl, ip).length;\n }, 0);\n const pluginCount = allInstalledPlugins.length;\n const typeChoices: Array<{ name: string; value: string } | Separator> = [\n { name: `> ${t(\"uninstall_type_skill\")} (${skillCount})`, value: \"skill\" },\n { name: `> ${t(\"uninstall_type_plugin\")} (${pluginCount})`, value: \"plugin\" },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ];\n showOperationHints();\n const choice = await select({\n message: t(\"uninstall_select_type\"),\n choices: typeChoices,\n loop: false,\n theme: selectTheme,\n });\n if (choice === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n uninstallType = choice;\n } else if (hasSkills) {\n uninstallType = \"skill\";\n } else {\n uninstallType = \"plugin\";\n }\n\n // Find which tools have content for the selected type\n const relevantKeys = uninstallType === \"skill\" ? toolsWithSkills : toolsWithPlugins;\n const toolsWithContent = new Set<AITool>();\n for (const key of relevantKeys) {\n toolsWithContent.add(key.split(\":\")[0] as AITool);\n }\n\n // Select tool (skip if only one tool has content, or respect --tool if user specified it)\n if (toolsWithContent.size === 1) {\n tool = [...toolsWithContent][0];\n } else if (userSpecifiedTool && toolsWithContent.has(defaultTool)) {\n tool = defaultTool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n // Find which levels have content for the selected tool\n const levelsWithContent = new Set<InstallLevel>();\n for (const key of relevantKeys) {\n const [toolName, lvl] = key.split(\":\") as [AITool, InstallLevel];\n if (toolName === tool) {\n levelsWithContent.add(lvl);\n }\n }\n\n // Select level (skip if only one level has content, or respect --level if user specified it)\n if (levelsWithContent.size === 1) {\n level = [...levelsWithContent][0];\n } else if (userSpecifiedLevel && levelsWithContent.has(defaultLevel)) {\n level = defaultLevel;\n } else {\n const { stepLevel } = await import(\"../ui/wizard.js\");\n const levelResult = await stepLevel();\n if (levelResult === \"__back__\" || levelResult === \"__cancel__\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n level = levelResult as InstallLevel;\n }\n\n if (uninstallType === \"skill\") {\n await interactiveSkillUninstall(tool, level);\n } else {\n await interactivePluginUninstall(tool, level);\n }\n}\n\nasync function interactiveSkillUninstall(tool: AITool, level: InstallLevel): Promise<void> {\n const result = await interactiveSkillUnselect(tool, level);\n\n if (result === \"back\" || result === \"cancel\") {\n if (result === \"cancel\") logger.info(t(\"init_cancelled\"));\n return;\n }\n\n const { toUninstall } = result;\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(toUninstall.length))}...`);\n await uninstallSkills(toUninstall, tool, level);\n logger.blank();\n logger.success(t(\"skill_uninstall_done\"));\n logger.blank();\n}\n\nasync function interactivePluginUninstall(tool: AITool, level: InstallLevel): Promise<void> {\n const installed = scanInstalled().filter((p) => p.tool === tool && p.level === level);\n\n if (installed.length === 0) {\n logger.warn(t(\"uninstall_no_installed_plugins\"));\n return;\n }\n\n const pluginChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n ...installed.map((inst) => ({\n name: `${chalk.cyan(inst.displayName)} ${chalk.dim(`(${inst.id})`)}`,\n value: inst.id,\n checked: false,\n description: `${inst.skillsCount} skills, ${inst.agentsCount} agents`,\n })),\n ];\n\n printBoxTitle(t(\"uninstall_interactive_title\"));\n logger.info(chalk.dim(` ${t(\"uninstall_checkbox_hint_select\")}`));\n logger.blank();\n showOperationHints(true);\n\n const selected = await checkbox({\n message: t(\"uninstall_select_plugins\"),\n choices: pluginChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n const toUninstall = installed.filter((inst) => selected.includes(inst.id));\n\n if (toUninstall.length === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return;\n }\n\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(toUninstall.length))),\n default: false,\n });\n\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n\n logger.info(`${t(\"uninstall_plugin_batch_progress\").replace(\"{count}\", String(toUninstall.length))}...`);\n for (const inst of toUninstall) {\n await uninstallPluginById(inst.id, true);\n }\n logger.blank();\n logger.success(t(\"uninstall_all_done\"));\n logger.blank();\n}\n\nasync function uninstallPlugins(pluginIds: string[], batchMode: boolean): Promise<void> {\n for (const pluginId of pluginIds) {\n await uninstallPluginById(pluginId, batchMode);\n }\n}\n\nasync function uninstallPluginById(pluginId: string, batchMode: boolean): Promise<void> {\n const plugin = findPlugin(pluginId);\n if (!plugin) return;\n\n let record = readRecord(plugin.id);\n\n if (!record) {\n // Fallback: scan all tool×level for manifest-based cleanup\n for (const toolName of VALID_TOOLS) {\n for (const lvl of [\"project\", \"global\"] as InstallLevel[]) {\n const configRoot = getConfigRoot(toolName, lvl);\n const manifestPath = join(configRoot, `${pluginId}-manifest.json`);\n if (!existsSync(manifestPath)) continue;\n\n let manifest: CannbotManifest | null = null;\n try {\n manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as CannbotManifest;\n } catch {\n continue;\n }\n\n const installPath = lvl === \"project\" ? process.cwd() : configRoot;\n record = scanInstalledFiles(\n pluginId, plugin.displayName, toolName, lvl,\n installPath, configRoot, manifest,\n plugin.externalRepos?.map((r) => basename(r.dir)),\n plugin.configRootConfigLink\n );\n break;\n }\n if (record) break;\n }\n }\n\n if (!record) {\n logger.warn(`${plugin.displayName} ${t(\"uninstall_no_record\")}`);\n logger.info(`${t(\"uninstall_no_record_hint\")}`);\n return;\n }\n\n logger.info(`${t(\"uninstall_in_progress\")} ${plugin.displayName}...`);\n\n const configRoot = getConfigRoot(record.tool, record.level);\n const allowedBases = [resolve(configRoot), resolve(record.installPath)];\n const isSafePath = (p: string): boolean => {\n const resolved = resolve(p);\n return allowedBases.some(base => resolved === base || resolved.startsWith(base + sep));\n };\n\n let removedFiles = 0;\n let removedDirs = 0;\n\n // Add configRoot-level config file if not already in record (backward compat)\n const configFileName = record.tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n const configRootConfigPath = join(configRoot, configFileName);\n const installPathConfigPath = join(record.installPath, configFileName);\n const extraFiles: string[] = [];\n if (record.level === \"project\" &&\n configRootConfigPath !== installPathConfigPath &&\n !record.files.includes(configRootConfigPath) &&\n (existsSync(configRootConfigPath) || isSymlink(configRootConfigPath))) {\n extraFiles.push(configRootConfigPath);\n }\n\n const allFiles = [...record.files, ...extraFiles];\n\n for (const filePath of allFiles) {\n if (!isSafePath(filePath)) continue;\n try {\n if (existsSync(filePath) || isSymlink(filePath)) {\n unlinkSync(filePath);\n const name = basename(filePath);\n logger.step(` ${t(\"uninstall_remove_label\")}: ${name}`);\n removedFiles++;\n }\n } catch {\n // ignore\n }\n }\n\n const sortedDirs = [...record.directories].filter(isSafePath).sort((a, b) => b.length - a.length);\n for (const dirPath of sortedDirs) {\n try {\n if (resolve(dirPath) === resolve(configRoot)) {\n continue;\n }\n if (existsSync(dirPath)) {\n const entries = readdirSync(dirPath);\n if (entries.length === 0) {\n rmdirSync(dirPath);\n const name = basename(dirPath);\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${name}/`);\n removedDirs++;\n }\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id);\n removeInstalledPlugin(plugin.id);\n\n const backups = findBackups(configRoot);\n const otherBackups = backups.filter((b) => b.pluginId !== pluginId);\n\n if (!batchMode && otherBackups.length > 0) {\n const choice = await showRestorePrompt(otherBackups);\n if (choice !== \"none\") {\n const restored = restoreBackup(choice, configRoot, record.tool);\n if (restored) {\n const backupInfo = otherBackups.find((b) => b.filePath === choice);\n logger.success(`${t(\"backup_restore_success\")}: ${backupInfo?.pluginName || \"\"}`);\n deleteBackup(choice);\n }\n }\n } else if (batchMode && otherBackups.length > 0) {\n logger.info(t(\"uninstall_plugin_batch_skip_restore\"));\n }\n\n const currentBackups = backups.filter((b) => b.pluginId === pluginId);\n for (const backup of currentBackups) {\n deleteBackup(backup.filePath);\n }\n\n const totalRemoved = removedFiles + removedDirs;\n if (totalRemoved > 0) {\n logger.success(t(\"uninstall_summary_format\").replace(\"{name}\", plugin.displayName).replace(\"{files}\", String(removedFiles)).replace(\"{dirs}\", String(removedDirs)));\n } else {\n logger.warn(`${plugin.displayName}${t(\"uninstall_files_gone\")}`);\n }\n}\n\nasync function uninstallSkillsByName(skills: string[], tool: AITool, level: InstallLevel): Promise<void> {\n if (skills.length === 0) return;\n\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(skills.length))}...`);\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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\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 { scanInstalled } from \"../core/manifest.js\";\nimport { printInstallSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { validateTool, validateLevel } from \"../utils/paths.js\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\ninterface UpdateTarget {\n pluginId: string;\n tool: AITool;\n level: InstallLevel;\n}\n\nexport async function updateCommand(\n pluginNames: string[],\n options: { tool?: string; level?: string; yes?: boolean }\n): Promise<void> {\n // Phase 1: ensureRepoAndScan (discover dynamic plugins + enrich metadata)\n const repoManager = createRepositoryManager();\n const updateSpinner = createSpinner(t(\"update_updating\") + \"...\");\n updateSpinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepoAndScan();\n updateSpinner.succeed(t(\"install_repo_ready\"));\n } catch (error) {\n updateSpinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n // Phase 2: scanInstalled (now includes dynamically discovered plugins)\n const installed = scanInstalled();\n\n let targets: UpdateTarget[] = [];\n\n if (pluginNames.length === 0) {\n if (installed.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n logger.info(t(\"update_install_hint\").replace(\"{cmd}\", chalk.cyan(\"install-helper install <plugin>\")));\n return;\n }\n targets = installed.map((p) => ({ pluginId: p.id, tool: p.tool, level: p.level }));\n } else {\n let defaultTool: AITool | undefined;\n let defaultLevel: InstallLevel | undefined;\n\n if (options.tool) {\n defaultTool = validateTool(options.tool);\n }\n if (options.level) {\n defaultLevel = validateLevel(options.level);\n }\n\n for (const name of pluginNames) {\n const plugin = findPlugin(name);\n if (!plugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n continue;\n }\n\n const installedForPlugin = installed.filter((p) => p.id === plugin.id);\n\n if (installedForPlugin.length > 0) {\n for (const inst of installedForPlugin) {\n if (defaultTool && inst.tool !== defaultTool) continue;\n if (defaultLevel && inst.level !== defaultLevel) continue;\n targets.push({ pluginId: plugin.id, tool: inst.tool, level: inst.level });\n }\n } else {\n logger.warn(`${plugin.displayName} ${t(\"error_not_installed\")}, ${t(\"update_skipped\")}`);\n }\n }\n }\n\n if (targets.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n return;\n }\n\n // Phase 3: reinstall each target\n const allPlugins = getAllPlugins();\n const results = [];\n const total = targets.length;\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n const plugin = allPlugins.find((p) => p.id === target.pluginId);\n const displayName = plugin?.displayName || target.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: target.pluginId,\n tool: target.tool,\n level: target.level,\n repoPath,\n yes: options.yes,\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 inst = installed.find((p) => p.id === plugin.id);\n const isInstalled = !!inst;\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\") + \":\")} ${inst ? inst.skillsCount : plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${inst ? inst.agentsCount : plugin.agents}`);\n console.log(` ${chalk.dim(t(\"info_aliases\") + \":\")} ${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(` ${t(\"lang_supported\")}`));\n console.log(chalk.dim(` ${t(\"lang_usage\")}`));\n console.log();\n return;\n }\n\n if (action === \"set\") {\n if (!value) {\n console.log(chalk.red(` ${t(\"lang_specify\")}`));\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(` ${t(\"lang_unknown_action\")}: ${action}`));\n console.log(chalk.dim(` ${t(\"lang_supported_actions\")}`));\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\";\nimport { t } from \"./utils/i18n.js\";\n\nfunction isExitError(error: any): boolean {\n if (!error) return false;\n return (\n error.name === \"ExitPromptError\" ||\n error.message?.includes(\"force closed\") ||\n error.message?.includes(\"SIGINT\") ||\n error.constructor?.name === \"ExitPromptError\"\n );\n}\n\nfunction handleExit(error: any): void {\n if (isExitError(error)) {\n console.log(\"\\n\" + t(\"init_cancelled\"));\n process.exit(0);\n }\n}\n\nprocess.on(\"SIGINT\", () => {\n console.log(\"\\n\" + t(\"init_cancelled\"));\n process.exit(130);\n});\n\nprocess.on(\"uncaughtException\", (error: any) => {\n handleExit(error);\n throw error;\n});\n\nprocess.on(\"unhandledRejection\", (error: any) => {\n handleExit(error);\n process.exit(1);\n});\n\nconst program = createCLI();\nprogram.parse();\n"],"mappings":"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","names":["existsSync","join","join","existsSync","existsSync","homedir","join","existsSync","readFileSync","join","i","chalk","existsSync","unlinkSync","dirname","existsSync","readFileSync","join","chalk","choices","result","select","Separator","chalk","existsSync","mkdirSync","readFileSync","rmSync","join","dirname","fileURLToPath","execa","parseYaml","existsSync","readdirSync","readFileSync","mkdirSync","join","dirname","fileURLToPath","__filename","__dirname","existsSync","readFileSync","statSync","join","join","readFileSync","existsSync","statSync","installSkills","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","execa","existsSync","mkdirSync","rmSync","existsSync","join","basename","execa","existsSync","mkdirSync","readFileSync","unlinkSync","readdirSync","join","existsSync","readdirSync","unlinkSync","join","join","existsSync","readdirSync","unlinkSync","select","chalk","existsSync","mkdirSync","copyFileSync","writeFileSync","rmSync","join","execa","join","existsSync","basename","execa","existsSync","mkdirSync","symlinkSync","readdirSync","rmSync","realpathSync","readlinkSync","cpSync","join","dirname","select","Separator","chalk","join","existsSync","mkdirSync","realpathSync","readlinkSync","symlinkSync","cpSync","readdirSync","rmSync","Separator","select","chalk","action","dirname","chalk","Table","existsSync","readFileSync","join","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","join","chalk","join","confirm","chalk","scanSpinner","tool","level","existsSync","unlinkSync","readdirSync","readFileSync","basename","join","chalk","select","checkbox","Separator","confirm","chalk","confirm","Separator","select","stepLevel","checkbox","configRoot","join","existsSync","readFileSync","basename","unlinkSync","readdirSync","chalk","chalk","existsSync","readdirSync","join","chalk","join","existsSync","readdirSync","chalk","readFileSync","existsSync","fileURLToPath","dirname","join","__filename","__dirname","program"]}
1
+ {"version":3,"sources":["../src/utils/fs-helpers.ts","../src/embedded-plugins.json","../src/core/registry.ts","../src/locales/zh_CN.json","../src/locales/en_US.json","../src/utils/i18n.ts","../src/utils/paths.ts","../src/core/detector.ts","../src/core/manifest.ts","../src/ui/theme.ts","../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/config.ts","../src/utils/constants.ts","../src/ui/wizard.ts","../src/cli.ts","../src/commands/init.ts","../src/core/repository.ts","../src/core/scanner.ts","../src/core/skill-registry.ts","../src/core/metadata-sync.ts","../src/core/installer.ts","../src/core/record.ts","../src/core/backup.ts","../src/ui/backup-prompts.ts","../src/core/plugin-installer.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 { lstatSync, statSync, unlinkSync, rmSync } from \"fs\";\n\nexport function isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nexport function isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function removePath(p: string): void {\n try {\n const stat = lstatSync(p);\n if (stat.isDirectory()) {\n rmSync(p, { recursive: true, force: true });\n } else {\n unlinkSync(p);\n }\n } catch {\n // path doesn't exist, nothing to remove\n }\n}\n","[\n {\n \"id\": \"ops-direct-invoke\",\n \"dir\": \"plugins-official/ops-direct-invoke\",\n \"displayName\": \"AscendC Kernel 直调\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"ops-direct\",\n \"ascendc-direct\",\n \"direct\",\n \"kernel\"\n ],\n \"skills\": 20,\n \"agents\": 4,\n \"description\": \"Ascend C 直调全流程:环境→设计→开发→审查→性能验收\",\n \"version\": \"1.2.4\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-tiling-design\",\n \"npu-arch\",\n \"ascendc-api-best-practices\",\n \"ascendc-regbase-best-practice\",\n \"ascendc-blaze-best-practice\",\n \"ops-precision-standard\",\n \"ascendc-docs-search\",\n \"ascendc-env-check\",\n \"ascendc-precision-debug\",\n \"ops-profiling\",\n \"ascendc-direct-invoke-template\",\n \"torch-ascendc-op-extension\",\n \"ascendc-runtime-debug\",\n \"ascendc-crash-debug\",\n \"ascendc-code-review\",\n \"ascendc-mc2-best-practice\"\n ]\n },\n {\n \"dir\": \"infra\",\n \"skills\": [\n \"gitcode-toolkit\",\n \"gitcode-pr-handler\",\n \"gitcode-issue-gen\",\n \"gitcode-issue-handler\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-kernel-architect\",\n \"ascendc-kernel-design-reviewer\",\n \"ascendc-kernel-developer\",\n \"ascendc-kernel-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/ops-direct-invoke/asc-devkit\",\n \"configRootLink\": false\n }\n ]\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\": [\n \"flash\",\n \"kernel-flash\"\n ],\n \"skills\": 7,\n \"agents\": 1,\n \"description\": \"从数学公式或代码片段快速构建并验证 Ascend NPU 核函数\",\n \"version\": \"1.2.2\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"plugins-official/ops-direct-invoke-flash/skills\",\n \"skills\": [\n \"ops-direct-invoke-flash\"\n ]\n },\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-st-design\",\n \"ascendc-whitebox-design\"\n ]\n },\n {\n \"dir\": \"infra\",\n \"skills\": [\n \"gitcode-toolkit\",\n \"gitcode-pr-handler\",\n \"gitcode-issue-gen\",\n \"gitcode-issue-handler\"\n ]\n }\n ],\n \"installAgents\": [\n \"ops-direct-invoke-flash-reviewer\"\n ]\n },\n {\n \"id\": \"ops-registry-invoke\",\n \"dir\": \"plugins-official/ops-registry-invoke\",\n \"displayName\": \"AscendC 算子注册调用\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"ops-registry\",\n \"ascendc-registry\",\n \"registry\"\n ],\n \"skills\": 28,\n \"agents\": 3,\n \"description\": \"生产级 ACLNN 注册算子全流程:代码→UT/ST→上库\",\n \"version\": \"1.2.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-blaze-best-practice\",\n \"ascendc-api-best-practices\",\n \"ascendc-code-review\",\n \"ascendc-crash-debug\",\n \"ascendc-direct-invoke-template\",\n \"ascendc-docs-gen\",\n \"ascendc-docs-search\",\n \"ascendc-env-check\",\n \"npu-arch\",\n \"ascendc-performance-best-practices\",\n \"ascendc-precision-debug\",\n \"ascendc-regbase-best-practice\",\n \"ascendc-registry-invoke-template\",\n \"ascendc-runtime-debug\",\n \"ascendc-st-design\",\n \"ascendc-tiling-design\",\n \"ascendc-ut-develop\",\n \"ascendc-whitebox-design\",\n \"ops-precision-standard\",\n \"ops-profiling\",\n \"ops-spec-gen\",\n \"ascendc-perf-optimize\",\n \"ops-simulator\"\n ]\n },\n {\n \"dir\": \"infra\",\n \"skills\": [\n \"gitcode-toolkit\",\n \"gitcode-pr-handler\",\n \"gitcode-issue-gen\",\n \"gitcode-issue-handler\"\n ]\n },\n {\n \"dir\": \"plugins-official/ops-registry-invoke\",\n \"skills\": [\n {\n \"name\": \"workflow\",\n \"as\": \"ops-registry-invoke-workflow\"\n }\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-ops-architect\",\n \"ascendc-ops-developer\",\n \"ascendc-ops-tester\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/ops-registry-invoke/asc-devkit\",\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"catlass-op-generator\",\n \"dir\": \"plugins-official/catlass-op-generator\",\n \"displayName\": \"Catlass 算子直调\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"catlass\"\n ],\n \"skills\": 14,\n \"agents\": 3,\n \"description\": \"Catlass 模板拼装 GEMM/Matmul/Epilogue 算子开发\",\n \"version\": \"1.0.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"catlass-op-design\",\n \"catlass-op-develop\",\n \"catlass-op-perf-tune\",\n \"ascendc-tiling-design\",\n \"npu-arch\",\n \"ascendc-api-best-practices\",\n \"ops-precision-standard\",\n \"ascendc-docs-search\",\n \"ascendc-env-check\",\n \"ascendc-precision-debug\",\n \"ops-profiling\",\n \"ascendc-runtime-debug\",\n \"ascendc-code-review\",\n \"torch-ascendc-op-extension\"\n ]\n }\n ],\n \"installAgents\": [\n \"catlass-op-architect\",\n \"catlass-op-generator\",\n \"catlass-op-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/catlass-op-generator/asc-devkit\",\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"model-infer-sota-approach\",\n \"dir\": \"plugins-official/model-infer-sota-approach\",\n \"displayName\": \"NPU 推理 SOTA 优化\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"sota\",\n \"sota-approach\",\n \"model-infer-sota\"\n ],\n \"skills\": 14,\n \"agents\": 6,\n \"description\": \"NPU 推理 baseline 之上 profiling 驱动的探索式优化编排(Plan/round 自循环,与 model-infer-optimize 前后衔接)\",\n \"version\": \"1.0.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"model\",\n \"skills\": [\n \"model-infer-migrator\",\n \"model-infer-parallel-analysis\",\n \"model-infer-parallel-impl\",\n \"model-infer-kvcache\",\n \"model-infer-fusion\",\n \"model-infer-quantization\",\n \"model-infer-graph-mode\",\n \"model-infer-precision-debug\",\n \"model-infer-runtime-debug\",\n \"model-infer-multi-stream\",\n \"model-infer-prefetch\",\n \"model-infer-superkernel\",\n \"model-infer-profiling\",\n \"model-infer-perf-breakdown\"\n ]\n }\n ],\n \"installAgents\": [\n \"model-infer-sota-scenario\",\n \"model-infer-sota-profiling-instrumenter\",\n \"model-infer-sota-profile-analyzer\",\n \"model-infer-sota-candidate\",\n \"model-infer-sota-implementer\",\n \"model-infer-sota-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/cann-recipes-infer.git\",\n \"dir\": \"plugins-official/model-infer-sota-approach/cann-recipes-infer\",\n \"depth\": 1,\n \"configRootLink\": true\n }\n ]\n },\n {\n \"id\": \"model-infer-optimize\",\n \"dir\": \"plugins-official/model-infer-optimize\",\n \"displayName\": \"NPU 推理优化\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"model-infer\",\n \"infer\",\n \"inference\"\n ],\n \"skills\": 14,\n \"agents\": 3,\n \"description\": \"NPU 模型推理端到端优化(并行/KVCache/融合/量化/图模式/多流/SuperKernel)\",\n \"version\": \"1.0.5\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"model\",\n \"skills\": [\n \"model-infer-migrator\",\n \"model-infer-parallel-analysis\",\n \"model-infer-parallel-impl\",\n \"model-infer-kvcache\",\n \"model-infer-fusion\",\n \"model-infer-quantization\",\n \"model-infer-graph-mode\",\n \"model-infer-precision-debug\",\n \"model-infer-runtime-debug\",\n \"model-infer-multi-stream\",\n \"model-infer-prefetch\",\n \"model-infer-superkernel\",\n \"model-infer-profiling\",\n \"model-infer-perf-breakdown\"\n ]\n }\n ],\n \"installAgents\": [\n \"model-infer-analyzer\",\n \"model-infer-implementer\",\n \"model-infer-reviewer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/cann-recipes-infer.git\",\n \"dir\": \"plugins-official/model-infer-optimize/cann-recipes-infer\",\n \"depth\": 1,\n \"configRootLink\": true\n }\n ]\n },\n {\n \"id\": \"pypto-op-orchestrator\",\n \"dir\": \"plugins-official/pypto-op-orchestrator\",\n \"displayName\": \"PyPTO 算子开发\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"pypto\",\n \"pytorch\"\n ],\n \"skills\": 8,\n \"agents\": 3,\n \"description\": \"PyPTO Python API 算子全流程开发,覆盖需求理解、API 探索、实现与调优\",\n \"version\": \"1.1.9\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"pypto-intent-understand\",\n \"pypto-api-explore\",\n \"pypto-op-design\",\n \"pypto-op-develop\",\n \"pypto-precision-debug\",\n \"pypto-precision-compare\",\n \"pypto-op-perf-tune\",\n \"pypto-golden-generate\"\n ]\n }\n ],\n \"installAgents\": [\n \"pypto-op-analyst\",\n \"pypto-op-developer\",\n \"pypto-op-perf-tuner\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/pypto.git\",\n \"dir\": \"plugins-official/pypto-op-orchestrator/pypto\",\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"tilelang-op-orchestrator\",\n \"dir\": \"plugins-official/tilelang-op-orchestrator\",\n \"displayName\": \"TileLang 算子开发\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"tilelang\"\n ],\n \"skills\": 9,\n \"agents\": 3,\n \"description\": \"TileLang Python DSL + @tilelang.jit 算子开发(支持 Developer/Expert 双模式)\",\n \"version\": \"1.1.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"tilelang-api-best-practices\",\n \"tilelang-env-check\",\n \"tilelang-op-design\",\n \"tilelang-op-develop\",\n \"tilelang-op-test-design\",\n \"tilelang-perf-optimization\",\n \"tilelang-programming-model-guide\",\n \"tilelang-review\",\n \"tilelang-submodule-pull\"\n ]\n }\n ],\n \"installAgents\": [\n \"tilelang-op-analyst\",\n \"tilelang-op-developer\",\n \"tilelang-op-perf-tuner\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://github.com/tile-ai/tilelang-ascend.git\",\n \"dir\": \"plugins-official/tilelang-op-orchestrator/tilelang-ascend\",\n \"depth\": 1,\n \"recursive\": true,\n \"configRootLink\": false\n }\n ]\n },\n {\n \"id\": \"triton-op-generator\",\n \"dir\": \"plugins-official/triton-op-generator\",\n \"displayName\": \"Triton 算子开发\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"triton\"\n ],\n \"skills\": 8,\n \"agents\": 0,\n \"description\": \"Triton-Ascend 算子 6 阶段自动生成与优化(描述→代码→验证→优化)\",\n \"version\": \"1.0.2\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"triton-task-extractor\",\n \"triton-op-designer\",\n \"triton-op-coding\",\n \"triton-op-verifier\",\n \"triton-latency-optimizer\",\n \"npu-arch\",\n \"triton-precision-debug\",\n \"triton-simulator-optimizer\"\n ]\n }\n ],\n \"installAgents\": []\n },\n {\n \"id\": \"torch-compile\",\n \"dir\": \"plugins-official/torch-compile\",\n \"displayName\": \"torch.compile 图模式\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"torch\",\n \"compile\",\n \"graph\"\n ],\n \"skills\": 6,\n \"agents\": 1,\n \"description\": \"NPU 图模式 npugraph_ex 配置、脚本迁移、编译诊断与自定义算子入图\",\n \"version\": \"1.0.4\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": true,\n \"installSkills\": [\n {\n \"dir\": \"graph\",\n \"skills\": [\n \"torch-npugraph-ex-knowledge\",\n \"torch-npugraph-ex-template\",\n \"torch-npugraph-ex-dfx-triage\",\n \"torch-npugraph-ex-compile-error-diagnosis\",\n \"torch-npugraph-ex-runtime-error-diagnosis\",\n \"torch-custom-ops-guide\"\n ]\n }\n ],\n \"installAgents\": [\n \"torch-npugraph-ex\"\n ]\n },\n {\n \"id\": \"ops-code-reviewer\",\n \"dir\": \"plugins-official/ops-code-reviewer\",\n \"displayName\": \"代码检视\",\n \"script\": \"init.sh\",\n \"aliases\": [\n \"code-review\",\n \"reviewer\",\n \"review\"\n ],\n \"skills\": 5,\n \"agents\": 2,\n \"description\": \"Ascend C 算子代码 4 阶段全量检视(主 Agent 编排 + 子 Agent 并行检视)\",\n \"version\": \"1.1.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-code-review\",\n \"ascendc-docs-search\",\n \"ascendc-task-focus\",\n \"ascendc-api-best-practices\",\n \"npu-arch\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-code-summarizer\",\n \"ascendc-ops-reviewer\"\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 { readdirSync, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport type { PluginEntry } from \"../types/index.js\";\nimport { isDirectory } from \"../utils/fs-helpers.js\";\nimport embeddedPlugins from \"../embedded-plugins.json\" with { type: \"json\" };\n\nfunction loadPlugins(): PluginEntry[] {\n const plugins = [...embeddedPlugins] as PluginEntry[];\n plugins.sort((a, b) =>\n a.displayName < b.displayName ? -1 : a.displayName > b.displayName ? 1 : 0\n );\n return plugins;\n}\n\nexport let PLUGIN_REGISTRY: PluginEntry[] = loadPlugins();\n\nconst PLUGIN_DIRS = [\"plugins-official\", \"plugins-community\"];\n\nexport function mergeDynamicPlugins(repoPath: string): void {\n if (!existsSync(repoPath)) return;\n\n const existingIds = new Set(PLUGIN_REGISTRY.map((p) => p.id));\n const dynamic: PluginEntry[] = [];\n\n for (const pluginDir of PLUGIN_DIRS) {\n const parent = join(repoPath, pluginDir);\n if (!existsSync(parent)) continue;\n\n let entries: string[] = [];\n try {\n entries = readdirSync(parent);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const pluginPath = join(parent, entry);\n if (!isDirectory(pluginPath)) continue;\n if (entry === \"install-helper\") continue;\n\n const initSh = join(pluginPath, \"init.sh\");\n if (!existsSync(initSh)) continue;\n\n const pluginId = entry;\n if (existingIds.has(pluginId)) continue;\n\n dynamic.push({\n id: pluginId,\n dir: `${pluginDir}/${entry}`,\n displayName: entry,\n script: \"init.sh\",\n aliases: [],\n skills: 0,\n agents: 0,\n description: \"\",\n });\n existingIds.add(pluginId);\n }\n }\n\n if (dynamic.length > 0) {\n PLUGIN_REGISTRY = [...PLUGIN_REGISTRY, ...dynamic].sort((a, b) =>\n a.displayName < b.displayName ? -1 : a.displayName > b.displayName ? 1 : 0\n );\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 prefixMatches = PLUGIN_REGISTRY.filter((p) => p.id.startsWith(normalized));\n if (prefixMatches.length === 1) return prefixMatches[0];\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 \"wizard_title\": \"CANNBot Install Helper\",\n \"wizard_detect\": \"正在检测已安装的 AI 编程工具...\",\n \"wizard_select_tool\": \"选择 AI 编程工具\",\n \"wizard_select_level\": \"选择安装位置\",\n \"wizard_select_plugin\": \"选择要安装的插件\",\n \"wizard_confirm\": \"确认安装\",\n \"wizard_detected_tool\": \"检测到\",\n \"wizard_confirm_tool\": \"使用\",\n \"wizard_last_used\": \"上次使用\",\n \"wizard_already_installed\": \"已安装\",\n \"install_repo_ready\": \"仓库就绪\",\n \"install_progress\": \"正在安装\",\n \"install_done\": \"安装完成\",\n \"install_success\": \"成功\",\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_updating\": \"正在更新\",\n \"update_done\": \"更新完成\",\n \"update_no_plugins\": \"暂无已安装的插件\",\n \"update_skipped\": \"已跳过\",\n \"doctor_title\": \"CANNBot Doctor\",\n \"doctor_tools\": \"AI 工具\",\n \"doctor_plugins\": \"已安装插件\",\n \"doctor_links\": \"链接完整性\",\n \"doctor_config\": \"配置文件\",\n \"doctor_result\": \"结果\",\n \"doctor_fix_cleaning\": \"清理失效链接\",\n \"doctor_fix_rebuilding\": \"重建目录\",\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_description\": \"描述\",\n \"status_installed\": \"已装\",\n \"status_not_installed\": \"未装\",\n \"error_tool_not_found\": \"未检测到任何 AI 编程工具\",\n \"error_plugin_not_found\": \"未找到插件\",\n \"error_invalid_tool\": \"暂不支持的 AI 工具: {tool}\\n支持的工具: {tools}\",\n \"error_invalid_level\": \"暂不支持的安装级别: {level}\\n支持的级别: {levels}\",\n \"error_skill_not_found\": \"未在注册表中找到 Skill\",\n \"error_source_not_found\": \"未找到源文件: {path}\",\n \"error_script_not_found\": \"未找到安装脚本: {path}\",\n \"error_unknown\": \"未知错误\",\n \"error_not_installed\": \"未安装\",\n \"error_no_shell\": \"未找到 bash 或 sh,无法执行安装脚本。请安装 Git Bash 或 WSL\",\n \"error_symlink_windows\": \"创建符号链接失败,请以管理员身份运行或开启 Windows 开发者模式\",\n \"skill_select_category\": \"选择 Skill 类别\",\n \"skill_select_items\": \"选择要安装的 Skills\",\n \"skill_already_installed\": \"已安装\",\n \"skill_select_all\": \"全选所有 Skills(共 {count} 个)\",\n \"skill_select_all_category\": \"全选当前类别\",\n \"skill_continue_or_install\": \"已选 {count} 个 Skills,请选择操作\",\n \"skill_continue_select\": \"继续选择其他类别\",\n \"skill_confirm_install_count\": \"确认安装(已选 {count} 个 Skills)\",\n \"skill_all_install_progress\": \"正在安装全部 {count} 个 Skills...\",\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 \"lang_supported\": \"支持的语言: zh_CN, en_US\",\n \"lang_usage\": \"用法: install-helper lang set <language>\",\n \"lang_specify\": \"请指定语言: install-helper lang set zh_CN\",\n \"lang_unknown_action\": \"未知操作\",\n \"lang_supported_actions\": \"支持的操作: show, set\",\n \"info_aliases\": \"别名\",\n \"uninstall_not_found\": \"未找到\",\n \"uninstall_no_record\": \"未找到安装记录,可能未安装或安装记录已损坏\",\n \"uninstall_no_record_hint\": \"如需强制清理,请手动删除 .opencode/ 或 .claude/ 目录中的相关文件\",\n \"uninstall_in_progress\": \"正在卸载\",\n \"uninstall_summary_format\": \"{name}(移除 {files} 个文件,{dirs} 个目录)\",\n \"uninstall_files_gone\": \"的文件已不存在,已清理安装记录\",\n \"uninstall_skills_in_progress\": \"正在卸载\",\n \"init_pkg_dir_warn\": \"当前目录看起来是 install-helper 包目录\",\n \"init_pkg_dir_hint\": \"请在你的项目目录中运行此命令,而不是在 install-helper 安装目录中\",\n \"init_pkg_dir_example\": \"示例:cd ~/my-project && install-helper\",\n \"init_cancelled\": \"已取消安装\",\n \"backup_detected\": \"检测到当前目录已安装插件\",\n \"backup_current\": \"当前安装\",\n \"backup_installing\": \"即将安装\",\n \"backup_overwrite_warning\": \"继续安装将覆盖现有的 AGENTS.md 配置文件。\",\n \"backup_auto_create\": \"系统会自动创建备份,以便后续恢复。\",\n \"backup_overwrite\": \"覆盖安装(自动备份)\",\n \"backup_cancel\": \"取消安装\",\n \"backup_restore_prompt\": \"检测到备份配置,是否恢复?\",\n \"backup_restore\": \"恢复\",\n \"backup_only_uninstall\": \"仅卸载(不恢复)\",\n \"backup_select_action\": \"请选择操作\",\n \"backup_restore_success\": \"已恢复配置\",\n \"backup_created\": \"已创建备份\",\n \"backup_failed\": \"备份创建失败,安装已中止以保护现有配置\",\n \"loading_skills_list\": \"正在加载 Skills 列表...\",\n \"loading_skills_list_complete\": \"Skills 列表加载完成\",\n \"loading_plugin_data\": \"正在加载插件数据...\",\n \"loading_plugin_data_complete\": \"插件数据加载完成\",\n \"loading_skills_list_failed\": \"Skills 列表加载失败,将使用内置数据\",\n \"repo_pull_failed\": \"无法拉取最新内容,使用缓存数据\",\n \"repo_cloning\": \"首次使用,正在克隆 cannbot-skills 仓库...\",\n \"repo_clone_failed\": \"克隆仓库失败: {error}\\n请手动克隆: git clone {url} {dir}\",\n \"external_repo_update_failed\": \"外部仓库更新失败,使用现有版本: {dir}\",\n \"config_corrupted\": \"配置文件已损坏,使用默认配置\",\n \"record_corrupted\": \"安装记录已损坏:{file}\",\n \"skill_record_corrupted\": \"Skill 安装记录已损坏\",\n \"record_write_failed\": \"安装记录写入失败,卸载时可能无法自动清理\",\n \"install_config_failed\": \"配置文件安装失败: {error}\",\n \"install_clone_failed\": \"git clone 失败: {url},请手动克隆: git clone {url} {dir}\",\n \"install_link_config_failed\": \"链接 {name} 到配置目录失败\",\n \"install_link_project_failed\": \"链接 {name} 到项目目录失败\",\n \"install_link_workflows_failed\": \"链接 workflows 到配置目录失败\",\n \"install_skill_source_not_found\": \"Skill 源目录未找到: {dir}\",\n \"install_skill_not_found\": \"Skill 未找到: {name} (在 {dir})\",\n \"install_skill_failed\": \"Skill 安装失败: {name}\",\n \"install_agent_not_found\": \"Agent 未找到: {name}\",\n \"install_agent_failed\": \"Agent 安装失败: {name}\",\n \"install_no_skill_selected\": \"未选择任何 Skill\",\n \"install_to\": \"安装到\",\n \"start_to_use\": \"启动 {tool} 即可使用\",\n \"wizard_step_1_title\": \"[1/4] 选择 AI 编程工具\",\n \"wizard_step_2_title\": \"[2/4] 选择安装位置\",\n \"wizard_step_3_title\": \"[3/4] 选择要安装的插件\",\n \"wizard_step_4_title\": \"[4/4] 确认安装\",\n \"wizard_step_3_skill_title\": \"[3/4] 选择 Skill 类别\",\n \"wizard_step_4_skill_title\": \"[4/4] 选择要安装的 Skills — {category}\",\n \"install_level_project\": \"安装到当前目录(推荐,仅当前项目可用)\",\n \"install_level_global\": \"安装到全局(所有项目共享)\",\n \"wizard_select_mode_title\": \"选择安装类型\",\n \"skill_count_format\": \"{count} 个 Skills\",\n \"result_success_format\": \"{count} 成功\",\n \"result_failed_format\": \"{count} 失败\",\n \"uninstall_remove_label\": \"移除\",\n \"uninstall_clean_empty_dir\": \"清理空目录\",\n \"uninstall_skill_not_installed\": \"未安装\",\n \"available_plugins\": \"可用插件\",\n \"available_skills\": \"可用 Skills\",\n \"skill_total_count\": \"共 {count} 个 Skills\",\n \"wizard_confirm_install_format\": \"即将安装 {count} 个插件到 {tool}({level} 级别):\",\n \"wizard_install_path\": \"安装路径\",\n \"update_install_hint\": \"使用 {cmd} 安装插件\",\n \"hint_select_move\": \"移动\",\n \"hint_select_space\": \"空格\",\n \"hint_select_check\": \"勾选\",\n \"hint_select_confirm\": \"确认\",\n \"hint_checkbox_suffix\": \"不选按回车可返回\",\n \"doctor_not_installed\": \"未安装\",\n \"doctor_links_valid\": \"{count} 个软链接均有效\",\n \"doctor_broken_links\": \"{count} 个失效链接\",\n \"doctor_fixed\": \"已清理 {count} 个失效链接\",\n \"doctor_not_exist\": \"不存在\",\n \"doctor_created\": \"已创建 {path}\",\n \"doctor_config_exists\": \"存在\",\n \"doctor_config_not_exist\": \"不存在\",\n \"doctor_result_with_fix\": \"{warnings} 个警告, {fixes} 项已修复\",\n \"doctor_result_without_fix\": \"{warnings} 个警告\",\n \"count_suffix\": \"个\",\n \"try_prompt\": \"帮我开发一个 Abs 算子\",\n \"uninstall_interactive_title\": \"管理已安装的内容 — 勾选要卸载的项\",\n \"uninstall_select_type\": \"选择要卸载的类型\",\n \"uninstall_type_skill\": \"卸载 Skills\",\n \"uninstall_type_plugin\": \"卸载 Plugins\",\n \"uninstall_checkbox_hint\": \"勾选=保留,取消勾选=卸载\",\n \"uninstall_checkbox_hint_select\": \"勾选要卸载的项,不选按回车可返回\",\n \"uninstall_uncheck_all\": \"卸载全部\",\n \"uninstall_confirm_count\": \"确认卸载({count} 个将卸载)\",\n \"uninstall_no_installed\": \"没有已安装的 Skills 或 Plugins\",\n \"uninstall_no_installed_skills\": \"没有已安装的 Skills\",\n \"uninstall_no_installed_plugins\": \"没有已安装的 Plugins\",\n \"uninstall_nothing_to_uninstall\": \"没有需要卸载的项目\",\n \"uninstall_all_progress\": \"正在卸载全部 {count} 个 Skills...\",\n \"uninstall_all_summary\": \"即将卸载 {skills} 个 Skills 和 {plugins} 个 Plugins:\",\n \"uninstall_all_done\": \"批量卸载完成\",\n \"uninstall_recent_no_history\": \"无安装批次记录,无法识别最近安装的 Skills\",\n \"uninstall_recent_progress\": \"即将卸载最近安装的 {count} 个 Skills:\",\n \"uninstall_plugin_batch_progress\": \"正在批量卸载 {count} 个插件...\",\n \"uninstall_plugin_batch_skip_restore\": \"批量卸载模式:跳过备份恢复\",\n \"uninstall_confirm_prompt\": \"即将卸载 {count} 项,确认?\",\n \"uninstall_select_items\": \"管理已安装的 Skills(空格切换,回车确认)\",\n \"uninstall_select_plugins\": \"管理已安装的 Plugins(空格切换,回车确认)\",\n \"uninstall_select_category\": \"选择要管理的 Skill 类别\",\n \"uninstall_uncheck_all_category\": \"卸载本类别全部\",\n \"uninstall_continue_or_confirm\": \"已标记 {count} 个待卸载,请选择操作\",\n \"uninstall_marked_count\": \"已标记 {count} 个待卸载\",\n \"uninstall_uncategorized\": \"未分类\"\n}\n","{\n \"wizard_title\": \"CANNBot Install Helper\",\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_plugin\": \"Select a scenario 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_repo_ready\": \"Repository ready\",\n \"install_progress\": \"Installing\",\n \"install_done\": \"Installation complete\",\n \"install_success\": \"success\",\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_updating\": \"Updating\",\n \"update_done\": \"Update complete\",\n \"update_no_plugins\": \"No installed plugins\",\n \"update_skipped\": \"skipped\",\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_cleaning\": \"Cleaning broken links\",\n \"doctor_fix_rebuilding\": \"Rebuilding directories\",\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_description\": \"Description\",\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_invalid_tool\": \"Unsupported AI tool: {tool}\\nSupported tools: {tools}\",\n \"error_invalid_level\": \"Unsupported install level: {level}\\nSupported levels: {levels}\",\n \"error_skill_not_found\": \"Skill not found in registry\",\n \"error_source_not_found\": \"Source not found: {path}\",\n \"error_script_not_found\": \"Script not found: {path}\",\n \"error_unknown\": \"Unknown error\",\n \"error_not_installed\": \"Not installed\",\n \"error_no_shell\": \"bash or sh not found, cannot execute install script. Please install Git Bash or WSL\",\n \"error_symlink_windows\": \"Failed to create symlink, please run as administrator or enable Windows Developer Mode\",\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_select_all\": \"Select ALL Skills ({count} total)\",\n \"skill_select_all_category\": \"Select all in this category\",\n \"skill_continue_or_install\": \"{count} Skills selected, choose an action\",\n \"skill_continue_select\": \"Continue selecting from other categories\",\n \"skill_confirm_install_count\": \"Install now ({count} Skills selected)\",\n \"skill_all_install_progress\": \"Installing all {count} Skills...\",\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 \"lang_supported\": \"Supported languages: zh_CN, en_US\",\n \"lang_usage\": \"Usage: install-helper lang set <language>\",\n \"lang_specify\": \"Please specify language: install-helper lang set zh_CN\",\n \"lang_unknown_action\": \"Unknown action\",\n \"lang_supported_actions\": \"Supported actions: show, set\",\n \"info_aliases\": \"Aliases\",\n \"uninstall_not_found\": \"Not found\",\n \"uninstall_no_record\": \"No install record found, may not be installed or record is corrupted\",\n \"uninstall_no_record_hint\": \"For manual cleanup, delete related files in .opencode/ or .claude/ directory\",\n \"uninstall_in_progress\": \"Uninstalling\",\n \"uninstall_summary_format\": \"{name} (removed {files} files, {dirs} directories)\",\n \"uninstall_files_gone\": \" files no longer exist, install record cleaned\",\n \"uninstall_skills_in_progress\": \"Uninstalling\",\n \"init_pkg_dir_warn\": \"Current directory appears to be the install-helper package directory\",\n \"init_pkg_dir_hint\": \"Please run this command in your project directory, not in the install-helper package directory\",\n \"init_pkg_dir_example\": \"Example: cd ~/my-project && install-helper\",\n \"init_cancelled\": \"Installation cancelled\",\n \"backup_detected\": \"Plugin already installed in current directory\",\n \"backup_current\": \"Currently installed\",\n \"backup_installing\": \"About to install\",\n \"backup_overwrite_warning\": \"Continuing will overwrite existing AGENTS.md configuration.\",\n \"backup_auto_create\": \"System will automatically create backup for future restoration.\",\n \"backup_overwrite\": \"Overwrite (auto backup)\",\n \"backup_cancel\": \"Cancel installation\",\n \"backup_restore_prompt\": \"Backup configuration detected, restore?\",\n \"backup_restore\": \"Restore\",\n \"backup_only_uninstall\": \"Uninstall only (no restore)\",\n \"backup_select_action\": \"Please select an action\",\n \"backup_restore_success\": \"Configuration restored\",\n \"backup_created\": \"Backup created\",\n \"backup_failed\": \"Backup creation failed, installation aborted to protect existing config\",\n \"loading_skills_list\": \"Loading Skills list...\",\n \"loading_skills_list_complete\": \"Skills list loaded\",\n \"loading_plugin_data\": \"Loading plugin data...\",\n \"loading_plugin_data_complete\": \"Plugin data loaded\",\n \"loading_skills_list_failed\": \"Failed to load Skills list, using built-in data\",\n \"repo_pull_failed\": \"Failed to pull latest updates, using cached data\",\n \"repo_cloning\": \"First-time setup: cloning cannbot-skills repository...\",\n \"repo_clone_failed\": \"Failed to clone repository: {error}\\nClone manually: git clone {url} {dir}\",\n \"external_repo_update_failed\": \"External repo update failed, using existing version: {dir}\",\n \"config_corrupted\": \"Config file corrupted, using defaults\",\n \"record_corrupted\": \"Install record corrupted: {file}\",\n \"skill_record_corrupted\": \"Skill install record corrupted\",\n \"record_write_failed\": \"Install record write failed, uninstall may not work properly\",\n \"install_config_failed\": \"Failed to install config file: {error}\",\n \"install_clone_failed\": \"git clone failed: {url}, clone manually: git clone {url} {dir}\",\n \"install_link_config_failed\": \"Failed to link {name} to config directory\",\n \"install_link_project_failed\": \"Failed to link {name} to project directory\",\n \"install_link_workflows_failed\": \"Failed to link workflows to config directory\",\n \"install_skill_source_not_found\": \"Skill source not found: {dir}\",\n \"install_skill_not_found\": \"Skill not found: {name} in {dir}\",\n \"install_skill_failed\": \"Failed to install skill: {name}\",\n \"install_agent_not_found\": \"Agent not found: {name}\",\n \"install_agent_failed\": \"Failed to install agent: {name}\",\n \"install_no_skill_selected\": \"No Skill selected\",\n \"install_to\": \"Install to\",\n \"start_to_use\": \"Start {tool} to use\",\n \"wizard_step_1_title\": \"[1/4] Select AI coding tool\",\n \"wizard_step_2_title\": \"[2/4] Select installation location\",\n \"wizard_step_3_title\": \"[3/4] Select plugins to install\",\n \"wizard_step_4_title\": \"[4/4] Confirm installation\",\n \"wizard_step_3_skill_title\": \"[3/4] Select Skill category\",\n \"wizard_step_4_skill_title\": \"[4/4] Select Skills to install — {category}\",\n \"install_level_project\": \"Install to current directory (recommended, current project only)\",\n \"install_level_global\": \"Install globally (all projects)\",\n \"wizard_select_mode_title\": \"Select installation type\",\n \"skill_count_format\": \"{count} Skills\",\n \"result_success_format\": \"{count} succeeded\",\n \"result_failed_format\": \"{count} failed\",\n \"uninstall_remove_label\": \"Removed\",\n \"uninstall_clean_empty_dir\": \"Cleaned empty directory\",\n \"uninstall_skill_not_installed\": \"Not installed\",\n \"available_plugins\": \"Available plugins\",\n \"available_skills\": \"Available Skills\",\n \"skill_total_count\": \"Total {count} Skills\",\n \"wizard_confirm_install_format\": \"About to install {count} plugins to {tool} ({level} level):\",\n \"wizard_install_path\": \"Install path\",\n \"update_install_hint\": \"Use {cmd} to install plugins\",\n \"hint_select_move\": \"Navigate\",\n \"hint_select_space\": \"Space\",\n \"hint_select_check\": \"Toggle\",\n \"hint_select_confirm\": \"Confirm\",\n \"hint_checkbox_suffix\": \"Press enter without selection to go back\",\n \"doctor_not_installed\": \"Not installed\",\n \"doctor_links_valid\": \"{count} symlinks all valid\",\n \"doctor_broken_links\": \"{count} broken links\",\n \"doctor_fixed\": \"Cleaned {count} broken links\",\n \"doctor_not_exist\": \"Does not exist\",\n \"doctor_created\": \"Created {path}\",\n \"doctor_config_exists\": \"Exists\",\n \"doctor_config_not_exist\": \"Does not exist\",\n \"doctor_result_with_fix\": \"{warnings} warnings, {fixes} fixed\",\n \"doctor_result_without_fix\": \"{warnings} warnings\",\n \"count_suffix\": \"\",\n \"try_prompt\": \"help me develop an Abs operator\",\n \"uninstall_interactive_title\": \"Manage installed items — check to uninstall\",\n \"uninstall_select_type\": \"Select type to uninstall\",\n \"uninstall_type_skill\": \"Uninstall Skills\",\n \"uninstall_type_plugin\": \"Uninstall Plugins\",\n \"uninstall_checkbox_hint\": \"Checked = keep, unchecked = uninstall\",\n \"uninstall_checkbox_hint_select\": \"Check items to uninstall, press enter without selection to go back\",\n \"uninstall_uncheck_all\": \"Uninstall all\",\n \"uninstall_confirm_count\": \"Confirm uninstall ({count} will be removed)\",\n \"uninstall_no_installed\": \"No installed Skills or Plugins\",\n \"uninstall_no_installed_skills\": \"No installed Skills\",\n \"uninstall_no_installed_plugins\": \"No installed Plugins\",\n \"uninstall_nothing_to_uninstall\": \"Nothing to uninstall\",\n \"uninstall_all_progress\": \"Uninstalling all {count} Skills...\",\n \"uninstall_all_summary\": \"About to uninstall {skills} Skills and {plugins} Plugins:\",\n \"uninstall_all_done\": \"Batch uninstall complete\",\n \"uninstall_recent_no_history\": \"No install batch history, cannot identify recently installed Skills\",\n \"uninstall_recent_progress\": \"About to uninstall {count} recently installed Skills:\",\n \"uninstall_plugin_batch_progress\": \"Batch uninstalling {count} plugins...\",\n \"uninstall_plugin_batch_skip_restore\": \"Batch mode: skipping backup restore\",\n \"uninstall_confirm_prompt\": \"About to uninstall {count} items, confirm?\",\n \"uninstall_select_items\": \"Manage installed Skills (space to toggle, enter to confirm)\",\n \"uninstall_select_plugins\": \"Manage installed Plugins (space to toggle, enter to confirm)\",\n \"uninstall_select_category\": \"Select Skill category to manage\",\n \"uninstall_uncheck_all_category\": \"Uninstall all in this category\",\n \"uninstall_continue_or_confirm\": \"{count} marked for uninstall, choose an action\",\n \"uninstall_marked_count\": \"{count} marked for uninstall\",\n \"uninstall_uncategorized\": \"Uncategorized\"\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 { readFileSync, existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport zhCN from \"../locales/zh_CN.json\" with { type: \"json\" };\nimport enUS from \"../locales/en_US.json\" with { type: \"json\" };\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ntype Messages = Record<string, string>;\n\nconst EMBEDDED_LOCALES: Record<string, Messages> = {\n zh_CN: zhCN as Messages,\n en_US: enUS as Messages,\n};\n\nfunction loadLocale(locale: string): Messages {\n const embedded = EMBEDDED_LOCALES[locale];\n if (embedded) return embedded;\n\n const localePath = join(__dirname, \"locales\", `${locale}.json`);\n if (existsSync(localePath)) {\n try {\n const content = readFileSync(localePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n }\n }\n\n const fallbackPath = join(__dirname, \"locales\", \"zh_CN.json\");\n if (existsSync(fallbackPath)) {\n try {\n const content = readFileSync(fallbackPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n }\n }\n\n return EMBEDDED_LOCALES.zh_CN || {};\n}\n\nlet currentLang: \"zh_CN\" | \"en_US\" = \"zh_CN\";\nlet messages: Messages = loadLocale(\"zh_CN\");\n\nexport function setLanguage(lang: \"zh_CN\" | \"en_US\"): void {\n currentLang = lang;\n messages = loadLocale(lang);\n}\n\nexport function t(key: string): string {\n return messages[key] !== undefined ? messages[key] : key;\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\";\nimport { t } from \"./i18n.js\";\n\nexport const VALID_TOOLS: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\", \"codearts\"];\nconst VALID_LEVELS: InstallLevel[] = [\"project\", \"global\"];\n\nexport function validateTool(tool: string): AITool {\n if (!VALID_TOOLS.includes(tool as AITool)) {\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n return tool as AITool;\n}\n\nexport function validateLevel(level: string): InstallLevel {\n if (!VALID_LEVELS.includes(level as InstallLevel)) {\n throw new Error(\n t(\"error_invalid_level\")\n .replace(\"{level}\", level)\n .replace(\"{levels}\", VALID_LEVELS.join(\", \"))\n );\n }\n return level as InstallLevel;\n}\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 case \"codearts\":\n return join(home, \".codeartsdoer\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\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 case \"codearts\":\n return join(baseDir, \".codeartsdoer\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n}\n\nexport function getConfigFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function getAgentsFileName(tool: AITool): string {\n return getConfigFileName(tool);\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 { 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, VALID_TOOLS } 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 whichCmd = process.platform === \"win32\" ? \"where\" : \"which\";\n const result = await execa(whichCmd, [cmd], { timeout: 5000 });\n return result.stdout.trim().split(\"\\n\")[0];\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\nasync function detectCodeArts(): Promise<DetectedTool | undefined> {\n const home = homedir();\n const configDir = join(home, \".codeartsdoer\");\n if (existsSync(configDir)) {\n return { name: \"codearts\", path: configDir };\n }\n return undefined;\n}\n\nexport async function detectTools(): Promise<DetectedTool[]> {\n const detectors = [\n detectOpenCode,\n detectClaude,\n detectTrae,\n detectCursor,\n detectCopilot,\n detectCodeArts,\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 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 codearts: \"CodeArts\",\n };\n return names[tool];\n}\n\nexport function getAllTools(): AITool[] {\n return VALID_TOOLS;\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, getAgentsFileName, VALID_TOOLS } from \"../utils/paths.js\";\nimport { getAllPlugins } from \"./registry.js\";\nimport { isSymlink } from \"../utils/fs-helpers.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[] = VALID_TOOLS;\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 // 验证实际文件是否存在\n if (!verifyPluginFilesExist(configRoot, manifest, tool, level)) {\n continue;\n }\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\nfunction verifyPluginFilesExist(configRoot: string, manifest: CannbotManifest, tool: AITool, level: InstallLevel): boolean {\n const skillsDir = join(configRoot, \"skills\");\n const agentsDir = join(configRoot, \"agents\");\n \n let hasAnyComponent = false;\n \n // 验证 skills\n if (manifest.installed_skills && manifest.installed_skills.length > 0) {\n const hasAnySkill = manifest.installed_skills.some((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\n });\n if (hasAnySkill) hasAnyComponent = true;\n }\n \n // 验证 agents\n if (manifest.installed_agents && manifest.installed_agents.length > 0) {\n const hasAnyAgent = manifest.installed_agents.some((agentId) => {\n const agentPath = join(agentsDir, agentId);\n const agentPathMd = join(agentsDir, agentId + \".md\");\n return existsSync(agentPath) || isSymlink(agentPath) ||\n existsSync(agentPathMd) || isSymlink(agentPathMd);\n });\n if (hasAnyAgent) hasAnyComponent = true;\n }\n \n // 验证配置文件(AGENTS.md / CLAUDE.md)\n const agentsFileName = getAgentsFileName(tool);\n const configFilePath = level === \"project\"\n ? join(configRoot, \"..\", agentsFileName)\n : join(configRoot, agentsFileName);\n if (existsSync(configFilePath) || isSymlink(configFilePath)) hasAnyComponent = true;\n \n // 验证 per-plugin manifest 文件\n const pluginManifestPath = join(configRoot, `${manifest.team}-manifest.json`);\n if (existsSync(pluginManifestPath)) hasAnyComponent = true;\n \n return hasAnyComponent;\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\";\n\nexport const selectTheme = {\n helpMode: \"never\" as const,\n};\n\nexport function isCJK(code: number): boolean {\n return (\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}\n\nfunction isEmoji(code: number): boolean {\n return (\n (code >= 0x1F300 && code <= 0x1FAFF) ||\n (code >= 0x2600 && code <= 0x27BF)\n );\n}\n\nexport function getDisplayWidth(str: string): number {\n let width = 0;\n for (const ch of str) {\n const code = ch.codePointAt(0)!;\n if (isCJK(code) || isEmoji(code)) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nfunction wrapDescription(text: string): string {\n const prefix = \" 💡 \";\n const indent = \" \";\n const cols = process.stdout.columns || 120;\n const maxLen = Math.max(20, cols - getDisplayWidth(prefix) - 2);\n\n const tokens: { text: string; width: number }[] = [];\n let i = 0;\n while (i < text.length) {\n const code = text[i].codePointAt(0)!;\n if (isCJK(code)) {\n tokens.push({ text: text[i], width: 2 });\n i++;\n } else {\n let j = i;\n while (j < text.length) {\n const c = text[j].codePointAt(0)!;\n if (isCJK(c)) break;\n j++;\n }\n const word = text.slice(i, j);\n tokens.push({ text: word, width: getDisplayWidth(word) });\n i = j;\n }\n }\n\n const lines: string[] = [];\n let line = \"\";\n let lineWidth = 0;\n for (const token of tokens) {\n if (lineWidth + token.width > maxLen && line) {\n lines.push(line.trimEnd());\n line = token.text;\n lineWidth = token.width;\n } else {\n line += token.text;\n lineWidth += token.width;\n }\n }\n if (line) lines.push(line.trimEnd());\n\n return lines\n .map((l, i) => chalk.cyan(i === 0 ? prefix + l : indent + l))\n .join(\"\\n\");\n}\n\nexport const checkboxTheme = {\n icon: {\n checked: \"\\x1b[32m☑\\x1b[22m\",\n unchecked: \"☐\",\n cursor: \"❯\",\n },\n helpMode: \"never\" as const,\n style: {\n description: (text: string) => wrapDescription(text),\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 ora, { type Ora } from \"ora\";\nimport { t } from \"./i18n.js\";\nimport { getDisplayWidth } from \"../ui/theme.js\";\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\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 ${t(\"hint_select_move\")} | \\x1b[36m${t(\"hint_select_space\")}\\x1b[0m ${t(\"hint_select_check\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}(${t(\"hint_checkbox_suffix\")})\\n`);\n } else {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m ${t(\"hint_select_move\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}\\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 { writeFileSync, renameSync, existsSync, unlinkSync } from \"fs\";\nimport { dirname } from \"path\";\n\nexport function atomicWriteFileSync(filePath: string, data: string, encoding: BufferEncoding = \"utf-8\"): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n throw new Error(`Directory does not exist: ${dir}`);\n }\n\n const tmpPath = `${filePath}.tmp`;\n writeFileSync(tmpPath, data, encoding);\n try {\n renameSync(tmpPath, filePath);\n } catch (e) {\n try { unlinkSync(tmpPath); } catch {}\n throw e;\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 { existsSync, mkdirSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { parse, stringify } from \"yaml\";\nimport type { AppConfig } from \"../types/index.js\";\nimport { atomicWriteFileSync } from \"./fs.js\";\nimport { logger } from \"./logger.js\";\nimport { t } from \"./i18n.js\";\nimport { getCannbotConfigDir } from \"./paths.js\";\n\nexport function getConfigDir(): string {\n return getCannbotConfigDir();\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 logger.warn(t(\"config_corrupted\"));\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 atomicWriteFileSync(configPath, content);\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 BACK = \"__back__\";\nexport const CANCEL = \"__cancel__\";\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 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, VALID_TOOLS } 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 } from \"./theme.js\";\nimport { BACK, CANCEL } from \"../utils/constants.js\";\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) {\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(t(\"wizard_step_1_title\"));\n\n if (detectedTools.length === 0) {\n logger.error(t(\"error_tool_not_found\"));\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...VALID_TOOLS.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 ...VALID_TOOLS.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(t(\"wizard_step_2_title\"));\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> project — ${t(\"install_level_project\")}`, value: \"project\" },\n { name: `> global — ${t(\"install_level_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(t(\"wizard_step_3_title\"));\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; description?: string } | Separator> = plugins.map((p) => {\n const isInstalled = installedSet.has(p.id);\n const suffix = isInstalled ? ` [${t(\"wizard_already_installed\")}]` : \"\";\n return {\n name: `> ${chalk.cyan(p.displayName)}${suffix}`,\n value: p.id,\n description: p.description,\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 selected = await select({\n message: t(\"wizard_select_plugin\"),\n choices,\n loop: false,\n theme: selectTheme,\n pageSize: 15,\n });\n\n if (selected === BACK) return BACK;\n if (selected === CANCEL) return CANCEL;\n return [selected];\n}\n\nasync function stepConfirm(\n tool: AITool,\n level: InstallLevel,\n plugins: string[]\n): Promise<true | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_4_title\"));\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(t(\"wizard_confirm_install_format\").replace(\"{count}\", chalk.bold(String(plugins.length))).replace(\"{tool}\", chalk.green(toolName)).replace(\"{level}\", chalk.cyan(levelText)));\n logger.info(`${t(\"wizard_install_path\")}: ${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 { 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\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\ndeclare const INSTALL_HELPER_VERSION: string | undefined;\n\nfunction readVersion(): string {\n try {\n if (typeof INSTALL_HELPER_VERSION !== \"undefined\" && INSTALL_HELPER_VERSION) {\n return INSTALL_HELPER_VERSION;\n }\n } catch {\n }\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const candidates = [\n join(__dirname, \"..\", \"package.json\"),\n join(__dirname, \"package.json\"),\n join(process.cwd(), \"package.json\"),\n ];\n for (const pkgPath of candidates) {\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n if (pkg.version && (pkg.name === \"@cannbot-ai/install-helper\" || pkg.name?.startsWith(\"@cannbot-ai/install-helper-\"))) {\n return pkg.version;\n }\n }\n }\n return \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\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(\"CANNBot Install Helper - Interactive installer for CANN operator development skills\")\n .version(readVersion());\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, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-a, --all\", \"Install ALL available skills\")\n .option(\"--list\", \"List all available skills by category\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; all?: 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, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-a, --all\", \"Uninstall ALL installed skills and plugins\")\n .option(\"--recent\", \"Uninstall the most recently installed skill batch\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; all?: boolean; recent?: boolean }) => {\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, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .action(async (plugins: string[], options: { tool?: string; level?: string; yes?: boolean }) => {\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, printBoxTitle, showOperationHints } 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 { BACK, CANCEL } from \"../utils/constants.js\";\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(t(\"init_pkg_dir_warn\"));\n logger.info(t(\"init_pkg_dir_hint\"));\n logger.info(t(\"init_pkg_dir_example\"));\n return;\n }\n\n printBanner(t(\"wizard_title\"));\n\n const spinner = createSpinner(t(\"loading_skills_list\"));\n spinner.start();\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n spinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n spinner.warn(t(\"loading_skills_list_failed\"));\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(t(\"wizard_select_mode_title\"));\n\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(t(\"init_cancelled\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return \"done\";\n }\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(t(\"init_cancelled\"));\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(t(\"init_cancelled\"));\n return \"done\";\n }\n level = result;\n step = 2;\n break;\n }\n case 2: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") { step = 1; break; }\n if (selectedSkills === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return \"done\";\n }\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(selectedSkills.length)))}...`);\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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(configRoot, \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", 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 { existsSync, mkdirSync, readFileSync, rmSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execa } from \"execa\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir, getCannbotRepoPath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport {\n scanSkills,\n getCurrentCommit,\n readScanCache,\n writeScanCache,\n} from \"./scanner.js\";\nimport { initFromScan } from \"./skill-registry.js\";\nimport { mergeDynamicPlugins } from \"./registry.js\";\nimport { enrichPluginMetadata } from \"./metadata-sync.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction loadRepoUrl(): string {\n if (process.env.CANNBOT_REPO_URL) {\n return process.env.CANNBOT_REPO_URL;\n }\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n return config.repository?.url || \"https://gitcode.com/cann/cannbot-skills.git\";\n } catch {\n return \"https://gitcode.com/cann/cannbot-skills.git\";\n }\n}\n\nconst REPO_URL = loadRepoUrl();\n\nexport class RepositoryManager {\n private repoPath: string | undefined;\n private customPath?: string;\n\n constructor(customPath?: string) {\n this.repoPath = customPath;\n this.customPath = 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 const clonedPath = await this.cloneRepo();\n return clonedPath;\n }\n\n async ensureRepoAndScan(): Promise<string> {\n const repoPath = await this.ensureRepo();\n\n const isUserProvided = !!this.customPath || !!process.env.CANNBOT_REPO_PATH;\n if (!isUserProvided) {\n await this.updateRepo();\n }\n mergeDynamicPlugins(repoPath);\n enrichPluginMetadata(repoPath);\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 logger.warn(t(\"repo_pull_failed\"));\n }\n mergeDynamicPlugins(repoPath);\n enrichPluginMetadata(repoPath);\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 rmSync(targetPath, { recursive: true, force: true });\n }\n\n try {\n logger.info(t(\"repo_cloning\"));\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 t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", REPO_URL)\n .replace(\"{dir}\", targetPath)\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, mkdirSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport { atomicWriteFileSync } from \"../utils/fs.js\";\nimport { isDirectory } from \"../utils/fs-helpers.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\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\nfunction loadScanConfig(): { skillDirs: string[]; pluginDirs: string[]; cacheTtlMs: number } {\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n const ttlHours = config.scanCacheTtlHours || 24;\n return {\n skillDirs: config.scanDirs || [\"ops\", \"model\", \"graph\", \"infra\", \"runtime\"],\n pluginDirs: config.pluginDirs || [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: ttlHours * 60 * 60 * 1000,\n };\n } catch {\n return {\n skillDirs: [\"ops\", \"model\", \"graph\", \"infra\", \"runtime\"],\n pluginDirs: [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: 24 * 60 * 60 * 1000,\n };\n }\n}\n\nconst scanConfig = loadScanConfig();\nconst SKILL_SCAN_DIRS = scanConfig.skillDirs;\nconst PLUGIN_SCAN_DIRS = scanConfig.pluginDirs;\n\nexport function getScanDirs(): string[] {\n return [...SKILL_SCAN_DIRS];\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 const rootSkillMd = join(pluginPath, \"SKILL.md\");\n const initSh = join(pluginPath, \"init.sh\");\n if (existsSync(rootSkillMd) && !existsSync(initSh)) {\n const frontmatter = parseFrontmatter(rootSkillMd);\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: `${pluginDir}/${plugin}`,\n filePath: rootSkillMd,\n });\n }\n }\n }\n }\n\n return skills;\n}\n\nfunction 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 const trimmedName = parsed.name.trim();\n if (!trimmedName || /[\\/\\\\]|\\.\\./.test(trimmedName) || !/^[a-zA-Z0-9._-]+$/.test(trimmedName)) {\n return null;\n }\n\n return {\n name: trimmedName,\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 > scanConfig.cacheTtlMs) 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 atomicWriteFileSync(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n }\n}\n\nfunction getCachePath(): string {\n return join(getCannbotConfigDir(), \"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 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 + \"/\" + entry, skills, seen);\n }\n}\n\nfunction safeReaddir(dir: string): string[] {\n try {\n return readdirSync(dir);\n } catch {\n return [];\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\";\nimport { t } from \"../utils/i18n.js\";\n\nexport interface SkillEntry {\n id: string;\n description: string;\n source: string;\n filePath?: string;\n}\n\nexport interface SkillCategory {\n id: string;\n name: string;\n skills: SkillEntry[];\n}\n\nconst CATEGORY_DEFS: { id: string; name: string; nameEn: string }[] = [\n { id: \"knowledge\", name: \"知识与参考\", nameEn: \"Knowledge & Reference\" },\n { id: \"env-tools\", name: \"环境与工具\", nameEn: \"Environment & Tools\" },\n { id: \"debug\", name: \"调试与诊断\", nameEn: \"Debug & Diagnostics\" },\n { id: \"testing\", name: \"测试与质量\", nameEn: \"Testing & Quality\" },\n { id: \"ascendc\", name: \"AscendC 开发\", nameEn: \"AscendC Development\" },\n { id: \"pypto\", name: \"PyPTO 开发\", nameEn: \"PyPTO Development\" },\n { id: \"tilelang\", name: \"TileLang 开发\", nameEn: \"TileLang Development\" },\n { id: \"triton\", name: \"Triton 开发\", nameEn: \"Triton Development\" },\n { id: \"model\", name: \"模型推理优化\", nameEn: \"Model Inference Optimization\" },\n { id: \"runtime\", name: \"Runtime 迁移\", nameEn: \"Runtime Migration\" },\n { id: \"graph\", name: \"图模式\", nameEn: \"Graph Mode\" },\n { id: \"platform\", name: \"平台工具\", nameEn: \"Platform Tools\" },\n { id: \"other\", name: \"其他 Skills\", nameEn: \"Other 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 filePath: s.filePath,\n }));\n initialized = true;\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 ],\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 { id: \"model-infer-harmony\", description: \"端侧鸿蒙 ASR 量化转换与打包\", source: \"model\" },\n { id: \"science-model-npu-migration\", description: \"NPU 代码级迁移(环境门禁/脚本适配/精度性能对比)\", source: \"plugins-community/science-model-npu-migration\", filePath: \"plugins-community/science-model-npu-migration/SKILL.md\" },\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: \"runtime\",\n name: \"Runtime 迁移\",\n skills: [\n { id: \"runtime_migration\", description: \"CUDA 应用迁移到 CANN 平台指南\", source: \"runtime\" },\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 getAllCategories(): SkillCategory[] {\n const skills = getActiveSkills();\n const isEn = t(\"list_name\") === \"Name\";\n return CATEGORY_DEFS.map((def) => ({\n id: def.id,\n name: isEn ? def.nameEn : 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, readFileSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport type { PluginEntry, PluginManifestSkillEntry, PluginManifestSkillSource } from \"../types/index.js\";\nimport { PLUGIN_REGISTRY } from \"./registry.js\";\nimport { getScanDirs } from \"./scanner.js\";\n\ninterface PluginJson {\n name?: string;\n version?: string;\n description?: string;\n agents?: string[];\n}\n\nfunction readPluginJson(pluginDir: string): PluginJson | null {\n const pjPath = join(pluginDir, \".claude-plugin\", \"plugin.json\");\n try {\n return JSON.parse(readFileSync(pjPath, \"utf-8\")) as PluginJson;\n } catch {\n return null;\n }\n}\n\nfunction parseIncludedSkills(pluginDir: string): string[] {\n const initPath = join(pluginDir, \"init.sh\");\n try {\n const text = readFileSync(initPath, \"utf-8\");\n const m = text.match(/INCLUDED_SKILLS=\"([^\"]*)\"/);\n if (!m) return [];\n return m[1].split(/\\s+/).filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction findSkillSourceDir(skillName: string, repoRoot: string, scanDirs: string[]): string | null {\n for (const dir of scanDirs) {\n const candidate = join(repoRoot, dir, skillName);\n if (existsSync(candidate) && statSync(candidate).isDirectory()) {\n return dir;\n }\n }\n return null;\n}\n\nfunction collectDeclaredSkillNames(\n installSkills: PluginManifestSkillSource[] | undefined\n): Set<string> {\n const set = new Set<string>();\n if (!installSkills) return set;\n for (const src of installSkills) {\n for (const sk of src.skills) {\n const name = typeof sk === \"string\" ? sk : sk.name;\n const as = typeof sk === \"string\" ? sk : (sk.as || sk.name);\n set.add(name);\n if (as !== name) set.add(as);\n }\n }\n return set;\n}\n\nfunction resolveAgentsFromPluginJson(pj: PluginJson | null): string[] {\n if (!pj || !Array.isArray(pj.agents)) return [];\n return pj.agents\n .map((a) => a.replace(/^\\.\\/agents\\//, \"\").replace(/\\.md$/, \"\"))\n .filter(Boolean);\n}\n\nfunction countSkills(installSkills: PluginManifestSkillSource[] | undefined): number {\n if (!installSkills) return 0;\n let n = 0;\n for (const src of installSkills) n += src.skills.length;\n return n;\n}\n\n/**\n * Merge init.sh INCLUDED_SKILLS into existing installSkills.\n * Existing skills (including `as` aliases) are preserved; init.sh-only skills\n * are appended to the matching source bucket (or a new bucket is created).\n */\nfunction mergeInitSkills(\n existing: PluginManifestSkillSource[] | undefined,\n pluginDir: string,\n repoRoot: string,\n scanDirs: string[]\n): PluginManifestSkillSource[] {\n const base = existing || [];\n const seen = collectDeclaredSkillNames(base);\n const initSkills = parseIncludedSkills(pluginDir);\n if (initSkills.length === 0) return base;\n\n const merged: PluginManifestSkillSource[] = base.map((s) => ({ ...s, skills: [...s.skills] }));\n\n for (const skill of initSkills) {\n if (seen.has(skill)) continue;\n const srcDir = findSkillSourceDir(skill, repoRoot, scanDirs);\n if (!srcDir) continue;\n let bucket = merged.find((b) => b.dir === srcDir);\n if (!bucket) {\n bucket = { dir: srcDir, skills: [] };\n merged.push(bucket);\n }\n bucket.skills.push(skill);\n seen.add(skill);\n }\n return merged;\n}\n\n/**\n * Enrich PLUGIN_REGISTRY in-place by reading the latest plugin.json and\n * init.sh INCLUDED_SKILLS from the freshly-pulled repository.\n *\n * Fields updated at runtime:\n * - version ← plugin.json version\n * - description ← plugin.json description (only if currently empty)\n * - displayName ← plugin.json name (only for dynamically discovered plugins with bare dir name)\n * - installAgents ← plugin.json agents (only if currently empty)\n * - installSkills ← existing + init.sh INCLUDED_SKILLS supplement\n * - skills / agents ← recomputed counts\n *\n * Fields NOT updated (require npm republish): aliases, externalRepos,\n * configRootConfigLink, configFile — these rarely change.\n */\nexport function enrichPluginMetadata(repoPath: string): void {\n const scanDirs = getScanDirs();\n\n for (const plugin of PLUGIN_REGISTRY) {\n const pluginDir = join(repoPath, plugin.dir);\n if (!existsSync(pluginDir)) continue;\n\n const pj = readPluginJson(pluginDir);\n\n // version: plugin.json overrides embedded hardcoded value\n if (pj && pj.version) {\n plugin.version = pj.version;\n }\n\n // description: fill from plugin.json if currently empty\n if ((!plugin.description || plugin.description === \"\") && pj && pj.description) {\n plugin.description = pj.description;\n }\n\n // displayName: for dynamically discovered plugins, upgrade from bare dir name\n if (pj && pj.name && (plugin.displayName === plugin.id)) {\n plugin.displayName = pj.name;\n }\n\n // installAgents: fill from plugin.json if currently empty\n if ((!plugin.installAgents || plugin.installAgents.length === 0)) {\n const agents = resolveAgentsFromPluginJson(pj);\n if (agents.length > 0) {\n plugin.installAgents = agents;\n }\n }\n\n // installSkills: merge init.sh INCLUDED_SKILLS into existing\n const merged = mergeInitSkills(plugin.installSkills, pluginDir, repoPath, scanDirs);\n plugin.installSkills = merged;\n\n // recompute counts\n plugin.skills = countSkills(merged);\n plugin.agents = plugin.installAgents ? plugin.installAgents.length : 0;\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 { existsSync } from \"fs\";\nimport { join, basename } from \"path\";\nimport { execa, execaSync } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult, BackupInfo } 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\";\nimport { detectCurrentPlugin, createBackup, getAgentsFileName } from \"./backup.js\";\nimport { showOverwriteWarning } from \"../ui/backup-prompts.js\";\nimport { installViaManifest } from \"./plugin-installer.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger } from \"../utils/logger.js\";\n\nfunction findShell(): string | null {\n const candidates = [\"bash\", \"sh\"];\n for (const cmd of candidates) {\n try {\n const detectCmd = process.platform === \"win32\" ? \"where\" : \"which\";\n execaSync(detectCmd, [cmd], { timeout: 3000 });\n return cmd;\n } catch {}\n }\n return null;\n}\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: [t(\"error_plugin_not_found\") + \": \" + opts.pluginId],\n warnings: [],\n };\n }\n\n const pluginDir = join(opts.repoPath, plugin.dir);\n const cwd = opts.installPath || process.cwd();\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n const agentsFile = join(configRoot, getAgentsFileName(opts.tool));\n let backupInfo: BackupInfo | null = null;\n\n if (existsSync(agentsFile)) {\n const currentPlugin = detectCurrentPlugin(configRoot, opts.tool, opts.installPath);\n\n if (currentPlugin && currentPlugin.pluginId !== opts.pluginId) {\n let choice: \"overwrite\" | \"cancel\" = \"overwrite\";\n \n if (!opts.yes) {\n choice = await showOverwriteWarning(\n currentPlugin.pluginName,\n plugin.displayName\n );\n }\n\n if (choice === \"cancel\") {\n logger.info(t(\"backup_cancel\"));\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"backup_cancel\")],\n warnings: [],\n };\n }\n }\n\n if (currentPlugin) {\n backupInfo = createBackup(\n configRoot,\n opts.tool,\n currentPlugin.pluginId,\n currentPlugin.pluginName\n );\n\n if (!backupInfo) {\n logger.error(t(\"backup_failed\"));\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"backup_failed\")],\n warnings: [],\n };\n }\n\n logger.success(`${t(\"backup_created\")}: ${backupInfo.filePath}`);\n }\n }\n\n if (plugin.installSkills && plugin.installSkills.length > 0) {\n const result = await installViaManifest(\n plugin,\n opts.repoPath,\n opts.tool,\n opts.level,\n opts.installPath\n );\n\n if (result.success) {\n try {\n const record = scanInstalledFiles(\n opts.pluginId,\n plugin.displayName,\n opts.tool,\n opts.level,\n cwd,\n configRoot,\n result.manifest,\n plugin.externalRepos?.map(r => basename(r.dir)),\n plugin.configRootConfigLink\n );\n \n if (backupInfo) {\n record.backup = {\n filePath: backupInfo.filePath,\n fromPluginId: backupInfo.pluginId,\n fromPluginName: backupInfo.pluginName,\n backupTime: backupInfo.backupTime,\n };\n }\n \n writeRecord(record);\n } catch {\n logger.warn(t(\"record_write_failed\"));\n }\n\n return {\n success: true,\n pluginId: opts.pluginId,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n errors: result.errors,\n warnings: [],\n };\n } else {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: result.errors,\n warnings: [],\n };\n }\n }\n\n const scriptPath = join(pluginDir, plugin.script);\n if (!existsSync(scriptPath)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_script_not_found\").replace(\"{path}\", scriptPath)],\n warnings: [],\n };\n }\n\n const args: string[] = [opts.level, opts.tool];\n if (opts.installPath) {\n args.push(opts.installPath);\n }\n\n try {\n const shell = findShell();\n if (!shell) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_no_shell\")],\n warnings: [],\n };\n }\n const execOptions: any = {\n cwd,\n timeout: 300000,\n stdio: \"pipe\",\n input: opts.yes ? \"y\\n\" : undefined,\n };\n \n await execa(shell, [scriptPath, ...args], execOptions);\n\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 plugin.externalRepos?.map(r => basename(r.dir)),\n plugin.configRootConfigLink\n );\n \n if (backupInfo) {\n record.backup = {\n filePath: backupInfo.filePath,\n fromPluginId: backupInfo.pluginId,\n fromPluginName: backupInfo.pluginName,\n backupTime: backupInfo.backupTime,\n };\n }\n \n writeRecord(record);\n } catch {\n logger.warn(t(\"record_write_failed\"));\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 : t(\"error_unknown\");\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [errorMessage],\n warnings: [],\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 { existsSync, mkdirSync, readFileSync, unlinkSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { getCannbotConfigDir, getConfigRoot } from \"../utils/paths.js\";\nimport { atomicWriteFileSync } from \"../utils/fs.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel, CannbotManifest, SkillBatchRecord } 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 backup?: {\n filePath: string;\n fromPluginId: string;\n fromPluginName: string;\n backupTime: string;\n };\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 logger.warn(t(\"record_corrupted\").replace(\"{file}\", recordPath));\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 atomicWriteFileSync(recordPath, JSON.stringify(record, null, 2));\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 externalRepoNames?: string[],\n configRootConfigLink?: boolean\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) || isSymlink(configFilePath)) {\n files.push(configFilePath);\n }\n\n if (level === \"project\" && configRootConfigLink !== false) {\n const configRootConfigPath = join(configRoot, configFileName);\n if (configRootConfigPath !== configFilePath && (existsSync(configRootConfigPath) || isSymlink(configRootConfigPath))) {\n files.push(configRootConfigPath);\n }\n }\n\n const repoLinks = externalRepoNames && externalRepoNames.length > 0\n ? externalRepoNames\n : [\"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 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\n// === Skill-level install records ===\n\nexport interface SkillInstallEntry {\n skills: string[];\n installTime: string;\n batches?: SkillBatchRecord[];\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 logger.warn(t(\"skill_record_corrupted\"));\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 atomicWriteFileSync(recordPath, JSON.stringify(record, null, 2));\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 const now = new Date().toISOString();\n const newSkills: string[] = [];\n for (const id of skillIds) {\n if (!entry.skills.includes(id)) {\n entry.skills.push(id);\n newSkills.push(id);\n }\n }\n entry.installTime = now;\n if (newSkills.length > 0) {\n if (!entry.batches) entry.batches = [];\n entry.batches.push({\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n installedAt: now,\n skills: newSkills,\n });\n }\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.batches) {\n for (const batch of entry.batches) {\n batch.skills = batch.skills.filter((id) => !skillIds.includes(id));\n }\n entry.batches = entry.batches.filter((b) => b.skills.length > 0);\n if (entry.batches.length === 0) {\n delete entry.batches;\n }\n }\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 allowFsScan: boolean = true\n): string[] {\n const record = readSkillRecord();\n const recordedSkills = record[tool]?.[level]?.[installPath]?.skills || [];\n\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n\n const fromRecord = recordedSkills.filter((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\n });\n\n if (!allowFsScan) {\n return fromRecord;\n }\n\n const fromFs: string[] = [];\n if (existsSync(skillsDir)) {\n try {\n const entries = readdirSync(skillsDir);\n for (const entry of entries) {\n if (entry === \".\" || entry === \"..\") continue;\n const entryPath = join(skillsDir, entry);\n if (isSymlink(entryPath) && !fromRecord.includes(entry)) {\n fromFs.push(entry);\n }\n }\n } catch {\n // ignore\n }\n }\n\n return [...fromRecord, ...fromFs];\n}\n\nexport function getLastBatchSkills(\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): string[] | null {\n const record = readSkillRecord();\n const entry = record[tool]?.[level]?.[installPath];\n if (!entry || !entry.batches || entry.batches.length === 0) {\n return null;\n }\n const lastBatch = entry.batches[entry.batches.length - 1];\n const configRoot = level === \"project\"\n ? getConfigRoot(tool, level, installPath)\n : getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n return lastBatch.skills.filter((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\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 { existsSync, copyFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport type { AITool, BackupInfo } from \"../types/index.js\";\nimport { readAllManifests } from \"./manifest.js\";\nimport { readRecord } from \"./record.js\";\nimport { findPlugin, getAllPlugins } from \"./registry.js\";\nimport { getAgentsFileName } from \"../utils/paths.js\";\n\nexport { getAgentsFileName };\n\nexport function detectCurrentPlugin(\n configRoot: string,\n tool: AITool,\n installPath?: string\n): { pluginId: string; pluginName: string } | null {\n const manifests = readAllManifests(configRoot);\n if (manifests.length > 0) {\n const sorted = [...manifests].sort((a, b) =>\n (b.install_time || \"\").localeCompare(a.install_time || \"\")\n );\n const manifest = sorted[0];\n if (manifest.team) {\n const plugin = findPlugin(manifest.team);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n }\n\n const agentsFileName = getAgentsFileName(tool);\n const configRootAgentsFile = join(configRoot, agentsFileName);\n const installPathAgentsFile = installPath ? join(installPath, agentsFileName) : null;\n\n if (!existsSync(configRootAgentsFile) && !(installPathAgentsFile && existsSync(installPathAgentsFile))) {\n return null;\n }\n\n const allRecords = readAllRecords();\n for (const record of allRecords) {\n if (record.configRoot === configRoot && record.tool === tool) {\n const plugin = findPlugin(record.pluginId);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n }\n\n return null;\n}\n\nexport function createBackup(\n configRoot: string,\n tool: AITool,\n fromPluginId: string,\n fromPluginName: string\n): BackupInfo | null {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n if (!existsSync(agentsFile)) {\n return null;\n }\n\n const timestamp = formatTimestamp(new Date());\n const backupFileName = `${getAgentsFileName(tool)}.cannbot-backup.${fromPluginId}.${timestamp}`;\n const backupPath = join(configRoot, backupFileName);\n\n try {\n copyFileSync(agentsFile, backupPath);\n return {\n filePath: backupPath,\n pluginId: fromPluginId,\n pluginName: fromPluginName,\n backupTime: timestamp,\n };\n } catch {\n return null;\n }\n}\n\nexport function findBackups(configRoot: string): BackupInfo[] {\n if (!existsSync(configRoot)) {\n return [];\n }\n\n const files = readdirSync(configRoot);\n const backups: BackupInfo[] = [];\n\n for (const file of files) {\n if (file.includes(\".cannbot-backup.\")) {\n const parts = file.split(\".cannbot-backup.\");\n if (parts.length === 2) {\n const pluginIdAndTime = parts[1];\n const lastDotIndex = pluginIdAndTime.lastIndexOf(\".\");\n if (lastDotIndex > 0) {\n const pluginId = pluginIdAndTime.substring(0, lastDotIndex);\n const timestamp = pluginIdAndTime.substring(lastDotIndex + 1);\n const plugin = findPlugin(pluginId);\n\n backups.push({\n filePath: join(configRoot, file),\n pluginId,\n pluginName: plugin?.displayName || pluginId,\n backupTime: timestamp,\n });\n }\n }\n }\n }\n\n return backups.sort((a, b) => b.backupTime.localeCompare(a.backupTime));\n}\n\nexport function restoreBackup(\n backupPath: string,\n configRoot: string,\n tool: AITool\n): boolean {\n try {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n copyFileSync(backupPath, agentsFile);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function deleteBackup(backupPath: string): boolean {\n try {\n if (existsSync(backupPath)) {\n unlinkSync(backupPath);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction formatTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}${month}${day}-${hours}${minutes}${seconds}`;\n}\n\nfunction readAllRecords(): any[] {\n const records: any[] = [];\n const plugins = getAllPlugins();\n\n for (const plugin of plugins) {\n const record = readRecord(plugin.id);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\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 } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { BackupInfo } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function showOverwriteWarning(\n currentPluginName: string,\n newPluginName: string\n): Promise<\"overwrite\" | \"cancel\"> {\n console.log();\n console.log(chalk.yellow(` ⚠️ ${t(\"backup_detected\")}`));\n console.log();\n console.log(` ${t(\"backup_current\")}: ${chalk.cyan(currentPluginName)}`);\n console.log(` ${t(\"backup_installing\")}: ${chalk.cyan(newPluginName)}`);\n console.log();\n console.log(` ${t(\"backup_overwrite_warning\")}`);\n console.log(` ${t(\"backup_auto_create\")}`);\n console.log();\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices: [\n { name: t(\"backup_overwrite\"), value: \"overwrite\" },\n { name: t(\"backup_cancel\"), value: \"cancel\" },\n ],\n });\n\n return choice as \"overwrite\" | \"cancel\";\n}\n\nexport async function showRestorePrompt(\n backups: BackupInfo[]\n): Promise<string | \"none\"> {\n console.log();\n console.log(chalk.cyan(` ${t(\"backup_restore_prompt\")}`));\n console.log();\n\n const choices = backups.map((b) => ({\n name: `${t(\"backup_restore\")} ${b.pluginName} (${b.backupTime})`,\n value: b.filePath,\n }));\n\n choices.push({ name: t(\"backup_only_uninstall\"), value: \"none\" });\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices,\n });\n\n return choice;\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// ----------------------------------------------------------------------------------------------------------\nimport { existsSync, mkdirSync, symlinkSync, realpathSync, readlinkSync, copyFileSync, cpSync, writeFileSync, rmSync } from \"fs\";\nimport { join, basename } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, PluginEntry, PluginManifestExternalRepo, CannbotManifest } from \"../types/index.js\";\nimport { getConfigRoot, getAgentsFileName } from \"../utils/paths.js\";\nimport { isSymlink, removePath } from \"../utils/fs-helpers.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport interface ManifestInstallResult {\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n errors: string[];\n manifest: CannbotManifest | null;\n}\n\nfunction installLink(source: string, target: string): \"symlink\" | \"copy\" | \"skipped\" | \"failed\" {\n try {\n const resolved = realpathSync(source);\n\n if (isSymlink(target)) {\n try {\n const currentTarget = readlinkSync(target);\n const normCurrent = currentTarget.replace(/\\\\/g, \"/\").toLowerCase();\n const normSource = resolved.replace(/\\\\/g, \"/\").toLowerCase();\n if (normCurrent === normSource) {\n return \"skipped\";\n }\n } catch {\n return \"skipped\";\n }\n }\n\n if (existsSync(target) || isSymlink(target)) {\n removePath(target);\n }\n try {\n symlinkSync(resolved, target);\n return \"symlink\";\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, target, { recursive: true });\n return \"copy\";\n }\n throw e;\n }\n } catch {\n return \"failed\";\n }\n}\n\nfunction installConfigFile(\n pluginDir: string,\n configFile: string,\n tool: AITool,\n level: InstallLevel,\n configRoot: string,\n installPath: string,\n configRootConfigLink?: boolean\n): void {\n const sourcePath = join(pluginDir, configFile);\n if (!existsSync(sourcePath)) return;\n\n const agentsFileName = getAgentsFileName(tool);\n const isProjectLevel = level === \"project\";\n\n let primaryTarget: string;\n if (isProjectLevel) {\n primaryTarget = join(installPath, agentsFileName);\n } else {\n primaryTarget = join(configRoot, agentsFileName);\n }\n\n try {\n const resolvedSource = realpathSync(sourcePath);\n\n if (existsSync(primaryTarget) || isSymlink(primaryTarget)) {\n removePath(primaryTarget);\n }\n\n try {\n symlinkSync(resolvedSource, primaryTarget);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n copyFileSync(sourcePath, primaryTarget);\n } else {\n throw e;\n }\n }\n } catch (e: any) {\n logger.warn(t(\"install_config_failed\").replace(\"{error}\", e.message));\n }\n\n if (isProjectLevel && primaryTarget !== join(configRoot, agentsFileName)) {\n if (configRootConfigLink === false) return;\n const configRootTarget = join(configRoot, agentsFileName);\n if (existsSync(configRootTarget) || isSymlink(configRootTarget)) {\n removePath(configRootTarget);\n }\n try {\n symlinkSync(realpathSync(sourcePath), configRootTarget);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n copyFileSync(sourcePath, configRootTarget);\n }\n }\n }\n}\n\nasync function installExternalRepos(\n repos: PluginManifestExternalRepo[] | undefined,\n repoPath: string,\n configRoot: string,\n installPath: string,\n level: InstallLevel\n): Promise<void> {\n if (!repos || repos.length === 0) return;\n\n for (const repo of repos) {\n const targetDir = join(repoPath, repo.dir);\n const gitDir = join(targetDir, \".git\");\n\n if (existsSync(gitDir)) {\n try {\n await execa(\"git\", [\"pull\", \"--quiet\"], { cwd: targetDir, timeout: 120000 });\n } catch {\n logger.warn(t(\"external_repo_update_failed\").replace(\"{dir}\", repo.dir));\n continue;\n }\n } else if (!existsSync(targetDir)) {\n const args = [\"clone\"];\n if (repo.depth) {\n args.push(\"--depth\", String(repo.depth));\n }\n if (repo.recursive) {\n args.push(\"--recursive\");\n }\n args.push(repo.url, targetDir);\n\n try {\n await execa(\"git\", args, { timeout: 120000 });\n } catch {\n logger.warn(t(\"install_clone_failed\").replace(\"{url}\", repo.url).replace(\"{dir}\", repo.dir));\n try { rmSync(targetDir, { recursive: true, force: true }); } catch {}\n continue;\n }\n }\n\n const linkName = basename(repo.dir);\n const resolved = realpathSync(targetDir);\n const shouldConfigRootLink = repo.configRootLink !== false && (level === \"global\" || repo.configRootLink === true);\n\n if (shouldConfigRootLink) {\n const configRootLink = join(configRoot, linkName);\n try {\n if (existsSync(configRootLink) || isSymlink(configRootLink)) {\n removePath(configRootLink);\n }\n try {\n symlinkSync(resolved, configRootLink);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, configRootLink, { recursive: true });\n }\n }\n } catch {\n logger.warn(t(\"install_link_config_failed\").replace(\"{name}\", linkName));\n }\n }\n\n if (level === \"project\") {\n const projectLink = join(installPath, linkName);\n try {\n if (existsSync(projectLink) || isSymlink(projectLink)) {\n removePath(projectLink);\n }\n try {\n symlinkSync(resolved, projectLink);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, projectLink, { recursive: true });\n }\n }\n } catch {\n logger.warn(t(\"install_link_project_failed\").replace(\"{name}\", linkName));\n }\n }\n }\n}\n\nfunction installWorkflows(pluginDir: string, configRoot: string): void {\n const workflowsDir = join(pluginDir, \"workflows\");\n if (!existsSync(workflowsDir)) return;\n\n const targetPath = join(configRoot, \"workflows\");\n try {\n const resolved = realpathSync(workflowsDir);\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n removePath(targetPath);\n }\n try {\n symlinkSync(resolved, targetPath);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolved, targetPath, { recursive: true });\n }\n }\n } catch {\n logger.warn(t(\"install_link_workflows_failed\"));\n }\n}\n\nexport function writeCannbotManifest(\n configRoot: string,\n pluginId: string,\n version: string,\n level: InstallLevel,\n tool: AITool,\n skills: string[],\n agents: string[]\n): CannbotManifest {\n const manifest: CannbotManifest = {\n brand: \"CANNBot\",\n version,\n team: pluginId,\n level,\n tool,\n installed_skills: skills,\n installed_agents: agents,\n brand_dir: configRoot,\n install_time: new Date().toISOString(),\n };\n\n const manifestPath = join(configRoot, `${pluginId}-manifest.json`);\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n return manifest;\n}\n\nexport async function installViaManifest(\n plugin: PluginEntry,\n repoPath: string,\n tool: AITool,\n level: InstallLevel,\n installPath?: string\n): Promise<ManifestInstallResult> {\n const cwd = installPath || process.cwd();\n const configRoot = getConfigRoot(tool, level, installPath);\n const pluginDir = join(repoPath, plugin.dir);\n\n try {\n const skillsDir = join(configRoot, \"skills\");\n const agentsDir = join(configRoot, \"agents\");\n mkdirSync(skillsDir, { recursive: true });\n mkdirSync(agentsDir, { recursive: true });\n\n const installedSkills: string[] = [];\n const installedAgents: string[] = [];\n\n for (const source of plugin.installSkills || []) {\n const sourceDir = join(repoPath, source.dir);\n if (!existsSync(sourceDir)) {\n logger.warn(t(\"install_skill_source_not_found\").replace(\"{dir}\", source.dir));\n continue;\n }\n\n for (const skillEntry of source.skills) {\n const skillName = typeof skillEntry === \"string\" ? skillEntry : skillEntry.name;\n const skillAlias = typeof skillEntry === \"string\" ? skillName : (skillEntry.as || skillName);\n const skillPath = join(sourceDir, skillName);\n if (!existsSync(skillPath)) {\n logger.warn(t(\"install_skill_not_found\").replace(\"{name}\", skillName).replace(\"{dir}\", source.dir));\n continue;\n }\n\n const targetPath = join(skillsDir, skillAlias);\n const result = installLink(skillPath, targetPath);\n if (result !== \"failed\") {\n installedSkills.push(skillAlias);\n } else {\n logger.warn(t(\"install_skill_failed\").replace(\"{name}\", skillAlias));\n }\n }\n }\n\n for (const agentName of plugin.installAgents || []) {\n const agentFile = agentName.endsWith(\".md\") ? agentName : `${agentName}.md`;\n const agentPath = join(pluginDir, \"agents\", agentFile);\n if (!existsSync(agentPath)) {\n logger.warn(t(\"install_agent_not_found\").replace(\"{name}\", agentFile));\n continue;\n }\n\n const targetPath = join(agentsDir, agentFile);\n const result = installLink(agentPath, targetPath);\n if (result !== \"failed\") {\n installedAgents.push(agentFile);\n } else {\n logger.warn(t(\"install_agent_failed\").replace(\"{name}\", agentFile));\n }\n }\n\n installConfigFile(pluginDir, plugin.configFile || \"AGENTS.md\", tool, level, configRoot, cwd, plugin.configRootConfigLink);\n\n installWorkflows(pluginDir, configRoot);\n\n await installExternalRepos(plugin.externalRepos, repoPath, configRoot, cwd, level);\n\n const cannbotManifest = writeCannbotManifest(\n configRoot,\n plugin.id,\n plugin.version || \"1.0.0\",\n level,\n tool,\n installedSkills,\n installedAgents\n );\n\n return {\n success: true,\n skillsCount: installedSkills.length,\n agentsCount: installedAgents.length,\n errors: [],\n manifest: cannbotManifest,\n };\n } catch (error) {\n return {\n success: false,\n skillsCount: 0,\n agentsCount: 0,\n errors: [error instanceof Error ? error.message : t(\"error_unknown\")],\n manifest: null,\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 { existsSync, mkdirSync, symlinkSync, readdirSync, rmSync, realpathSync, readlinkSync, cpSync } from \"fs\";\nimport { join, dirname, isAbsolute } 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 { isSymlink, removePath } from \"../utils/fs-helpers.js\";\nimport { BACK, CANCEL } from \"../utils/constants.js\";\nimport { logger, 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\";\nimport { confirm } from \"@inquirer/prompts\";\n\ninterface SkillInstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\ninterface 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: t(\"error_skill_not_found\") });\n continue;\n }\n\n const sourcePath = resolveSkillSourcePath(skill, repoPath);\n const targetPath = join(skillsDir, skillId);\n\n if (!existsSync(sourcePath)) {\n results.push({ skillId, success: false, error: t(\"error_source_not_found\").replace(\"{path}\", sourcePath) });\n continue;\n }\n\n try {\n const resolvedSource = realpathSync(sourcePath);\n\n if (isSymlink(targetPath)) {\n try {\n const currentTarget = readlinkSync(targetPath);\n const normCurrent = currentTarget.replace(/\\\\/g, \"/\").toLowerCase();\n const normSource = resolvedSource.replace(/\\\\/g, \"/\").toLowerCase();\n if (normCurrent === normSource) {\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n continue;\n }\n } catch {\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n continue;\n }\n }\n\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n removePath(targetPath);\n }\n try {\n symlinkSync(resolvedSource, targetPath);\n } catch (e: any) {\n if (e.code === \"EPERM\") {\n cpSync(resolvedSource, targetPath, { recursive: true });\n } else {\n throw e;\n }\n }\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n } catch (error) {\n let msg = error instanceof Error ? error.message : t(\"error_unknown\");\n if (process.platform === \"win32\" && msg.includes(\"EPERM\")) {\n msg = t(\"error_symlink_windows\");\n }\n results.push({ skillId, success: false, error: msg });\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 removePath(targetPath);\n results.push({ skillId, success: true });\n removedIds.push(skillId);\n logger.step(` ${t(\"uninstall_remove_label\")}: ${skillId}`);\n } else {\n results.push({ skillId, success: false, error: t(\"error_not_installed\") });\n logger.warn(`${skillId} ${t(\"uninstall_skill_not_installed\")}`);\n }\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : t(\"error_unknown\") });\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 rmSync(skillsDir, { recursive: true });\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: skills/`);\n }\n } catch {\n // ignore\n }\n }\n\n return results;\n}\n\nconst SELECT_ALL = \"__select_all__\";\nconst SELECT_ALL_CATEGORY = \"__select_all_category__\";\nconst CONTINUE_SELECT = \"__continue_select__\";\nconst UNSELECT_ALL = \"__unselect_all__\";\n\nexport async function interactiveSkillSelect(\n tool: AITool,\n level: InstallLevel\n): Promise<string[] | \"back\" | \"cancel\"> {\n const categories = getAllCategories();\n const allSkillIds = getAllSkills().map((s) => s.id);\n\n let accumulated: string[] = [];\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n const titleSuffix = accumulated.length > 0\n ? `${t(\"wizard_step_3_skill_title\")}(${t(\"skill_count_format\").replace(\"{count}\", String(accumulated.length))})`\n : t(\"wizard_step_3_skill_title\");\n printBoxTitle(titleSuffix);\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `>> ${t(\"skill_select_all\").replace(\"{count}\", String(allSkillIds.length))}`,\n value: SELECT_ALL,\n },\n new Separator(\"──────────────\"),\n ...categories.map((cat) => ({\n name: `> ${cat.name} (${cat.skills.length} skills)`,\n value: cat.id,\n })),\n new Separator(\"──────────────\"),\n ...(accumulated.length > 0\n ? [{ name: `>> ${t(\"skill_confirm_install_count\").replace(\"{count}\", String(accumulated.length))}`, value: \"install\" } as { name: string; value: string }]\n : []),\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 pageSize: 15,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n if (selectedCategoryId === SELECT_ALL) {\n return allSkillIds;\n }\n if (selectedCategoryId === \"install\") {\n return accumulated;\n }\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(t(\"wizard_step_4_skill_title\").replace(\"{category}\", category.name));\n\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath);\n const installedSet = new Set(installedSkills);\n const categorySkillIds = new Set(category.skills.map((s) => s.id));\n const accumulatedInCategory = new Set(accumulated.filter((id) => categorySkillIds.has(id)));\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n {\n name: `>> ${t(\"skill_select_all_category\")}`,\n value: SELECT_ALL_CATEGORY,\n checked: accumulatedInCategory.size === category.skills.length,\n description: t(\"skill_select_all_category\"),\n },\n new Separator(\"──────────────\"),\n ...category.skills.map((skill) => {\n const isInstalled = installedSet.has(skill.id);\n const isAccumulated = accumulatedInCategory.has(skill.id);\n const suffix = isInstalled ? ` [${t(\"skill_already_installed\")}]` : (isAccumulated ? \" [+]\" : \"\");\n return {\n name: `${chalk.cyan(skill.id)}${suffix}`,\n value: skill.id,\n checked: isAccumulated,\n description: skill.description,\n };\n }),\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 pageSize: 15,\n });\n\n let skillIds: string[];\n if (selectedSkills.includes(SELECT_ALL_CATEGORY)) {\n skillIds = category.skills.map((s) => s.id);\n } else {\n skillIds = selectedSkills.filter((id) => id !== SELECT_ALL_CATEGORY);\n }\n\n if (skillIds.length === 0) {\n accumulated = accumulated.filter((id) => !categorySkillIds.has(id));\n const action = await select({\n message: accumulated.length > 0\n ? t(\"skill_continue_or_install\").replace(\"{count}\", String(accumulated.length))\n : t(\"wizard_no_selection\"),\n choices: accumulated.length > 0\n ? [\n { name: \">> \" + t(\"skill_confirm_install_count\").replace(\"{count}\", String(accumulated.length)), value: \"install\" },\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ]\n : [\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 === \"install\") return accumulated;\n if (action === \"back\") { step = 0; break; }\n return \"cancel\";\n }\n\n accumulated = accumulated.filter((id) => !categorySkillIds.has(id));\n for (const id of skillIds) {\n if (!accumulated.includes(id)) {\n accumulated.push(id);\n }\n }\n\n const action = await select({\n message: t(\"skill_continue_or_install\").replace(\"{count}\", String(accumulated.length)),\n choices: [\n { name: \">> \" + t(\"skill_confirm_install_count\").replace(\"{count}\", String(accumulated.length)), value: \"install\" },\n { name: \"> \" + t(\"skill_continue_select\"), value: CONTINUE_SELECT },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n\n if (action === \"install\") {\n return accumulated;\n }\n if (action === CONTINUE_SELECT) {\n step = 0;\n break;\n }\n return \"cancel\";\n }\n }\n }\n}\n\nexport async function interactiveSkillUnselect(\n tool: AITool,\n level: InstallLevel\n): Promise<{ toUninstall: string[]; toKeep: string[] } | \"back\" | \"cancel\"> {\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath);\n\n if (installedSkills.length === 0) {\n logger.warn(t(\"uninstall_no_installed_skills\"));\n return \"back\";\n }\n\n if (installedSkills.length <= 15) {\n return await flatSkillUnselect(installedSkills);\n }\n\n return await categorySkillUnselect(installedSkills);\n}\n\nasync function flatSkillUnselect(\n installedSkills: string[]\n): Promise<{ toUninstall: string[]; toKeep: string[] } | \"back\" | \"cancel\"> {\n const categories = getAllCategories();\n const installedSet = new Set(installedSkills);\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n ...installedSkills.map((skillId) => {\n const skill = findSkill(skillId);\n const cat = categories.find((c) => c.skills.some((s) => s.id === skillId));\n const catName = cat ? cat.name : \"\";\n const desc = skill?.description || \"\";\n return {\n name: `${chalk.cyan(skillId)}${catName ? chalk.dim(` [${catName}]`) : \"\"}`,\n value: skillId,\n checked: false,\n description: desc,\n };\n }),\n ];\n\n printBoxTitle(t(\"uninstall_interactive_title\"));\n logger.info(chalk.dim(` ${t(\"uninstall_checkbox_hint_select\")}`));\n logger.blank();\n showOperationHints(true);\n\n const selected = await checkbox({\n message: t(\"uninstall_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 20,\n });\n\n if (selected.length === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return \"back\";\n }\n\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(selected.length))),\n default: false,\n });\n\n if (!confirmed) return \"cancel\";\n\n return {\n toUninstall: selected,\n toKeep: installedSkills.filter((id) => !selected.includes(id)),\n };\n}\n\nasync function categorySkillUnselect(\n installedSkills: string[]\n): Promise<{ toUninstall: string[]; toKeep: string[] } | \"back\" | \"cancel\"> {\n const allCategories = getAllCategories();\n const installedSet = new Set(installedSkills);\n\n const categoriesWithInstalled = allCategories\n .map((cat) => ({\n ...cat,\n skills: cat.skills.filter((s) => installedSet.has(s.id)),\n }))\n .filter((cat) => cat.skills.length > 0);\n\n const uncategorized = installedSkills.filter(\n (id) => !allCategories.some((cat) => cat.skills.some((s) => s.id === id))\n );\n if (uncategorized.length > 0) {\n categoriesWithInstalled.push({\n id: \"__uncategorized__\",\n name: t(\"uninstall_uncategorized\"),\n skills: uncategorized.map((id) => ({ id, description: \"\", source: \"\", filePath: \"\" }) as any),\n });\n }\n\n const uninstallSet = new Set<string>();\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n const titleSuffix = uninstallSet.size > 0\n ? `${t(\"wizard_step_3_skill_title\")}(${t(\"uninstall_marked_count\").replace(\"{count}\", String(uninstallSet.size))})`\n : t(\"wizard_step_3_skill_title\");\n printBoxTitle(titleSuffix);\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `>> ${t(\"uninstall_uncheck_all\")}`,\n value: UNSELECT_ALL,\n },\n new Separator(\"──────────────\"),\n ...categoriesWithInstalled.map((cat) => {\n const catSelectedCount = cat.skills.filter((s) => uninstallSet.has(s.id)).length;\n const suffix = catSelectedCount > 0 ? chalk.yellow(` (${catSelectedCount} selected)`) : \"\";\n return {\n name: `> ${cat.name} (${cat.skills.length} skills)${suffix}`,\n value: cat.id,\n };\n }),\n new Separator(\"──────────────\"),\n ...(uninstallSet.size > 0\n ? [{ name: `>> ${t(\"uninstall_confirm_count\").replace(\"{count}\", String(uninstallSet.size))}`, value: \"uninstall\" } as { name: string; value: string }]\n : []),\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(\"uninstall_select_category\"),\n choices: categoryChoices,\n loop: false,\n theme: selectTheme,\n pageSize: 15,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n if (selectedCategoryId === UNSELECT_ALL) {\n for (const id of installedSkills) {\n uninstallSet.add(id);\n }\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(installedSkills.length))),\n default: false,\n });\n if (!confirmed) return \"cancel\";\n return { toUninstall: [...uninstallSet], toKeep: [] };\n }\n if (selectedCategoryId === \"uninstall\") {\n if (uninstallSet.size === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return \"back\";\n }\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(uninstallSet.size))),\n default: false,\n });\n if (!confirmed) return \"cancel\";\n return { toUninstall: [...uninstallSet], toKeep: installedSkills.filter((id) => !uninstallSet.has(id)) };\n }\n step = 1;\n break;\n }\n case 1: {\n const category = categoriesWithInstalled.find((c) => c.id === selectedCategoryId);\n if (!category) return \"back\";\n\n printBoxTitle(t(\"wizard_step_4_skill_title\").replace(\"{category}\", category.name));\n\n const categorySkillIds = new Set(category.skills.map((s) => s.id));\n const selectedInCategory = new Set([...uninstallSet].filter((id) => categorySkillIds.has(id)));\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n {\n name: `>> ${t(\"uninstall_uncheck_all_category\")}`,\n value: SELECT_ALL_CATEGORY,\n checked: selectedInCategory.size === category.skills.length,\n description: t(\"uninstall_uncheck_all_category\"),\n },\n new Separator(\"──────────────\"),\n ...category.skills.map((skill) => {\n const isSelected = selectedInCategory.has(skill.id);\n return {\n name: `${chalk.cyan(skill.id)}`,\n value: skill.id,\n checked: isSelected,\n description: skill.description || \"\",\n };\n }),\n ];\n\n logger.info(chalk.dim(` ${t(\"uninstall_checkbox_hint_select\")}`));\n logger.blank();\n showOperationHints(true);\n\n const selectedSkills = await checkbox({\n message: t(\"uninstall_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n let selectedInCat: string[];\n if (selectedSkills.includes(SELECT_ALL_CATEGORY)) {\n selectedInCat = category.skills.map((s) => s.id);\n } else {\n selectedInCat = selectedSkills.filter((id) => id !== SELECT_ALL_CATEGORY);\n }\n\n for (const id of categorySkillIds) {\n if (selectedInCat.includes(id)) {\n uninstallSet.add(id);\n } else {\n uninstallSet.delete(id);\n }\n }\n\n const toUninstallCount = uninstallSet.size;\n const action = await select({\n message: toUninstallCount > 0\n ? t(\"uninstall_continue_or_confirm\").replace(\"{count}\", String(toUninstallCount))\n : t(\"wizard_no_selection\"),\n choices: toUninstallCount > 0\n ? [\n { name: \">> \" + t(\"uninstall_confirm_count\").replace(\"{count}\", String(toUninstallCount)), value: \"uninstall\" },\n { name: \"> \" + t(\"skill_continue_select\"), value: CONTINUE_SELECT },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ]\n : [\n new Separator(\"──────────────\"),\n { name: \"> \" + t(\"skill_continue_select\"), value: CONTINUE_SELECT },\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\n if (action === \"uninstall\") {\n if (uninstallSet.size === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return \"back\";\n }\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(uninstallSet.size))),\n default: false,\n });\n if (!confirmed) return \"cancel\";\n return { toUninstall: [...uninstallSet], toKeep: installedSkills.filter((id) => !uninstallSet.has(id)) };\n }\n if (action === CONTINUE_SELECT) {\n step = 0;\n break;\n }\n if (action === \"back\") {\n step = 0;\n break;\n }\n return \"cancel\";\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(` ${t(\"skill_total_count\").replace(\"{count}\", String(getAllSkills().length))}`));\n console.log();\n}\n\nfunction resolveSkillSourcePath(skill: { filePath?: string; source: string; id: string }, repoPath: string): string {\n if (skill.filePath) {\n const absPath = isAbsolute(skill.filePath) ? skill.filePath : join(repoPath, skill.filePath);\n if (existsSync(absPath)) {\n return dirname(absPath);\n }\n }\n return join(repoPath, skill.source, skill.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 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\";\nimport { findPlugin } from \"../core/registry.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_description\")),\n ],\n style: { head: [], border: [] },\n colWidths: [6, 32, 8, 50],\n wordWrap: true,\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 plugin.description || chalk.dim(\"—\"),\n ]);\n });\n\n console.log();\n const countSuffix = t(\"count_suffix\");\n console.log(chalk.bold(` ${t(\"list_title\")} (${plugins.length}${countSuffix ? \" \" + countSuffix : \"\"})`));\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 countSuffix = t(\"count_suffix\");\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}${countSuffix ? \" \" + countSuffix : \"\"} ${chalk.dim(\"|\")} ${chalk.dim(t(\"install_agents_count\") + \":\")} ${totalAgents}${countSuffix ? \" \" + countSuffix : \"\"}`,\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(t(\"try_prompt\"))}`,\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 const plugin = findPlugin(successResults[0].pluginId);\n const docsPath = plugin ? `${plugin.dir}/quickstart.md` : `${successResults[0].pluginId}/quickstart.md`;\n lines.push(\n ` ${chalk.dim(t(\"install_enhanced_docs\"))}: ${chalk.dim(docsPath)}`\n );\n }\n\n console.log();\n for (const line of lines) {\n console.log(line);\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 { 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 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)} — ${t(\"doctor_not_installed\")}`);\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)} — ${t(\"doctor_not_installed\")}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_links\")}`));\n\n const checkedRoots = new Set<string>();\n const configRootsToCheck: { configRoot: string; tool: AITool; level: \"project\" | \"global\" }[] = [];\n\n if (installed.length > 0) {\n for (const inst of installed) {\n if (!checkedRoots.has(inst.configRoot)) {\n checkedRoots.add(inst.configRoot);\n configRootsToCheck.push({ configRoot: inst.configRoot, tool: inst.tool, level: inst.level });\n }\n }\n } else {\n const primaryTool = detectedTools[0]?.name || \"opencode\";\n const configRoot = getConfigRoot(primaryTool, \"project\");\n configRootsToCheck.push({ configRoot, tool: primaryTool, level: \"project\" });\n }\n\n for (const { configRoot } of configRootsToCheck) {\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} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${skillsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(skillsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${skillsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(skillsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", 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} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${agentsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(agentsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${agentsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(agentsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", agentsDir)}`);\n }\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_config\")}`));\n for (const { configRoot, tool, level } of configRootsToCheck) {\n const configFile = getConfigFileName(tool);\n const configPath = level === \"project\"\n ? join(configRoot, \"..\", configFile)\n : join(configRoot, configFile);\n if (existsSync(configPath)) {\n console.log(chalk.green(\" ✓\") + ` ${configPath} ${t(\"doctor_config_exists\")}`);\n } else {\n console.log(chalk.dim(\" —\") + ` ${configPath} ${t(\"doctor_config_not_exist\")}`);\n }\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\")}: ${t(\"doctor_result_with_fix\").replace(\"{warnings}\", String(warnings)).replace(\"{fixes}\", String(fixes))}`\n );\n } else {\n console.log(\n ` ${t(\"doctor_result\")}: ${t(\"doctor_result_without_fix\").replace(\"{warnings}\", String(warnings))}`\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 { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function statusCommand(): Promise<void> {\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, getAllSkills } 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 { join } from \"path\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot, validateTool, validateLevel } 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; all?: 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 // Handle --all flag: install all available skills\n if (options.all) {\n const scanSpinner = createSpinner(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n const allSkills = getAllSkills();\n const skillIds = allSkills.map((s) => s.id);\n\n if (skillIds.length === 0) {\n logger.error(t(\"install_no_skill_selected\"));\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n logger.info(`${t(\"skill_all_install_progress\").replace(\"{count}\", chalk.bold(String(skillIds.length)))}`);\n\n const results = await installSkills(skillIds, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) { logger.success(`${progress} ${result.skillId}`); successCount++; }\n else { logger.error(`${progress} ${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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(configRoot, \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\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(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n let step = 1;\n while (true) {\n switch (step) {\n case 1: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") {\n const redetected = await selectToolWithDetection();\n if (redetected === \"back\" || redetected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = redetected;\n break;\n }\n if (selectedSkills === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return;\n }\n names = selectedSkills;\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(names.length)))}...`);\n const results = await installSkills(names, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) { logger.success(`${progress} ${result.skillId}`); successCount++; }\n else { logger.error(`${progress} ${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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(configRoot, \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", 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(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\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(t(\"available_plugins\") + \":\");\n for (const p of allPlugins) {\n logger.step(` ${p.id} (${p.aliases.join(\", \")})`);\n }\n logger.info(`${t(\"available_skills\")}: ${chalk.cyan(\"install-helper install --list\")}`);\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"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(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n const allPlugins = getAllPlugins();\n const results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath,\n undefined,\n options.yes\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(\"loading_plugin_data\"));\n spinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n } catch (error) {\n spinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(skills.length)))}...`);\n\n const results = await installSkills(skills, 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 logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(join(getConfigRoot(tool, level), \"skills\"))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", 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 installPath?: string,\n yes?: boolean\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 installPath,\n yes,\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, readFileSync } from \"fs\";\nimport { resolve, basename, sep, join } from \"path\";\nimport chalk from \"chalk\";\nimport { select, checkbox, Separator, confirm } from \"@inquirer/prompts\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { uninstallSkills, interactiveSkillUnselect } from \"../core/skill-installer.js\";\nimport { readRecord, deleteRecord, getInstalledSkills, getLastBatchSkills, scanInstalledFiles } from \"../core/record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { logger, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel, CannbotManifest } from \"../types/index.js\";\nimport { findBackups, restoreBackup, deleteBackup } from \"../core/backup.js\";\nimport { showRestorePrompt } from \"../ui/backup-prompts.js\";\nimport { getConfigRoot, validateTool, validateLevel, VALID_TOOLS } from \"../utils/paths.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { selectTheme, checkboxTheme } from \"../ui/theme.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\n\nexport async function uninstallCommand(\n names: string[],\n options: { tool?: string; level?: string; yes?: boolean; all?: boolean; recent?: boolean }\n): Promise<void> {\n const userSpecifiedTool = !!options.tool;\n const userSpecifiedLevel = !!options.level;\n const tool: AITool = options.tool ? validateTool(options.tool) : \"opencode\";\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n // --all mode: uninstall all installed skills + plugins\n if (options.all) {\n await uninstallAll(tool, level, options.yes || false);\n return;\n }\n\n // --recent mode: uninstall last batch of skills\n if (options.recent) {\n await uninstallRecent(tool, level, options.yes || false);\n return;\n }\n\n // Interactive mode: no names provided\n if (names.length === 0) {\n await uninstallInteractive(tool, level, userSpecifiedTool, userSpecifiedLevel);\n return;\n }\n\n // Name-driven mode (existing behavior)\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(`${t(\"uninstall_not_found\")}: ${name}`);\n }\n\n await uninstallPlugins(plugins, options.yes || false);\n await uninstallSkillsByName(skills, tool, level);\n}\n\nasync function uninstallAll(tool: AITool, level: InstallLevel, yes: boolean): Promise<void> {\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath, !yes);\n const installedPlugins = scanInstalled().filter((p) => p.tool === tool && p.level === level);\n\n const totalItems = installedSkills.length + installedPlugins.length;\n if (totalItems === 0) {\n logger.warn(t(\"uninstall_no_installed\"));\n return;\n }\n\n logger.info(t(\"uninstall_all_summary\")\n .replace(\"{skills}\", String(installedSkills.length))\n .replace(\"{plugins}\", String(installedPlugins.length)));\n logger.blank();\n\n for (const s of installedSkills) {\n logger.step(` • ${chalk.cyan(s)}`);\n }\n for (const p of installedPlugins) {\n logger.step(` • ${chalk.cyan(p.displayName)} ${chalk.dim(`(${p.id})`)}`);\n }\n logger.blank();\n\n if (!yes) {\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(totalItems))),\n default: false,\n });\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n }\n\n // Uninstall skills\n if (installedSkills.length > 0) {\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(installedSkills.length))}...`);\n await uninstallSkills(installedSkills, tool, level);\n }\n\n // Uninstall plugins\n if (installedPlugins.length > 0) {\n logger.info(`${t(\"uninstall_plugin_batch_progress\").replace(\"{count}\", String(installedPlugins.length))}...`);\n for (const inst of installedPlugins) {\n await uninstallPluginById(inst.id, true);\n }\n }\n\n logger.blank();\n logger.success(t(\"uninstall_all_done\"));\n logger.blank();\n}\n\nasync function uninstallRecent(tool: AITool, level: InstallLevel, yes: boolean): Promise<void> {\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const lastBatch = getLastBatchSkills(tool, level, installPath);\n\n if (!lastBatch || lastBatch.length === 0) {\n logger.warn(t(\"uninstall_recent_no_history\"));\n return;\n }\n\n logger.info(t(\"uninstall_recent_progress\").replace(\"{count}\", chalk.bold(String(lastBatch.length))));\n logger.blank();\n for (const s of lastBatch) {\n logger.step(` • ${chalk.cyan(s)}`);\n }\n logger.blank();\n\n if (!yes) {\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(lastBatch.length))),\n default: false,\n });\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n }\n\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(lastBatch.length))}...`);\n await uninstallSkills(lastBatch, tool, level);\n logger.blank();\n logger.success(t(\"skill_uninstall_done\"));\n logger.blank();\n}\n\nasync function uninstallInteractive(\n defaultTool: AITool,\n defaultLevel: InstallLevel,\n userSpecifiedTool: boolean,\n userSpecifiedLevel: boolean\n): Promise<void> {\n let tool = defaultTool;\n let level = defaultLevel;\n\n // Scan all tool×level combinations for installed content\n const allInstalledPlugins = scanInstalled();\n const toolsWithPlugins = new Set(allInstalledPlugins.map((p) => `${p.tool}:${p.level}`));\n\n // Check which tool×level combos have installed skills\n const toolsWithSkills = new Set<string>();\n for (const toolName of [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\", \"codearts\"] as AITool[]) {\n for (const lvl of [\"project\", \"global\"] as InstallLevel[]) {\n const ip = lvl === \"project\" ? process.cwd() : getConfigRoot(toolName, lvl);\n const skills = getInstalledSkills(toolName, lvl, ip);\n if (skills.length > 0) {\n toolsWithSkills.add(`${toolName}:${lvl}`);\n }\n }\n }\n\n const hasSkills = toolsWithSkills.size > 0;\n const hasPlugins = toolsWithPlugins.size > 0;\n\n if (!hasSkills && !hasPlugins) {\n logger.warn(t(\"uninstall_no_installed\"));\n return;\n }\n\n // Step: select type (skip if only one type has content)\n let uninstallType: string;\n if (hasSkills && hasPlugins) {\n printBoxTitle(t(\"uninstall_interactive_title\"));\n const skillCount = [...toolsWithSkills].reduce((sum, key) => {\n const [toolName, lvl] = key.split(\":\") as [AITool, InstallLevel];\n const ip = lvl === \"project\" ? process.cwd() : getConfigRoot(toolName, lvl);\n return sum + getInstalledSkills(toolName, lvl, ip).length;\n }, 0);\n const pluginCount = allInstalledPlugins.length;\n const typeChoices: Array<{ name: string; value: string } | Separator> = [\n { name: `> ${t(\"uninstall_type_skill\")} (${skillCount})`, value: \"skill\" },\n { name: `> ${t(\"uninstall_type_plugin\")} (${pluginCount})`, value: \"plugin\" },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ];\n showOperationHints();\n const choice = await select({\n message: t(\"uninstall_select_type\"),\n choices: typeChoices,\n loop: false,\n theme: selectTheme,\n });\n if (choice === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n uninstallType = choice;\n } else if (hasSkills) {\n uninstallType = \"skill\";\n } else {\n uninstallType = \"plugin\";\n }\n\n // Find which tools have content for the selected type\n const relevantKeys = uninstallType === \"skill\" ? toolsWithSkills : toolsWithPlugins;\n const toolsWithContent = new Set<AITool>();\n for (const key of relevantKeys) {\n toolsWithContent.add(key.split(\":\")[0] as AITool);\n }\n\n // Select tool (skip if only one tool has content, or respect --tool if user specified it)\n if (toolsWithContent.size === 1) {\n tool = [...toolsWithContent][0];\n } else if (userSpecifiedTool && toolsWithContent.has(defaultTool)) {\n tool = defaultTool;\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n tool = detected;\n }\n\n // Find which levels have content for the selected tool\n const levelsWithContent = new Set<InstallLevel>();\n for (const key of relevantKeys) {\n const [toolName, lvl] = key.split(\":\") as [AITool, InstallLevel];\n if (toolName === tool) {\n levelsWithContent.add(lvl);\n }\n }\n\n // Select level (skip if only one level has content, or respect --level if user specified it)\n if (levelsWithContent.size === 1) {\n level = [...levelsWithContent][0];\n } else if (userSpecifiedLevel && levelsWithContent.has(defaultLevel)) {\n level = defaultLevel;\n } else {\n const { stepLevel } = await import(\"../ui/wizard.js\");\n const levelResult = await stepLevel();\n if (levelResult === \"__back__\" || levelResult === \"__cancel__\") {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n level = levelResult as InstallLevel;\n }\n\n if (uninstallType === \"skill\") {\n await interactiveSkillUninstall(tool, level);\n } else {\n await interactivePluginUninstall(tool, level);\n }\n}\n\nasync function interactiveSkillUninstall(tool: AITool, level: InstallLevel): Promise<void> {\n const result = await interactiveSkillUnselect(tool, level);\n\n if (result === \"back\" || result === \"cancel\") {\n if (result === \"cancel\") logger.info(t(\"init_cancelled\"));\n return;\n }\n\n const { toUninstall } = result;\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(toUninstall.length))}...`);\n await uninstallSkills(toUninstall, tool, level);\n logger.blank();\n logger.success(t(\"skill_uninstall_done\"));\n logger.blank();\n}\n\nasync function interactivePluginUninstall(tool: AITool, level: InstallLevel): Promise<void> {\n const installed = scanInstalled().filter((p) => p.tool === tool && p.level === level);\n\n if (installed.length === 0) {\n logger.warn(t(\"uninstall_no_installed_plugins\"));\n return;\n }\n\n const pluginChoices: Array<{ name: string; value: string; checked: boolean; description?: string } | Separator> = [\n ...installed.map((inst) => ({\n name: `${chalk.cyan(inst.displayName)} ${chalk.dim(`(${inst.id})`)}`,\n value: inst.id,\n checked: false,\n description: `${inst.skillsCount} skills, ${inst.agentsCount} agents`,\n })),\n ];\n\n printBoxTitle(t(\"uninstall_interactive_title\"));\n logger.info(chalk.dim(` ${t(\"uninstall_checkbox_hint_select\")}`));\n logger.blank();\n showOperationHints(true);\n\n const selected = await checkbox({\n message: t(\"uninstall_select_plugins\"),\n choices: pluginChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n const toUninstall = installed.filter((inst) => selected.includes(inst.id));\n\n if (toUninstall.length === 0) {\n logger.info(t(\"uninstall_nothing_to_uninstall\"));\n return;\n }\n\n const confirmed = await confirm({\n message: t(\"uninstall_confirm_prompt\").replace(\"{count}\", chalk.bold(String(toUninstall.length))),\n default: false,\n });\n\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n\n logger.info(`${t(\"uninstall_plugin_batch_progress\").replace(\"{count}\", String(toUninstall.length))}...`);\n for (const inst of toUninstall) {\n await uninstallPluginById(inst.id, true);\n }\n logger.blank();\n logger.success(t(\"uninstall_all_done\"));\n logger.blank();\n}\n\nasync function uninstallPlugins(pluginIds: string[], batchMode: boolean): Promise<void> {\n for (const pluginId of pluginIds) {\n await uninstallPluginById(pluginId, batchMode);\n }\n}\n\nasync function uninstallPluginById(pluginId: string, batchMode: boolean): Promise<void> {\n const plugin = findPlugin(pluginId);\n if (!plugin) return;\n\n let record = readRecord(plugin.id);\n\n if (!record) {\n // Fallback: scan all tool×level for manifest-based cleanup\n for (const toolName of VALID_TOOLS) {\n for (const lvl of [\"project\", \"global\"] as InstallLevel[]) {\n const configRoot = getConfigRoot(toolName, lvl);\n const manifestPath = join(configRoot, `${pluginId}-manifest.json`);\n if (!existsSync(manifestPath)) continue;\n\n let manifest: CannbotManifest | null = null;\n try {\n manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as CannbotManifest;\n } catch {\n continue;\n }\n\n const installPath = lvl === \"project\" ? process.cwd() : configRoot;\n record = scanInstalledFiles(\n pluginId, plugin.displayName, toolName, lvl,\n installPath, configRoot, manifest,\n plugin.externalRepos?.map((r) => basename(r.dir)),\n plugin.configRootConfigLink\n );\n break;\n }\n if (record) break;\n }\n }\n\n if (!record) {\n logger.warn(`${plugin.displayName} ${t(\"uninstall_no_record\")}`);\n logger.info(`${t(\"uninstall_no_record_hint\")}`);\n return;\n }\n\n logger.info(`${t(\"uninstall_in_progress\")} ${plugin.displayName}...`);\n\n const configRoot = getConfigRoot(record.tool, record.level);\n const allowedBases = [resolve(configRoot), resolve(record.installPath)];\n const isSafePath = (p: string): boolean => {\n const resolved = resolve(p);\n return allowedBases.some(base => resolved === base || resolved.startsWith(base + sep));\n };\n\n let removedFiles = 0;\n let removedDirs = 0;\n\n // Add configRoot-level config file if not already in record (backward compat)\n const configFileName = record.tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n const configRootConfigPath = join(configRoot, configFileName);\n const installPathConfigPath = join(record.installPath, configFileName);\n const extraFiles: string[] = [];\n if (record.level === \"project\" &&\n configRootConfigPath !== installPathConfigPath &&\n !record.files.includes(configRootConfigPath) &&\n (existsSync(configRootConfigPath) || isSymlink(configRootConfigPath))) {\n extraFiles.push(configRootConfigPath);\n }\n\n const allFiles = [...record.files, ...extraFiles];\n\n for (const filePath of allFiles) {\n if (!isSafePath(filePath)) continue;\n try {\n if (existsSync(filePath) || isSymlink(filePath)) {\n unlinkSync(filePath);\n const name = basename(filePath);\n logger.step(` ${t(\"uninstall_remove_label\")}: ${name}`);\n removedFiles++;\n }\n } catch {\n // ignore\n }\n }\n\n const sortedDirs = [...record.directories].filter(isSafePath).sort((a, b) => b.length - a.length);\n for (const dirPath of sortedDirs) {\n try {\n if (resolve(dirPath) === resolve(configRoot)) {\n continue;\n }\n if (existsSync(dirPath)) {\n const entries = readdirSync(dirPath);\n if (entries.length === 0) {\n rmdirSync(dirPath);\n const name = basename(dirPath);\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${name}/`);\n removedDirs++;\n }\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id);\n removeInstalledPlugin(plugin.id);\n\n const backups = findBackups(configRoot);\n const otherBackups = backups.filter((b) => b.pluginId !== pluginId);\n\n if (!batchMode && otherBackups.length > 0) {\n const choice = await showRestorePrompt(otherBackups);\n if (choice !== \"none\") {\n const restored = restoreBackup(choice, configRoot, record.tool);\n if (restored) {\n const backupInfo = otherBackups.find((b) => b.filePath === choice);\n logger.success(`${t(\"backup_restore_success\")}: ${backupInfo?.pluginName || \"\"}`);\n deleteBackup(choice);\n }\n }\n } else if (batchMode && otherBackups.length > 0) {\n logger.info(t(\"uninstall_plugin_batch_skip_restore\"));\n }\n\n const currentBackups = backups.filter((b) => b.pluginId === pluginId);\n for (const backup of currentBackups) {\n deleteBackup(backup.filePath);\n }\n\n const totalRemoved = removedFiles + removedDirs;\n if (totalRemoved > 0) {\n logger.success(t(\"uninstall_summary_format\").replace(\"{name}\", plugin.displayName).replace(\"{files}\", String(removedFiles)).replace(\"{dirs}\", String(removedDirs)));\n } else {\n logger.warn(`${plugin.displayName}${t(\"uninstall_files_gone\")}`);\n }\n}\n\nasync function uninstallSkillsByName(skills: string[], tool: AITool, level: InstallLevel): Promise<void> {\n if (skills.length === 0) return;\n\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(skills.length))}...`);\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(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\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 { scanInstalled } from \"../core/manifest.js\";\nimport { printInstallSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { validateTool, validateLevel } from \"../utils/paths.js\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\ninterface UpdateTarget {\n pluginId: string;\n tool: AITool;\n level: InstallLevel;\n}\n\nexport async function updateCommand(\n pluginNames: string[],\n options: { tool?: string; level?: string; yes?: boolean }\n): Promise<void> {\n // Phase 1: ensureRepoAndScan (discover dynamic plugins + enrich metadata)\n const repoManager = createRepositoryManager();\n const updateSpinner = createSpinner(t(\"update_updating\") + \"...\");\n updateSpinner.start();\n\n let repoPath: string;\n try {\n repoPath = await repoManager.ensureRepoAndScan();\n updateSpinner.succeed(t(\"install_repo_ready\"));\n } catch (error) {\n updateSpinner.fail(t(\"repo_clone_failed\")\n .replace(\"{error}\", error instanceof Error ? error.message : t(\"error_unknown\"))\n .replace(\"{url}\", \"\")\n .replace(\"{dir}\", \"\"));\n return;\n }\n\n // Phase 2: scanInstalled (now includes dynamically discovered plugins)\n const installed = scanInstalled();\n\n let targets: UpdateTarget[] = [];\n\n if (pluginNames.length === 0) {\n if (installed.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n logger.info(t(\"update_install_hint\").replace(\"{cmd}\", chalk.cyan(\"install-helper install <plugin>\")));\n return;\n }\n targets = installed.map((p) => ({ pluginId: p.id, tool: p.tool, level: p.level }));\n } else {\n let defaultTool: AITool | undefined;\n let defaultLevel: InstallLevel | undefined;\n\n if (options.tool) {\n defaultTool = validateTool(options.tool);\n }\n if (options.level) {\n defaultLevel = validateLevel(options.level);\n }\n\n for (const name of pluginNames) {\n const plugin = findPlugin(name);\n if (!plugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n continue;\n }\n\n const installedForPlugin = installed.filter((p) => p.id === plugin.id);\n\n if (installedForPlugin.length > 0) {\n for (const inst of installedForPlugin) {\n if (defaultTool && inst.tool !== defaultTool) continue;\n if (defaultLevel && inst.level !== defaultLevel) continue;\n targets.push({ pluginId: plugin.id, tool: inst.tool, level: inst.level });\n }\n } else {\n logger.warn(`${plugin.displayName} ${t(\"error_not_installed\")}, ${t(\"update_skipped\")}`);\n }\n }\n }\n\n if (targets.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n return;\n }\n\n // Phase 3: reinstall each target\n const allPlugins = getAllPlugins();\n const results = [];\n const total = targets.length;\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n const plugin = allPlugins.find((p) => p.id === target.pluginId);\n const displayName = plugin?.displayName || target.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: target.pluginId,\n tool: target.tool,\n level: target.level,\n repoPath,\n yes: options.yes,\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 inst = installed.find((p) => p.id === plugin.id);\n const isInstalled = !!inst;\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\") + \":\")} ${inst ? inst.skillsCount : plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${inst ? inst.agentsCount : plugin.agents}`);\n console.log(` ${chalk.dim(t(\"info_aliases\") + \":\")} ${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(` ${t(\"lang_supported\")}`));\n console.log(chalk.dim(` ${t(\"lang_usage\")}`));\n console.log();\n return;\n }\n\n if (action === \"set\") {\n if (!value) {\n console.log(chalk.red(` ${t(\"lang_specify\")}`));\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(` ${t(\"lang_unknown_action\")}: ${action}`));\n console.log(chalk.dim(` ${t(\"lang_supported_actions\")}`));\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\";\nimport { t } from \"./utils/i18n.js\";\n\nfunction isExitError(error: any): boolean {\n if (!error) return false;\n return (\n error.name === \"ExitPromptError\" ||\n error.message?.includes(\"force closed\") ||\n error.message?.includes(\"SIGINT\") ||\n error.constructor?.name === \"ExitPromptError\"\n );\n}\n\nfunction handleExit(error: any): void {\n if (isExitError(error)) {\n console.log(\"\\n\" + t(\"init_cancelled\"));\n process.exit(0);\n }\n}\n\nprocess.on(\"SIGINT\", () => {\n console.log(\"\\n\" + t(\"init_cancelled\"));\n process.exit(130);\n});\n\nprocess.on(\"uncaughtException\", (error: any) => {\n handleExit(error);\n throw error;\n});\n\nprocess.on(\"unhandledRejection\", (error: any) => {\n handleExit(error);\n process.exit(1);\n});\n\nconst program = createCLI();\nprogram.parse();\n"],"mappings":"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","names":["existsSync","join","join","existsSync","existsSync","homedir","join","existsSync","readFileSync","join","i","chalk","existsSync","unlinkSync","dirname","existsSync","readFileSync","join","chalk","choices","result","select","Separator","chalk","existsSync","mkdirSync","readFileSync","rmSync","join","dirname","fileURLToPath","execa","parseYaml","existsSync","readdirSync","readFileSync","mkdirSync","join","dirname","fileURLToPath","__filename","__dirname","existsSync","readFileSync","statSync","join","join","readFileSync","existsSync","statSync","installSkills","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","execa","existsSync","mkdirSync","rmSync","existsSync","join","basename","execa","existsSync","mkdirSync","readFileSync","unlinkSync","readdirSync","join","existsSync","readdirSync","unlinkSync","join","join","existsSync","readdirSync","unlinkSync","select","chalk","existsSync","mkdirSync","copyFileSync","writeFileSync","rmSync","join","execa","join","existsSync","basename","execa","existsSync","mkdirSync","symlinkSync","readdirSync","rmSync","realpathSync","readlinkSync","cpSync","join","dirname","select","Separator","chalk","join","existsSync","mkdirSync","realpathSync","readlinkSync","symlinkSync","cpSync","readdirSync","rmSync","Separator","select","chalk","action","dirname","chalk","Table","existsSync","readFileSync","join","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","join","chalk","join","confirm","chalk","scanSpinner","tool","level","existsSync","unlinkSync","readdirSync","readFileSync","basename","join","chalk","select","checkbox","Separator","confirm","chalk","confirm","Separator","select","stepLevel","checkbox","configRoot","join","existsSync","readFileSync","basename","unlinkSync","readdirSync","chalk","chalk","existsSync","readdirSync","join","chalk","join","existsSync","readdirSync","chalk","readFileSync","existsSync","fileURLToPath","dirname","join","__filename","__dirname","program"]}