@cannbot-ai/install-helper 1.2.2-beta.0 → 1.2.2

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/locales/zh_CN.json","../src/locales/en_US.json","../src/utils/i18n.ts","../src/utils/paths.ts","../src/utils/fs.ts","../src/embedded-config.json","../src/core/scanner.ts","../src/embedded-plugins.json","../src/core/registry.ts","../src/core/detector.ts","../src/core/manifest.ts","../src/ui/theme.ts","../src/utils/logger.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/skill-registry.ts","../src/core/metadata-sync.ts","../src/core/cannbot-delegate.ts","../src/core/cannbot-installer.ts","../src/core/cannbot-registry.ts","../src/core/record.ts","../src/core/installer.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 \"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_cannbot_requires_delegation\": \"插件 {plugin} 为 cannbot 仓委托安装源,须经 installPluginRouted 路由安装(内部路由错误,请提 Issue 反馈)\",\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/、.trae/、.cursor/、.codex/ 与 .agents/、.github/、.codeartsdoer/)\",\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 \"unowned_file_detected\": \"检测到非 CANNBot 安装的配置文件\",\n \"unowned_file_path\": \"文件\",\n \"unowned_file_warning\": \"该文件不是由 CANNBot 安装的。替换将覆盖其现有内容(会在文件旁创建备份)。\",\n \"unowned_file_keep\": \"保留我的文件(跳过替换)\",\n \"unowned_file_replace\": \"替换(自动备份)\",\n \"unowned_preserved\": \"已保留现有文件(未替换): {file}\",\n \"unowned_preserved_yes\": \"非交互模式:已保留非 CANNBot 安装的现有文件: {file}\",\n \"unowned_backup_label\": \"用户文件\",\n \"backup_restore_user_file\": \"恢复用户文件\",\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_config_preserved\": \"已跳过配置文件(保留现有文件): {file}\",\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_codex_toml_missing\": \"插件未提供 Codex 适配文件 {path},已跳过 agent: {name}\",\n \"error_tool_not_supported\": \"插件 {plugin} 的安装脚本暂不支持工具 {tool}(为避免误装到默认目录已中止),请查看该插件 quickstart.md 确认支持的工具列表\",\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 \"error_invalid_source\": \"无效的插件来源: {source}\\n支持的来源: {sources}\",\n \"info_source\": \"安装注册表\",\n \"cannbot_tool_unsupported\": \"cannbot 型插件暂不支持工具 {tool}(上游安装器支持: {tools})\",\n \"cannbot_level_unsupported\": \"cannbot 型插件仅支持 project 级安装\",\n \"cannbot_node_required\": \"安装 cannbot 型插件需要可用的 Node.js 运行环境,当前未检测到 node。请安装 Node.js(≥20)后重试\",\n \"cannbot_installer_failed\": \"获取 @cannbot-plugin/cannbot 安装器失败: {error}\",\n \"cannbot_installer_refresh_failed\": \"刷新 cannbot 安装器失败,使用本地缓存继续\",\n \"cannbot_installer_path_invalid\": \"CANNBOT_INSTALLER_PATH 指定的安装器路径无效: {path}\",\n \"cannbot_plugin_not_found\": \"cannbot 安装器包中未找到插件 {plugin}\",\n \"cannbot_registry_missing\": \"安装后未在 cannbot-plugin.json 中找到注册记录\",\n \"cannbot_delegate_failed\": \"cannbot 安装器执行失败(退出码 {code}),输出见上方日志\",\n \"cannbot_bundled_fallback\": \"上游安装器暂不识别新版 plugins-official 目录(等待其发版修复),已自动回退为安装器包内置快照(--bundled)完成安装\",\n \"cannbot_migrated_symlink\": \"检测到 {file} 为旧版插件软链,已转为真实文件(内容保留并已备份)\",\n \"cannbot_migrate_symlink_failed\": \"旧版软链 {file} 转真实文件失败,请手动处理后重试\",\n \"cannbot_dual_skill_copy\": \"以下 Skills 同时存在于新旧两套布局中,AI 工具会看到两份副本: {skills}\",\n \"cannbot_registry_corrupted\": \"无法解析 cannbot-plugin.json: {file}\",\n \"cannbot_registry_schema_unsupported\": \"cannbot-plugin.json schemaVersion({version})不受支持,请升级 install-helper 后再执行卸载\",\n \"cannbot_uninstall_no_record\": \"未找到该插件的 cannbot 安装记录\",\n \"cannbot_uninstall_native_hint\": \"该插件在工具侧注册了原生插件,如需取消注册可执行: opencode plugin remove {spec}\",\n \"doctor_cannbot\": \"cannbot 集成\",\n \"doctor_cannbot_node_ok\": \"Node.js 运行时可用(支持 cannbot 插件委托安装)\",\n \"doctor_cannbot_node_missing\": \"未检测到 Node.js 运行时,cannbot 型插件不可安装\",\n \"doctor_cannbot_missing_skills\": \"注册表记录的 Skills 中有 {count} 个在磁盘上不存在\",\n \"doctor_cannbot_marker_duplicate\": \"插件 {plugin} 存在重复的标记块\",\n \"doctor_cannbot_marker_unpaired\": \"标记块不配对(start={start}, end={end})\",\n \"doctor_cannbot_orphan_record\": \"插件 {plugin} 的委托安装记录已悬空(cannbot-plugin.json 中无对应记录)\"\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_cannbot_requires_delegation\": \"Plugin {plugin} is a cannbot-source entry and must be installed via installPluginRouted delegation (internal routing error — please report an issue)\",\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 the tool's config directory (e.g. .opencode/, .claude/, .trae/, .cursor/, .codex/ with .agents/, .github/, .codeartsdoer/)\",\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 \"unowned_file_detected\": \"Configuration file not created by CANNBot detected\",\n \"unowned_file_path\": \"File\",\n \"unowned_file_warning\": \"This file was not installed by CANNBot. Replacing it overwrites its current content (a backup is created beside it).\",\n \"unowned_file_keep\": \"Keep my file (skip replacing it)\",\n \"unowned_file_replace\": \"Replace (auto backup)\",\n \"unowned_preserved\": \"Kept existing file (not replaced): {file}\",\n \"unowned_preserved_yes\": \"Non-interactive mode: kept existing file not created by CANNBot: {file}\",\n \"unowned_backup_label\": \"User file\",\n \"backup_restore_user_file\": \"Restore user file\",\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_config_preserved\": \"Skipped config file (kept existing file): {file}\",\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_codex_toml_missing\": \"Codex adapter file {path} not found in plugin, agent skipped: {name}\",\n \"error_tool_not_supported\": \"Plugin {plugin} does not support tool {tool} yet (aborted to avoid mis-installing into default directories); see the plugin quickstart.md for supported tools\",\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 \"error_invalid_source\": \"Invalid plugin source: {source}\\nSupported sources: {sources}\",\n \"info_source\": \"Install registry\",\n \"cannbot_tool_unsupported\": \"Tool {tool} is not supported for cannbot plugins yet (upstream supports: {tools})\",\n \"cannbot_level_unsupported\": \"cannbot plugins support project-level installation only\",\n \"cannbot_node_required\": \"A working Node.js runtime is required to install cannbot plugins but node was not found. Please install Node.js (>=20) and retry\",\n \"cannbot_installer_failed\": \"Failed to fetch the @cannbot-plugin/cannbot installer: {error}\",\n \"cannbot_installer_refresh_failed\": \"Failed to refresh the cannbot installer; continuing with the local cache\",\n \"cannbot_installer_path_invalid\": \"The installer path set by CANNBOT_INSTALLER_PATH is invalid: {path}\",\n \"cannbot_plugin_not_found\": \"Plugin {plugin} was not found in the cannbot installer package\",\n \"cannbot_registry_missing\": \"No cannbot-plugin.json record found after installation\",\n \"cannbot_delegate_failed\": \"The cannbot installer exited with code {code}; see the output above\",\n \"cannbot_bundled_fallback\": \"The upstream installer predates the plugins-official rename (pending its next release); automatically fell back to the installer package's bundled snapshot (--bundled)\",\n \"cannbot_migrated_symlink\": \"{file} was a legacy plugin symlink; converted to a real file (content kept, backup saved)\",\n \"cannbot_migrate_symlink_failed\": \"Failed to convert the legacy symlink {file} to a real file; resolve it manually and retry\",\n \"cannbot_dual_skill_copy\": \"These Skills exist in both the legacy and cannbot layouts, the AI tool will see two copies: {skills}\",\n \"cannbot_registry_corrupted\": \"Cannot parse cannbot-plugin.json: {file}\",\n \"cannbot_registry_schema_unsupported\": \"cannbot-plugin.json schemaVersion ({version}) is not supported; upgrade install-helper before uninstalling\",\n \"cannbot_uninstall_no_record\": \"No cannbot install record found for this plugin\",\n \"cannbot_uninstall_native_hint\": \"This plugin registered a native plugin with the tool; unregister it via: opencode plugin remove {spec}\",\n \"doctor_cannbot\": \"cannbot integration\",\n \"doctor_cannbot_node_ok\": \"Node.js runtime available (cannbot delegation supported)\",\n \"doctor_cannbot_node_missing\": \"No Node.js runtime detected; cannbot plugins cannot be installed\",\n \"doctor_cannbot_missing_skills\": \"{count} skills recorded in the registry are missing on disk\",\n \"doctor_cannbot_marker_duplicate\": \"Plugin {plugin} has duplicate marker blocks\",\n \"doctor_cannbot_marker_unpaired\": \"Marker blocks are unpaired (start={start}, end={end})\",\n \"doctor_cannbot_orphan_record\": \"Delegated install record for {plugin} is orphaned (no matching cannbot-plugin.json entry)\"\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\", \"codex\", \"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 \"codex\":\n return join(home, \".codex\");\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 \"codex\":\n return join(baseDir, \".codex\");\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 getSkillsRoot(tool: AITool, level: InstallLevel, base?: string): string {\n if (tool === \"codex\") {\n if (level === \"global\") {\n return join(homedir(), \".agents\", \"skills\");\n }\n return join(base || process.cwd(), \".agents\", \"skills\");\n }\n return join(getConfigRoot(tool, level, base), \"skills\");\n}\n\nexport function getAgentsFileName(tool: AITool): string {\n return getConfigFileName(tool);\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 { 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 \"scanDirs\": [\n \"ops\",\n \"model\",\n \"graph\",\n \"infra\",\n \"runtime\",\n \"tools\"\n ],\n \"pluginDirs\": [\n \"plugins-official\"\n ],\n \"cacheTtlHours\": 24,\n \"cannbotInstaller\": {\n \"package\": \"@cannbot-plugin/cannbot\",\n \"channel\": \"latest\",\n \"ttlHours\": 24\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\";\nimport embeddedConfig from \"../embedded-config.json\" with { type: \"json\" };\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 // Resolution order:\n // 1. repository.yaml on disk — runtime override, works for tsup dist\n // (dist/config/) and TS source (src/core → ../config/)\n // 2. embedded-config.json — generated from repository.yaml at build time;\n // the only source available inside the bun-compiled native binary\n // 3. hardcoded defaults (must not drift from repository.yaml)\n const configCandidates = [\n join(__dirname, \"config\", \"repository.yaml\"),\n join(__dirname, \"..\", \"config\", \"repository.yaml\"),\n ];\n for (const configPath of configCandidates) {\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n if (!config) continue;\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 // try next candidate\n }\n }\n const embedded = embeddedConfig as { scanDirs?: string[]; pluginDirs?: string[]; cacheTtlHours?: number };\n if (Array.isArray(embedded.scanDirs) && embedded.scanDirs.length > 0) {\n return {\n skillDirs: embedded.scanDirs,\n pluginDirs: Array.isArray(embedded.pluginDirs) && embedded.pluginDirs.length > 0\n ? embedded.pluginDirs\n : [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: (embedded.cacheTtlHours || 24) * 60 * 60 * 1000,\n };\n }\n return {\n skillDirs: [\"ops\", \"model\", \"graph\", \"infra\", \"runtime\"],\n pluginDirs: [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: 24 * 60 * 60 * 1000,\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 getPluginDirs(): string[] {\n return [...PLUGIN_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 {\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\": 0,\n \"agents\": 6,\n \"description\": \"skill 驱动多角色直调算子开发工作流:PM 调度 architect/developer/qa 团队,8 阶段 7 CP 全流程,支持静默模式与算子仓继承定制\",\n \"version\": \"2.0.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [],\n \"installAgents\": [\n \"architect\",\n \"developer\",\n \"developer-code\",\n \"developer-doc\",\n \"developer-test\",\n \"qa\"\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\": 30,\n \"agents\": 7,\n \"description\": \"生产级 ACLNN 注册算子全流程:代码→UT/ST→上库\",\n \"version\": \"1.2.3\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-blaze-best-practice\",\n \"ascendc-blaze-migration\",\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-perf-optimize\",\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-simulator\",\n \"ops-spec-gen\"\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 \"dir\": \"plugins-official/ops-registry-invoke/skills\",\n \"skills\": [\n \"spec-to-design\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-ops-architect\",\n \"ascendc-ops-spec-reviewer\",\n \"ascendc-ops-designer\",\n \"ascendc-ops-design-reviewer\",\n \"ascendc-ops-tester\",\n \"ascendc-ops-test-design-reviewer\",\n \"ascendc-ops-developer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/ops-registry-invoke/reference/cann/asc-devkit\",\n \"depth\": 1,\n \"configRootLink\": false\n },\n {\n \"url\": \"https://gitcode.com/cann/ops-tensor.git\",\n \"dir\": \"plugins-official/ops-registry-invoke/ops-tensor\",\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-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 \"sota\",\n \"sota-approach\",\n \"model-infer-sota\"\n ],\n \"skills\": 14,\n \"agents\": 9,\n \"description\": \"NPU 模型推理端到端优化,涵盖固定阶段优化(并行/KVCache/融合/量化/图模式)与 baseline 之上 profiling 驱动的探索式优化(按需调用多流/预取/SuperKernel 等单点优化)\",\n \"version\": \"1.0.6\",\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 \"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-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\": 17,\n \"agents\": 8,\n \"description\": \"PyPTO Python API 算子全流程开发,覆盖需求理解、API 探索、实现与调优\",\n \"version\": \"1.2.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"pypto-orchestration-manual\",\n \"pypto-intent-understand\",\n \"pypto-op-plan\",\n \"pypto-api-explore\",\n \"pypto-docs-search\",\n \"pypto-golden-generate\",\n \"pypto-op-design\",\n \"pypto-op-construct\",\n \"pypto-op-develop\",\n \"pypto-op-verify\",\n \"pypto-op-review\",\n \"pypto-precision-compare\",\n \"pypto-precision-debug\",\n \"pypto-general-debug\",\n \"pypto-op-perf-tune\",\n \"pypto-op-knowledge\",\n \"pypto-memory-template\"\n ]\n }\n ],\n \"installAgents\": [\n \"pypto-op-planner\",\n \"pypto-op-mathematician\",\n \"pypto-op-architect\",\n \"pypto-op-designer\",\n \"pypto-op-coder\",\n \"pypto-op-verifier\",\n \"pypto-op-debugger\",\n \"pypto-op-optimizer\"\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\": 13,\n \"agents\": 6,\n \"description\": \"TileLang Python DSL + @tilelang.jit 算子开发(支持 Developer/Expert 双模式)\",\n \"version\": \"1.2.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 \"tilelang-performance-best-practices\",\n \"ascendc-env-check\",\n \"npu-arch\",\n \"tilelang-op-profiling\"\n ]\n }\n ],\n \"installAgents\": [\n \"tilelang-op-analyst\",\n \"tilelang-op-developer\",\n \"tilelang-op-perf-tuner\",\n \"tilelang-tuning\",\n \"tilelang-perf-analysis-expert\",\n \"tilelang-perf-impl-expert\"\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 \"triton-precision-debug\",\n \"npu-arch\",\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\": 7,\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-npugraph-ex-performance-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\": 4,\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-api-best-practices\",\n \"npu-arch\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-ops-reviewer\",\n \"ascendc-code-summarizer\"\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, PluginSource } from \"../types/index.js\";\nimport { isDirectory } from \"../utils/fs-helpers.js\";\nimport { getPluginDirs } from \"./scanner.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\n// cannbot-repo plugins discovered from the managed @cannbot-plugin/cannbot\n// package (dist/plugins manifests). Kept separate from the embedded legacy\n// snapshot: cannbot entries are resolved at runtime and never baked into\n// embedded-plugins.json (no release coupling with the cannbot repo).\nlet CANNBOT_PLUGINS: PluginEntry[] = [];\n\nexport function setCannbotPlugins(entries: PluginEntry[]): void {\n CANNBOT_PLUGINS = entries.map((entry) => ({ ...entry, source: \"cannbot\" as PluginSource }));\n}\n\nexport function getCannbotPlugins(): PluginEntry[] {\n return [...CANNBOT_PLUGINS];\n}\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 // Plugin discovery scope follows repository.yaml pluginDirs (currently\n // official plugins only — community plugins are not adapted yet).\n for (const pluginDir of getPluginDirs()) {\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(\n query: string,\n options?: { source?: PluginSource }\n): PluginEntry | undefined {\n const normalized = query.toLowerCase().trim();\n const wantCannbot = options?.source !== \"skills\";\n\n // cannbot-source plugins win for same-name ids (migration policy: the new\n // generation in the cannbot repo is authoritative; the legacy version can\n // still be requested explicitly via --source skills).\n if (wantCannbot) {\n const cannbotExact = CANNBOT_PLUGINS.find(\n (p) => p.id === normalized || p.id === query.trim()\n );\n if (cannbotExact) return cannbotExact;\n\n const cannbotAlias = CANNBOT_PLUGINS.find((p) =>\n p.aliases.some((a) => a === normalized)\n );\n if (cannbotAlias) return cannbotAlias;\n }\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 if (wantCannbot) {\n const cannbotPrefixes = CANNBOT_PLUGINS.filter((p) => p.id.startsWith(normalized));\n if (cannbotPrefixes.length === 1) return cannbotPrefixes[0];\n }\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 [...CANNBOT_PLUGINS, ...PLUGIN_REGISTRY].sort((a, b) =>\n a.displayName < b.displayName ? -1 : a.displayName > b.displayName ? 1 : 0\n );\n}\n\nexport function getPluginById(id: string): PluginEntry | undefined {\n const cannbot = CANNBOT_PLUGINS.find((p) => p.id === id);\n if (cannbot) return cannbot;\n return PLUGIN_REGISTRY.find((p) => p.id === id);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { execa } from \"execa\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport type { AITool, DetectedTool } from \"../types/index.js\";\nimport { detectTraeVariant, 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 detectCodex(): Promise<DetectedTool | undefined> {\n const cmdPath = await getCommandPath(\"codex\");\n if (cmdPath) {\n const version = await getCommandVersion(\"codex\");\n return { name: \"codex\", version, path: cmdPath };\n }\n\n const home = homedir();\n const configDir = join(home, \".codex\");\n if (existsSync(configDir)) {\n return { name: \"codex\", path: configDir };\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 detectCodex,\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 codex: \"Codex\",\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, getSkillsRoot, 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 = getSkillsRoot(tool, level);\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 { 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, PluginSource, 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\n// Wizard choice values encode the plugin source so same-name cannbot and\n// legacy entries stay distinguishable through selection, confirm and install.\nexport function encodePluginChoice(id: string, source?: PluginSource): string {\n return source === \"cannbot\" ? `cannbot::${id}` : `skills::${id}`;\n}\n\nexport function decodePluginChoice(value: string): { id: string; source: PluginSource } {\n if (value.startsWith(\"cannbot::\")) return { id: value.slice(\"cannbot::\".length), source: \"cannbot\" };\n if (value.startsWith(\"skills::\")) return { id: value.slice(\"skills::\".length), source: \"skills\" };\n return { id: value, source: \"skills\" };\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 const badge = p.source === \"cannbot\" ? chalk.magenta(\" [cannbot]\") : \"\";\n return {\n name: `> ${chalk.cyan(p.displayName)}${badge}${suffix}`,\n value: encodePluginChoice(p.id, p.source),\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((value) => {\n const { id, source } = decodePluginChoice(value);\n return allPlugins.find((p) => p.id === id && (p.source ?? \"skills\") === source);\n });\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, codex, copilot, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-s, --source <source>\", \"Plugin source for same-name plugins (cannbot, skills)\")\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; source?: 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, codex, 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, codex, 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, decodePluginChoice } from \"../ui/wizard.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPluginRouted } from \"../core/cannbot-delegate.js\";\nimport { ensureCannbotDiscovery } from \"../core/cannbot-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, getSkillsRoot } 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 await ensureCannbotDiscovery();\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 // wizard choices carry a source prefix (cannbot::<id> / skills::<id>) so\n // same-name entries resolve to the source the user actually picked\n const selected = answers.plugins.map((value) => {\n const { id, source } = decodePluginChoice(value);\n return {\n id,\n source,\n plugin: allPlugins.find((p) => p.id === id && (p.source ?? \"skills\") === source),\n };\n });\n\n const total = answers.plugins.length;\n const results = [];\n\n for (let i = 0; i < selected.length; i++) {\n const pluginId = selected[i].id;\n const source = selected[i].source;\n const plugin = selected[i].plugin;\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 installPluginRouted({\n pluginId,\n tool: answers.tool,\n level: answers.level,\n repoPath,\n plugin,\n source,\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 for (const warning of result.warnings || []) {\n logger.warn(warning);\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => ({\n pluginId: result.pluginId,\n displayName: selected[index]?.plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n source: selected[index]?.source,\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 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(getSkillsRoot(tool, level))}`);\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 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: \"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-blaze-migration\", description: \"AscendC Matmul 家族等价迁移到 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: \"算子对接 PyTorch(kernel 直调 / aclnn 注册双路线)\", 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: \"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: \"model-train-precision-numerical-mismatch\", description: \"PyTorch on NPU 训练正向/反向有限值偏差诊断\", source: \"model\" },\n { id: \"model-train-precision-nonfinite\", description: \"PyTorch on NPU 训练 NaN/Inf/Overflow 诊断\", source: \"model\" },\n { id: \"model-train-precision-determinism\", description: \"PyTorch on NPU 训练非确定性诊断\", source: \"model\" },\n { id: \"model-train-log-visualization\", description: \"NPU 大模型训练日志可视化与对比\", source: \"model\" },\n { id: \"model-train-oom-analysis\", description: \"PyTorch on NPU 训练 OOM 内存诊断与优化\", 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 { id: \"ge-fusion-pass-skill\", description: \"GE/CANN 自定义融合 pass 开发与诊断\", 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/批量 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, readdirSync } from \"fs\";\nimport { join, sep } 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 parseAllSkills(pluginDir: string): string[] {\n const initPath = join(pluginDir, \"init.sh\");\n try {\n const text = readFileSync(initPath, \"utf-8\");\n const m = text.match(/ALL_SKILLS=\"([^\"]*)\"/);\n if (!m) return [];\n const val = m[1];\n if (val.includes(\"$(\") || val.includes(\"${\")) return [];\n return val.split(/\\s+/).filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction findSkillSourceDir(skillName: string, repoRoot: string, scanDirs: string[], pluginDir?: 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 if (pluginDir) {\n const localCandidate = join(pluginDir, \"skills\", skillName);\n if (existsSync(localCandidate) && statSync(localCandidate).isDirectory()) {\n const relPluginDir = pluginDir.replace(repoRoot + sep, \"\").replace(repoRoot + \"/\", \"\");\n return `${relPluginDir}/skills`;\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 .filter((a) => a.startsWith(\"./agents/\"))\n .map((a) => a.replace(/^\\.\\/agents\\//, \"\").replace(/\\.md$/, \"\"))\n .filter(Boolean);\n}\n\nfunction parseIncludedAgentPattern(initShPath: string): string | null {\n try {\n const text = readFileSync(initShPath, \"utf-8\");\n const m = text.match(/INCLUDED_AGENT_PATTERN=\"([^\"]*)\"/);\n if (!m) return null;\n return m[1].trim() || null;\n } catch {\n return null;\n }\n}\n\nfunction simpleGlobToRegExp(pattern: string): RegExp {\n let re = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const c = pattern[i];\n if (c === \"*\") re += \".*\";\n else if (c === \"?\") re += \".\";\n else re += c.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return new RegExp(re + \"$\");\n}\n\nfunction matchAgentsByPattern(agentsDir: string, pattern: string): string[] {\n const filePattern = pattern.endsWith(\".md\") ? pattern : pattern + \".md\";\n try {\n const fsSync = require(\"fs\") as typeof import(\"fs\");\n if (typeof fsSync.globSync === \"function\") {\n return fsSync.globSync(filePattern, { cwd: agentsDir })\n .map((f: string) => f.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\"));\n }\n } catch {}\n if (filePattern.includes(\"@(\") || filePattern.includes(\"+(\") || filePattern.includes(\"!(\")) {\n return [];\n }\n try {\n const re = simpleGlobToRegExp(filePattern);\n return readdirSync(agentsDir)\n .filter((f) => f.endsWith(\".md\") && re.test(f))\n .map((f) => f.replace(/\\.md$/, \"\"));\n } catch {\n return [];\n }\n}\n\nfunction discoverAgents(pluginDir: string, pj: PluginJson | null, initShPath: string, fallbackAgents?: string[]): string[] {\n const fromPj = resolveAgentsFromPluginJson(pj);\n if (fromPj.length > 0) return fromPj;\n if (pj && Array.isArray(pj.agents) && pj.agents.length === 0) return [];\n const pattern = parseIncludedAgentPattern(initShPath);\n if (pattern) {\n const agentsDir = join(pluginDir, \"agents\");\n if (existsSync(agentsDir)) {\n const fromPattern = matchAgentsByPattern(agentsDir, pattern);\n if (fromPattern.length > 0) return fromPattern;\n }\n }\n // Layer 3: fallback agents (from embedded/yml installAgents, last resort)\n return fallbackAgents || [];\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 let initSkills = parseIncludedSkills(pluginDir);\n if (initSkills.length === 0) {\n initSkills = parseAllSkills(pluginDir);\n }\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, pluginDir);\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 (SoT), fallback to init.sh pattern, then embedded\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: discover from plugin.json (SoT) with init.sh pattern + embedded fallback\n const initShPath = join(pluginDir, \"init.sh\");\n plugin.installAgents = discoverAgents(pluginDir, pj, initShPath, plugin.installAgents);\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.length;\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\n// Delegation protocol: cannbot-style plugins are installed by the cannbot\n// repository's own installer (@cannbot-plugin/cannbot) so the resulting\n// layout (.agents/skills, marker-block AGENTS.md, .cannbot/plugins assets,\n// cannbot-plugin.json registry) is byte-for-byte identical to a direct\n// `npx @cannbot-plugin/cannbot install`. install-helper only wraps discovery,\n// boundaries, bookkeeping and (uninstall/list/status) around it.\n\nimport { existsSync, readFileSync, writeFileSync, copyFileSync, unlinkSync, readdirSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult, PluginEntry, PluginSource } from \"../types/index.js\";\nimport { discoverCannbotPlugins, ensureCannbotInstaller, getCannbotBinPath, hasNodeRuntime } from \"./cannbot-installer.js\";\nimport { findCannbotRegistryPath, readCannbotRegistry } from \"./cannbot-registry.js\";\nimport { writeRecord } from \"./record.js\";\nimport { installPlugin } from \"./installer.js\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigFileName, getSkillsRoot } from \"../utils/paths.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport const DELEGATE_TOOLS: AITool[] = [\"opencode\", \"claude\", \"trae\", \"codex\"];\n\nexport interface DelegateInstallOptions {\n pluginId: string;\n displayName?: string;\n tool: AITool;\n level: InstallLevel;\n target?: string;\n yes?: boolean;\n}\n\nfunction boundaryErrors(tool: AITool, level: InstallLevel): string[] {\n const errors: string[] = [];\n if (!DELEGATE_TOOLS.includes(tool)) {\n errors.push(\n t(\"cannbot_tool_unsupported\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", DELEGATE_TOOLS.join(\", \"))\n );\n }\n if (level !== \"project\") {\n errors.push(t(\"cannbot_level_unsupported\"));\n }\n return errors;\n}\n\n/**\n * Migration-time precheck: legacy installs own AGENTS.md/CLAUDE.md as a\n * symlink to the plugin source. The cannbot installer merges marker blocks\n * into a real file, so a symlinked config would be replaced wholesale and\n * the legacy uninstall would later delete the merged file. Convert the\n * symlink to a real file (keeping content) before delegating.\n */\nfunction migrateSymlinkedInstructions(target: string, tool: AITool): string[] {\n const warnings: string[] = [];\n const fileName = getConfigFileName(tool);\n const candidates = [join(target, fileName), join(target, \"AGENTS.md\"), join(target, \"CLAUDE.md\")];\n\n for (const configPath of candidates) {\n if (!isSymlink(configPath)) continue;\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const backupPath = `${configPath}.cannbot-migration.${Date.now()}`;\n copyFileSync(configPath, backupPath);\n unlinkSync(configPath);\n writeFileSync(configPath, content);\n warnings.push(t(\"cannbot_migrated_symlink\").replace(\"{file}\", fileName));\n } catch {\n warnings.push(t(\"cannbot_migrate_symlink_failed\").replace(\"{file}\", fileName));\n }\n break;\n }\n\n return warnings;\n}\n\n/** Detects skills installed by a legacy plugin that the cannbot plugin also\n * installs (same skill name in a different layout root) — scenario B. */\nfunction detectDualSkillCopies(tool: AITool, target: string, skillNames: string[]): string[] {\n const duplicates: string[] = [];\n if (tool !== \"opencode\") return duplicates;\n\n const legacyRoot = getSkillsRoot(\"opencode\", \"project\", target);\n if (!existsSync(legacyRoot)) return duplicates;\n let legacyEntries: string[] = [];\n try {\n legacyEntries = readdirSync(legacyRoot);\n } catch {\n return duplicates;\n }\n\n for (const name of skillNames) {\n if (legacyEntries.includes(name)) {\n duplicates.push(name);\n }\n }\n return duplicates;\n}\n\nfunction skillNameFromPath(rel: string): string {\n const parts = rel.split(\"/\");\n return parts[parts.length - 1] || rel;\n}\n\ninterface DelegateRunResult {\n ok: boolean;\n stdout: string;\n stderr: string;\n exitCode: number | undefined;\n}\n\n/**\n * Runs the cannbot installer CLI. Output is captured and re-emitted\n * verbatim (equivalent to stdio inherit) so the transcript stays identical\n * while still being inspectable for the rename-gap fallback below.\n */\nasync function runDelegate(\n args: string[],\n target: string\n): Promise<DelegateRunResult> {\n try {\n const result = await execa(\"node\", [getCannbotBinPath(), ...args], {\n cwd: target,\n timeout: 600000,\n });\n process.stdout.write(result.stdout || \"\");\n process.stderr.write(result.stderr || \"\");\n return { ok: true, stdout: result.stdout || \"\", stderr: result.stderr || \"\", exitCode: 0 };\n } catch (error) {\n const err = error as { stdout?: string; stderr?: string; exitCode?: number; message?: string };\n process.stdout.write(err.stdout || \"\");\n process.stderr.write(err.stderr || \"\");\n if (!err.stdout && !err.stderr && err.message) {\n process.stderr.write(`${err.message}\\n`);\n }\n return {\n ok: false,\n stdout: err.stdout || \"\",\n stderr: err.stderr || \"\",\n exitCode: err.exitCode,\n };\n }\n}\n\n/**\n * The --bundled retry only applies to installers that still expose the flag\n * (pre-1.8.0, where installLatest followed the cannbot mainline). Installers\n * >= 1.8.0 dropped the flag because bundled is the default behavior — for\n * them a first-attempt \"plugin not found\" is a genuine failure and must be\n * passed through verbatim without a misleading unknown-option retry.\n */\nfunction installerSupportsBundledFlag(): boolean {\n try {\n const binSource = readFileSync(getCannbotBinPath(), \"utf-8\");\n return binSource.includes('\"--bundled\"');\n } catch {\n return false;\n }\n}\n\nexport async function delegateInstall(options: DelegateInstallOptions): Promise<InstallResult> {\n const { pluginId, tool, level } = options;\n const target = resolve(options.target || process.cwd());\n const displayName = options.displayName || pluginId;\n\n const result: InstallResult = {\n success: false,\n pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [],\n warnings: [],\n };\n\n // 1. boundary validation (tool matrix + level)\n result.errors.push(...boundaryErrors(tool, level));\n if (result.errors.length > 0) {\n return result;\n }\n\n // 2. Node.js runtime is required to run the cannbot installer\n if (!hasNodeRuntime()) {\n result.errors.push(t(\"cannbot_node_required\"));\n return result;\n }\n\n // 3. ensure the managed installer package\n try {\n await ensureCannbotInstaller();\n } catch (error) {\n result.errors.push(\n t(\"cannbot_installer_failed\").replace(\n \"{error}\",\n error instanceof Error ? error.message : t(\"error_unknown\")\n )\n );\n return result;\n }\n\n // 4. the plugin must exist in the bundled release; if it is missing from a\n // cached installer, force one refresh before giving up (handles newly\n // published cannbot plugins)\n if (!discoverCannbotPlugins().some((p) => p.id === pluginId)) {\n try {\n await ensureCannbotInstaller({ force: true });\n } catch {\n // fall through to the not-found error below\n }\n if (!discoverCannbotPlugins().some((p) => p.id === pluginId)) {\n result.errors.push(t(\"cannbot_plugin_not_found\").replace(\"{plugin}\", pluginId));\n return result;\n }\n }\n\n // 5. instructions-file precheck (legacy symlink -> real file)\n result.warnings.push(...migrateSymlinkedInstructions(target, tool));\n\n // 6. delegate: node <installer>/bin/cannbot.js install <id> --tool <t> --target <dir>\n // Default mirrors a direct `cannbot install`. Installers packaged before\n // the plugins/ -> plugins-official/ rename (cannbot e140ca6) resolve\n // official plugins against a fresh mainline checkout via their bundled\n // sourcePluginDirectory and fail with \"plugin not found\". When exactly\n // that failure occurs on a --bundled-capable installer, retry once with\n // --bundled (install from the installer package's own dist snapshot) so\n // users are not blocked on upstream's release cadence. Installers\n // >= 1.8.0 install from the bundled snapshot by default and dropped the\n // flag, so for them the first failure is final and passed through.\n let run = await runDelegate([\"install\", pluginId, \"--tool\", tool, \"--target\", target], target);\n\n // installLatest reports the failure via console.error (stderr)\n const hitRenameGap =\n !run.ok &&\n installerSupportsBundledFlag() &&\n (run.stdout.includes(`plugin not found: ${pluginId}`) ||\n run.stderr.includes(`plugin not found: ${pluginId}`));\n if (hitRenameGap) {\n result.warnings.push(t(\"cannbot_bundled_fallback\"));\n run = await runDelegate(\n [\"install\", pluginId, \"--tool\", tool, \"--target\", target, \"--bundled\"],\n target\n );\n }\n\n if (!run.ok) {\n result.errors.push(\n t(\"cannbot_delegate_failed\").replace(\n \"{code}\",\n run.exitCode !== undefined ? String(run.exitCode) : \"?\"\n )\n );\n return result;\n }\n\n // 7. read back the registry record the cannbot installer just wrote and\n // mirror it into install-helper's own bookkeeping\n const registryRead = readCannbotRegistry(target, tool);\n const record = registryRead?.registry.plugins.find((r) => r?.plugin === pluginId);\n\n if (!record) {\n result.errors.push(t(\"cannbot_registry_missing\"));\n return result;\n }\n\n result.skillsCount = Array.isArray(record.skills) ? record.skills.length : 0;\n result.agentsCount = Array.isArray(record.agents) ? record.agents.length : 0;\n\n const files: string[] = [];\n const directories: string[] = [];\n for (const rel of [...(record.skills || []), ...(record.agents || [])]) {\n files.push(join(target, rel));\n }\n if (record.assets) {\n directories.push(join(target, record.assets));\n }\n if (record.permissions) {\n directories.push(join(target, record.permissions));\n }\n\n const registryPath = findCannbotRegistryPath(target, tool);\n\n writeRecord({\n pluginId,\n displayName,\n tool,\n level: \"project\",\n installPath: target,\n configRoot: registryPath ? join(registryPath, \"..\") : target,\n installTime: new Date().toISOString(),\n files,\n directories,\n kind: \"delegated\",\n });\n addInstalledPlugin(pluginId);\n\n // 8. dual-copy warning (scenario B)\n const duplicates = detectDualSkillCopies(\n tool,\n target,\n (record.skills || []).map(skillNameFromPath)\n );\n if (duplicates.length > 0) {\n result.warnings.push(t(\"cannbot_dual_skill_copy\").replace(\"{skills}\", duplicates.join(\", \")));\n }\n\n result.success = true;\n return result;\n}\n\n/**\n * Unified routing helper: cannbot-style plugins go through delegation,\n * everything else through the legacy installer. Used by install/update and\n * the interactive wizard so no call site needs to branch on its own.\n */\nexport async function installPluginRouted(\n options: InstallOptions & { plugin?: PluginEntry; source?: PluginSource }\n): Promise<InstallResult> {\n // An explicit --source skills always forces the legacy installer, even\n // when the plugin metadata (resolved by an unscoped cannbot-first lookup\n // at a call site) points at the cannbot entry of a same-name plugin.\n const isCannbot =\n options.source === \"cannbot\" ||\n (options.source !== \"skills\" && options.plugin?.source === \"cannbot\");\n\n if (isCannbot) {\n return delegateInstall({\n pluginId: options.pluginId,\n displayName: options.plugin?.displayName,\n tool: options.tool,\n level: options.level,\n target: options.installPath || process.cwd(),\n yes: options.yes,\n });\n }\n\n return installPlugin(options);\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\n// Managed installer for the cannbot repository's unified installer\n// (@cannbot-plugin/cannbot). install-helper delegates cannbot-style plugin\n// installation to this package so both installers always produce identical\n// on-disk layouts (single source of truth for the \"resolve + materialize\"\n// stages of installation).\n//\n// Lifecycle mirrors RepositoryManager.ensureRepo():\n// - missing -> npm install <package>@<channel> into the managed prefix\n// - TTL ok -> reuse the cached copy (offline friendly)\n// - TTL gone -> refresh via npm install (same channel)\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execa, execaSync } from \"execa\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { CannbotInstallerConfig, CannbotPluginManifest } from \"../types/index.js\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport embeddedConfig from \"../embedded-config.json\" with { type: \"json\" };\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst DEFAULT_CONFIG: CannbotInstallerConfig = {\n package: \"@cannbot-plugin/cannbot\",\n channel: \"latest\",\n ttlHours: 24,\n};\n\nconst NPM_MIRRORS = [\n undefined, // user's npm config (registry.npmjs.org by default)\n \"https://registry.npmmirror.com\",\n];\n\nexport interface CannbotPluginEntry {\n id: string;\n version: string;\n description: string;\n skillsCount: number;\n agentsCount: number;\n dir: string;\n}\n\nexport function loadCannbotInstallerConfig(): CannbotInstallerConfig {\n // Resolution order (mirrors scanner.loadScanConfig):\n // 1. repository.yaml on disk (dist/config/ or src/config/)\n // 2. embedded-config.json (bun-compiled native binary)\n // 3. hardcoded defaults (must not drift from repository.yaml)\n // CANNBOT_INSTALLER_CHANNEL always overrides the channel when set.\n let config: CannbotInstallerConfig = DEFAULT_CONFIG;\n\n const configCandidates = [\n join(__dirname, \"config\", \"repository.yaml\"),\n join(__dirname, \"..\", \"config\", \"repository.yaml\"),\n ];\n for (const configPath of configCandidates) {\n try {\n const parsed = parseYaml(readFileSync(configPath, \"utf-8\"));\n if (!parsed?.cannbotInstaller) continue;\n config = {\n package: parsed.cannbotInstaller.package || DEFAULT_CONFIG.package,\n channel: parsed.cannbotInstaller.channel || DEFAULT_CONFIG.channel,\n ttlHours: parsed.cannbotInstaller.ttlHours || DEFAULT_CONFIG.ttlHours,\n };\n break;\n } catch {\n // try next candidate\n }\n }\n\n if (config === DEFAULT_CONFIG) {\n const embedded = embeddedConfig as {\n cannbotInstaller?: { package?: string; channel?: string; ttlHours?: number };\n };\n if (embedded.cannbotInstaller) {\n config = {\n package: embedded.cannbotInstaller.package || DEFAULT_CONFIG.package,\n channel: embedded.cannbotInstaller.channel || DEFAULT_CONFIG.channel,\n ttlHours: embedded.cannbotInstaller.ttlHours || DEFAULT_CONFIG.ttlHours,\n };\n }\n }\n\n return {\n ...config,\n channel: process.env.CANNBOT_INSTALLER_CHANNEL || config.channel,\n };\n}\n\nexport function getCannbotInstallerPrefix(): string {\n return join(getCannbotConfigDir(), \"installers\", \"cannbot\");\n}\n\nexport function getCannbotPackageRoot(): string {\n const override = process.env.CANNBOT_INSTALLER_PATH;\n if (override) return override;\n const { package: packageName } = loadCannbotInstallerConfig();\n return join(getCannbotInstallerPrefix(), \"node_modules\", ...packageName.split(\"/\"));\n}\n\nexport function getCannbotBinPath(): string {\n return join(getCannbotPackageRoot(), \"bin\", \"cannbot.js\");\n}\n\ninterface InstallerState {\n version: string;\n channel: string;\n installedAt: number;\n}\n\nfunction getStatePath(): string {\n return join(getCannbotInstallerPrefix(), \"state.json\");\n}\n\nfunction readState(): InstallerState | null {\n try {\n return JSON.parse(readFileSync(getStatePath(), \"utf-8\")) as InstallerState;\n } catch {\n return null;\n }\n}\n\nfunction writeState(state: InstallerState): void {\n const prefix = getCannbotInstallerPrefix();\n if (!existsSync(prefix)) {\n mkdirSync(prefix, { recursive: true });\n }\n writeFileSync(getStatePath(), JSON.stringify(state, null, 2));\n}\n\nexport function isCannbotInstallerReady(): boolean {\n return existsSync(getCannbotBinPath());\n}\n\nexport function getCannbotInstallerVersion(): string | null {\n try {\n const pkg = JSON.parse(readFileSync(join(getCannbotPackageRoot(), \"package.json\"), \"utf-8\"));\n return pkg.version || null;\n } catch {\n return null;\n }\n}\n\nexport function hasNodeRuntime(): boolean {\n // Delegation spawns `node`; probe it directly. process.versions.node is\n // unreliable here because bun-compiled binaries also set it.\n try {\n const result = execaSync(\"node\", [\"--version\"], { timeout: 10000 });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n\nasync function npmInstallInstaller(config: CannbotInstallerConfig, force: boolean): Promise<void> {\n const prefix = getCannbotInstallerPrefix();\n if (!existsSync(prefix)) {\n mkdirSync(prefix, { recursive: true });\n }\n\n const spec = `${config.package}@${config.channel}`;\n let lastError: unknown = null;\n for (const registry of NPM_MIRRORS) {\n const args = [\"install\", \"--prefix\", prefix, \"--no-audit\", \"--no-fund\", \"--ignore-scripts\", spec];\n if (registry) args.push(\"--registry\", registry);\n try {\n await execa(\"npm\", args, { timeout: 300000 });\n return;\n } catch (error) {\n lastError = error;\n if (force || !isCannbotInstallerReady()) {\n // keep trying mirrors only when we have nothing cached yet\n continue;\n }\n break;\n }\n }\n if (isCannbotInstallerReady() && !force) {\n // refresh failed but a cached copy exists — degrade to the cache\n logger.warn(t(\"cannbot_installer_refresh_failed\"));\n return;\n }\n throw lastError instanceof Error\n ? lastError\n : new Error(t(\"error_unknown\"));\n}\n\n/**\n * Ensures the cannbot installer package is available. Returns the package\n * root. Throws when the package cannot be installed and no cache exists.\n */\nexport async function ensureCannbotInstaller(options?: { force?: boolean }): Promise<string> {\n const config = loadCannbotInstallerConfig();\n const packageRoot = getCannbotPackageRoot();\n\n // Explicit override: trust it as-is (offline/test escape hatch). Never\n // npm-install into it.\n if (process.env.CANNBOT_INSTALLER_PATH) {\n if (!isCannbotInstallerReady()) {\n throw new Error(\n t(\"cannbot_installer_path_invalid\").replace(\"{path}\", process.env.CANNBOT_INSTALLER_PATH)\n );\n }\n return packageRoot;\n }\n\n const ready = isCannbotInstallerReady();\n\n if (!ready || options?.force) {\n await npmInstallInstaller(config, options?.force || !ready);\n writeState({\n version: getCannbotInstallerVersion() || \"unknown\",\n channel: config.channel,\n installedAt: Date.now(),\n });\n return packageRoot;\n }\n\n const state = readState();\n const ttlMs = config.ttlHours * 60 * 60 * 1000;\n if (!state || Date.now() - state.installedAt > ttlMs) {\n try {\n await npmInstallInstaller(config, false);\n writeState({\n version: getCannbotInstallerVersion() || \"unknown\",\n channel: config.channel,\n installedAt: Date.now(),\n });\n } catch {\n // already handled inside npmInstallInstaller (cache fallback / throw)\n }\n }\n\n return packageRoot;\n}\n\nfunction readManifest(pluginDir: string): CannbotPluginManifest | null {\n try {\n return JSON.parse(readFileSync(join(pluginDir, \".claude-plugin\", \"plugin.json\"), \"utf-8\"));\n } catch {\n return null;\n }\n}\n\n/**\n * Discovers cannbot-style plugins bundled inside the managed installer\n * package. Layouts probed (in order):\n * - dist/plugins — npm package layout (assemble output; stable\n * across the upstream plugins-official rename)\n * - dist/plugins-official — defensive: future npm layout change\n * - plugins / plugins-official — repository checkout layouts, for\n * CANNBOT_INSTALLER_PATH pointing at a cannbot\n * repo clone (pre/post the e140ca6 rename)\n * The npm package is self-contained: skills are copied into dist at pack\n * time, so no cannbot repository checkout or vendor/cannbot-skills\n * submodule is needed. Returns [] when the installer package is not\n * available (graceful degradation for offline environments).\n */\nexport function discoverCannbotPlugins(): CannbotPluginEntry[] {\n if (!isCannbotInstallerReady()) {\n return [];\n }\n\n const packageRoot = getCannbotPackageRoot();\n const entries: CannbotPluginEntry[] = [];\n const parents = [\n join(packageRoot, \"dist\", \"plugins\"),\n join(packageRoot, \"dist\", \"plugins-official\"),\n join(packageRoot, \"plugins\"),\n join(packageRoot, \"plugins-official\"),\n ];\n\n for (const parent of parents) {\n if (!existsSync(parent)) continue;\n let names: string[] = [];\n try {\n names = readdirSync(parent);\n } catch {\n continue;\n }\n for (const name of names) {\n const pluginDir = join(parent, name);\n const manifest = readManifest(pluginDir);\n if (!manifest || typeof manifest.name !== \"string\") continue;\n if (entries.some((e) => e.id === manifest.name)) continue;\n entries.push({\n id: manifest.name,\n version: manifest.version || \"\",\n description: manifest.description || \"\",\n skillsCount: Array.isArray(manifest.skills) ? manifest.skills.length : 0,\n agentsCount: Array.isArray(manifest.agents) ? manifest.agents.length : 0,\n dir: join(parent, name),\n });\n }\n }\n\n return entries;\n}\n\n/**\n * Bootstrap for the dual-source registry: ensures the managed installer\n * (best effort, never throws — offline environments degrade to the legacy\n * source only) and merges cannbot plugin entries into the plugin registry\n * so findPlugin resolves them with cannbot-first precedence.\n */\nexport async function ensureCannbotDiscovery(): Promise<boolean> {\n try {\n await ensureCannbotInstaller();\n } catch {\n return false;\n }\n\n const entries = discoverCannbotPlugins();\n const { setCannbotPlugins } = await import(\"./registry.js\");\n setCannbotPlugins(\n entries.map((entry) => ({\n id: entry.id,\n dir: entry.dir,\n displayName: entry.id,\n script: \"cannbot\",\n aliases: [],\n skills: entry.skillsCount,\n agents: entry.agentsCount,\n description: entry.description,\n version: entry.version,\n source: \"cannbot\" as const,\n }))\n );\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\n// Adapter for the cannbot installer's own install registry\n// (<configDir>/cannbot-plugin.json, schemaVersion 2). install-helper reads\n// it to implement list/status and a full uninstall for cannbot-style\n// plugins (the upstream CLI only ships `install`). The registry file is the\n// source of truth for cannbot-type installs — records written directly by\n// the cannbot CLI (no install-helper delegated record) are handled the same\n// way.\n\nimport { existsSync, readFileSync, readdirSync, rmSync, rmdirSync, unlinkSync, lstatSync, writeFileSync } from \"fs\";\nimport { join, resolve, sep, dirname } from \"path\";\nimport type { CannbotInstalledEntry, CannbotRegistryFile, CannbotRegistryRecord } from \"../types/index.js\";\nimport { deleteRecord, readRecords } from \"./record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\n\n// Mirror of cannbot installer TOOL_DIRECTORIES (script/bin/cannbot.js) for\n// the tools install-helper delegates to. configDirs are probed in order; the\n// first existing one wins, falling back to defaultConfigDir.\nexport const CANNBOT_TOOL_LAYOUTS: Record<string, { configDirs: string[]; defaultConfigDir: string }> = {\n opencode: { configDirs: [\".opencode\"], defaultConfigDir: \".opencode\" },\n codex: { configDirs: [\".codex\"], defaultConfigDir: \".codex\" },\n claude: { configDirs: [\".claude\"], defaultConfigDir: \".claude\" },\n trae: { configDirs: [\".traecli\", \".marscode\", \".trae\", \".trae-cn\"], defaultConfigDir: \".trae\" },\n};\n\nexport const CANNBOT_SUPPORTED_TOOLS = Object.keys(CANNBOT_TOOL_LAYOUTS);\n\nexport const CANNBOT_REGISTRY_SCHEMA_VERSION = 2;\nconst REGISTRY_FILE_NAME = \"cannbot-plugin.json\";\n\nfunction toolConfigDir(target: string, tool: string): string {\n const layout = CANNBOT_TOOL_LAYOUTS[tool];\n if (!layout) return join(target, `.${tool}`);\n return layout.configDirs\n .map((name) => join(target, name))\n .find((path) => existsSync(path)) ?? join(target, layout.defaultConfigDir);\n}\n\nexport function findCannbotRegistryPath(target: string, tool: string): string | null {\n const configDir = toolConfigDir(target, tool);\n const registryPath = join(configDir, REGISTRY_FILE_NAME);\n return existsSync(registryPath) ? registryPath : null;\n}\n\nexport interface CannbotRegistryReadResult {\n registryPath: string;\n registry: CannbotRegistryFile;\n schemaSupported: boolean;\n}\n\nexport function readCannbotRegistry(target: string, tool: string): CannbotRegistryReadResult | null {\n const registryPath = findCannbotRegistryPath(target, tool);\n if (!registryPath) return null;\n\n let registry: CannbotRegistryFile;\n try {\n registry = JSON.parse(readFileSync(registryPath, \"utf-8\")) as CannbotRegistryFile;\n } catch {\n logger.warn(t(\"cannbot_registry_corrupted\").replace(\"{file}\", registryPath));\n return null;\n }\n\n if (typeof registry.schemaVersion !== \"number\" || !Array.isArray(registry.plugins)) {\n logger.warn(t(\"cannbot_registry_corrupted\").replace(\"{file}\", registryPath));\n return null;\n }\n\n return {\n registryPath,\n registry,\n schemaSupported: registry.schemaVersion === CANNBOT_REGISTRY_SCHEMA_VERSION,\n };\n}\n\nfunction toInstalledEntry(target: string, registryPath: string, record: CannbotRegistryRecord): CannbotInstalledEntry {\n return {\n id: record.plugin,\n version: record.pluginVersion || \"\",\n tool: record.tool,\n target,\n registryPath,\n skillsCount: Array.isArray(record.skills) ? record.skills.length : 0,\n agentsCount: Array.isArray(record.agents) ? record.agents.length : 0,\n record,\n };\n}\n\n/**\n * Scans for cannbot-style installs. cannbot plugins are project-level only,\n * so only `target` (defaults to cwd) is scanned across the supported tools.\n */\nexport function scanCannbotInstalled(target?: string): CannbotInstalledEntry[] {\n const root = resolve(target || process.cwd());\n const installed: CannbotInstalledEntry[] = [];\n\n for (const tool of CANNBOT_SUPPORTED_TOOLS) {\n const result = readCannbotRegistry(root, tool);\n if (!result) continue;\n for (const record of result.registry.plugins) {\n if (!record?.plugin) continue;\n installed.push(toInstalledEntry(root, result.registryPath, record));\n }\n }\n\n return installed;\n}\n\nexport function findCannbotRecord(pluginId: string, target?: string): CannbotInstalledEntry | null {\n const entries = scanCannbotInstalled(target);\n return entries.find((e) => e.id === pluginId) || null;\n}\n\nexport function removeMarkerBlock(content: string, pluginName: string): string {\n const start = `<!-- cannbot:${pluginName}:start -->`;\n const end = `<!-- cannbot:${pluginName}:end -->`;\n const pattern = new RegExp(\n `${start.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\n?[\\\\s\\\\S]*?${end.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\n?`,\n \"g\"\n );\n return content.replace(pattern, \"\");\n}\n\nexport function countMarkerBlocks(content: string, pluginName: string): number {\n const start = `<!-- cannbot:${pluginName}:start -->`;\n return content.split(start).length - 1;\n}\n\n// --- uninstall ---\n\nexport interface CannbotUninstallResult {\n success: boolean;\n pluginId: string;\n removedFiles: number;\n removedDirs: number;\n errors: string[];\n}\n\nfunction removeIfSafe(pathToRemove: string, allowedBase: string): \"removed\" | \"missing\" | \"skipped\" {\n const resolved = resolve(pathToRemove);\n if (resolved !== allowedBase && !resolved.startsWith(allowedBase + sep)) {\n return \"skipped\";\n }\n try {\n const stat = lstatSync(resolved);\n if (stat.isDirectory()) {\n rmSync(resolved, { recursive: true, force: true });\n } else {\n unlinkSync(resolved);\n }\n return \"removed\";\n } catch {\n return \"missing\";\n }\n}\n\nfunction removeEmptyDirUpward(dirPath: string, stopAt: string): boolean {\n let current = resolve(dirPath);\n const stop = resolve(stopAt);\n let removedAny = false;\n while (current.startsWith(stop + sep)) {\n try {\n const entries = readdirSync(current);\n if (entries.length > 0) break;\n rmdirSync(current);\n removedAny = true;\n } catch {\n break;\n }\n current = dirname(current);\n }\n return removedAny;\n}\n\nfunction cleanHookSettings(hookSettingsPath: string, target: string, pluginId: string): void {\n // Remove hook entries that point into .cannbot/plugins/<pluginId>/ so a\n // shared settings.json (e.g. .claude/settings.json) keeps serving other\n // plugins. Best effort — malformed files are left untouched.\n const resolved = resolve(target, hookSettingsPath);\n if (!existsSync(resolved)) return;\n let settings: Record<string, unknown>;\n try {\n settings = JSON.parse(readFileSync(resolved, \"utf-8\"));\n } catch {\n return;\n }\n if (!settings || typeof settings !== \"object\" || !settings.hooks) return;\n\n const pluginRootFragment = `.cannbot/plugins/${pluginId}`;\n const cleanHooks = (hooks: unknown): unknown => {\n if (Array.isArray(hooks)) {\n return hooks.filter((entry) => !JSON.stringify(entry).includes(pluginRootFragment));\n }\n if (hooks && typeof hooks === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(hooks as Record<string, unknown>)) {\n const cleaned = cleanHooks(value);\n if (Array.isArray(cleaned) ? cleaned.length > 0 : cleaned !== undefined) {\n result[key] = cleaned;\n }\n }\n return result;\n }\n return hooks;\n };\n\n try {\n const cleaned = cleanHooks(settings.hooks);\n if (Array.isArray(cleaned) ? cleaned.length === 0 : Object.keys(cleaned as object).length === 0) {\n delete settings.hooks;\n } else {\n settings.hooks = cleaned;\n }\n writeFileSync(resolved, `${JSON.stringify(settings, null, 2)}\\n`);\n } catch {\n // leave the file untouched on failure\n }\n}\n\nfunction cleanCodexNativePlugin(record: CannbotRegistryRecord, pluginId: string): void {\n const native = record.nativePlugin;\n if (!native || typeof native !== \"object\") return;\n\n if (native.pluginRoot) {\n try {\n rmSync(native.pluginRoot, { recursive: true, force: true });\n logger.step(` ${t(\"uninstall_remove_label\")}: ${native.pluginRoot}`);\n } catch {\n // best effort\n }\n }\n\n if (native.marketplacePath && existsSync(native.marketplacePath)) {\n try {\n const marketplace = JSON.parse(readFileSync(native.marketplacePath, \"utf-8\"));\n if (Array.isArray(marketplace?.plugins)) {\n marketplace.plugins = marketplace.plugins.filter(\n (p: { name?: string }) => !(p && (p.name === pluginId || p.name === native.marketplaceName))\n );\n if (marketplace.plugins.length === 0) {\n unlinkSync(native.marketplacePath);\n } else {\n writeFileSync(native.marketplacePath, `${JSON.stringify(marketplace, null, 2)}\\n`);\n }\n }\n } catch {\n // best effort\n }\n }\n}\n\n/**\n * The upstream installer registers its npm plugin with the opencode CLI\n * (`opencode plugin @cannbot-plugin/cannbot@<version>`), which writes the\n * spec into <target>/.opencode/opencode.json. Strip that entry so uninstall\n * leaves no residue; the file is removed once nothing remains in it. Only\n * called when no sibling cannbot plugin still needs the registration.\n */\nfunction cleanOpenCodePluginRegistration(root: string): void {\n const configPath = join(root, \".opencode\", \"opencode.json\");\n if (!existsSync(configPath)) return;\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {\n return;\n }\n if (!Array.isArray(config.plugin)) return;\n\n const CLEAN_PACKAGE_PREFIX = \"@cannbot-plugin/cannbot\";\n config.plugin = config.plugin.filter(\n (entry) => !(typeof entry === \"string\" && entry.startsWith(CLEAN_PACKAGE_PREFIX))\n );\n\n try {\n if (Array.isArray(config.plugin) && config.plugin.length === 0) {\n delete config.plugin;\n }\n if (Object.keys(config).length === 0) {\n unlinkSync(configPath);\n removeOpenCodePluginGitignore(dirname(configPath));\n } else {\n writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n }\n } catch {\n // leave the file untouched on failure\n }\n}\n\n/**\n * `opencode plugin add` also drops a generic .gitignore next to the\n * registration (node_modules/package.json/bun.lock/...). Remove it together\n * with the registration, but only when its content matches the opencode\n * plugin signature so user-authored files are never touched.\n */\nfunction removeOpenCodePluginGitignore(configDir: string): void {\n const gitignorePath = join(configDir, \".gitignore\");\n if (!existsSync(gitignorePath)) return;\n try {\n const content = readFileSync(gitignorePath, \"utf-8\");\n if (content.includes(\"bun.lock\") && content.includes(\"node_modules\")) {\n unlinkSync(gitignorePath);\n }\n } catch {\n // best effort\n }\n}\n\n/**\n * Full uninstall of a cannbot-style plugin driven by its registry record.\n * Steps: remove skills/agents, strip the AGENTS.md/CLAUDE.md marker block,\n * remove .cannbot/plugins/<id> assets, shared permissions/settings only when\n * no other cannbot plugin still references them, dependency clones, the\n * codex native plugin, then update the registry itself.\n */\nexport function uninstallCannbotPlugin(pluginId: string, target?: string): CannbotUninstallResult {\n const result: CannbotUninstallResult = {\n success: false,\n pluginId,\n removedFiles: 0,\n removedDirs: 0,\n errors: [],\n };\n\n const root = resolve(target || process.cwd());\n let read: CannbotRegistryReadResult | null = null;\n let record: CannbotRegistryRecord | undefined;\n\n for (const tool of CANNBOT_SUPPORTED_TOOLS) {\n const candidate = readCannbotRegistry(root, tool);\n if (!candidate) continue;\n const found = candidate.registry.plugins.find((r) => r?.plugin === pluginId);\n if (found) {\n read = candidate;\n record = found;\n break;\n }\n }\n\n if (!read || !record) {\n result.errors.push(t(\"cannbot_uninstall_no_record\"));\n return result;\n }\n\n if (!read.schemaSupported) {\n result.errors.push(\n t(\"cannbot_registry_schema_unsupported\").replace(\"{version}\", String(read.registry.schemaVersion))\n );\n return result;\n }\n\n const registryPath = read.registryPath;\n const allowedBase = root;\n\n // 1. skills + agents (record paths are target-relative)\n for (const relPath of [...(record.skills || []), ...(record.agents || [])]) {\n const absolute = join(root, relPath);\n if (removeIfSafe(absolute, allowedBase) === \"removed\") {\n result.removedFiles++;\n removeEmptyDirUpward(dirname(absolute), allowedBase);\n }\n }\n\n // 2. instructions marker block (keep the file for other plugins)\n if (record.instructions) {\n const instructionsPath = join(root, record.instructions);\n const resolved = resolve(instructionsPath);\n if (resolved.startsWith(allowedBase + sep) && existsSync(resolved)) {\n try {\n const content = readFileSync(resolved, \"utf-8\");\n const cleaned = removeMarkerBlock(content, pluginId);\n if (cleaned.trim().length === 0) {\n unlinkSync(resolved);\n result.removedFiles++;\n } else if (cleaned !== content) {\n writeFileSync(resolved, cleaned);\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : t(\"error_unknown\"));\n }\n }\n }\n\n // 3. plugin assets (.cannbot/plugins/<id>)\n if (record.assets) {\n if (removeIfSafe(join(root, record.assets), allowedBase) === \"removed\") {\n result.removedDirs++;\n removeEmptyDirUpward(join(root, \".cannbot\", \"plugins\"), allowedBase);\n }\n }\n\n // 4. shared runtime paths — remove only when no sibling plugin uses them\n const siblings = scanCannbotInstalled(root)\n .map((e) => e.record)\n .filter((r) => r.plugin !== pluginId);\n const siblingUses = (rel: string | null) =>\n siblings.some((r) => [r.permissions, r.settings, r.hookSettings].filter(Boolean).includes(rel as string));\n\n if (record.permissions && !siblingUses(record.permissions)) {\n if (removeIfSafe(join(root, record.permissions), allowedBase) === \"removed\") {\n result.removedDirs++;\n }\n }\n if (record.settings && !siblingUses(record.settings)) {\n if (removeIfSafe(join(root, record.settings), allowedBase) === \"removed\") {\n result.removedFiles++;\n }\n }\n\n // 5. hook settings: surgical removal of this plugin's hook entries\n if (record.hookSettings) {\n cleanHookSettings(record.hookSettings, root, pluginId);\n }\n\n // 6. dependency clones (.cannbot/dependencies/<id>/...)\n for (const relDep of record.dependencies || []) {\n if (removeIfSafe(join(root, relDep), allowedBase) === \"removed\") {\n result.removedDirs++;\n }\n }\n if ((record.dependencies || []).length > 0) {\n removeEmptyDirUpward(join(root, \".cannbot\", \"dependencies\", pluginId), allowedBase);\n }\n\n // 7. codex native plugin (~/plugins/<id> + marketplace registration)\n cleanCodexNativePlugin(record, pluginId);\n if (record.nativePlugin && typeof record.nativePlugin === \"object\" && record.nativePlugin.package) {\n logger.warn(t(\"cannbot_uninstall_native_hint\").replace(\"{spec}\", String(record.nativePlugin.package)));\n }\n // opencode native plugin registration (opencode.json) — strip it only when\n // the last cannbot plugin for this target is being removed\n if (record.tool === \"opencode\" && siblings.length === 0) {\n cleanOpenCodePluginRegistration(root);\n }\n\n // 8. update the registry itself\n try {\n const registry = JSON.parse(readFileSync(registryPath, \"utf-8\")) as CannbotRegistryFile;\n registry.plugins = registry.plugins.filter((r) => r?.plugin !== pluginId);\n if (registry.plugins.length === 0) {\n unlinkSync(registryPath);\n removeEmptyDirUpward(dirname(registryPath), allowedBase);\n } else {\n writeFileSync(registryPath, `${JSON.stringify(registry, null, 2)}\\n`);\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : t(\"error_unknown\"));\n }\n\n // 8b. clean layout roots the cannbot installer created but that carry no\n // recorded entries (e.g. an empty agents/ dir for a 0-agent plugin)\n if (CANNBOT_TOOL_LAYOUTS[record.tool]) {\n const configDir = dirname(registryPath);\n const layoutRoots = [join(configDir, \"agents\"), join(configDir, \"skills\")];\n if (record.tool === \"opencode\" || record.tool === \"codex\") {\n // opencode/codex share the .agents/skills root\n layoutRoots.push(join(root, \".agents\", \"skills\"), join(root, \".agents\"));\n }\n for (const dirPath of layoutRoots) {\n if (removeEmptyDirUpward(dirPath, allowedBase)) {\n result.removedDirs++;\n }\n }\n }\n\n // 9. install-helper side bookkeeping\n deleteRecord(pluginId);\n removeInstalledPlugin(pluginId);\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Consistency check for doctor: delegated records in\n * ~/.cannbot/installs/<id>.json whose cannbot registry entry has vanished.\n * Each location record is checked against the registry at its own\n * install path (a record for another project is not an orphan just because\n * the current project's registry lacks it).\n */\nexport function findOrphanedDelegatedRecords(target?: string): string[] {\n const orphans: string[] = [];\n\n const installsDir = join(getCannbotConfigDir(), \"installs\");\n if (!existsSync(installsDir)) return orphans;\n\n for (const file of readdirSync(installsDir)) {\n if (!file.endsWith(\".json\") || file === \"skills.json\") continue;\n const pluginId = file.replace(/\\.json$/, \"\");\n try {\n // readRecords transparently handles both the v2 location-keyed store\n // and the v1 single-record format\n const records = readRecords(pluginId);\n const delegated = records.filter((r) => r?.kind === \"delegated\");\n if (delegated.length === 0) continue;\n\n const isOrphan = delegated.some((rec) => {\n // Records without an install path (legacy fixtures) fall back to the\n // passed target, mirroring the pre-location behavior.\n const recTarget = rec.installPath || target;\n const installedThere = new Set(scanCannbotInstalled(recTarget).map((e) => e.id));\n return !installedThere.has(pluginId);\n });\n if (isOrphan) {\n orphans.push(pluginId);\n }\n } catch {\n // ignore malformed records\n }\n }\n return orphans;\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, resolve } from \"path\";\nimport { getCannbotConfigDir, getSkillsRoot } 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, BackupRecordEntry } 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 /** \"delegated\" = installed via the cannbot installer (@cannbot-plugin/cannbot);\n * absent/legacy = installed by install-helper itself. */\n kind?: \"legacy\" | \"delegated\";\n /** Legacy single-backup field (pre multi-target backups). Kept for\n * reading old records; new installs populate `backups` instead. */\n backup?: {\n filePath: string;\n fromPluginId: string;\n fromPluginName: string;\n backupTime: string;\n };\n /** Backups created during this install, one per replaced configuration\n * file. `originalPath` is the restore target so uninstall can return\n * project-level files to their original locations. */\n backups?: BackupRecordEntry[];\n /** Configuration paths the user chose to keep (never replaced by this\n * install). Recorded so uninstall never removes them even though they\n * sit where the plugin's own config file would live. */\n preservedTargets?: string[];\n}\n\n/** Location dimensions of an install: the same plugin can be installed at\n * several locations (different projects, tools or levels) simultaneously —\n * each keeps its own record so a later install elsewhere never clobbers the\n * bookkeeping of an earlier one (uninstall would otherwise delete the wrong\n * location's files). */\nexport interface RecordLocation {\n tool: AITool;\n level: InstallLevel;\n installPath: string;\n}\n\ninterface RecordStore {\n version: 2;\n /** key: `${tool}:${level}:${resolved installPath}` */\n locations: Record<string, InstallRecord>;\n}\n\nconst LEGACY_LOCATION_KEY = \"__legacy__\";\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\nfunction locationKey(loc: RecordLocation): string {\n return `${loc.tool}:${loc.level}:${resolve(loc.installPath)}`;\n}\n\n/** Reads the record file, migrating the v1 single-record format (a plain\n * InstallRecord object) to the v2 location-keyed store in memory. */\nfunction readStore(pluginId: string): RecordStore | null {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(recordPath, \"utf-8\"));\n } catch {\n logger.warn(t(\"record_corrupted\").replace(\"{file}\", recordPath));\n return null;\n }\n\n const store = parsed as Partial<RecordStore> & Partial<InstallRecord>;\n if (store && typeof store === \"object\" && \"locations\" in store && store.locations) {\n return { version: 2, locations: store.locations as Record<string, InstallRecord> };\n }\n\n // v1: a single InstallRecord object\n const legacy = parsed as InstallRecord;\n if (legacy && typeof legacy === \"object\" && typeof legacy.pluginId === \"string\") {\n const key =\n legacy.tool && legacy.level && legacy.installPath\n ? locationKey(legacy)\n : LEGACY_LOCATION_KEY;\n return { version: 2, locations: { [key]: legacy } };\n }\n\n logger.warn(t(\"record_corrupted\").replace(\"{file}\", recordPath));\n return null;\n}\n\nfunction writeStore(pluginId: string, store: RecordStore): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n atomicWriteFileSync(getRecordPath(pluginId), JSON.stringify(store, null, 2));\n}\n\n/** All location records for a plugin (any tool / level / install path). */\nexport function readRecords(pluginId: string): InstallRecord[] {\n const store = readStore(pluginId);\n return store ? Object.values(store.locations) : [];\n}\n\nconst byLatest = (a: InstallRecord, b: InstallRecord) =>\n (b.installTime || \"\").localeCompare(a.installTime || \"\");\n\n/**\n * The record uninstall/install flows should act on, preferring the one that\n * matches the current working directory:\n * 1. project-level record whose installPath is the cwd (latest first)\n * 2. global-level record (latest first)\n * 3. latest record overall (legacy compatibility: acts on the recorded\n * location even when run from an unrelated directory)\n */\nexport function readRecord(pluginId: string): InstallRecord | null {\n const records = readRecords(pluginId);\n if (records.length === 0) {\n return null;\n }\n\n const cwd = resolve(process.cwd());\n const localMatch = records\n .filter((r) => r.level === \"project\" && resolve(r.installPath) === cwd)\n .sort(byLatest);\n if (localMatch.length > 0) return localMatch[0];\n\n const globalMatch = records.filter((r) => r.level === \"global\").sort(byLatest);\n if (globalMatch.length > 0) return globalMatch[0];\n\n return [...records].sort(byLatest)[0];\n}\n\nexport function writeRecord(record: InstallRecord): void {\n const store = readStore(record.pluginId) ?? { version: 2, locations: {} };\n store.locations[locationKey(record)] = record;\n writeStore(record.pluginId, store);\n}\n\n/**\n * Removes record locations. With `where`, only the matching location is\n * removed (the file is pruned when the last location goes away); without it,\n * the whole record file is deleted (legacy whole-plugin semantics).\n */\nexport function deleteRecord(pluginId: string, where?: RecordLocation): void {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return;\n }\n\n if (!where) {\n unlinkSync(recordPath);\n return;\n }\n\n const store = readStore(pluginId);\n if (!store) {\n return;\n }\n delete store.locations[locationKey(where)];\n if (Object.keys(store.locations).length === 0) {\n unlinkSync(recordPath);\n } else {\n writeStore(pluginId, store);\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 preservedTargets?: string[]\n): InstallRecord {\n const files: string[] = [];\n const directories: string[] = [];\n\n if (manifest) {\n const skillsDir = getSkillsRoot(tool, level, installPath);\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 // A preserved (user-kept) file at the config location is NOT owned by this\n // install — recording it would make uninstall delete the user's file.\n if (!preservedTargets?.includes(configFilePath) && (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 &&\n !preservedTargets?.includes(configRootConfigPath) &&\n (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\", \"ops-tensor\"];\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 skillsDir = getSkillsRoot(tool, level);\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 skillsDir = getSkillsRoot(tool, level, installPath);\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, readFileSync, realpathSync } from \"fs\";\nimport { join, basename, isAbsolute } 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, findRecordOwner, UNOWNED_PLUGIN_ID } from \"./backup.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { showOverwriteWarning, showUnownedFileWarning } from \"../ui/backup-prompts.js\";\nimport { installViaManifest, configFileTargets } 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 function scriptSupportsTool(scriptPath: string, tool: AITool): boolean {\n try {\n const scriptContent = readFileSync(scriptPath, \"utf-8\");\n return new RegExp(`\\\\b${tool}\\\\b`).test(scriptContent);\n } catch {\n // script unreadable — let execa surface the failure\n return true;\n }\n}\n\ninterface TargetOwner {\n kind: \"same-plugin\" | \"other-plugin\" | \"unowned\";\n pluginId: string;\n pluginName: string;\n}\n\n/**\n * Classifies who owns an existing configuration file that installation is\n * about to replace:\n * - \"same-plugin\": the file is this plugin's own (reinstall) — no prompt;\n * - \"other-plugin\": a recorded/manifested install of another plugin;\n * - \"unowned\": a user-maintained or unknown-origin file — must be confirmed\n * by the user before it is replaced.\n */\nfunction classifyConfigTarget(\n targetPath: string,\n pluginConfigSource: string,\n pluginId: string,\n pluginName: string,\n configRoot: string,\n tool: AITool,\n installPath: string\n): TargetOwner {\n // A symlink pointing at this plugin's own source file: reinstall.\n if (isSymlink(targetPath)) {\n try {\n if (realpathSync(targetPath) === realpathSync(pluginConfigSource)) {\n return { kind: \"same-plugin\", pluginId, pluginName };\n }\n } catch {\n // dangling/unreadable link — fall through to the record lookup\n }\n }\n\n // A recorded install owns the target (covers project-root files too).\n const recordOwner = findRecordOwner(targetPath);\n if (recordOwner) {\n return recordOwner.pluginId === pluginId\n ? { kind: \"same-plugin\", pluginId, pluginName }\n : { kind: \"other-plugin\", ...recordOwner };\n }\n\n // Config-root manifests: the legacy ownership signal.\n const currentPlugin = detectCurrentPlugin(configRoot, tool, installPath);\n if (currentPlugin) {\n return currentPlugin.pluginId === pluginId\n ? { kind: \"same-plugin\", pluginId, pluginName }\n : { kind: \"other-plugin\", ...currentPlugin };\n }\n\n return { kind: \"unowned\", pluginId: UNOWNED_PLUGIN_ID, pluginName: UNOWNED_PLUGIN_ID };\n}\n\nexport async function installPlugin(\n opts: InstallOptions\n): Promise<InstallResult> {\n // Prefer the caller-resolved entry (installPluginRouted passes the entry\n // it routed on — source-scoped). Re-resolving by bare id here would apply\n // cannbot-first precedence to a legacy-routed install of a same-name\n // plugin, silently swapping in the cannbot entry whose absolute dir and\n // sentinel script violate this script-installer's contract.\n const plugin = opts.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 // Guard: cannbot-source entries must go through installPluginRouted\n // delegation, never the legacy script path. Reached only via internal\n // routing errors — refuse with a clear message instead of a bogus\n // double-joined script path.\n if (plugin.source === \"cannbot\") {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_cannbot_requires_delegation\").replace(\"{plugin}\", plugin.displayName)],\n warnings: [],\n };\n }\n\n // Legacy entries carry repo-relative dirs; cannbot discovery entries are\n // absolute (managed installer package) and must never be joined onto repoPath.\n const pluginDir = isAbsolute(plugin.dir) ? plugin.dir : join(opts.repoPath, plugin.dir);\n const cwd = opts.installPath || process.cwd();\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n\n // --- Multi-target preflight: every configuration file this install will\n // replace is detected, confirmed and backed up before anything is touched.\n // At project level that includes the project-root instructions file, which\n // used to be replaced silently (no prompt, no backup) whenever the tool\n // config root held no previous install.\n const pluginConfigSource = join(pluginDir, plugin.configFile || \"AGENTS.md\");\n const existingTargets = configFileTargets(\n pluginDir,\n plugin.configFile || \"AGENTS.md\",\n opts.tool,\n opts.level,\n configRoot,\n cwd,\n plugin.configRootConfigLink\n ).filter((p) => existsSync(p) || isSymlink(p));\n\n const backups: BackupInfo[] = [];\n // Targets the user chose to keep (or that --yes preserves) — passed to the\n // manifest installer so it skips them. Legacy init.sh scripts cannot honor\n // this list (see issue #372); for them the preflight backup above is the\n // recovery path.\n const preservedTargets: string[] = [];\n const promptedPlugins = new Set<string>();\n\n for (const target of existingTargets) {\n const owner = classifyConfigTarget(\n target,\n pluginConfigSource,\n opts.pluginId,\n plugin.displayName,\n configRoot,\n opts.tool,\n cwd\n );\n\n if (owner.kind === \"same-plugin\") {\n // Reinstall of the same plugin: content identical, keep the safety\n // backup but never prompt (historical behavior).\n const backup = createBackup(target, owner.pluginId, owner.pluginName);\n if (backup) backups.push(backup);\n continue;\n }\n\n if (owner.kind === \"other-plugin\") {\n if (!promptedPlugins.has(owner.pluginId)) {\n promptedPlugins.add(owner.pluginId);\n let choice: \"overwrite\" | \"cancel\" = \"overwrite\";\n\n if (!opts.yes) {\n choice = await showOverwriteWarning(owner.pluginName, plugin.displayName);\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 const backup = createBackup(target, owner.pluginId, owner.pluginName);\n if (!backup) {\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 backups.push(backup);\n logger.success(`${t(\"backup_created\")}: ${backup.filePath}`);\n continue;\n }\n\n // Unowned file: user-maintained or unknown origin.\n if (opts.yes) {\n // Non-interactive: no explicit user confirmation exists — preserve it.\n preservedTargets.push(target);\n logger.warn(t(\"unowned_preserved_yes\").replace(\"{file}\", target));\n continue;\n }\n\n const choice = await showUnownedFileWarning(target, plugin.displayName);\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 if (choice === \"keep\") {\n preservedTargets.push(target);\n logger.info(t(\"unowned_preserved\").replace(\"{file}\", target));\n continue;\n }\n\n const backup = createBackup(target, UNOWNED_PLUGIN_ID, t(\"unowned_backup_label\"));\n if (!backup) {\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 backups.push(backup);\n logger.success(`${t(\"backup_created\")}: ${backup.filePath}`);\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 preservedTargets\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 preservedTargets\n );\n\n if (backups.length > 0) {\n record.backups = backups.map((b) => ({\n filePath: b.filePath,\n originalPath: b.originalPath,\n fromPluginId: b.pluginId,\n fromPluginName: b.pluginName,\n backupTime: b.backupTime,\n }));\n }\n if (preservedTargets.length > 0) {\n record.preservedTargets = [...preservedTargets];\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 // Guard: the plugin's init.sh must actually support the target tool.\n // Scripts that predate a tool (e.g. most community init.sh without codex)\n // silently ignore the unknown arg and would mis-install into default\n // .opencode directories — block that with an explicit error.\n if (!scriptSupportsTool(scriptPath, opts.tool)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_tool_not_supported\").replace(\"{plugin}\", plugin.displayName).replace(\"{tool}\", opts.tool)],\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 preservedTargets\n );\n\n if (backups.length > 0) {\n record.backups = backups.map((b) => ({\n filePath: b.filePath,\n originalPath: b.originalPath,\n fromPluginId: b.pluginId,\n fromPluginName: b.pluginName,\n backupTime: b.backupTime,\n }));\n }\n if (preservedTargets.length > 0) {\n record.preservedTargets = [...preservedTargets];\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, copyFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join, dirname, basename, resolve } from \"path\";\nimport type { AITool, BackupInfo } from \"../types/index.js\";\nimport { readAllManifests } from \"./manifest.js\";\nimport { readRecords } from \"./record.js\";\nimport { findPlugin } from \"./registry.js\";\nimport { getAgentsFileName, getCannbotConfigDir } from \"../utils/paths.js\";\n\nexport { getAgentsFileName };\n\n/** Backup owner id used when the replaced file has no known plugin owner\n * (a user-maintained configuration file). */\nexport const UNOWNED_PLUGIN_ID = \"unowned\";\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\n/**\n * Creates a backup of `targetPath` beside the file itself, so a replaced\n * configuration file (including a project-root AGENTS.md that lives outside\n * the tool config root) always keeps a recoverable copy next to its original\n * location. Returns null when the file does not exist.\n */\nexport function createBackup(\n targetPath: string,\n fromPluginId: string,\n fromPluginName: string\n): BackupInfo | null {\n if (!existsSync(targetPath)) {\n return null;\n }\n\n const timestamp = formatTimestamp(new Date());\n const backupFileName = `${basename(targetPath)}.cannbot-backup.${fromPluginId}.${timestamp}`;\n const backupPath = join(dirname(targetPath), backupFileName);\n\n try {\n copyFileSync(targetPath, backupPath);\n return {\n filePath: backupPath,\n originalPath: targetPath,\n pluginId: fromPluginId,\n pluginName: fromPluginName,\n backupTime: timestamp,\n };\n } catch {\n return null;\n }\n}\n\n/** Finds the plugin whose install record owns `targetPath` (its recorded\n * files list contains the path), if any. Works for both config-root and\n * project-root configuration files. */\nexport function findRecordOwner(\n targetPath: string\n): { pluginId: string; pluginName: string } | null {\n const resolved = resolve(targetPath);\n for (const record of readAllRecords()) {\n if ((record.files || []).some((f: string) => resolve(f) === resolved)) {\n const plugin = findPlugin(record.pluginId);\n return {\n pluginId: record.pluginId,\n pluginName: plugin?.displayName || record.displayName || record.pluginId,\n };\n }\n }\n return null;\n}\n\n/**\n * Scans one or more directories for `*.cannbot-backup.*` files. The restore\n * target (`originalPath`) is derived from the backup file name, so backups\n * created beside project-root files restore to the project root, not to the\n * tool config root.\n */\nexport function findBackups(configRoot: string | string[]): BackupInfo[] {\n const dirs = Array.isArray(configRoot) ? configRoot : [configRoot];\n const backups: BackupInfo[] = [];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n continue;\n }\n\n const files = readdirSync(dir);\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(dir, file),\n originalPath: join(dir, parts[0]),\n pluginId,\n pluginName: plugin?.displayName || pluginId,\n backupTime: timestamp,\n });\n }\n }\n }\n }\n }\n\n return backups.sort((a, b) => b.backupTime.localeCompare(a.backupTime));\n}\n\n/**\n * Restores a backup file to `targetPath` (the original location recorded\n * when the backup was created).\n */\nexport function restoreBackup(\n backupPath: string,\n targetPath: string\n): boolean {\n try {\n copyFileSync(backupPath, targetPath);\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\n // Scan the installs directory directly (not the plugin registry): records\n // exist for community plugins that are not part of the embedded registry,\n // and ownership detection must see those too.\n const installsDir = join(getCannbotConfigDir(), \"installs\");\n if (!existsSync(installsDir)) {\n return records;\n }\n for (const file of readdirSync(installsDir)) {\n if (!file.endsWith(\".json\") || file === \"skills.json\") continue;\n const pluginId = file.replace(/\\.json$/, \"\");\n records.push(...readRecords(pluginId));\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\n/**\n * Prompt shown before replacing a configuration file that no known plugin\n * owns (typically user-maintained). Defaults to keeping the user's file.\n */\nexport async function showUnownedFileWarning(\n filePath: string,\n newPluginName: string\n): Promise<\"replace\" | \"keep\" | \"cancel\"> {\n console.log();\n console.log(chalk.yellow(` ⚠️ ${t(\"unowned_file_detected\")}`));\n console.log();\n console.log(` ${t(\"unowned_file_path\")}: ${chalk.cyan(filePath)}`);\n console.log(` ${t(\"backup_installing\")}: ${chalk.cyan(newPluginName)}`);\n console.log();\n console.log(` ${t(\"unowned_file_warning\")}`);\n console.log();\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices: [\n { name: t(\"unowned_file_keep\"), value: \"keep\" },\n { name: t(\"unowned_file_replace\"), value: \"replace\" },\n { name: t(\"backup_cancel\"), value: \"cancel\" },\n ],\n });\n\n return choice as \"replace\" | \"keep\" | \"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: b.pluginId === \"unowned\"\n ? `${t(\"backup_restore_user_file\")} ${b.originalPath} (${b.backupTime})`\n : `${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, readFileSync, constants as fsConstants } 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, getSkillsRoot } 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\nconst ISSUE_HANDLER_ID = \"gitcode-issue-handler\";\nconst ISSUE_HANDLER_CONFIG_FILES = [\"classify_config.yaml\", \"operator_owners.yaml\"] as const;\n\nexport function shouldInitializeIssueHandlerConfig(level: InstallLevel, installedSkills: string[]): boolean {\n return level === \"project\" && installedSkills.includes(ISSUE_HANDLER_ID);\n}\n\n/**\n * Seed the issue handler's repository-local configuration after a successful\n * install. Configuration is deliberately separate from the tool config root:\n * the same project config must work with every supported AI tool.\n *\n * Existing canonical files win. A former repository-root config is copied to\n * the canonical location (while retaining the original) before the packaged\n * template is considered, so an upgrade cannot replace user configuration.\n */\nexport function instantiateIssueHandlerConfig(repoPath: string, targetRepoPath: string): void {\n const configDir = join(targetRepoPath, \".cannbot\", ISSUE_HANDLER_ID, \"config\");\n const legacyConfigDir = targetRepoPath;\n\n try {\n mkdirSync(configDir, { recursive: true });\n } catch (error) {\n logger.warn(`issue-handler config directory creation failed: ${error instanceof Error ? error.message : String(error)}`);\n return;\n }\n\n for (const fileName of ISSUE_HANDLER_CONFIG_FILES) {\n const targetPath = join(configDir, fileName);\n // existsSync intentionally does not cover a dangling symlink.\n if (existsSync(targetPath) || isSymlink(targetPath)) continue;\n\n const legacyPath = join(legacyConfigDir, fileName);\n const templatePath = join(repoPath, \"infra\", ISSUE_HANDLER_ID, \"assets\", `${fileName}.template`);\n const sourcePath = existsSync(legacyPath) ? legacyPath : templatePath;\n\n if (!existsSync(sourcePath)) {\n logger.warn(`issue-handler config source not found: ${sourcePath}`);\n continue;\n }\n\n try {\n // COPYFILE_EXCL makes the missing-file check safe if another installer\n // creates the file between the check and the copy.\n copyFileSync(sourcePath, targetPath, fsConstants.COPYFILE_EXCL);\n } catch (error: any) {\n if (error?.code !== \"EEXIST\") {\n logger.warn(`issue-handler config install failed for ${fileName}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\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\n/**\n * Enumerates every configuration file path `installConfigFile` will replace\n * for this plugin/tool/level — the single source of truth shared by the\n * installer preflight (prompt + backup) and the actual replacement. At\n * project level the primary target is the project-root instructions file and\n * (unless `configRootConfigLink === false`) the tool config root copy.\n */\nexport function configFileTargets(\n pluginDir: string,\n configFile: string,\n tool: AITool,\n level: InstallLevel,\n configRoot: string,\n installPath: string,\n configRootConfigLink?: boolean\n): string[] {\n const sourcePath = join(pluginDir, configFile);\n if (!existsSync(sourcePath)) return [];\n\n const agentsFileName = getAgentsFileName(tool);\n const targets: string[] = [];\n\n if (level === \"project\") {\n targets.push(join(installPath, agentsFileName));\n if (configRootConfigLink !== false) {\n const configRootTarget = join(configRoot, agentsFileName);\n if (!targets.includes(configRootTarget)) {\n targets.push(configRootTarget);\n }\n }\n } else {\n targets.push(join(configRoot, agentsFileName));\n }\n\n return targets;\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 preservedTargets?: string[]\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 if (preservedTargets?.includes(primaryTarget)) {\n logger.info(t(\"install_config_preserved\").replace(\"{file}\", primaryTarget));\n } else {\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\n if (isProjectLevel && primaryTarget !== join(configRoot, agentsFileName)) {\n if (configRootConfigLink === false) return;\n const configRootTarget = join(configRoot, agentsFileName);\n if (preservedTargets?.includes(configRootTarget)) {\n logger.info(t(\"install_config_preserved\").replace(\"{file}\", configRootTarget));\n return;\n }\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 — 目录已存在且可用,继续创建 symlink(与 init.sh 行为一致)\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 preservedTargets?: 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 = getSkillsRoot(tool, level, cwd);\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 if (tool === \"codex\") {\n // Codex custom agents use standalone TOML files and may ignore symlinks\n // (openai/codex#15345). Install regular TOML files with the\n // __CANNBOT_AGENT_SOURCE__ placeholder resolved to the canonical .md\n // so multiple plugins can coexist in the same .codex/agents/ directory.\n const baseName = agentName.replace(/\\.md$/, \"\");\n const tomlSource = join(pluginDir, \"agents\", \"codex\", `${baseName}.toml`);\n if (!existsSync(tomlSource)) {\n logger.warn(t(\"install_agent_codex_toml_missing\").replace(\"{name}\", baseName).replace(\"{path}\", tomlSource));\n continue;\n }\n\n const canonicalMd = join(pluginDir, \"agents\", `${baseName}.md`);\n const canonicalPath = existsSync(canonicalMd) ? realpathSync(canonicalMd) : canonicalMd;\n const targetPath = join(agentsDir, `${baseName}.toml`);\n\n try {\n const content = readFileSync(tomlSource, \"utf-8\")\n .split(\"__CANNBOT_AGENT_SOURCE__\")\n .join(canonicalPath);\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n removePath(targetPath);\n }\n writeFileSync(targetPath, content, \"utf-8\");\n installedAgents.push(`${baseName}.toml`);\n } catch {\n logger.warn(t(\"install_agent_failed\").replace(\"{name}\", `${baseName}.toml`));\n }\n continue;\n }\n\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, preservedTargets);\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 if (shouldInitializeIssueHandlerConfig(level, installedSkills)) {\n instantiateIssueHandlerConfig(repoPath, cwd);\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, basename, 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, getSkillsRoot } 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 { instantiateIssueHandlerConfig, shouldInitializeIssueHandlerConfig } from \"./plugin-installer.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 = getSkillsRoot(tool, level);\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 if (shouldInitializeIssueHandlerConfig(level, installedIds)) {\n instantiateIssueHandlerConfig(repoPath, installPath);\n }\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 = getSkillsRoot(tool, level);\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 // Codex skills live under .agents/skills — clean up the empty .agents parent too\n if (tool === \"codex\") {\n const agentsRoot = dirname(skillsDir);\n try {\n if (existsSync(agentsRoot) && readdirSync(agentsRoot).length === 0) {\n rmSync(agentsRoot, { recursive: true });\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${basename(agentsRoot)}/`);\n }\n } catch {\n // ignore\n }\n }\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, PluginSource } 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 const badge = plugin.source === \"cannbot\"\n ? chalk.magenta(\" [cannbot]\") + (plugin.version ? chalk.dim(` v${plugin.version}`) : \"\")\n : \"\";\n\n table.push([\n String(index + 1),\n plugin.displayName + badge,\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 source?: PluginSource;\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 source?: PluginSource;\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 // Source-scoped: a --source skills install must point at the legacy\n // entry's docs, not the same-name cannbot package (unscoped lookup is\n // cannbot-first).\n const plugin = findPlugin(successResults[0].pluginId, {\n source: successResults[0].source,\n });\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 { ensureCannbotDiscovery } from \"../core/cannbot-installer.js\";\nimport { scanCannbotInstalled } from \"../core/cannbot-registry.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 await ensureCannbotDiscovery();\n\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n // cannbot-style installs: registry-driven, project-level only\n for (const entry of scanCannbotInstalled()) {\n if (!installedMap.has(entry.id)) {\n installedMap.set(entry.id, {\n id: entry.id,\n displayName: entry.id,\n tool: entry.tool as import(\"../types/index.js\").AITool,\n level: \"project\",\n skillsCount: entry.skillsCount,\n agentsCount: entry.agentsCount,\n installTime: \"\",\n configRoot: entry.registryPath,\n });\n }\n }\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, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { detectTools, getToolDisplayName, getAllTools } from \"../core/detector.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport {\n hasNodeRuntime,\n isCannbotInstallerReady,\n getCannbotInstallerVersion,\n loadCannbotInstallerConfig,\n} from \"../core/cannbot-installer.js\";\nimport {\n scanCannbotInstalled,\n countMarkerBlocks,\n findOrphanedDelegatedRecords,\n} from \"../core/cannbot-registry.js\";\nimport { getConfigRoot, getSkillsRoot, 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, tool, level } of configRootsToCheck) {\n const skillsDir = getSkillsRoot(tool, level);\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 // cannbot integration checks (Node runtime, managed installer, registry,\n // marker blocks, recorded skills, delegated-record consistency)\n const cannbotResult = doctorCannbotSection(options);\n warnings += cannbotResult.warnings;\n fixes += cannbotResult.fixes;\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 doctorCannbotSection(options: { fix?: boolean }): { warnings: number; fixes: number } {\n let warnings = 0;\n let fixes = 0;\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_cannbot\")}`));\n\n // 1. Node.js runtime (required to delegate to the cannbot installer)\n if (hasNodeRuntime()) {\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_cannbot_node_ok\")}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${t(\"doctor_cannbot_node_missing\")}`);\n warnings++;\n }\n\n // 2. managed cannbot installer package\n const installerConfig = loadCannbotInstallerConfig();\n if (isCannbotInstallerReady()) {\n const version = getCannbotInstallerVersion() || \"?\";\n console.log(\n chalk.green(\" ✓\") +\n ` ${installerConfig.package} v${version} ${chalk.dim(`(${installerConfig.channel})`)}`\n );\n } else {\n console.log(\n chalk.dim(\" —\") + ` ${installerConfig.package} — ${t(\"doctor_not_installed\")}`\n );\n }\n\n // 3-5. cannbot registries in the current project\n const cannbotInstalled = scanCannbotInstalled();\n if (cannbotInstalled.length === 0) {\n console.log(chalk.dim(\" —\") + ` cannbot-plugin.json — ${t(\"doctor_not_exist\")}`);\n } else {\n for (const entry of cannbotInstalled) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${entry.id} ${chalk.dim(`(${entry.tool}, ${entry.skillsCount} skills, ${entry.agentsCount} agents)`)}`\n );\n\n // 5. recorded skills actually exist on disk\n const missing = (entry.record.skills || []).filter((rel) => {\n const p = join(entry.target, rel);\n return !existsSync(p) && !lstatTryIsSymlink(p);\n });\n if (missing.length > 0) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${entry.id}: ${t(\"doctor_cannbot_missing_skills\").replace(\"{count}\", String(missing.length))}`\n );\n warnings++;\n }\n }\n }\n\n // 4. marker block pairing in the project instructions file\n for (const fileName of [\"AGENTS.md\", \"CLAUDE.md\"]) {\n const filePath = join(process.cwd(), fileName);\n if (!existsSync(filePath)) continue;\n try {\n const content = readFileSync(filePath, \"utf-8\");\n for (const entry of cannbotInstalled) {\n const blocks = countMarkerBlocks(content, entry.id);\n if (blocks > 1) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${fileName}: ${t(\"doctor_cannbot_marker_duplicate\").replace(\"{plugin}\", entry.id)}`\n );\n warnings++;\n }\n }\n const starts = (content.match(/<!-- cannbot:[\\w.-]+:start -->/g) || []).length;\n const ends = (content.match(/<!-- cannbot:[\\w.-]+:end -->/g) || []).length;\n if (starts !== ends) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${fileName}: ${t(\"doctor_cannbot_marker_unpaired\").replace(\"{start}\", String(starts)).replace(\"{end}\", String(ends))}`\n );\n warnings++;\n }\n } catch {\n // unreadable file — skip\n }\n }\n\n // 6. delegated-record ↔ registry consistency\n const orphans = findOrphanedDelegatedRecords();\n for (const pluginId of orphans) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${t(\"doctor_cannbot_orphan_record\").replace(\"{plugin}\", pluginId)}`\n );\n warnings++;\n if (options.fix) {\n try {\n unlinkSync(join(homedir(), \".cannbot\", \"installs\", `${pluginId}.json`));\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fixed\").replace(\"{count}\", \"1\")}: ${pluginId}`);\n } catch {\n // ignore\n }\n }\n }\n\n return { warnings, fixes };\n}\n\nfunction lstatTryIsSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\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 { scanCannbotInstalled } from \"../core/cannbot-registry.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool } from \"../types/index.js\";\n\nexport async function statusCommand(): Promise<void> {\n const installed = scanInstalled();\n const cannbotInstalled = scanCannbotInstalled();\n\n console.log();\n console.log(chalk.bold(` ${t(\"status_title\")}`));\n console.log();\n\n if (installed.length === 0 && cannbotInstalled.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 for (const entry of cannbotInstalled) {\n const versionSuffix = entry.version ? chalk.dim(` v${entry.version}`) : \"\";\n console.log(\n chalk.green(\" ✓\") +\n ` ${entry.id}${versionSuffix}` +\n chalk.magenta(\" [cannbot]\") +\n chalk.dim(` (${entry.tool}, project)`)\n );\n console.log(\n chalk.dim(` ${entry.skillsCount} skills, ${entry.agentsCount} agents`)\n );\n console.log(chalk.dim(` ${entry.target}`));\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 { installPluginRouted } from \"../core/cannbot-delegate.js\";\nimport { ensureCannbotDiscovery } from \"../core/cannbot-installer.js\";\nimport { scanCannbotInstalled } from \"../core/cannbot-registry.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, getSkillsRoot, validateTool, validateLevel } from \"../utils/paths.js\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel, PluginSource } from \"../types/index.js\";\n\nfunction validateSource(source?: string): PluginSource | undefined {\n if (!source) return undefined;\n if (source !== \"cannbot\" && source !== \"skills\") {\n throw new Error(t(\"error_invalid_source\").replace(\"{source}\", source).replace(\"{sources}\", \"cannbot, skills\"));\n }\n return source;\n}\n\nexport async function installCommand(\n names: string[],\n options: { tool?: string; level?: string; source?: string; yes?: boolean; all?: boolean; list?: boolean }\n): Promise<void> {\n const source = validateSource(options.source);\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 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(getSkillsRoot(tool, level))}`);\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 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(getSkillsRoot(tool, level))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n if (failCount > 0) {\n process.exitCode = 1;\n }\n return;\n }\n }\n }\n }\n\n // Scan repo for dynamic skill/plugin discovery + cannbot dual-source merge\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 await ensureCannbotDiscovery();\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, { source });\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 const badge = p.source === \"cannbot\" ? chalk.magenta(\" [cannbot]\") : \"\";\n logger.step(` ${p.id}${badge} (${p.aliases.join(\", \")})`);\n }\n logger.info(`${t(\"available_skills\")}: ${chalk.cyan(\"install-helper install --list\")}`);\n process.exitCode = 1;\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 const pluginEntry = findPlugin(pluginId, { source });\n const alreadyInstalled = pluginEntry?.source === \"cannbot\"\n ? scanCannbotInstalled().some((e) => e.id === pluginId && e.tool === tool)\n : installedSet.has(pluginId);\n if (alreadyInstalled && !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 results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath,\n undefined,\n options.yes,\n source\n );\n\n const summary = results.map((result) => {\n // Source-scoped so a --source skills install reports the legacy\n // entry's displayName (unscoped lookup is cannbot-first).\n const plugin = findPlugin(result.pluginId, { source });\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 // the command-line source is the user intent — legacy entries\n // carry no `source` field, so plugin?.source alone would lose the\n // \"skills\" scope and the docs hint would resolve cannbot-first\n source: source ?? plugin?.source,\n };\n });\n\n printInstallSummary(summary);\n printEnhancedSummary(summary, tool, configRoot);\n if (results.some((r) => !r.success)) {\n process.exitCode = 1;\n }\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(getSkillsRoot(tool, level))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n if (failCount > 0) {\n process.exitCode = 1;\n }\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 source?: PluginSource\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 plugin = findPlugin(pluginId, { source });\n const result = await installPluginRouted({\n pluginId,\n tool,\n level,\n repoPath,\n installPath,\n yes,\n plugin,\n source,\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 for (const warning of result.warnings || []) {\n logger.warn(warning);\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, readSkillRecord } from \"../core/record.js\";\nimport { scanCannbotInstalled, uninstallCannbotPlugin } from \"../core/cannbot-registry.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, getSkillsRoot, 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 cannbotPlugins: string[] = [];\n const skills: string[] = [];\n\n // cannbot-style installs are registry-driven: a cannbot-plugin.json record\n // wins over the legacy bookkeeping (migration policy: cannbot first).\n const cannbotInstalledIds = new Set(scanCannbotInstalled().map((e) => e.id));\n\n for (const name of names) {\n if (cannbotInstalledIds.has(name)) {\n cannbotPlugins.push(name);\n continue;\n }\n const plugin = findPlugin(name);\n if (plugin && plugin.source !== \"cannbot\") {\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 // Skills absent from the static fallback list (newly added repo domains\n // like tools/ drift from it) are still uninstalled by name when an\n // install record exists — mirrors the record-driven plugin fallback.\n if (isRecordedSkill(name)) {\n skills.push(name);\n continue;\n }\n // Community plugins are not in the embedded registry — allow uninstall\n // by name when an install record exists (previously \"not found\").\n if (readRecord(name)) {\n plugins.push(name);\n continue;\n }\n logger.error(`${t(\"uninstall_not_found\")}: ${name}`);\n }\n\n await uninstallCannbotPlugins(cannbotPlugins);\n await uninstallPlugins(plugins, options.yes || false);\n await uninstallSkillsByName(skills, tool, level);\n}\n\nasync function uninstallCannbotPlugins(pluginIds: string[]): Promise<void> {\n for (const pluginId of pluginIds) {\n logger.info(`${t(\"uninstall_in_progress\")} ${pluginId}...`);\n await uninstallCannbotPluginById(pluginId);\n }\n}\n\nexport function isRecordedSkill(skillId: string): boolean {\n const record = readSkillRecord();\n for (const toolName of Object.keys(record)) {\n for (const levelName of Object.keys(record[toolName])) {\n for (const installPath of Object.keys(record[toolName][levelName])) {\n if (record[toolName][levelName][installPath].skills?.includes(skillId)) {\n return true;\n }\n }\n }\n }\n return false;\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 const cannbotInstalled = level === \"project\"\n ? scanCannbotInstalled().filter((e) => e.tool === tool)\n : [];\n\n const totalItems = installedSkills.length + installedPlugins.length + cannbotInstalled.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 + cannbotInstalled.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 for (const c of cannbotInstalled) {\n logger.step(` • ${chalk.cyan(c.id)} ${chalk.magenta(\"[cannbot]\")}`);\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 cannbot-style plugins\n for (const entry of cannbotInstalled) {\n await uninstallCannbotPluginById(entry.id);\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 uninstallCannbotPluginById(pluginId: string): Promise<void> {\n const result = uninstallCannbotPlugin(pluginId);\n if (result.success) {\n logger.success(\n t(\"uninstall_summary_format\")\n .replace(\"{name}\", pluginId)\n .replace(\"{files}\", String(result.removedFiles))\n .replace(\"{dirs}\", String(result.removedDirs))\n );\n } else {\n for (const error of result.errors) {\n logger.error(`${pluginId}: ${error}`);\n }\n }\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 VALID_TOOLS) {\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 const cannbotInstalled = level === \"project\" ? scanCannbotInstalled().filter((e) => e.tool === tool) : [];\n\n if (installed.length === 0 && cannbotInstalled.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 ...cannbotInstalled.map((entry) => ({\n name: `${chalk.cyan(entry.id)} ${chalk.magenta(\"[cannbot]\")}`,\n value: entry.id,\n checked: false,\n description: `${entry.skillsCount} skills, ${entry.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 toUninstallLegacy = installed.filter((inst) => selected.includes(inst.id));\n const toUninstallCannbot = cannbotInstalled.filter((entry) => selected.includes(entry.id));\n\n if (toUninstallLegacy.length === 0 && toUninstallCannbot.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(\n \"{count}\",\n chalk.bold(String(toUninstallLegacy.length + toUninstallCannbot.length))\n ),\n default: false,\n });\n\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n\n const totalCount = toUninstallLegacy.length + toUninstallCannbot.length;\n logger.info(`${t(\"uninstall_plugin_batch_progress\").replace(\"{count}\", String(totalCount))}...`);\n for (const entry of toUninstallCannbot) {\n await uninstallCannbotPluginById(entry.id);\n }\n for (const inst of toUninstallLegacy) {\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 let plugin = findPlugin(pluginId);\n if (!plugin) {\n // Community plugin not in the embedded registry — recover display info\n // from the install record so it can still be uninstalled by name.\n const record = readRecord(pluginId);\n if (record) {\n plugin = {\n id: pluginId,\n dir: \"\",\n displayName: record.displayName,\n script: \"init.sh\",\n aliases: [],\n skills: 0,\n agents: 0,\n description: \"\",\n };\n }\n }\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 // Use the config root recorded at install time — deriving it from the\n // current cwd would resolve against the wrong project when the record\n // belongs to another location (breaking backup cleanup and potentially\n // deleting the current project's config file via extraFiles).\n const configRoot = record.configRoot;\n const allowedBases = [resolve(configRoot), resolve(record.installPath)];\n if (record.tool === \"codex\") {\n // Codex skills live under .agents/skills which is outside the .codex\n // config root — allow it explicitly so files there can be removed.\n allowedBases.push(resolve(getSkillsRoot(record.tool, record.level, record.installPath)));\n }\n const isSafePath = (p: string): boolean => {\n const resolved = resolve(p);\n return allowedBases.some(base => resolved === base || resolved.startsWith(base + sep));\n };\n // Paths the user kept at install time — never removed by uninstall.\n const preservedPaths = new Set((record.preservedTargets || []).map((p) => resolve(p)));\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].filter(\n (filePath) => !preservedPaths.has(resolve(filePath))\n );\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 // Codex skills live under .agents/skills — remove the empty .agents parent\n if (record.tool === \"codex\") {\n try {\n const agentsRoot = resolve(getSkillsRoot(record.tool, record.level, record.installPath), \"..\");\n if (existsSync(agentsRoot) && readdirSync(agentsRoot).length === 0) {\n rmdirSync(agentsRoot);\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${basename(agentsRoot)}/`);\n removedDirs++;\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id, {\n tool: record.tool,\n level: record.level,\n installPath: record.installPath,\n });\n removeInstalledPlugin(plugin.id);\n\n // Backups may sit beside the replaced files in the install path (project\n // root) as well as in the config root — scan both, preferring the\n // originalPath recorded at install time over filename derivation so\n // project-level files restore to their original locations.\n const backupDirs = resolve(record.installPath) === resolve(configRoot)\n ? [configRoot]\n : [configRoot, record.installPath];\n const recordBackups = [\n ...(record.backups || []),\n ...(record.backup\n ? [{ ...record.backup, originalPath: join(configRoot, configFileName) }]\n : []),\n ];\n const backups = findBackups(backupDirs).map((b) => {\n const recorded = recordBackups.find((rb) => resolve(rb.filePath) === resolve(b.filePath));\n return recorded ? { ...b, originalPath: recorded.originalPath } : b;\n });\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 backupInfo = otherBackups.find((b) => b.filePath === choice);\n const restoreTarget = backupInfo?.originalPath || join(configRoot, configFileName);\n if (isSafePath(restoreTarget)) {\n const restored = restoreBackup(choice, restoreTarget);\n if (restored) {\n logger.success(`${t(\"backup_restore_success\")}: ${backupInfo?.pluginName || \"\"} -> ${restoreTarget}`);\n deleteBackup(choice);\n }\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 { installPluginRouted } from \"../core/cannbot-delegate.js\";\nimport { ensureCannbotDiscovery, ensureCannbotInstaller } from \"../core/cannbot-installer.js\";\nimport { scanCannbotInstalled } from \"../core/cannbot-registry.js\";\nimport { findPlugin } 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 source: \"cannbot\" | \"skills\";\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 // + cannbot dual-source discovery\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 await ensureCannbotDiscovery();\n\n // Phase 2: scanInstalled (legacy manifests) + cannbot registry records\n const installed = scanInstalled();\n const cannbotInstalled = scanCannbotInstalled();\n\n let targets: UpdateTarget[] = [];\n\n if (pluginNames.length === 0) {\n if (installed.length === 0 && cannbotInstalled.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 = [\n ...installed.map((p) => ({ pluginId: p.id, tool: p.tool, level: p.level, source: \"skills\" as const })),\n ...cannbotInstalled.map((e) => ({ pluginId: e.id, tool: e.tool as AITool, level: \"project\" as InstallLevel, source: \"cannbot\" as const })),\n ];\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 // cannbot registry records win for same-name ids (migration policy);\n // legacy resolution must be source-scoped so a same-name cannbot\n // entry never shadows an installed legacy plugin\n const cannbotMatches = cannbotInstalled.filter((e) => e.id === name);\n const legacyPlugin = findPlugin(name, { source: \"skills\" });\n const anyPlugin = findPlugin(name);\n\n if (cannbotMatches.length === 0 && !legacyPlugin && !anyPlugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n continue;\n }\n\n const legacyMatches = cannbotMatches.length === 0 && legacyPlugin\n ? installed.filter((p) => p.id === legacyPlugin.id)\n : [];\n\n const matches = [\n ...cannbotMatches.map((e) => ({ pluginId: e.id, tool: e.tool as AITool, level: \"project\" as InstallLevel, source: \"cannbot\" as const })),\n ...legacyMatches.map((p) => ({ pluginId: p.id, tool: p.tool, level: p.level, source: \"skills\" as const })),\n ];\n\n if (matches.length > 0) {\n for (const match of matches) {\n if (defaultTool && match.tool !== defaultTool) continue;\n if (defaultLevel && match.level !== defaultLevel) continue;\n targets.push(match);\n }\n } else {\n const displayName = cannbotMatches.length\n ? cannbotMatches[0].id\n : legacyPlugin?.displayName || anyPlugin?.displayName || name;\n logger.warn(`${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 // Refresh the managed cannbot installer when cannbot targets are present\n // (update implies pulling the latest bundled plugins).\n if (targets.some((target) => target.source === \"cannbot\")) {\n try {\n await ensureCannbotInstaller({ force: true });\n } catch (error) {\n logger.warn(\n t(\"cannbot_installer_failed\").replace(\n \"{error}\",\n error instanceof Error ? error.message : t(\"error_unknown\")\n )\n );\n }\n }\n\n // Phase 3: reinstall each target (source-scoped lookup so same-name\n // cannbot entries never override a legacy target's metadata or routing)\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 = findPlugin(target.pluginId, { source: target.source });\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 installPluginRouted({\n pluginId: target.pluginId,\n tool: target.tool,\n level: target.level,\n repoPath,\n yes: options.yes,\n plugin,\n source: target.source,\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 for (const warning of result.warnings || []) {\n logger.warn(warning);\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => {\n const source = targets[index]?.source;\n const plugin = source ? findPlugin(result.pluginId, { source }) : undefined;\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 { scanCannbotInstalled } from \"../core/cannbot-registry.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 cannbotEntry = plugin.source === \"cannbot\"\n ? scanCannbotInstalled().find((e) => e.id === plugin.id)\n : undefined;\n const isInstalled = !!inst || !!cannbotEntry;\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 if (plugin.source === \"cannbot\") {\n console.log(chalk.magenta(\" [cannbot]\") + chalk.dim(` v${plugin.version || \"?\"}`));\n }\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 || cannbotEntry ? (cannbotEntry?.skillsCount ?? inst?.skillsCount) : plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${inst || cannbotEntry ? (cannbotEntry?.agentsCount ?? inst?.agentsCount) : plugin.agents}`);\n if (plugin.source !== \"cannbot\") {\n console.log(` ${chalk.dim(t(\"info_aliases\") + \":\")} ${plugin.aliases.join(\", \")}`);\n }\n console.log();\n\n if (plugin.source === \"cannbot\") {\n if (cannbotEntry) {\n console.log(` ${chalk.dim(t(\"info_source\") + \":\")} ${cannbotEntry.registryPath}`);\n }\n console.log();\n return;\n }\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":["join","existsSync","existsSync","unlinkSync","dirname","existsSync","readFileSync","join","dirname","fileURLToPath","__dirname","__filename","readdirSync","existsSync","join","existsSync","homedir","join","existsSync","readFileSync","join","i","chalk","existsSync","mkdirSync","readFileSync","join","chalk","choices","result","select","Separator","chalk","existsSync","mkdirSync","readFileSync","rmSync","join","dirname","fileURLToPath","execa","parseYaml","existsSync","readFileSync","statSync","readdirSync","join","installSkills","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","execa","existsSync","mkdirSync","rmSync","existsSync","readFileSync","writeFileSync","copyFileSync","unlinkSync","readdirSync","join","resolve","execa","existsSync","mkdirSync","readFileSync","readdirSync","writeFileSync","join","dirname","fileURLToPath","execa","parseYaml","__filename","__dirname","readManifest","setCannbotPlugins","existsSync","readFileSync","readdirSync","rmSync","unlinkSync","lstatSync","writeFileSync","join","resolve","sep","dirname","existsSync","mkdirSync","readFileSync","unlinkSync","readdirSync","join","join","existsSync","readFileSync","resolve","resolve","sep","lstatSync","rmSync","unlinkSync","readdirSync","dirname","existsSync","readFileSync","writeFileSync","join","existsSync","readFileSync","realpathSync","join","basename","execa","execaSync","existsSync","readdirSync","unlinkSync","join","dirname","resolve","join","existsSync","dirname","resolve","readdirSync","unlinkSync","select","chalk","existsSync","mkdirSync","copyFileSync","writeFileSync","rmSync","readFileSync","join","basename","execa","targetPath","execaSync","readFileSync","realpathSync","join","existsSync","backup","choice","basename","execa","join","readFileSync","copyFileSync","unlinkSync","writeFileSync","existsSync","readdirSync","execa","resolve","existsSync","mkdirSync","symlinkSync","readdirSync","rmSync","realpathSync","readlinkSync","cpSync","join","dirname","basename","isAbsolute","select","Separator","chalk","existsSync","mkdirSync","join","realpathSync","readlinkSync","symlinkSync","cpSync","readdirSync","rmSync","dirname","basename","Separator","select","chalk","action","isAbsolute","chalk","Table","existsSync","readFileSync","join","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","readFileSync","join","homedir","chalk","existsSync","readdirSync","mkdirSync","join","readFileSync","unlinkSync","homedir","lstatSync","chalk","chalk","confirm","chalk","scanSpinner","tool","level","existsSync","unlinkSync","rmdirSync","readdirSync","readFileSync","resolve","basename","sep","join","chalk","select","checkbox","Separator","confirm","chalk","confirm","Separator","select","stepLevel","checkbox","record","configRoot","join","existsSync","readFileSync","basename","resolve","sep","unlinkSync","readdirSync","rmdirSync","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/locales/zh_CN.json","../src/locales/en_US.json","../src/utils/i18n.ts","../src/utils/paths.ts","../src/utils/fs.ts","../src/embedded-config.json","../src/core/scanner.ts","../src/embedded-plugins.json","../src/core/registry.ts","../src/core/detector.ts","../src/core/manifest.ts","../src/ui/theme.ts","../src/utils/logger.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/skill-registry.ts","../src/core/metadata-sync.ts","../src/core/cannbot-delegate.ts","../src/core/cannbot-installer.ts","../src/core/cannbot-registry.ts","../src/core/record.ts","../src/core/installer.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 \"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_cannbot_requires_delegation\": \"插件 {plugin} 为 cannbot 仓委托安装源,须经 installPluginRouted 路由安装(内部路由错误,请提 Issue 反馈)\",\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/、.trae/、.cursor/、.codex/ 与 .agents/、.github/、.codeartsdoer/)\",\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 \"unowned_file_detected\": \"检测到非 CANNBot 安装的配置文件\",\n \"unowned_file_path\": \"文件\",\n \"unowned_file_warning\": \"该文件不是由 CANNBot 安装的。替换将覆盖其现有内容(会在文件旁创建备份)。\",\n \"unowned_file_keep\": \"保留我的文件(跳过替换)\",\n \"unowned_file_replace\": \"替换(自动备份)\",\n \"unowned_preserved\": \"已保留现有文件(未替换): {file}\",\n \"unowned_preserved_yes\": \"非交互模式:已保留非 CANNBot 安装的现有文件: {file}\",\n \"unowned_backup_label\": \"用户文件\",\n \"backup_restore_user_file\": \"恢复用户文件\",\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_config_preserved\": \"已跳过配置文件(保留现有文件): {file}\",\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_codex_toml_missing\": \"插件未提供 Codex 适配文件 {path},已跳过 agent: {name}\",\n \"error_tool_not_supported\": \"插件 {plugin} 的安装脚本暂不支持工具 {tool}(为避免误装到默认目录已中止),请查看该插件 quickstart.md 确认支持的工具列表\",\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 \"error_invalid_source\": \"无效的插件来源: {source}\\n支持的来源: {sources}\",\n \"info_source\": \"安装注册表\",\n \"cannbot_tool_unsupported\": \"cannbot 型插件暂不支持工具 {tool}(上游安装器支持: {tools})\",\n \"cannbot_level_unsupported\": \"cannbot 型插件仅支持 project 级安装\",\n \"cannbot_node_required\": \"安装 cannbot 型插件需要可用的 Node.js 运行环境,当前未检测到 node。请安装 Node.js(≥20)后重试\",\n \"cannbot_installer_failed\": \"获取 @cannbot-plugin/cannbot 安装器失败: {error}\",\n \"cannbot_installer_refresh_failed\": \"刷新 cannbot 安装器失败,使用本地缓存继续\",\n \"cannbot_installer_path_invalid\": \"CANNBOT_INSTALLER_PATH 指定的安装器路径无效: {path}\",\n \"cannbot_plugin_not_found\": \"cannbot 安装器包中未找到插件 {plugin}\",\n \"cannbot_registry_missing\": \"安装后未在 cannbot-plugin.json 中找到注册记录\",\n \"cannbot_delegate_failed\": \"cannbot 安装器执行失败(退出码 {code}),输出见上方日志\",\n \"cannbot_bundled_fallback\": \"上游安装器暂不识别新版 plugins-official 目录(等待其发版修复),已自动回退为安装器包内置快照(--bundled)完成安装\",\n \"cannbot_migrated_symlink\": \"检测到 {file} 为旧版插件软链,已转为真实文件(内容保留并已备份)\",\n \"cannbot_migrate_symlink_failed\": \"旧版软链 {file} 转真实文件失败,请手动处理后重试\",\n \"cannbot_dual_skill_copy\": \"以下 Skills 同时存在于新旧两套布局中,AI 工具会看到两份副本: {skills}\",\n \"cannbot_registry_corrupted\": \"无法解析 cannbot-plugin.json: {file}\",\n \"cannbot_registry_schema_unsupported\": \"cannbot-plugin.json schemaVersion({version})不受支持,请升级 install-helper 后再执行卸载\",\n \"cannbot_uninstall_no_record\": \"未找到该插件的 cannbot 安装记录\",\n \"cannbot_uninstall_native_hint\": \"该插件在工具侧注册了原生插件,如需取消注册可执行: opencode plugin remove {spec}\",\n \"doctor_cannbot\": \"cannbot 集成\",\n \"doctor_cannbot_node_ok\": \"Node.js 运行时可用(支持 cannbot 插件委托安装)\",\n \"doctor_cannbot_node_missing\": \"未检测到 Node.js 运行时,cannbot 型插件不可安装\",\n \"doctor_cannbot_missing_skills\": \"注册表记录的 Skills 中有 {count} 个在磁盘上不存在\",\n \"doctor_cannbot_marker_duplicate\": \"插件 {plugin} 存在重复的标记块\",\n \"doctor_cannbot_marker_unpaired\": \"标记块不配对(start={start}, end={end})\",\n \"doctor_cannbot_orphan_record\": \"插件 {plugin} 的委托安装记录已悬空(cannbot-plugin.json 中无对应记录)\"\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_cannbot_requires_delegation\": \"Plugin {plugin} is a cannbot-source entry and must be installed via installPluginRouted delegation (internal routing error — please report an issue)\",\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 the tool's config directory (e.g. .opencode/, .claude/, .trae/, .cursor/, .codex/ with .agents/, .github/, .codeartsdoer/)\",\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 \"unowned_file_detected\": \"Configuration file not created by CANNBot detected\",\n \"unowned_file_path\": \"File\",\n \"unowned_file_warning\": \"This file was not installed by CANNBot. Replacing it overwrites its current content (a backup is created beside it).\",\n \"unowned_file_keep\": \"Keep my file (skip replacing it)\",\n \"unowned_file_replace\": \"Replace (auto backup)\",\n \"unowned_preserved\": \"Kept existing file (not replaced): {file}\",\n \"unowned_preserved_yes\": \"Non-interactive mode: kept existing file not created by CANNBot: {file}\",\n \"unowned_backup_label\": \"User file\",\n \"backup_restore_user_file\": \"Restore user file\",\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_config_preserved\": \"Skipped config file (kept existing file): {file}\",\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_codex_toml_missing\": \"Codex adapter file {path} not found in plugin, agent skipped: {name}\",\n \"error_tool_not_supported\": \"Plugin {plugin} does not support tool {tool} yet (aborted to avoid mis-installing into default directories); see the plugin quickstart.md for supported tools\",\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 \"error_invalid_source\": \"Invalid plugin source: {source}\\nSupported sources: {sources}\",\n \"info_source\": \"Install registry\",\n \"cannbot_tool_unsupported\": \"Tool {tool} is not supported for cannbot plugins yet (upstream supports: {tools})\",\n \"cannbot_level_unsupported\": \"cannbot plugins support project-level installation only\",\n \"cannbot_node_required\": \"A working Node.js runtime is required to install cannbot plugins but node was not found. Please install Node.js (>=20) and retry\",\n \"cannbot_installer_failed\": \"Failed to fetch the @cannbot-plugin/cannbot installer: {error}\",\n \"cannbot_installer_refresh_failed\": \"Failed to refresh the cannbot installer; continuing with the local cache\",\n \"cannbot_installer_path_invalid\": \"The installer path set by CANNBOT_INSTALLER_PATH is invalid: {path}\",\n \"cannbot_plugin_not_found\": \"Plugin {plugin} was not found in the cannbot installer package\",\n \"cannbot_registry_missing\": \"No cannbot-plugin.json record found after installation\",\n \"cannbot_delegate_failed\": \"The cannbot installer exited with code {code}; see the output above\",\n \"cannbot_bundled_fallback\": \"The upstream installer predates the plugins-official rename (pending its next release); automatically fell back to the installer package's bundled snapshot (--bundled)\",\n \"cannbot_migrated_symlink\": \"{file} was a legacy plugin symlink; converted to a real file (content kept, backup saved)\",\n \"cannbot_migrate_symlink_failed\": \"Failed to convert the legacy symlink {file} to a real file; resolve it manually and retry\",\n \"cannbot_dual_skill_copy\": \"These Skills exist in both the legacy and cannbot layouts, the AI tool will see two copies: {skills}\",\n \"cannbot_registry_corrupted\": \"Cannot parse cannbot-plugin.json: {file}\",\n \"cannbot_registry_schema_unsupported\": \"cannbot-plugin.json schemaVersion ({version}) is not supported; upgrade install-helper before uninstalling\",\n \"cannbot_uninstall_no_record\": \"No cannbot install record found for this plugin\",\n \"cannbot_uninstall_native_hint\": \"This plugin registered a native plugin with the tool; unregister it via: opencode plugin remove {spec}\",\n \"doctor_cannbot\": \"cannbot integration\",\n \"doctor_cannbot_node_ok\": \"Node.js runtime available (cannbot delegation supported)\",\n \"doctor_cannbot_node_missing\": \"No Node.js runtime detected; cannbot plugins cannot be installed\",\n \"doctor_cannbot_missing_skills\": \"{count} skills recorded in the registry are missing on disk\",\n \"doctor_cannbot_marker_duplicate\": \"Plugin {plugin} has duplicate marker blocks\",\n \"doctor_cannbot_marker_unpaired\": \"Marker blocks are unpaired (start={start}, end={end})\",\n \"doctor_cannbot_orphan_record\": \"Delegated install record for {plugin} is orphaned (no matching cannbot-plugin.json entry)\"\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\", \"codex\", \"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 \"codex\":\n return join(home, \".codex\");\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 \"codex\":\n return join(baseDir, \".codex\");\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 getSkillsRoot(tool: AITool, level: InstallLevel, base?: string): string {\n if (tool === \"codex\") {\n if (level === \"global\") {\n return join(homedir(), \".agents\", \"skills\");\n }\n return join(base || process.cwd(), \".agents\", \"skills\");\n }\n return join(getConfigRoot(tool, level, base), \"skills\");\n}\n\nexport function getAgentsFileName(tool: AITool): string {\n return getConfigFileName(tool);\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 { 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 \"scanDirs\": [\n \"ops\",\n \"model\",\n \"graph\",\n \"infra\",\n \"runtime\",\n \"tools\"\n ],\n \"pluginDirs\": [\n \"plugins-official\"\n ],\n \"cacheTtlHours\": 24,\n \"cannbotInstaller\": {\n \"package\": \"@cannbot-plugin/cannbot\",\n \"channel\": \"latest\",\n \"ttlHours\": 24\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\";\nimport embeddedConfig from \"../embedded-config.json\" with { type: \"json\" };\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 // Resolution order:\n // 1. repository.yaml on disk — runtime override, works for tsup dist\n // (dist/config/) and TS source (src/core → ../config/)\n // 2. embedded-config.json — generated from repository.yaml at build time;\n // the only source available inside the bun-compiled native binary\n // 3. hardcoded defaults (must not drift from repository.yaml)\n const configCandidates = [\n join(__dirname, \"config\", \"repository.yaml\"),\n join(__dirname, \"..\", \"config\", \"repository.yaml\"),\n ];\n for (const configPath of configCandidates) {\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n if (!config) continue;\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 // try next candidate\n }\n }\n const embedded = embeddedConfig as { scanDirs?: string[]; pluginDirs?: string[]; cacheTtlHours?: number };\n if (Array.isArray(embedded.scanDirs) && embedded.scanDirs.length > 0) {\n return {\n skillDirs: embedded.scanDirs,\n pluginDirs: Array.isArray(embedded.pluginDirs) && embedded.pluginDirs.length > 0\n ? embedded.pluginDirs\n : [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: (embedded.cacheTtlHours || 24) * 60 * 60 * 1000,\n };\n }\n return {\n skillDirs: [\"ops\", \"model\", \"graph\", \"infra\", \"runtime\"],\n pluginDirs: [\"plugins-official\", \"plugins-community\"],\n cacheTtlMs: 24 * 60 * 60 * 1000,\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 getPluginDirs(): string[] {\n return [...PLUGIN_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 {\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\": 0,\n \"agents\": 6,\n \"description\": \"skill 驱动多角色直调算子开发工作流:PM 调度 architect/developer/qa 团队,8 阶段 7 CP 全流程,支持静默模式与算子仓继承定制\",\n \"version\": \"2.0.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [],\n \"installAgents\": [\n \"architect\",\n \"developer\",\n \"developer-code\",\n \"developer-doc\",\n \"developer-test\",\n \"qa\"\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\": 30,\n \"agents\": 7,\n \"description\": \"生产级 ACLNN 注册算子全流程:代码→UT/ST→上库\",\n \"version\": \"1.2.3\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"ascendc-blaze-best-practice\",\n \"ascendc-blaze-migration\",\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-perf-optimize\",\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-simulator\",\n \"ops-spec-gen\"\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 \"dir\": \"plugins-official/ops-registry-invoke/skills\",\n \"skills\": [\n \"spec-to-design\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-ops-architect\",\n \"ascendc-ops-spec-reviewer\",\n \"ascendc-ops-designer\",\n \"ascendc-ops-design-reviewer\",\n \"ascendc-ops-tester\",\n \"ascendc-ops-test-design-reviewer\",\n \"ascendc-ops-developer\"\n ],\n \"externalRepos\": [\n {\n \"url\": \"https://gitcode.com/cann/asc-devkit.git\",\n \"dir\": \"plugins-official/ops-registry-invoke/reference/cann/asc-devkit\",\n \"depth\": 1,\n \"configRootLink\": false\n },\n {\n \"url\": \"https://gitcode.com/cann/ops-tensor.git\",\n \"dir\": \"plugins-official/ops-registry-invoke/ops-tensor\",\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-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 \"sota\",\n \"sota-approach\",\n \"model-infer-sota\"\n ],\n \"skills\": 14,\n \"agents\": 9,\n \"description\": \"NPU 模型推理端到端优化,涵盖固定阶段优化(并行/KVCache/融合/量化/图模式)与 baseline 之上 profiling 驱动的探索式优化(按需调用多流/预取/SuperKernel 等单点优化)\",\n \"version\": \"1.0.6\",\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 \"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-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\": 17,\n \"agents\": 8,\n \"description\": \"PyPTO Python API 算子全流程开发,覆盖需求理解、API 探索、实现与调优\",\n \"version\": \"1.2.0\",\n \"configFile\": \"AGENTS.md\",\n \"configRootConfigLink\": false,\n \"installSkills\": [\n {\n \"dir\": \"ops\",\n \"skills\": [\n \"pypto-orchestration-manual\",\n \"pypto-intent-understand\",\n \"pypto-op-plan\",\n \"pypto-api-explore\",\n \"pypto-docs-search\",\n \"pypto-golden-generate\",\n \"pypto-op-design\",\n \"pypto-op-construct\",\n \"pypto-op-develop\",\n \"pypto-op-verify\",\n \"pypto-op-review\",\n \"pypto-precision-compare\",\n \"pypto-precision-debug\",\n \"pypto-general-debug\",\n \"pypto-op-perf-tune\",\n \"pypto-op-knowledge\",\n \"pypto-memory-template\"\n ]\n }\n ],\n \"installAgents\": [\n \"pypto-op-planner\",\n \"pypto-op-mathematician\",\n \"pypto-op-architect\",\n \"pypto-op-designer\",\n \"pypto-op-coder\",\n \"pypto-op-verifier\",\n \"pypto-op-debugger\",\n \"pypto-op-optimizer\"\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\": 13,\n \"agents\": 6,\n \"description\": \"TileLang Python DSL + @tilelang.jit 算子开发(支持 Developer/Expert 双模式)\",\n \"version\": \"1.2.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 \"tilelang-performance-best-practices\",\n \"ascendc-env-check\",\n \"npu-arch\",\n \"tilelang-op-profiling\"\n ]\n }\n ],\n \"installAgents\": [\n \"tilelang-op-analyst\",\n \"tilelang-op-developer\",\n \"tilelang-op-perf-tuner\",\n \"tilelang-tuning\",\n \"tilelang-perf-analysis-expert\",\n \"tilelang-perf-impl-expert\"\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 \"triton-precision-debug\",\n \"npu-arch\",\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\": 7,\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-npugraph-ex-performance-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\": 4,\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-api-best-practices\",\n \"npu-arch\"\n ]\n }\n ],\n \"installAgents\": [\n \"ascendc-ops-reviewer\",\n \"ascendc-code-summarizer\"\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, PluginSource } from \"../types/index.js\";\nimport { isDirectory } from \"../utils/fs-helpers.js\";\nimport { getPluginDirs } from \"./scanner.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\n// cannbot-repo plugins discovered from the managed @cannbot-plugin/cannbot\n// package (dist/plugins manifests). Kept separate from the embedded legacy\n// snapshot: cannbot entries are resolved at runtime and never baked into\n// embedded-plugins.json (no release coupling with the cannbot repo).\nlet CANNBOT_PLUGINS: PluginEntry[] = [];\n\nexport function setCannbotPlugins(entries: PluginEntry[]): void {\n CANNBOT_PLUGINS = entries.map((entry) => ({ ...entry, source: \"cannbot\" as PluginSource }));\n}\n\nexport function getCannbotPlugins(): PluginEntry[] {\n return [...CANNBOT_PLUGINS];\n}\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 // Plugin discovery scope follows repository.yaml pluginDirs (currently\n // official plugins only — community plugins are not adapted yet).\n for (const pluginDir of getPluginDirs()) {\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(\n query: string,\n options?: { source?: PluginSource }\n): PluginEntry | undefined {\n const normalized = query.toLowerCase().trim();\n const wantCannbot = options?.source !== \"skills\";\n\n // cannbot-source plugins win for same-name ids (migration policy: the new\n // generation in the cannbot repo is authoritative; the legacy version can\n // still be requested explicitly via --source skills).\n if (wantCannbot) {\n const cannbotExact = CANNBOT_PLUGINS.find(\n (p) => p.id === normalized || p.id === query.trim()\n );\n if (cannbotExact) return cannbotExact;\n\n const cannbotAlias = CANNBOT_PLUGINS.find((p) =>\n p.aliases.some((a) => a === normalized)\n );\n if (cannbotAlias) return cannbotAlias;\n }\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 if (wantCannbot) {\n const cannbotPrefixes = CANNBOT_PLUGINS.filter((p) => p.id.startsWith(normalized));\n if (cannbotPrefixes.length === 1) return cannbotPrefixes[0];\n }\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 [...CANNBOT_PLUGINS, ...PLUGIN_REGISTRY].sort((a, b) =>\n a.displayName < b.displayName ? -1 : a.displayName > b.displayName ? 1 : 0\n );\n}\n\nexport function getPluginById(id: string): PluginEntry | undefined {\n const cannbot = CANNBOT_PLUGINS.find((p) => p.id === id);\n if (cannbot) return cannbot;\n return PLUGIN_REGISTRY.find((p) => p.id === id);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { execa } from \"execa\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport type { AITool, DetectedTool } from \"../types/index.js\";\nimport { detectTraeVariant, 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 detectCodex(): Promise<DetectedTool | undefined> {\n const cmdPath = await getCommandPath(\"codex\");\n if (cmdPath) {\n const version = await getCommandVersion(\"codex\");\n return { name: \"codex\", version, path: cmdPath };\n }\n\n const home = homedir();\n const configDir = join(home, \".codex\");\n if (existsSync(configDir)) {\n return { name: \"codex\", path: configDir };\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 detectCodex,\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 codex: \"Codex\",\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, getSkillsRoot, 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 = getSkillsRoot(tool, level);\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 { 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, PluginSource, 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\n// Wizard choice values encode the plugin source so same-name cannbot and\n// legacy entries stay distinguishable through selection, confirm and install.\nexport function encodePluginChoice(id: string, source?: PluginSource): string {\n return source === \"cannbot\" ? `cannbot::${id}` : `skills::${id}`;\n}\n\nexport function decodePluginChoice(value: string): { id: string; source: PluginSource } {\n if (value.startsWith(\"cannbot::\")) return { id: value.slice(\"cannbot::\".length), source: \"cannbot\" };\n if (value.startsWith(\"skills::\")) return { id: value.slice(\"skills::\".length), source: \"skills\" };\n return { id: value, source: \"skills\" };\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 const badge = p.source === \"cannbot\" ? chalk.magenta(\" [cannbot]\") : \"\";\n return {\n name: `> ${chalk.cyan(p.displayName)}${badge}${suffix}`,\n value: encodePluginChoice(p.id, p.source),\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((value) => {\n const { id, source } = decodePluginChoice(value);\n return allPlugins.find((p) => p.id === id && (p.source ?? \"skills\") === source);\n });\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, codex, copilot, codearts)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-s, --source <source>\", \"Plugin source for same-name plugins (cannbot, skills)\")\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; source?: 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, codex, 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, codex, 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, decodePluginChoice } from \"../ui/wizard.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPluginRouted } from \"../core/cannbot-delegate.js\";\nimport { ensureCannbotDiscovery } from \"../core/cannbot-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, getSkillsRoot } 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 await ensureCannbotDiscovery();\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 // wizard choices carry a source prefix (cannbot::<id> / skills::<id>) so\n // same-name entries resolve to the source the user actually picked\n const selected = answers.plugins.map((value) => {\n const { id, source } = decodePluginChoice(value);\n return {\n id,\n source,\n plugin: allPlugins.find((p) => p.id === id && (p.source ?? \"skills\") === source),\n };\n });\n\n const total = answers.plugins.length;\n const results = [];\n\n for (let i = 0; i < selected.length; i++) {\n const pluginId = selected[i].id;\n const source = selected[i].source;\n const plugin = selected[i].plugin;\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 installPluginRouted({\n pluginId,\n tool: answers.tool,\n level: answers.level,\n repoPath,\n plugin,\n source,\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 for (const warning of result.warnings || []) {\n logger.warn(warning);\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => ({\n pluginId: result.pluginId,\n displayName: selected[index]?.plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n source: selected[index]?.source,\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 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(getSkillsRoot(tool, level))}`);\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 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: \"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-blaze-migration\", description: \"AscendC Matmul 家族等价迁移到 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: \"算子对接 PyTorch(kernel 直调 / aclnn 注册双路线)\", 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: \"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: \"model-train-precision-numerical-mismatch\", description: \"PyTorch on NPU 训练正向/反向有限值偏差诊断\", source: \"model\" },\n { id: \"model-train-precision-nonfinite\", description: \"PyTorch on NPU 训练 NaN/Inf/Overflow 诊断\", source: \"model\" },\n { id: \"model-train-precision-determinism\", description: \"PyTorch on NPU 训练非确定性诊断\", source: \"model\" },\n { id: \"model-train-log-visualization\", description: \"NPU 大模型训练日志可视化与对比\", source: \"model\" },\n { id: \"model-train-oom-analysis\", description: \"PyTorch on NPU 训练 OOM 内存诊断与优化\", 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 { id: \"ge-fusion-pass-skill\", description: \"GE/CANN 自定义融合 pass 开发与诊断\", 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/批量 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, readdirSync } from \"fs\";\nimport { join, sep } 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 parseAllSkills(pluginDir: string): string[] {\n const initPath = join(pluginDir, \"init.sh\");\n try {\n const text = readFileSync(initPath, \"utf-8\");\n const m = text.match(/ALL_SKILLS=\"([^\"]*)\"/);\n if (!m) return [];\n const val = m[1];\n if (val.includes(\"$(\") || val.includes(\"${\")) return [];\n return val.split(/\\s+/).filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction findSkillSourceDir(skillName: string, repoRoot: string, scanDirs: string[], pluginDir?: 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 if (pluginDir) {\n const localCandidate = join(pluginDir, \"skills\", skillName);\n if (existsSync(localCandidate) && statSync(localCandidate).isDirectory()) {\n const relPluginDir = pluginDir.replace(repoRoot + sep, \"\").replace(repoRoot + \"/\", \"\");\n return `${relPluginDir}/skills`;\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 .filter((a) => a.startsWith(\"./agents/\"))\n .map((a) => a.replace(/^\\.\\/agents\\//, \"\").replace(/\\.md$/, \"\"))\n .filter(Boolean);\n}\n\nfunction parseIncludedAgentPattern(initShPath: string): string | null {\n try {\n const text = readFileSync(initShPath, \"utf-8\");\n const m = text.match(/INCLUDED_AGENT_PATTERN=\"([^\"]*)\"/);\n if (!m) return null;\n return m[1].trim() || null;\n } catch {\n return null;\n }\n}\n\nfunction simpleGlobToRegExp(pattern: string): RegExp {\n let re = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const c = pattern[i];\n if (c === \"*\") re += \".*\";\n else if (c === \"?\") re += \".\";\n else re += c.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return new RegExp(re + \"$\");\n}\n\nfunction matchAgentsByPattern(agentsDir: string, pattern: string): string[] {\n const filePattern = pattern.endsWith(\".md\") ? pattern : pattern + \".md\";\n try {\n const fsSync = require(\"fs\") as typeof import(\"fs\");\n if (typeof fsSync.globSync === \"function\") {\n return fsSync.globSync(filePattern, { cwd: agentsDir })\n .map((f: string) => f.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\"));\n }\n } catch {}\n if (filePattern.includes(\"@(\") || filePattern.includes(\"+(\") || filePattern.includes(\"!(\")) {\n return [];\n }\n try {\n const re = simpleGlobToRegExp(filePattern);\n return readdirSync(agentsDir)\n .filter((f) => f.endsWith(\".md\") && re.test(f))\n .map((f) => f.replace(/\\.md$/, \"\"));\n } catch {\n return [];\n }\n}\n\nfunction discoverAgents(pluginDir: string, pj: PluginJson | null, initShPath: string, fallbackAgents?: string[]): string[] {\n const fromPj = resolveAgentsFromPluginJson(pj);\n if (fromPj.length > 0) return fromPj;\n if (pj && Array.isArray(pj.agents) && pj.agents.length === 0) return [];\n const pattern = parseIncludedAgentPattern(initShPath);\n if (pattern) {\n const agentsDir = join(pluginDir, \"agents\");\n if (existsSync(agentsDir)) {\n const fromPattern = matchAgentsByPattern(agentsDir, pattern);\n if (fromPattern.length > 0) return fromPattern;\n }\n }\n // Layer 3: fallback agents (from embedded/yml installAgents, last resort)\n return fallbackAgents || [];\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 let initSkills = parseIncludedSkills(pluginDir);\n if (initSkills.length === 0) {\n initSkills = parseAllSkills(pluginDir);\n }\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, pluginDir);\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 (SoT), fallback to init.sh pattern, then embedded\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: discover from plugin.json (SoT) with init.sh pattern + embedded fallback\n const initShPath = join(pluginDir, \"init.sh\");\n plugin.installAgents = discoverAgents(pluginDir, pj, initShPath, plugin.installAgents);\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.length;\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\n// Delegation protocol: cannbot-style plugins are installed by the cannbot\n// repository's own installer (@cannbot-plugin/cannbot) so the resulting\n// layout (.agents/skills, marker-block AGENTS.md, .cannbot/plugins assets,\n// cannbot-plugin.json registry) is byte-for-byte identical to a direct\n// `npx @cannbot-plugin/cannbot install`. install-helper only wraps discovery,\n// boundaries, bookkeeping and (uninstall/list/status) around it.\n\nimport { existsSync, readFileSync, writeFileSync, copyFileSync, unlinkSync, readdirSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult, PluginEntry, PluginSource } from \"../types/index.js\";\nimport { discoverCannbotPlugins, ensureCannbotInstaller, getCannbotBinPath, hasNodeRuntime } from \"./cannbot-installer.js\";\nimport { findCannbotRegistryPath, readCannbotRegistry } from \"./cannbot-registry.js\";\nimport { writeRecord } from \"./record.js\";\nimport { installPlugin } from \"./installer.js\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigFileName, getSkillsRoot } from \"../utils/paths.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport const DELEGATE_TOOLS: AITool[] = [\"opencode\", \"claude\", \"trae\", \"codex\"];\n\nexport interface DelegateInstallOptions {\n pluginId: string;\n displayName?: string;\n tool: AITool;\n level: InstallLevel;\n target?: string;\n yes?: boolean;\n}\n\nfunction boundaryErrors(tool: AITool, level: InstallLevel): string[] {\n const errors: string[] = [];\n if (!DELEGATE_TOOLS.includes(tool)) {\n errors.push(\n t(\"cannbot_tool_unsupported\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", DELEGATE_TOOLS.join(\", \"))\n );\n }\n if (level !== \"project\") {\n errors.push(t(\"cannbot_level_unsupported\"));\n }\n return errors;\n}\n\n/**\n * Migration-time precheck: legacy installs own AGENTS.md/CLAUDE.md as a\n * symlink to the plugin source. The cannbot installer merges marker blocks\n * into a real file, so a symlinked config would be replaced wholesale and\n * the legacy uninstall would later delete the merged file. Convert the\n * symlink to a real file (keeping content) before delegating.\n */\nfunction migrateSymlinkedInstructions(target: string, tool: AITool): string[] {\n const warnings: string[] = [];\n const fileName = getConfigFileName(tool);\n const candidates = [join(target, fileName), join(target, \"AGENTS.md\"), join(target, \"CLAUDE.md\")];\n\n for (const configPath of candidates) {\n if (!isSymlink(configPath)) continue;\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const backupPath = `${configPath}.cannbot-migration.${Date.now()}`;\n copyFileSync(configPath, backupPath);\n unlinkSync(configPath);\n writeFileSync(configPath, content);\n warnings.push(t(\"cannbot_migrated_symlink\").replace(\"{file}\", fileName));\n } catch {\n warnings.push(t(\"cannbot_migrate_symlink_failed\").replace(\"{file}\", fileName));\n }\n break;\n }\n\n return warnings;\n}\n\n/** Detects skills installed by a legacy plugin that the cannbot plugin also\n * installs (same skill name in a different layout root) — scenario B. */\nfunction detectDualSkillCopies(tool: AITool, target: string, skillNames: string[]): string[] {\n const duplicates: string[] = [];\n if (tool !== \"opencode\") return duplicates;\n\n const legacyRoot = getSkillsRoot(\"opencode\", \"project\", target);\n if (!existsSync(legacyRoot)) return duplicates;\n let legacyEntries: string[] = [];\n try {\n legacyEntries = readdirSync(legacyRoot);\n } catch {\n return duplicates;\n }\n\n for (const name of skillNames) {\n if (legacyEntries.includes(name)) {\n duplicates.push(name);\n }\n }\n return duplicates;\n}\n\nfunction skillNameFromPath(rel: string): string {\n const parts = rel.split(\"/\");\n return parts[parts.length - 1] || rel;\n}\n\ninterface DelegateRunResult {\n ok: boolean;\n stdout: string;\n stderr: string;\n exitCode: number | undefined;\n}\n\n/**\n * Runs the cannbot installer CLI. Output is captured and re-emitted\n * verbatim (equivalent to stdio inherit) so the transcript stays identical\n * while still being inspectable for the rename-gap fallback below.\n */\nasync function runDelegate(\n args: string[],\n target: string\n): Promise<DelegateRunResult> {\n try {\n const result = await execa(\"node\", [getCannbotBinPath(), ...args], {\n cwd: target,\n timeout: 600000,\n });\n process.stdout.write(result.stdout || \"\");\n process.stderr.write(result.stderr || \"\");\n return { ok: true, stdout: result.stdout || \"\", stderr: result.stderr || \"\", exitCode: 0 };\n } catch (error) {\n const err = error as { stdout?: string; stderr?: string; exitCode?: number; message?: string };\n process.stdout.write(err.stdout || \"\");\n process.stderr.write(err.stderr || \"\");\n if (!err.stdout && !err.stderr && err.message) {\n process.stderr.write(`${err.message}\\n`);\n }\n return {\n ok: false,\n stdout: err.stdout || \"\",\n stderr: err.stderr || \"\",\n exitCode: err.exitCode,\n };\n }\n}\n\n/**\n * The --bundled retry only applies to installers that still expose the flag\n * (pre-1.8.0, where installLatest followed the cannbot mainline). Installers\n * >= 1.8.0 dropped the flag because bundled is the default behavior — for\n * them a first-attempt \"plugin not found\" is a genuine failure and must be\n * passed through verbatim without a misleading unknown-option retry.\n */\nfunction installerSupportsBundledFlag(): boolean {\n try {\n const binSource = readFileSync(getCannbotBinPath(), \"utf-8\");\n return binSource.includes('\"--bundled\"');\n } catch {\n return false;\n }\n}\n\nexport async function delegateInstall(options: DelegateInstallOptions): Promise<InstallResult> {\n const { pluginId, tool, level } = options;\n const target = resolve(options.target || process.cwd());\n const displayName = options.displayName || pluginId;\n\n const result: InstallResult = {\n success: false,\n pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [],\n warnings: [],\n };\n\n // 1. boundary validation (tool matrix + level)\n result.errors.push(...boundaryErrors(tool, level));\n if (result.errors.length > 0) {\n return result;\n }\n\n // 2. Node.js runtime is required to run the cannbot installer\n if (!hasNodeRuntime()) {\n result.errors.push(t(\"cannbot_node_required\"));\n return result;\n }\n\n // 3. ensure the managed installer package\n try {\n await ensureCannbotInstaller();\n } catch (error) {\n result.errors.push(\n t(\"cannbot_installer_failed\").replace(\n \"{error}\",\n error instanceof Error ? error.message : t(\"error_unknown\")\n )\n );\n return result;\n }\n\n // 4. the plugin must exist in the bundled release; if it is missing from a\n // cached installer, force one refresh before giving up (handles newly\n // published cannbot plugins)\n if (!discoverCannbotPlugins().some((p) => p.id === pluginId)) {\n try {\n await ensureCannbotInstaller({ force: true });\n } catch {\n // fall through to the not-found error below\n }\n if (!discoverCannbotPlugins().some((p) => p.id === pluginId)) {\n result.errors.push(t(\"cannbot_plugin_not_found\").replace(\"{plugin}\", pluginId));\n return result;\n }\n }\n\n // 5. instructions-file precheck (legacy symlink -> real file)\n result.warnings.push(...migrateSymlinkedInstructions(target, tool));\n\n // 6. delegate: node <installer>/bin/cannbot.js install <id> --tool <t> --target <dir>\n // Default mirrors a direct `cannbot install`. Installers packaged before\n // the plugins/ -> plugins-official/ rename (cannbot e140ca6) resolve\n // official plugins against a fresh mainline checkout via their bundled\n // sourcePluginDirectory and fail with \"plugin not found\". When exactly\n // that failure occurs on a --bundled-capable installer, retry once with\n // --bundled (install from the installer package's own dist snapshot) so\n // users are not blocked on upstream's release cadence. Installers\n // >= 1.8.0 install from the bundled snapshot by default and dropped the\n // flag, so for them the first failure is final and passed through.\n let run = await runDelegate([\"install\", pluginId, \"--tool\", tool, \"--target\", target], target);\n\n // installLatest reports the failure via console.error (stderr)\n const hitRenameGap =\n !run.ok &&\n installerSupportsBundledFlag() &&\n (run.stdout.includes(`plugin not found: ${pluginId}`) ||\n run.stderr.includes(`plugin not found: ${pluginId}`));\n if (hitRenameGap) {\n result.warnings.push(t(\"cannbot_bundled_fallback\"));\n run = await runDelegate(\n [\"install\", pluginId, \"--tool\", tool, \"--target\", target, \"--bundled\"],\n target\n );\n }\n\n if (!run.ok) {\n result.errors.push(\n t(\"cannbot_delegate_failed\").replace(\n \"{code}\",\n run.exitCode !== undefined ? String(run.exitCode) : \"?\"\n )\n );\n return result;\n }\n\n // 7. read back the registry record the cannbot installer just wrote and\n // mirror it into install-helper's own bookkeeping\n const registryRead = readCannbotRegistry(target, tool);\n const record = registryRead?.registry.plugins.find((r) => r?.plugin === pluginId);\n\n if (!record) {\n result.errors.push(t(\"cannbot_registry_missing\"));\n return result;\n }\n\n result.skillsCount = Array.isArray(record.skills) ? record.skills.length : 0;\n result.agentsCount = Array.isArray(record.agents) ? record.agents.length : 0;\n\n const files: string[] = [];\n const directories: string[] = [];\n for (const rel of [...(record.skills || []), ...(record.agents || [])]) {\n files.push(join(target, rel));\n }\n if (record.assets) {\n directories.push(join(target, record.assets));\n }\n if (record.permissions) {\n directories.push(join(target, record.permissions));\n }\n\n const registryPath = findCannbotRegistryPath(target, tool);\n\n writeRecord({\n pluginId,\n displayName,\n tool,\n level: \"project\",\n installPath: target,\n configRoot: registryPath ? join(registryPath, \"..\") : target,\n installTime: new Date().toISOString(),\n files,\n directories,\n kind: \"delegated\",\n });\n addInstalledPlugin(pluginId);\n\n // 8. dual-copy warning (scenario B)\n const duplicates = detectDualSkillCopies(\n tool,\n target,\n (record.skills || []).map(skillNameFromPath)\n );\n if (duplicates.length > 0) {\n result.warnings.push(t(\"cannbot_dual_skill_copy\").replace(\"{skills}\", duplicates.join(\", \")));\n }\n\n result.success = true;\n return result;\n}\n\n/**\n * Unified routing helper: cannbot-style plugins go through delegation,\n * everything else through the legacy installer. Used by install/update and\n * the interactive wizard so no call site needs to branch on its own.\n */\nexport async function installPluginRouted(\n options: InstallOptions & { plugin?: PluginEntry; source?: PluginSource }\n): Promise<InstallResult> {\n // An explicit --source skills always forces the legacy installer, even\n // when the plugin metadata (resolved by an unscoped cannbot-first lookup\n // at a call site) points at the cannbot entry of a same-name plugin.\n const isCannbot =\n options.source === \"cannbot\" ||\n (options.source !== \"skills\" && options.plugin?.source === \"cannbot\");\n\n if (isCannbot) {\n return delegateInstall({\n pluginId: options.pluginId,\n displayName: options.plugin?.displayName,\n tool: options.tool,\n level: options.level,\n target: options.installPath || process.cwd(),\n yes: options.yes,\n });\n }\n\n return installPlugin(options);\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\n// Managed installer for the cannbot repository's unified installer\n// (@cannbot-plugin/cannbot). install-helper delegates cannbot-style plugin\n// installation to this package so both installers always produce identical\n// on-disk layouts (single source of truth for the \"resolve + materialize\"\n// stages of installation).\n//\n// Lifecycle mirrors RepositoryManager.ensureRepo():\n// - missing -> npm install <package>@<channel> into the managed prefix\n// - TTL ok -> reuse the cached copy (offline friendly)\n// - TTL gone -> refresh via npm install (same channel)\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execa, execaSync } from \"execa\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { CannbotInstallerConfig, CannbotPluginManifest } from \"../types/index.js\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport embeddedConfig from \"../embedded-config.json\" with { type: \"json\" };\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst DEFAULT_CONFIG: CannbotInstallerConfig = {\n package: \"@cannbot-plugin/cannbot\",\n channel: \"latest\",\n ttlHours: 24,\n};\n\nconst NPM_MIRRORS = [\n undefined, // user's npm config (registry.npmjs.org by default)\n \"https://registry.npmmirror.com\",\n];\n\nexport interface CannbotPluginEntry {\n id: string;\n version: string;\n description: string;\n skillsCount: number;\n agentsCount: number;\n dir: string;\n}\n\nexport function loadCannbotInstallerConfig(): CannbotInstallerConfig {\n // Resolution order (mirrors scanner.loadScanConfig):\n // 1. repository.yaml on disk (dist/config/ or src/config/)\n // 2. embedded-config.json (bun-compiled native binary)\n // 3. hardcoded defaults (must not drift from repository.yaml)\n // CANNBOT_INSTALLER_CHANNEL always overrides the channel when set.\n let config: CannbotInstallerConfig = DEFAULT_CONFIG;\n\n const configCandidates = [\n join(__dirname, \"config\", \"repository.yaml\"),\n join(__dirname, \"..\", \"config\", \"repository.yaml\"),\n ];\n for (const configPath of configCandidates) {\n try {\n const parsed = parseYaml(readFileSync(configPath, \"utf-8\"));\n if (!parsed?.cannbotInstaller) continue;\n config = {\n package: parsed.cannbotInstaller.package || DEFAULT_CONFIG.package,\n channel: parsed.cannbotInstaller.channel || DEFAULT_CONFIG.channel,\n ttlHours: parsed.cannbotInstaller.ttlHours || DEFAULT_CONFIG.ttlHours,\n };\n break;\n } catch {\n // try next candidate\n }\n }\n\n if (config === DEFAULT_CONFIG) {\n const embedded = embeddedConfig as {\n cannbotInstaller?: { package?: string; channel?: string; ttlHours?: number };\n };\n if (embedded.cannbotInstaller) {\n config = {\n package: embedded.cannbotInstaller.package || DEFAULT_CONFIG.package,\n channel: embedded.cannbotInstaller.channel || DEFAULT_CONFIG.channel,\n ttlHours: embedded.cannbotInstaller.ttlHours || DEFAULT_CONFIG.ttlHours,\n };\n }\n }\n\n return {\n ...config,\n channel: process.env.CANNBOT_INSTALLER_CHANNEL || config.channel,\n };\n}\n\nexport function getCannbotInstallerPrefix(): string {\n return join(getCannbotConfigDir(), \"installers\", \"cannbot\");\n}\n\nexport function getCannbotPackageRoot(): string {\n const override = process.env.CANNBOT_INSTALLER_PATH;\n if (override) return override;\n const { package: packageName } = loadCannbotInstallerConfig();\n return join(getCannbotInstallerPrefix(), \"node_modules\", ...packageName.split(\"/\"));\n}\n\nexport function getCannbotBinPath(): string {\n return join(getCannbotPackageRoot(), \"bin\", \"cannbot.js\");\n}\n\ninterface InstallerState {\n version: string;\n channel: string;\n installedAt: number;\n}\n\nfunction getStatePath(): string {\n return join(getCannbotInstallerPrefix(), \"state.json\");\n}\n\nfunction readState(): InstallerState | null {\n try {\n return JSON.parse(readFileSync(getStatePath(), \"utf-8\")) as InstallerState;\n } catch {\n return null;\n }\n}\n\nfunction writeState(state: InstallerState): void {\n const prefix = getCannbotInstallerPrefix();\n if (!existsSync(prefix)) {\n mkdirSync(prefix, { recursive: true });\n }\n writeFileSync(getStatePath(), JSON.stringify(state, null, 2));\n}\n\nexport function isCannbotInstallerReady(): boolean {\n return existsSync(getCannbotBinPath());\n}\n\nexport function getCannbotInstallerVersion(): string | null {\n try {\n const pkg = JSON.parse(readFileSync(join(getCannbotPackageRoot(), \"package.json\"), \"utf-8\"));\n return pkg.version || null;\n } catch {\n return null;\n }\n}\n\nexport function hasNodeRuntime(): boolean {\n // Delegation spawns `node`; probe it directly. process.versions.node is\n // unreliable here because bun-compiled binaries also set it.\n try {\n const result = execaSync(\"node\", [\"--version\"], { timeout: 10000 });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n\nasync function npmInstallInstaller(config: CannbotInstallerConfig, force: boolean): Promise<void> {\n const prefix = getCannbotInstallerPrefix();\n if (!existsSync(prefix)) {\n mkdirSync(prefix, { recursive: true });\n }\n\n const spec = `${config.package}@${config.channel}`;\n let lastError: unknown = null;\n for (const registry of NPM_MIRRORS) {\n const args = [\"install\", \"--prefix\", prefix, \"--no-audit\", \"--no-fund\", \"--ignore-scripts\", spec];\n if (registry) args.push(\"--registry\", registry);\n try {\n await execa(\"npm\", args, { timeout: 300000 });\n return;\n } catch (error) {\n lastError = error;\n if (force || !isCannbotInstallerReady()) {\n // keep trying mirrors only when we have nothing cached yet\n continue;\n }\n break;\n }\n }\n if (isCannbotInstallerReady() && !force) {\n // refresh failed but a cached copy exists — degrade to the cache\n logger.warn(t(\"cannbot_installer_refresh_failed\"));\n return;\n }\n throw lastError instanceof Error\n ? lastError\n : new Error(t(\"error_unknown\"));\n}\n\n/**\n * Ensures the cannbot installer package is available. Returns the package\n * root. Throws when the package cannot be installed and no cache exists.\n */\nexport async function ensureCannbotInstaller(options?: { force?: boolean }): Promise<string> {\n const config = loadCannbotInstallerConfig();\n const packageRoot = getCannbotPackageRoot();\n\n // Explicit override: trust it as-is (offline/test escape hatch). Never\n // npm-install into it.\n if (process.env.CANNBOT_INSTALLER_PATH) {\n if (!isCannbotInstallerReady()) {\n throw new Error(\n t(\"cannbot_installer_path_invalid\").replace(\"{path}\", process.env.CANNBOT_INSTALLER_PATH)\n );\n }\n return packageRoot;\n }\n\n const ready = isCannbotInstallerReady();\n\n if (!ready || options?.force) {\n await npmInstallInstaller(config, options?.force || !ready);\n writeState({\n version: getCannbotInstallerVersion() || \"unknown\",\n channel: config.channel,\n installedAt: Date.now(),\n });\n return packageRoot;\n }\n\n const state = readState();\n const ttlMs = config.ttlHours * 60 * 60 * 1000;\n if (!state || Date.now() - state.installedAt > ttlMs) {\n try {\n await npmInstallInstaller(config, false);\n writeState({\n version: getCannbotInstallerVersion() || \"unknown\",\n channel: config.channel,\n installedAt: Date.now(),\n });\n } catch {\n // already handled inside npmInstallInstaller (cache fallback / throw)\n }\n }\n\n return packageRoot;\n}\n\nfunction readManifest(pluginDir: string): CannbotPluginManifest | null {\n try {\n return JSON.parse(readFileSync(join(pluginDir, \".claude-plugin\", \"plugin.json\"), \"utf-8\"));\n } catch {\n return null;\n }\n}\n\n/**\n * Discovers cannbot-style plugins bundled inside the managed installer\n * package. Layouts probed (in order):\n * - dist/plugins — npm package layout (assemble output; stable\n * across the upstream plugins-official rename)\n * - dist/plugins-official — defensive: future npm layout change\n * - plugins / plugins-official — repository checkout layouts, for\n * CANNBOT_INSTALLER_PATH pointing at a cannbot\n * repo clone (pre/post the e140ca6 rename)\n * The npm package is self-contained: skills are copied into dist at pack\n * time, so no cannbot repository checkout or vendor/cannbot-skills\n * submodule is needed. Returns [] when the installer package is not\n * available (graceful degradation for offline environments).\n */\nexport function discoverCannbotPlugins(): CannbotPluginEntry[] {\n if (!isCannbotInstallerReady()) {\n return [];\n }\n\n const packageRoot = getCannbotPackageRoot();\n const entries: CannbotPluginEntry[] = [];\n const parents = [\n join(packageRoot, \"dist\", \"plugins\"),\n join(packageRoot, \"dist\", \"plugins-official\"),\n join(packageRoot, \"plugins\"),\n join(packageRoot, \"plugins-official\"),\n ];\n\n for (const parent of parents) {\n if (!existsSync(parent)) continue;\n let names: string[] = [];\n try {\n names = readdirSync(parent);\n } catch {\n continue;\n }\n for (const name of names) {\n const pluginDir = join(parent, name);\n const manifest = readManifest(pluginDir);\n if (!manifest || typeof manifest.name !== \"string\") continue;\n if (entries.some((e) => e.id === manifest.name)) continue;\n entries.push({\n id: manifest.name,\n version: manifest.version || \"\",\n description: manifest.description || \"\",\n skillsCount: Array.isArray(manifest.skills) ? manifest.skills.length : 0,\n agentsCount: Array.isArray(manifest.agents) ? manifest.agents.length : 0,\n dir: join(parent, name),\n });\n }\n }\n\n return entries;\n}\n\n/**\n * Bootstrap for the dual-source registry: ensures the managed installer\n * (best effort, never throws — offline environments degrade to the legacy\n * source only) and merges cannbot plugin entries into the plugin registry\n * so findPlugin resolves them with cannbot-first precedence.\n */\nexport async function ensureCannbotDiscovery(): Promise<boolean> {\n try {\n await ensureCannbotInstaller();\n } catch {\n return false;\n }\n\n const entries = discoverCannbotPlugins();\n const { setCannbotPlugins } = await import(\"./registry.js\");\n setCannbotPlugins(\n entries.map((entry) => ({\n id: entry.id,\n dir: entry.dir,\n displayName: entry.id,\n script: \"cannbot\",\n aliases: [],\n skills: entry.skillsCount,\n agents: entry.agentsCount,\n description: entry.description,\n version: entry.version,\n source: \"cannbot\" as const,\n }))\n );\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\n// Adapter for the cannbot installer's own install registry\n// (<configDir>/cannbot-plugin.json, schemaVersion 2). install-helper reads\n// it to implement list/status and a full uninstall for cannbot-style\n// plugins (the upstream CLI only ships `install`). The registry file is the\n// source of truth for cannbot-type installs — records written directly by\n// the cannbot CLI (no install-helper delegated record) are handled the same\n// way.\n\nimport { existsSync, readFileSync, readdirSync, rmSync, rmdirSync, unlinkSync, lstatSync, writeFileSync } from \"fs\";\nimport { join, resolve, sep, dirname } from \"path\";\nimport type { CannbotInstalledEntry, CannbotRegistryFile, CannbotRegistryRecord } from \"../types/index.js\";\nimport { deleteRecord, readRecords } from \"./record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\n\n// Mirror of cannbot installer TOOL_DIRECTORIES (script/bin/cannbot.js) for\n// the tools install-helper delegates to. configDirs are probed in order; the\n// first existing one wins, falling back to defaultConfigDir.\nexport const CANNBOT_TOOL_LAYOUTS: Record<string, { configDirs: string[]; defaultConfigDir: string }> = {\n opencode: { configDirs: [\".opencode\"], defaultConfigDir: \".opencode\" },\n codex: { configDirs: [\".codex\"], defaultConfigDir: \".codex\" },\n claude: { configDirs: [\".claude\"], defaultConfigDir: \".claude\" },\n trae: { configDirs: [\".traecli\", \".marscode\", \".trae\", \".trae-cn\"], defaultConfigDir: \".trae\" },\n};\n\nexport const CANNBOT_SUPPORTED_TOOLS = Object.keys(CANNBOT_TOOL_LAYOUTS);\n\nexport const CANNBOT_REGISTRY_SCHEMA_VERSION = 2;\nconst REGISTRY_FILE_NAME = \"cannbot-plugin.json\";\n\nfunction toolConfigDir(target: string, tool: string): string {\n const layout = CANNBOT_TOOL_LAYOUTS[tool];\n if (!layout) return join(target, `.${tool}`);\n return layout.configDirs\n .map((name) => join(target, name))\n .find((path) => existsSync(path)) ?? join(target, layout.defaultConfigDir);\n}\n\nexport function findCannbotRegistryPath(target: string, tool: string): string | null {\n const configDir = toolConfigDir(target, tool);\n const registryPath = join(configDir, REGISTRY_FILE_NAME);\n return existsSync(registryPath) ? registryPath : null;\n}\n\nexport interface CannbotRegistryReadResult {\n registryPath: string;\n registry: CannbotRegistryFile;\n schemaSupported: boolean;\n}\n\nexport function readCannbotRegistry(target: string, tool: string): CannbotRegistryReadResult | null {\n const registryPath = findCannbotRegistryPath(target, tool);\n if (!registryPath) return null;\n\n let registry: CannbotRegistryFile;\n try {\n registry = JSON.parse(readFileSync(registryPath, \"utf-8\")) as CannbotRegistryFile;\n } catch {\n logger.warn(t(\"cannbot_registry_corrupted\").replace(\"{file}\", registryPath));\n return null;\n }\n\n if (typeof registry.schemaVersion !== \"number\" || !Array.isArray(registry.plugins)) {\n logger.warn(t(\"cannbot_registry_corrupted\").replace(\"{file}\", registryPath));\n return null;\n }\n\n return {\n registryPath,\n registry,\n schemaSupported: registry.schemaVersion === CANNBOT_REGISTRY_SCHEMA_VERSION,\n };\n}\n\nfunction toInstalledEntry(target: string, registryPath: string, record: CannbotRegistryRecord): CannbotInstalledEntry {\n return {\n id: record.plugin,\n version: record.pluginVersion || \"\",\n tool: record.tool,\n target,\n registryPath,\n skillsCount: Array.isArray(record.skills) ? record.skills.length : 0,\n agentsCount: Array.isArray(record.agents) ? record.agents.length : 0,\n record,\n };\n}\n\n/**\n * Scans for cannbot-style installs. cannbot plugins are project-level only,\n * so only `target` (defaults to cwd) is scanned across the supported tools.\n */\nexport function scanCannbotInstalled(target?: string): CannbotInstalledEntry[] {\n const root = resolve(target || process.cwd());\n const installed: CannbotInstalledEntry[] = [];\n\n for (const tool of CANNBOT_SUPPORTED_TOOLS) {\n const result = readCannbotRegistry(root, tool);\n if (!result) continue;\n for (const record of result.registry.plugins) {\n if (!record?.plugin) continue;\n installed.push(toInstalledEntry(root, result.registryPath, record));\n }\n }\n\n return installed;\n}\n\nexport function findCannbotRecord(pluginId: string, target?: string): CannbotInstalledEntry | null {\n const entries = scanCannbotInstalled(target);\n return entries.find((e) => e.id === pluginId) || null;\n}\n\nexport function removeMarkerBlock(content: string, pluginName: string): string {\n const start = `<!-- cannbot:${pluginName}:start -->`;\n const end = `<!-- cannbot:${pluginName}:end -->`;\n const pattern = new RegExp(\n `${start.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\n?[\\\\s\\\\S]*?${end.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\n?`,\n \"g\"\n );\n return content.replace(pattern, \"\");\n}\n\nexport function countMarkerBlocks(content: string, pluginName: string): number {\n const start = `<!-- cannbot:${pluginName}:start -->`;\n return content.split(start).length - 1;\n}\n\n// --- uninstall ---\n\nexport interface CannbotUninstallResult {\n success: boolean;\n pluginId: string;\n removedFiles: number;\n removedDirs: number;\n errors: string[];\n}\n\nfunction removeIfSafe(pathToRemove: string, allowedBase: string): \"removed\" | \"missing\" | \"skipped\" {\n const resolved = resolve(pathToRemove);\n if (resolved !== allowedBase && !resolved.startsWith(allowedBase + sep)) {\n return \"skipped\";\n }\n try {\n const stat = lstatSync(resolved);\n if (stat.isDirectory()) {\n rmSync(resolved, { recursive: true, force: true });\n } else {\n unlinkSync(resolved);\n }\n return \"removed\";\n } catch {\n return \"missing\";\n }\n}\n\nfunction removeEmptyDirUpward(dirPath: string, stopAt: string): boolean {\n let current = resolve(dirPath);\n const stop = resolve(stopAt);\n let removedAny = false;\n while (current.startsWith(stop + sep)) {\n try {\n const entries = readdirSync(current);\n if (entries.length > 0) break;\n rmdirSync(current);\n removedAny = true;\n } catch {\n break;\n }\n current = dirname(current);\n }\n return removedAny;\n}\n\nfunction cleanHookSettings(hookSettingsPath: string, target: string, pluginId: string): void {\n // Remove hook entries that point into .cannbot/plugins/<pluginId>/ so a\n // shared settings.json (e.g. .claude/settings.json) keeps serving other\n // plugins. Best effort — malformed files are left untouched.\n const resolved = resolve(target, hookSettingsPath);\n if (!existsSync(resolved)) return;\n let settings: Record<string, unknown>;\n try {\n settings = JSON.parse(readFileSync(resolved, \"utf-8\"));\n } catch {\n return;\n }\n if (!settings || typeof settings !== \"object\" || !settings.hooks) return;\n\n const pluginRootFragment = `.cannbot/plugins/${pluginId}`;\n const cleanHooks = (hooks: unknown): unknown => {\n if (Array.isArray(hooks)) {\n return hooks.filter((entry) => !JSON.stringify(entry).includes(pluginRootFragment));\n }\n if (hooks && typeof hooks === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(hooks as Record<string, unknown>)) {\n const cleaned = cleanHooks(value);\n if (Array.isArray(cleaned) ? cleaned.length > 0 : cleaned !== undefined) {\n result[key] = cleaned;\n }\n }\n return result;\n }\n return hooks;\n };\n\n try {\n const cleaned = cleanHooks(settings.hooks);\n if (Array.isArray(cleaned) ? cleaned.length === 0 : Object.keys(cleaned as object).length === 0) {\n delete settings.hooks;\n } else {\n settings.hooks = cleaned;\n }\n writeFileSync(resolved, `${JSON.stringify(settings, null, 2)}\\n`);\n } catch {\n // leave the file untouched on failure\n }\n}\n\nfunction cleanCodexNativePlugin(record: CannbotRegistryRecord, pluginId: string): void {\n const native = record.nativePlugin;\n if (!native || typeof native !== \"object\") return;\n\n if (native.pluginRoot) {\n try {\n rmSync(native.pluginRoot, { recursive: true, force: true });\n logger.step(` ${t(\"uninstall_remove_label\")}: ${native.pluginRoot}`);\n } catch {\n // best effort\n }\n }\n\n if (native.marketplacePath && existsSync(native.marketplacePath)) {\n try {\n const marketplace = JSON.parse(readFileSync(native.marketplacePath, \"utf-8\"));\n if (Array.isArray(marketplace?.plugins)) {\n marketplace.plugins = marketplace.plugins.filter(\n (p: { name?: string }) => !(p && (p.name === pluginId || p.name === native.marketplaceName))\n );\n if (marketplace.plugins.length === 0) {\n unlinkSync(native.marketplacePath);\n } else {\n writeFileSync(native.marketplacePath, `${JSON.stringify(marketplace, null, 2)}\\n`);\n }\n }\n } catch {\n // best effort\n }\n }\n}\n\n/**\n * The upstream installer registers its npm plugin with the opencode CLI\n * (`opencode plugin @cannbot-plugin/cannbot@<version>`), which writes the\n * spec into <target>/.opencode/opencode.json. Strip that entry so uninstall\n * leaves no residue; the file is removed once nothing remains in it. Only\n * called when no sibling cannbot plugin still needs the registration.\n */\nfunction cleanOpenCodePluginRegistration(root: string): void {\n const configPath = join(root, \".opencode\", \"opencode.json\");\n if (!existsSync(configPath)) return;\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {\n return;\n }\n if (!Array.isArray(config.plugin)) return;\n\n const CLEAN_PACKAGE_PREFIX = \"@cannbot-plugin/cannbot\";\n config.plugin = config.plugin.filter(\n (entry) => !(typeof entry === \"string\" && entry.startsWith(CLEAN_PACKAGE_PREFIX))\n );\n\n try {\n if (Array.isArray(config.plugin) && config.plugin.length === 0) {\n delete config.plugin;\n }\n if (Object.keys(config).length === 0) {\n unlinkSync(configPath);\n removeOpenCodePluginGitignore(dirname(configPath));\n } else {\n writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n }\n } catch {\n // leave the file untouched on failure\n }\n}\n\n/**\n * `opencode plugin add` also drops a generic .gitignore next to the\n * registration (node_modules/package.json/bun.lock/...). Remove it together\n * with the registration, but only when its content matches the opencode\n * plugin signature so user-authored files are never touched.\n */\nfunction removeOpenCodePluginGitignore(configDir: string): void {\n const gitignorePath = join(configDir, \".gitignore\");\n if (!existsSync(gitignorePath)) return;\n try {\n const content = readFileSync(gitignorePath, \"utf-8\");\n if (content.includes(\"bun.lock\") && content.includes(\"node_modules\")) {\n unlinkSync(gitignorePath);\n }\n } catch {\n // best effort\n }\n}\n\n/**\n * Full uninstall of a cannbot-style plugin driven by its registry record.\n * Steps: remove skills/agents, strip the AGENTS.md/CLAUDE.md marker block,\n * remove .cannbot/plugins/<id> assets, shared permissions/settings only when\n * no other cannbot plugin still references them, dependency clones, the\n * codex native plugin, then update the registry itself.\n */\nexport function uninstallCannbotPlugin(pluginId: string, target?: string): CannbotUninstallResult {\n const result: CannbotUninstallResult = {\n success: false,\n pluginId,\n removedFiles: 0,\n removedDirs: 0,\n errors: [],\n };\n\n const root = resolve(target || process.cwd());\n let read: CannbotRegistryReadResult | null = null;\n let record: CannbotRegistryRecord | undefined;\n\n for (const tool of CANNBOT_SUPPORTED_TOOLS) {\n const candidate = readCannbotRegistry(root, tool);\n if (!candidate) continue;\n const found = candidate.registry.plugins.find((r) => r?.plugin === pluginId);\n if (found) {\n read = candidate;\n record = found;\n break;\n }\n }\n\n if (!read || !record) {\n result.errors.push(t(\"cannbot_uninstall_no_record\"));\n return result;\n }\n\n if (!read.schemaSupported) {\n result.errors.push(\n t(\"cannbot_registry_schema_unsupported\").replace(\"{version}\", String(read.registry.schemaVersion))\n );\n return result;\n }\n\n const registryPath = read.registryPath;\n const allowedBase = root;\n\n // 1. skills + agents (record paths are target-relative)\n for (const relPath of [...(record.skills || []), ...(record.agents || [])]) {\n const absolute = join(root, relPath);\n if (removeIfSafe(absolute, allowedBase) === \"removed\") {\n result.removedFiles++;\n removeEmptyDirUpward(dirname(absolute), allowedBase);\n }\n }\n\n // 2. instructions marker block (keep the file for other plugins)\n if (record.instructions) {\n const instructionsPath = join(root, record.instructions);\n const resolved = resolve(instructionsPath);\n if (resolved.startsWith(allowedBase + sep) && existsSync(resolved)) {\n try {\n const content = readFileSync(resolved, \"utf-8\");\n const cleaned = removeMarkerBlock(content, pluginId);\n if (cleaned.trim().length === 0) {\n unlinkSync(resolved);\n result.removedFiles++;\n } else if (cleaned !== content) {\n writeFileSync(resolved, cleaned);\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : t(\"error_unknown\"));\n }\n }\n }\n\n // 3. plugin assets (.cannbot/plugins/<id>)\n if (record.assets) {\n if (removeIfSafe(join(root, record.assets), allowedBase) === \"removed\") {\n result.removedDirs++;\n removeEmptyDirUpward(join(root, \".cannbot\", \"plugins\"), allowedBase);\n }\n }\n\n // 4. shared runtime paths — remove only when no sibling plugin uses them\n const siblings = scanCannbotInstalled(root)\n .map((e) => e.record)\n .filter((r) => r.plugin !== pluginId);\n const siblingUses = (rel: string | null) =>\n siblings.some((r) => [r.permissions, r.settings, r.hookSettings].filter(Boolean).includes(rel as string));\n\n if (record.permissions && !siblingUses(record.permissions)) {\n if (removeIfSafe(join(root, record.permissions), allowedBase) === \"removed\") {\n result.removedDirs++;\n }\n }\n if (record.settings && !siblingUses(record.settings)) {\n if (removeIfSafe(join(root, record.settings), allowedBase) === \"removed\") {\n result.removedFiles++;\n }\n }\n\n // 5. hook settings: surgical removal of this plugin's hook entries\n if (record.hookSettings) {\n cleanHookSettings(record.hookSettings, root, pluginId);\n }\n\n // 6. dependency clones (.cannbot/dependencies/<id>/...)\n for (const relDep of record.dependencies || []) {\n if (removeIfSafe(join(root, relDep), allowedBase) === \"removed\") {\n result.removedDirs++;\n }\n }\n if ((record.dependencies || []).length > 0) {\n removeEmptyDirUpward(join(root, \".cannbot\", \"dependencies\", pluginId), allowedBase);\n }\n\n // 7. codex native plugin (~/plugins/<id> + marketplace registration)\n cleanCodexNativePlugin(record, pluginId);\n if (record.nativePlugin && typeof record.nativePlugin === \"object\" && record.nativePlugin.package) {\n logger.warn(t(\"cannbot_uninstall_native_hint\").replace(\"{spec}\", String(record.nativePlugin.package)));\n }\n // opencode native plugin registration (opencode.json) — strip it only when\n // the last cannbot plugin for this target is being removed\n if (record.tool === \"opencode\" && siblings.length === 0) {\n cleanOpenCodePluginRegistration(root);\n }\n\n // 8. update the registry itself\n try {\n const registry = JSON.parse(readFileSync(registryPath, \"utf-8\")) as CannbotRegistryFile;\n registry.plugins = registry.plugins.filter((r) => r?.plugin !== pluginId);\n if (registry.plugins.length === 0) {\n unlinkSync(registryPath);\n removeEmptyDirUpward(dirname(registryPath), allowedBase);\n } else {\n writeFileSync(registryPath, `${JSON.stringify(registry, null, 2)}\\n`);\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : t(\"error_unknown\"));\n }\n\n // 8b. clean layout roots the cannbot installer created but that carry no\n // recorded entries (e.g. an empty agents/ dir for a 0-agent plugin)\n if (CANNBOT_TOOL_LAYOUTS[record.tool]) {\n const configDir = dirname(registryPath);\n const layoutRoots = [join(configDir, \"agents\"), join(configDir, \"skills\")];\n if (record.tool === \"opencode\" || record.tool === \"codex\") {\n // opencode/codex share the .agents/skills root\n layoutRoots.push(join(root, \".agents\", \"skills\"), join(root, \".agents\"));\n }\n for (const dirPath of layoutRoots) {\n if (removeEmptyDirUpward(dirPath, allowedBase)) {\n result.removedDirs++;\n }\n }\n }\n\n // 9. install-helper side bookkeeping\n deleteRecord(pluginId);\n removeInstalledPlugin(pluginId);\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Consistency check for doctor: delegated records in\n * ~/.cannbot/installs/<id>.json whose cannbot registry entry has vanished.\n * Each location record is checked against the registry at its own\n * install path (a record for another project is not an orphan just because\n * the current project's registry lacks it).\n */\nexport function findOrphanedDelegatedRecords(target?: string): string[] {\n const orphans: string[] = [];\n\n const installsDir = join(getCannbotConfigDir(), \"installs\");\n if (!existsSync(installsDir)) return orphans;\n\n for (const file of readdirSync(installsDir)) {\n if (!file.endsWith(\".json\") || file === \"skills.json\") continue;\n const pluginId = file.replace(/\\.json$/, \"\");\n try {\n // readRecords transparently handles both the v2 location-keyed store\n // and the v1 single-record format\n const records = readRecords(pluginId);\n const delegated = records.filter((r) => r?.kind === \"delegated\");\n if (delegated.length === 0) continue;\n\n const isOrphan = delegated.some((rec) => {\n // Records without an install path (legacy fixtures) fall back to the\n // passed target, mirroring the pre-location behavior.\n const recTarget = rec.installPath || target;\n const installedThere = new Set(scanCannbotInstalled(recTarget).map((e) => e.id));\n return !installedThere.has(pluginId);\n });\n if (isOrphan) {\n orphans.push(pluginId);\n }\n } catch {\n // ignore malformed records\n }\n }\n return orphans;\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, resolve } from \"path\";\nimport { getCannbotConfigDir, getSkillsRoot } 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, BackupRecordEntry } 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 /** \"delegated\" = installed via the cannbot installer (@cannbot-plugin/cannbot);\n * absent/legacy = installed by install-helper itself. */\n kind?: \"legacy\" | \"delegated\";\n /** Legacy single-backup field (pre multi-target backups). Kept for\n * reading old records; new installs populate `backups` instead. */\n backup?: {\n filePath: string;\n fromPluginId: string;\n fromPluginName: string;\n backupTime: string;\n };\n /** Backups created during this install, one per replaced configuration\n * file. `originalPath` is the restore target so uninstall can return\n * project-level files to their original locations. */\n backups?: BackupRecordEntry[];\n /** Configuration paths the user chose to keep (never replaced by this\n * install). Recorded so uninstall never removes them even though they\n * sit where the plugin's own config file would live. */\n preservedTargets?: string[];\n}\n\n/** Location dimensions of an install: the same plugin can be installed at\n * several locations (different projects, tools or levels) simultaneously —\n * each keeps its own record so a later install elsewhere never clobbers the\n * bookkeeping of an earlier one (uninstall would otherwise delete the wrong\n * location's files). */\nexport interface RecordLocation {\n tool: AITool;\n level: InstallLevel;\n installPath: string;\n}\n\ninterface RecordStore {\n version: 2;\n /** key: `${tool}:${level}:${resolved installPath}` */\n locations: Record<string, InstallRecord>;\n}\n\nconst LEGACY_LOCATION_KEY = \"__legacy__\";\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\nfunction locationKey(loc: RecordLocation): string {\n return `${loc.tool}:${loc.level}:${resolve(loc.installPath)}`;\n}\n\n/** Reads the record file, migrating the v1 single-record format (a plain\n * InstallRecord object) to the v2 location-keyed store in memory. */\nfunction readStore(pluginId: string): RecordStore | null {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(recordPath, \"utf-8\"));\n } catch {\n logger.warn(t(\"record_corrupted\").replace(\"{file}\", recordPath));\n return null;\n }\n\n const store = parsed as Partial<RecordStore> & Partial<InstallRecord>;\n if (store && typeof store === \"object\" && \"locations\" in store && store.locations) {\n return { version: 2, locations: store.locations as Record<string, InstallRecord> };\n }\n\n // v1: a single InstallRecord object\n const legacy = parsed as InstallRecord;\n if (legacy && typeof legacy === \"object\" && typeof legacy.pluginId === \"string\") {\n const key =\n legacy.tool && legacy.level && legacy.installPath\n ? locationKey(legacy)\n : LEGACY_LOCATION_KEY;\n return { version: 2, locations: { [key]: legacy } };\n }\n\n logger.warn(t(\"record_corrupted\").replace(\"{file}\", recordPath));\n return null;\n}\n\nfunction writeStore(pluginId: string, store: RecordStore): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n atomicWriteFileSync(getRecordPath(pluginId), JSON.stringify(store, null, 2));\n}\n\n/** All location records for a plugin (any tool / level / install path). */\nexport function readRecords(pluginId: string): InstallRecord[] {\n const store = readStore(pluginId);\n return store ? Object.values(store.locations) : [];\n}\n\nconst byLatest = (a: InstallRecord, b: InstallRecord) =>\n (b.installTime || \"\").localeCompare(a.installTime || \"\");\n\n/**\n * The record uninstall/install flows should act on, preferring the one that\n * matches the current working directory:\n * 1. project-level record whose installPath is the cwd (latest first)\n * 2. global-level record (latest first)\n * 3. latest record overall (legacy compatibility: acts on the recorded\n * location even when run from an unrelated directory)\n */\nexport function readRecord(pluginId: string): InstallRecord | null {\n const records = readRecords(pluginId);\n if (records.length === 0) {\n return null;\n }\n\n const cwd = resolve(process.cwd());\n const localMatch = records\n .filter((r) => r.level === \"project\" && resolve(r.installPath) === cwd)\n .sort(byLatest);\n if (localMatch.length > 0) return localMatch[0];\n\n const globalMatch = records.filter((r) => r.level === \"global\").sort(byLatest);\n if (globalMatch.length > 0) return globalMatch[0];\n\n return [...records].sort(byLatest)[0];\n}\n\nexport function writeRecord(record: InstallRecord): void {\n const store = readStore(record.pluginId) ?? { version: 2, locations: {} };\n store.locations[locationKey(record)] = record;\n writeStore(record.pluginId, store);\n}\n\n/**\n * Removes record locations. With `where`, only the matching location is\n * removed (the file is pruned when the last location goes away); without it,\n * the whole record file is deleted (legacy whole-plugin semantics).\n */\nexport function deleteRecord(pluginId: string, where?: RecordLocation): void {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return;\n }\n\n if (!where) {\n unlinkSync(recordPath);\n return;\n }\n\n const store = readStore(pluginId);\n if (!store) {\n return;\n }\n delete store.locations[locationKey(where)];\n if (Object.keys(store.locations).length === 0) {\n unlinkSync(recordPath);\n } else {\n writeStore(pluginId, store);\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 preservedTargets?: string[]\n): InstallRecord {\n const files: string[] = [];\n const directories: string[] = [];\n\n if (manifest) {\n const skillsDir = getSkillsRoot(tool, level, installPath);\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 // A preserved (user-kept) file at the config location is NOT owned by this\n // install — recording it would make uninstall delete the user's file.\n if (!preservedTargets?.includes(configFilePath) && (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 &&\n !preservedTargets?.includes(configRootConfigPath) &&\n (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\", \"ops-tensor\"];\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 skillsDir = getSkillsRoot(tool, level);\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 skillsDir = getSkillsRoot(tool, level, installPath);\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, readFileSync, realpathSync } from \"fs\";\nimport { join, basename, isAbsolute } 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, findRecordOwner, isPreservedTarget, UNOWNED_PLUGIN_ID } from \"./backup.js\";\nimport { isSymlink } from \"../utils/fs-helpers.js\";\nimport { showOverwriteWarning, showUnownedFileWarning } from \"../ui/backup-prompts.js\";\nimport { installViaManifest, configFileTargets } 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 function scriptSupportsTool(scriptPath: string, tool: AITool): boolean {\n try {\n const scriptContent = readFileSync(scriptPath, \"utf-8\");\n return new RegExp(`\\\\b${tool}\\\\b`).test(scriptContent);\n } catch {\n // script unreadable — let execa surface the failure\n return true;\n }\n}\n\ninterface TargetOwner {\n kind: \"same-plugin\" | \"other-plugin\" | \"unowned\";\n pluginId: string;\n pluginName: string;\n}\n\n/**\n * Classifies who owns an existing configuration file that installation is\n * about to replace:\n * - \"same-plugin\": the file is this plugin's own (reinstall) — no prompt;\n * - \"other-plugin\": a recorded/manifested install of another plugin;\n * - \"unowned\": a user-maintained or unknown-origin file — must be confirmed\n * by the user before it is replaced.\n */\nfunction classifyConfigTarget(\n targetPath: string,\n pluginConfigSource: string,\n pluginId: string,\n pluginName: string,\n configRoot: string,\n tool: AITool,\n installPath: string\n): TargetOwner {\n // A symlink pointing at this plugin's own source file: reinstall.\n if (isSymlink(targetPath)) {\n try {\n if (realpathSync(targetPath) === realpathSync(pluginConfigSource)) {\n return { kind: \"same-plugin\", pluginId, pluginName };\n }\n } catch {\n // dangling/unreadable link — fall through to the record lookup\n }\n }\n\n // A previous install explicitly preserved this file for the user — it is\n // user-maintained, not plugin-owned (its record keeps it out of `files`),\n // so it must be re-confirmed instead of silently replaced by a reinstall\n // that otherwise looks like \"same-plugin\" via the leftover manifest.\n if (isPreservedTarget(targetPath)) {\n return { kind: \"unowned\", pluginId: UNOWNED_PLUGIN_ID, pluginName: UNOWNED_PLUGIN_ID };\n }\n\n // A recorded install owns the target (covers project-root files too).\n const recordOwner = findRecordOwner(targetPath);\n if (recordOwner) {\n return recordOwner.pluginId === pluginId\n ? { kind: \"same-plugin\", pluginId, pluginName }\n : { kind: \"other-plugin\", ...recordOwner };\n }\n\n // Config-root manifests: the legacy ownership signal.\n const currentPlugin = detectCurrentPlugin(configRoot, tool, installPath);\n if (currentPlugin) {\n return currentPlugin.pluginId === pluginId\n ? { kind: \"same-plugin\", pluginId, pluginName }\n : { kind: \"other-plugin\", ...currentPlugin };\n }\n\n return { kind: \"unowned\", pluginId: UNOWNED_PLUGIN_ID, pluginName: UNOWNED_PLUGIN_ID };\n}\n\nexport async function installPlugin(\n opts: InstallOptions\n): Promise<InstallResult> {\n // Prefer the caller-resolved entry (installPluginRouted passes the entry\n // it routed on — source-scoped). Re-resolving by bare id here would apply\n // cannbot-first precedence to a legacy-routed install of a same-name\n // plugin, silently swapping in the cannbot entry whose absolute dir and\n // sentinel script violate this script-installer's contract.\n const plugin = opts.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 // Guard: cannbot-source entries must go through installPluginRouted\n // delegation, never the legacy script path. Reached only via internal\n // routing errors — refuse with a clear message instead of a bogus\n // double-joined script path.\n if (plugin.source === \"cannbot\") {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_cannbot_requires_delegation\").replace(\"{plugin}\", plugin.displayName)],\n warnings: [],\n };\n }\n\n // Legacy entries carry repo-relative dirs; cannbot discovery entries are\n // absolute (managed installer package) and must never be joined onto repoPath.\n const pluginDir = isAbsolute(plugin.dir) ? plugin.dir : join(opts.repoPath, plugin.dir);\n const cwd = opts.installPath || process.cwd();\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n\n // --- Multi-target preflight: every configuration file this install will\n // replace is detected, confirmed and backed up before anything is touched.\n // At project level that includes the project-root instructions file, which\n // used to be replaced silently (no prompt, no backup) whenever the tool\n // config root held no previous install.\n const pluginConfigSource = join(pluginDir, plugin.configFile || \"AGENTS.md\");\n const existingTargets = configFileTargets(\n pluginDir,\n plugin.configFile || \"AGENTS.md\",\n opts.tool,\n opts.level,\n configRoot,\n cwd,\n plugin.configRootConfigLink\n ).filter((p) => existsSync(p) || isSymlink(p));\n\n const backups: BackupInfo[] = [];\n // Targets the user chose to keep (or that --yes preserves) — passed to the\n // manifest installer so it skips them. Legacy init.sh scripts cannot honor\n // this list (see issue #372); for them the preflight backup above is the\n // recovery path.\n const preservedTargets: string[] = [];\n const promptedPlugins = new Set<string>();\n\n for (const target of existingTargets) {\n const owner = classifyConfigTarget(\n target,\n pluginConfigSource,\n opts.pluginId,\n plugin.displayName,\n configRoot,\n opts.tool,\n cwd\n );\n\n if (owner.kind === \"same-plugin\") {\n // Reinstall of the same plugin: content identical, keep the safety\n // backup but never prompt (historical behavior).\n const backup = createBackup(target, owner.pluginId, owner.pluginName);\n if (backup) backups.push(backup);\n continue;\n }\n\n if (owner.kind === \"other-plugin\") {\n if (!promptedPlugins.has(owner.pluginId)) {\n promptedPlugins.add(owner.pluginId);\n let choice: \"overwrite\" | \"cancel\" = \"overwrite\";\n\n if (!opts.yes) {\n choice = await showOverwriteWarning(owner.pluginName, plugin.displayName);\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 const backup = createBackup(target, owner.pluginId, owner.pluginName);\n if (!backup) {\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 backups.push(backup);\n logger.success(`${t(\"backup_created\")}: ${backup.filePath}`);\n continue;\n }\n\n // Unowned file: user-maintained or unknown origin.\n if (opts.yes) {\n // Non-interactive: no explicit user confirmation exists — preserve it.\n preservedTargets.push(target);\n logger.warn(t(\"unowned_preserved_yes\").replace(\"{file}\", target));\n continue;\n }\n\n const choice = await showUnownedFileWarning(target, plugin.displayName);\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 if (choice === \"keep\") {\n preservedTargets.push(target);\n logger.info(t(\"unowned_preserved\").replace(\"{file}\", target));\n continue;\n }\n\n const backup = createBackup(target, UNOWNED_PLUGIN_ID, t(\"unowned_backup_label\"));\n if (!backup) {\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 backups.push(backup);\n logger.success(`${t(\"backup_created\")}: ${backup.filePath}`);\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 preservedTargets\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 preservedTargets\n );\n\n if (backups.length > 0) {\n record.backups = backups.map((b) => ({\n filePath: b.filePath,\n originalPath: b.originalPath,\n fromPluginId: b.pluginId,\n fromPluginName: b.pluginName,\n backupTime: b.backupTime,\n }));\n }\n if (preservedTargets.length > 0) {\n record.preservedTargets = [...preservedTargets];\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 // Guard: the plugin's init.sh must actually support the target tool.\n // Scripts that predate a tool (e.g. most community init.sh without codex)\n // silently ignore the unknown arg and would mis-install into default\n // .opencode directories — block that with an explicit error.\n if (!scriptSupportsTool(scriptPath, opts.tool)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"error_tool_not_supported\").replace(\"{plugin}\", plugin.displayName).replace(\"{tool}\", opts.tool)],\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 preservedTargets\n );\n\n if (backups.length > 0) {\n record.backups = backups.map((b) => ({\n filePath: b.filePath,\n originalPath: b.originalPath,\n fromPluginId: b.pluginId,\n fromPluginName: b.pluginName,\n backupTime: b.backupTime,\n }));\n }\n if (preservedTargets.length > 0) {\n record.preservedTargets = [...preservedTargets];\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, copyFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join, dirname, basename, resolve } from \"path\";\nimport type { AITool, BackupInfo } from \"../types/index.js\";\nimport { readAllManifests } from \"./manifest.js\";\nimport { readRecords } from \"./record.js\";\nimport { findPlugin } from \"./registry.js\";\nimport { getAgentsFileName, getCannbotConfigDir } from \"../utils/paths.js\";\n\nexport { getAgentsFileName };\n\n/** Backup owner id used when the replaced file has no known plugin owner\n * (a user-maintained configuration file). */\nexport const UNOWNED_PLUGIN_ID = \"unowned\";\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\n/**\n * Creates a backup of `targetPath` beside the file itself, so a replaced\n * configuration file (including a project-root AGENTS.md that lives outside\n * the tool config root) always keeps a recoverable copy next to its original\n * location. Returns null when the file does not exist.\n */\nexport function createBackup(\n targetPath: string,\n fromPluginId: string,\n fromPluginName: string\n): BackupInfo | null {\n if (!existsSync(targetPath)) {\n return null;\n }\n\n const timestamp = formatTimestamp(new Date());\n const backupFileName = `${basename(targetPath)}.cannbot-backup.${fromPluginId}.${timestamp}`;\n const backupPath = join(dirname(targetPath), backupFileName);\n\n try {\n copyFileSync(targetPath, backupPath);\n return {\n filePath: backupPath,\n originalPath: targetPath,\n pluginId: fromPluginId,\n pluginName: fromPluginName,\n backupTime: timestamp,\n };\n } catch {\n return null;\n }\n}\n\n/** Finds the plugin whose install record owns `targetPath` (its recorded\n * files list contains the path), if any. Works for both config-root and\n * project-root configuration files. */\nexport function findRecordOwner(\n targetPath: string\n): { pluginId: string; pluginName: string } | null {\n const resolved = resolve(targetPath);\n for (const record of readAllRecords()) {\n if ((record.files || []).some((f: string) => resolve(f) === resolved)) {\n const plugin = findPlugin(record.pluginId);\n return {\n pluginId: record.pluginId,\n pluginName: plugin?.displayName || record.displayName || record.pluginId,\n };\n }\n }\n return null;\n}\n\n/** True when a previous install explicitly preserved `targetPath` for the\n * user (recorded in `preservedTargets` and deliberately kept out of the\n * record's owned files). Such a file is user-maintained: it must be\n * re-confirmed before any install replaces it — including reinstalls of the\n * plugin that preserved it, whose leftover manifest would otherwise make\n * the file look \"same-plugin\" owned. */\nexport function isPreservedTarget(targetPath: string): boolean {\n const resolved = resolve(targetPath);\n return readAllRecords().some((record) =>\n (record.preservedTargets || []).some((p: string) => resolve(p) === resolved)\n );\n}\n\n/**\n * Scans one or more directories for `*.cannbot-backup.*` files. The restore\n * target (`originalPath`) is derived from the backup file name, so backups\n * created beside project-root files restore to the project root, not to the\n * tool config root.\n */\nexport function findBackups(configRoot: string | string[]): BackupInfo[] {\n const dirs = Array.isArray(configRoot) ? configRoot : [configRoot];\n const backups: BackupInfo[] = [];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n continue;\n }\n\n const files = readdirSync(dir);\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(dir, file),\n originalPath: join(dir, parts[0]),\n pluginId,\n pluginName: plugin?.displayName || pluginId,\n backupTime: timestamp,\n });\n }\n }\n }\n }\n }\n\n return backups.sort((a, b) => b.backupTime.localeCompare(a.backupTime));\n}\n\n/**\n * Restores a backup file to `targetPath` (the original location recorded\n * when the backup was created).\n */\nexport function restoreBackup(\n backupPath: string,\n targetPath: string\n): boolean {\n try {\n copyFileSync(backupPath, targetPath);\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\n // Scan the installs directory directly (not the plugin registry): records\n // exist for community plugins that are not part of the embedded registry,\n // and ownership detection must see those too.\n const installsDir = join(getCannbotConfigDir(), \"installs\");\n if (!existsSync(installsDir)) {\n return records;\n }\n for (const file of readdirSync(installsDir)) {\n if (!file.endsWith(\".json\") || file === \"skills.json\") continue;\n const pluginId = file.replace(/\\.json$/, \"\");\n records.push(...readRecords(pluginId));\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\n/**\n * Prompt shown before replacing a configuration file that no known plugin\n * owns (typically user-maintained). Defaults to keeping the user's file.\n */\nexport async function showUnownedFileWarning(\n filePath: string,\n newPluginName: string\n): Promise<\"replace\" | \"keep\" | \"cancel\"> {\n console.log();\n console.log(chalk.yellow(` ⚠️ ${t(\"unowned_file_detected\")}`));\n console.log();\n console.log(` ${t(\"unowned_file_path\")}: ${chalk.cyan(filePath)}`);\n console.log(` ${t(\"backup_installing\")}: ${chalk.cyan(newPluginName)}`);\n console.log();\n console.log(` ${t(\"unowned_file_warning\")}`);\n console.log();\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices: [\n { name: t(\"unowned_file_keep\"), value: \"keep\" },\n { name: t(\"unowned_file_replace\"), value: \"replace\" },\n { name: t(\"backup_cancel\"), value: \"cancel\" },\n ],\n });\n\n return choice as \"replace\" | \"keep\" | \"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: b.pluginId === \"unowned\"\n ? `${t(\"backup_restore_user_file\")} ${b.originalPath} (${b.backupTime})`\n : `${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, readFileSync, constants as fsConstants } 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, getSkillsRoot } 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\nconst ISSUE_HANDLER_ID = \"gitcode-issue-handler\";\nconst ISSUE_HANDLER_CONFIG_FILES = [\"classify_config.yaml\", \"operator_owners.yaml\"] as const;\n\nexport function shouldInitializeIssueHandlerConfig(level: InstallLevel, installedSkills: string[]): boolean {\n return level === \"project\" && installedSkills.includes(ISSUE_HANDLER_ID);\n}\n\n/**\n * Seed the issue handler's repository-local configuration after a successful\n * install. Configuration is deliberately separate from the tool config root:\n * the same project config must work with every supported AI tool.\n *\n * Existing canonical files win. A former repository-root config is copied to\n * the canonical location (while retaining the original) before the packaged\n * template is considered, so an upgrade cannot replace user configuration.\n */\nexport function instantiateIssueHandlerConfig(repoPath: string, targetRepoPath: string): void {\n const configDir = join(targetRepoPath, \".cannbot\", ISSUE_HANDLER_ID, \"config\");\n const legacyConfigDir = targetRepoPath;\n\n try {\n mkdirSync(configDir, { recursive: true });\n } catch (error) {\n logger.warn(`issue-handler config directory creation failed: ${error instanceof Error ? error.message : String(error)}`);\n return;\n }\n\n for (const fileName of ISSUE_HANDLER_CONFIG_FILES) {\n const targetPath = join(configDir, fileName);\n // existsSync intentionally does not cover a dangling symlink.\n if (existsSync(targetPath) || isSymlink(targetPath)) continue;\n\n const legacyPath = join(legacyConfigDir, fileName);\n const templatePath = join(repoPath, \"infra\", ISSUE_HANDLER_ID, \"assets\", `${fileName}.template`);\n const sourcePath = existsSync(legacyPath) ? legacyPath : templatePath;\n\n if (!existsSync(sourcePath)) {\n logger.warn(`issue-handler config source not found: ${sourcePath}`);\n continue;\n }\n\n try {\n // COPYFILE_EXCL makes the missing-file check safe if another installer\n // creates the file between the check and the copy.\n copyFileSync(sourcePath, targetPath, fsConstants.COPYFILE_EXCL);\n } catch (error: any) {\n if (error?.code !== \"EEXIST\") {\n logger.warn(`issue-handler config install failed for ${fileName}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\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\n/**\n * Enumerates every configuration file path `installConfigFile` will replace\n * for this plugin/tool/level — the single source of truth shared by the\n * installer preflight (prompt + backup) and the actual replacement. At\n * project level the primary target is the project-root instructions file and\n * (unless `configRootConfigLink === false`) the tool config root copy.\n */\nexport function configFileTargets(\n pluginDir: string,\n configFile: string,\n tool: AITool,\n level: InstallLevel,\n configRoot: string,\n installPath: string,\n configRootConfigLink?: boolean\n): string[] {\n const sourcePath = join(pluginDir, configFile);\n if (!existsSync(sourcePath)) return [];\n\n const agentsFileName = getAgentsFileName(tool);\n const targets: string[] = [];\n\n if (level === \"project\") {\n targets.push(join(installPath, agentsFileName));\n if (configRootConfigLink !== false) {\n const configRootTarget = join(configRoot, agentsFileName);\n if (!targets.includes(configRootTarget)) {\n targets.push(configRootTarget);\n }\n }\n } else {\n targets.push(join(configRoot, agentsFileName));\n }\n\n return targets;\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 preservedTargets?: string[]\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 if (preservedTargets?.includes(primaryTarget)) {\n logger.info(t(\"install_config_preserved\").replace(\"{file}\", primaryTarget));\n } else {\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\n if (isProjectLevel && primaryTarget !== join(configRoot, agentsFileName)) {\n if (configRootConfigLink === false) return;\n const configRootTarget = join(configRoot, agentsFileName);\n if (preservedTargets?.includes(configRootTarget)) {\n logger.info(t(\"install_config_preserved\").replace(\"{file}\", configRootTarget));\n return;\n }\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 — 目录已存在且可用,继续创建 symlink(与 init.sh 行为一致)\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 preservedTargets?: 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 = getSkillsRoot(tool, level, cwd);\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 if (tool === \"codex\") {\n // Codex custom agents use standalone TOML files and may ignore symlinks\n // (openai/codex#15345). Install regular TOML files with the\n // __CANNBOT_AGENT_SOURCE__ placeholder resolved to the canonical .md\n // so multiple plugins can coexist in the same .codex/agents/ directory.\n const baseName = agentName.replace(/\\.md$/, \"\");\n const tomlSource = join(pluginDir, \"agents\", \"codex\", `${baseName}.toml`);\n if (!existsSync(tomlSource)) {\n logger.warn(t(\"install_agent_codex_toml_missing\").replace(\"{name}\", baseName).replace(\"{path}\", tomlSource));\n continue;\n }\n\n const canonicalMd = join(pluginDir, \"agents\", `${baseName}.md`);\n const canonicalPath = existsSync(canonicalMd) ? realpathSync(canonicalMd) : canonicalMd;\n const targetPath = join(agentsDir, `${baseName}.toml`);\n\n try {\n const content = readFileSync(tomlSource, \"utf-8\")\n .split(\"__CANNBOT_AGENT_SOURCE__\")\n .join(canonicalPath);\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n removePath(targetPath);\n }\n writeFileSync(targetPath, content, \"utf-8\");\n installedAgents.push(`${baseName}.toml`);\n } catch {\n logger.warn(t(\"install_agent_failed\").replace(\"{name}\", `${baseName}.toml`));\n }\n continue;\n }\n\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, preservedTargets);\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 if (shouldInitializeIssueHandlerConfig(level, installedSkills)) {\n instantiateIssueHandlerConfig(repoPath, cwd);\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, basename, 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, getSkillsRoot } 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 { instantiateIssueHandlerConfig, shouldInitializeIssueHandlerConfig } from \"./plugin-installer.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 = getSkillsRoot(tool, level);\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 if (shouldInitializeIssueHandlerConfig(level, installedIds)) {\n instantiateIssueHandlerConfig(repoPath, installPath);\n }\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 = getSkillsRoot(tool, level);\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 // Codex skills live under .agents/skills — clean up the empty .agents parent too\n if (tool === \"codex\") {\n const agentsRoot = dirname(skillsDir);\n try {\n if (existsSync(agentsRoot) && readdirSync(agentsRoot).length === 0) {\n rmSync(agentsRoot, { recursive: true });\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${basename(agentsRoot)}/`);\n }\n } catch {\n // ignore\n }\n }\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, PluginSource } 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 const badge = plugin.source === \"cannbot\"\n ? chalk.magenta(\" [cannbot]\") + (plugin.version ? chalk.dim(` v${plugin.version}`) : \"\")\n : \"\";\n\n table.push([\n String(index + 1),\n plugin.displayName + badge,\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 source?: PluginSource;\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 source?: PluginSource;\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 // Source-scoped: a --source skills install must point at the legacy\n // entry's docs, not the same-name cannbot package (unscoped lookup is\n // cannbot-first).\n const plugin = findPlugin(successResults[0].pluginId, {\n source: successResults[0].source,\n });\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 { ensureCannbotDiscovery } from \"../core/cannbot-installer.js\";\nimport { scanCannbotInstalled } from \"../core/cannbot-registry.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 await ensureCannbotDiscovery();\n\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n // cannbot-style installs: registry-driven, project-level only\n for (const entry of scanCannbotInstalled()) {\n if (!installedMap.has(entry.id)) {\n installedMap.set(entry.id, {\n id: entry.id,\n displayName: entry.id,\n tool: entry.tool as import(\"../types/index.js\").AITool,\n level: \"project\",\n skillsCount: entry.skillsCount,\n agentsCount: entry.agentsCount,\n installTime: \"\",\n configRoot: entry.registryPath,\n });\n }\n }\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, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { detectTools, getToolDisplayName, getAllTools } from \"../core/detector.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport {\n hasNodeRuntime,\n isCannbotInstallerReady,\n getCannbotInstallerVersion,\n loadCannbotInstallerConfig,\n} from \"../core/cannbot-installer.js\";\nimport {\n scanCannbotInstalled,\n countMarkerBlocks,\n findOrphanedDelegatedRecords,\n} from \"../core/cannbot-registry.js\";\nimport { getConfigRoot, getSkillsRoot, 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, tool, level } of configRootsToCheck) {\n const skillsDir = getSkillsRoot(tool, level);\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 // cannbot integration checks (Node runtime, managed installer, registry,\n // marker blocks, recorded skills, delegated-record consistency)\n const cannbotResult = doctorCannbotSection(options);\n warnings += cannbotResult.warnings;\n fixes += cannbotResult.fixes;\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 doctorCannbotSection(options: { fix?: boolean }): { warnings: number; fixes: number } {\n let warnings = 0;\n let fixes = 0;\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_cannbot\")}`));\n\n // 1. Node.js runtime (required to delegate to the cannbot installer)\n if (hasNodeRuntime()) {\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_cannbot_node_ok\")}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${t(\"doctor_cannbot_node_missing\")}`);\n warnings++;\n }\n\n // 2. managed cannbot installer package\n const installerConfig = loadCannbotInstallerConfig();\n if (isCannbotInstallerReady()) {\n const version = getCannbotInstallerVersion() || \"?\";\n console.log(\n chalk.green(\" ✓\") +\n ` ${installerConfig.package} v${version} ${chalk.dim(`(${installerConfig.channel})`)}`\n );\n } else {\n console.log(\n chalk.dim(\" —\") + ` ${installerConfig.package} — ${t(\"doctor_not_installed\")}`\n );\n }\n\n // 3-5. cannbot registries in the current project\n const cannbotInstalled = scanCannbotInstalled();\n if (cannbotInstalled.length === 0) {\n console.log(chalk.dim(\" —\") + ` cannbot-plugin.json — ${t(\"doctor_not_exist\")}`);\n } else {\n for (const entry of cannbotInstalled) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${entry.id} ${chalk.dim(`(${entry.tool}, ${entry.skillsCount} skills, ${entry.agentsCount} agents)`)}`\n );\n\n // 5. recorded skills actually exist on disk\n const missing = (entry.record.skills || []).filter((rel) => {\n const p = join(entry.target, rel);\n return !existsSync(p) && !lstatTryIsSymlink(p);\n });\n if (missing.length > 0) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${entry.id}: ${t(\"doctor_cannbot_missing_skills\").replace(\"{count}\", String(missing.length))}`\n );\n warnings++;\n }\n }\n }\n\n // 4. marker block pairing in the project instructions file\n for (const fileName of [\"AGENTS.md\", \"CLAUDE.md\"]) {\n const filePath = join(process.cwd(), fileName);\n if (!existsSync(filePath)) continue;\n try {\n const content = readFileSync(filePath, \"utf-8\");\n for (const entry of cannbotInstalled) {\n const blocks = countMarkerBlocks(content, entry.id);\n if (blocks > 1) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${fileName}: ${t(\"doctor_cannbot_marker_duplicate\").replace(\"{plugin}\", entry.id)}`\n );\n warnings++;\n }\n }\n const starts = (content.match(/<!-- cannbot:[\\w.-]+:start -->/g) || []).length;\n const ends = (content.match(/<!-- cannbot:[\\w.-]+:end -->/g) || []).length;\n if (starts !== ends) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${fileName}: ${t(\"doctor_cannbot_marker_unpaired\").replace(\"{start}\", String(starts)).replace(\"{end}\", String(ends))}`\n );\n warnings++;\n }\n } catch {\n // unreadable file — skip\n }\n }\n\n // 6. delegated-record ↔ registry consistency\n const orphans = findOrphanedDelegatedRecords();\n for (const pluginId of orphans) {\n console.log(\n chalk.yellow(\" ⚠\") +\n ` ${t(\"doctor_cannbot_orphan_record\").replace(\"{plugin}\", pluginId)}`\n );\n warnings++;\n if (options.fix) {\n try {\n unlinkSync(join(homedir(), \".cannbot\", \"installs\", `${pluginId}.json`));\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fixed\").replace(\"{count}\", \"1\")}: ${pluginId}`);\n } catch {\n // ignore\n }\n }\n }\n\n return { warnings, fixes };\n}\n\nfunction lstatTryIsSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\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 { scanCannbotInstalled } from \"../core/cannbot-registry.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool } from \"../types/index.js\";\n\nexport async function statusCommand(): Promise<void> {\n const installed = scanInstalled();\n const cannbotInstalled = scanCannbotInstalled();\n\n console.log();\n console.log(chalk.bold(` ${t(\"status_title\")}`));\n console.log();\n\n if (installed.length === 0 && cannbotInstalled.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 for (const entry of cannbotInstalled) {\n const versionSuffix = entry.version ? chalk.dim(` v${entry.version}`) : \"\";\n console.log(\n chalk.green(\" ✓\") +\n ` ${entry.id}${versionSuffix}` +\n chalk.magenta(\" [cannbot]\") +\n chalk.dim(` (${entry.tool}, project)`)\n );\n console.log(\n chalk.dim(` ${entry.skillsCount} skills, ${entry.agentsCount} agents`)\n );\n console.log(chalk.dim(` ${entry.target}`));\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 { installPluginRouted } from \"../core/cannbot-delegate.js\";\nimport { ensureCannbotDiscovery } from \"../core/cannbot-installer.js\";\nimport { scanCannbotInstalled } from \"../core/cannbot-registry.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, getSkillsRoot, validateTool, validateLevel } from \"../utils/paths.js\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel, PluginSource } from \"../types/index.js\";\n\nfunction validateSource(source?: string): PluginSource | undefined {\n if (!source) return undefined;\n if (source !== \"cannbot\" && source !== \"skills\") {\n throw new Error(t(\"error_invalid_source\").replace(\"{source}\", source).replace(\"{sources}\", \"cannbot, skills\"));\n }\n return source;\n}\n\nexport async function installCommand(\n names: string[],\n options: { tool?: string; level?: string; source?: string; yes?: boolean; all?: boolean; list?: boolean }\n): Promise<void> {\n const source = validateSource(options.source);\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 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(getSkillsRoot(tool, level))}`);\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 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(getSkillsRoot(tool, level))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n if (failCount > 0) {\n process.exitCode = 1;\n }\n return;\n }\n }\n }\n }\n\n // Scan repo for dynamic skill/plugin discovery + cannbot dual-source merge\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 await ensureCannbotDiscovery();\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, { source });\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 const badge = p.source === \"cannbot\" ? chalk.magenta(\" [cannbot]\") : \"\";\n logger.step(` ${p.id}${badge} (${p.aliases.join(\", \")})`);\n }\n logger.info(`${t(\"available_skills\")}: ${chalk.cyan(\"install-helper install --list\")}`);\n process.exitCode = 1;\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 const pluginEntry = findPlugin(pluginId, { source });\n const alreadyInstalled = pluginEntry?.source === \"cannbot\"\n ? scanCannbotInstalled().some((e) => e.id === pluginId && e.tool === tool)\n : installedSet.has(pluginId);\n if (alreadyInstalled && !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 results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath,\n undefined,\n options.yes,\n source\n );\n\n const summary = results.map((result) => {\n // Source-scoped so a --source skills install reports the legacy\n // entry's displayName (unscoped lookup is cannbot-first).\n const plugin = findPlugin(result.pluginId, { source });\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 // the command-line source is the user intent — legacy entries\n // carry no `source` field, so plugin?.source alone would lose the\n // \"skills\" scope and the docs hint would resolve cannbot-first\n source: source ?? plugin?.source,\n };\n });\n\n printInstallSummary(summary);\n printEnhancedSummary(summary, tool, configRoot);\n if (results.some((r) => !r.success)) {\n process.exitCode = 1;\n }\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(getSkillsRoot(tool, level))}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n if (failCount > 0) {\n process.exitCode = 1;\n }\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 source?: PluginSource\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 plugin = findPlugin(pluginId, { source });\n const result = await installPluginRouted({\n pluginId,\n tool,\n level,\n repoPath,\n installPath,\n yes,\n plugin,\n source,\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 for (const warning of result.warnings || []) {\n logger.warn(warning);\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, readSkillRecord } from \"../core/record.js\";\nimport { scanCannbotInstalled, uninstallCannbotPlugin } from \"../core/cannbot-registry.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, getSkillsRoot, 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 cannbotPlugins: string[] = [];\n const skills: string[] = [];\n\n // cannbot-style installs are registry-driven: a cannbot-plugin.json record\n // wins over the legacy bookkeeping (migration policy: cannbot first).\n const cannbotInstalledIds = new Set(scanCannbotInstalled().map((e) => e.id));\n\n for (const name of names) {\n if (cannbotInstalledIds.has(name)) {\n cannbotPlugins.push(name);\n continue;\n }\n const plugin = findPlugin(name);\n if (plugin && plugin.source !== \"cannbot\") {\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 // Skills absent from the static fallback list (newly added repo domains\n // like tools/ drift from it) are still uninstalled by name when an\n // install record exists — mirrors the record-driven plugin fallback.\n if (isRecordedSkill(name)) {\n skills.push(name);\n continue;\n }\n // Community plugins are not in the embedded registry — allow uninstall\n // by name when an install record exists (previously \"not found\").\n if (readRecord(name)) {\n plugins.push(name);\n continue;\n }\n logger.error(`${t(\"uninstall_not_found\")}: ${name}`);\n }\n\n await uninstallCannbotPlugins(cannbotPlugins);\n await uninstallPlugins(plugins, options.yes || false);\n await uninstallSkillsByName(skills, tool, level);\n}\n\nasync function uninstallCannbotPlugins(pluginIds: string[]): Promise<void> {\n for (const pluginId of pluginIds) {\n logger.info(`${t(\"uninstall_in_progress\")} ${pluginId}...`);\n await uninstallCannbotPluginById(pluginId);\n }\n}\n\nexport function isRecordedSkill(skillId: string): boolean {\n const record = readSkillRecord();\n for (const toolName of Object.keys(record)) {\n for (const levelName of Object.keys(record[toolName])) {\n for (const installPath of Object.keys(record[toolName][levelName])) {\n if (record[toolName][levelName][installPath].skills?.includes(skillId)) {\n return true;\n }\n }\n }\n }\n return false;\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 const cannbotInstalled = level === \"project\"\n ? scanCannbotInstalled().filter((e) => e.tool === tool)\n : [];\n\n const totalItems = installedSkills.length + installedPlugins.length + cannbotInstalled.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 + cannbotInstalled.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 for (const c of cannbotInstalled) {\n logger.step(` • ${chalk.cyan(c.id)} ${chalk.magenta(\"[cannbot]\")}`);\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 cannbot-style plugins\n for (const entry of cannbotInstalled) {\n await uninstallCannbotPluginById(entry.id);\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 uninstallCannbotPluginById(pluginId: string): Promise<void> {\n const result = uninstallCannbotPlugin(pluginId);\n if (result.success) {\n logger.success(\n t(\"uninstall_summary_format\")\n .replace(\"{name}\", pluginId)\n .replace(\"{files}\", String(result.removedFiles))\n .replace(\"{dirs}\", String(result.removedDirs))\n );\n } else {\n for (const error of result.errors) {\n logger.error(`${pluginId}: ${error}`);\n }\n }\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 VALID_TOOLS) {\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 const cannbotInstalled = level === \"project\" ? scanCannbotInstalled().filter((e) => e.tool === tool) : [];\n\n if (installed.length === 0 && cannbotInstalled.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 ...cannbotInstalled.map((entry) => ({\n name: `${chalk.cyan(entry.id)} ${chalk.magenta(\"[cannbot]\")}`,\n value: entry.id,\n checked: false,\n description: `${entry.skillsCount} skills, ${entry.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 toUninstallLegacy = installed.filter((inst) => selected.includes(inst.id));\n const toUninstallCannbot = cannbotInstalled.filter((entry) => selected.includes(entry.id));\n\n if (toUninstallLegacy.length === 0 && toUninstallCannbot.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(\n \"{count}\",\n chalk.bold(String(toUninstallLegacy.length + toUninstallCannbot.length))\n ),\n default: false,\n });\n\n if (!confirmed) {\n logger.info(t(\"init_cancelled\"));\n return;\n }\n\n const totalCount = toUninstallLegacy.length + toUninstallCannbot.length;\n logger.info(`${t(\"uninstall_plugin_batch_progress\").replace(\"{count}\", String(totalCount))}...`);\n for (const entry of toUninstallCannbot) {\n await uninstallCannbotPluginById(entry.id);\n }\n for (const inst of toUninstallLegacy) {\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 let plugin = findPlugin(pluginId);\n if (!plugin) {\n // Community plugin not in the embedded registry — recover display info\n // from the install record so it can still be uninstalled by name.\n const record = readRecord(pluginId);\n if (record) {\n plugin = {\n id: pluginId,\n dir: \"\",\n displayName: record.displayName,\n script: \"init.sh\",\n aliases: [],\n skills: 0,\n agents: 0,\n description: \"\",\n };\n }\n }\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 // Use the config root recorded at install time — deriving it from the\n // current cwd would resolve against the wrong project when the record\n // belongs to another location (breaking backup cleanup and potentially\n // deleting the current project's config file via extraFiles).\n const configRoot = record.configRoot;\n const allowedBases = [resolve(configRoot), resolve(record.installPath)];\n if (record.tool === \"codex\") {\n // Codex skills live under .agents/skills which is outside the .codex\n // config root — allow it explicitly so files there can be removed.\n allowedBases.push(resolve(getSkillsRoot(record.tool, record.level, record.installPath)));\n }\n const isSafePath = (p: string): boolean => {\n const resolved = resolve(p);\n return allowedBases.some(base => resolved === base || resolved.startsWith(base + sep));\n };\n // Paths the user kept at install time — never removed by uninstall.\n const preservedPaths = new Set((record.preservedTargets || []).map((p) => resolve(p)));\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].filter(\n (filePath) => !preservedPaths.has(resolve(filePath))\n );\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 // Codex skills live under .agents/skills — remove the empty .agents parent\n if (record.tool === \"codex\") {\n try {\n const agentsRoot = resolve(getSkillsRoot(record.tool, record.level, record.installPath), \"..\");\n if (existsSync(agentsRoot) && readdirSync(agentsRoot).length === 0) {\n rmdirSync(agentsRoot);\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${basename(agentsRoot)}/`);\n removedDirs++;\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id, {\n tool: record.tool,\n level: record.level,\n installPath: record.installPath,\n });\n removeInstalledPlugin(plugin.id);\n\n // Backups may sit beside the replaced files in the install path (project\n // root) as well as in the config root — scan both, preferring the\n // originalPath recorded at install time over filename derivation so\n // project-level files restore to their original locations.\n const backupDirs = resolve(record.installPath) === resolve(configRoot)\n ? [configRoot]\n : [configRoot, record.installPath];\n const recordBackups = [\n ...(record.backups || []),\n ...(record.backup\n ? [{ ...record.backup, originalPath: join(configRoot, configFileName) }]\n : []),\n ];\n const backups = findBackups(backupDirs).map((b) => {\n const recorded = recordBackups.find((rb) => resolve(rb.filePath) === resolve(b.filePath));\n return recorded ? { ...b, originalPath: recorded.originalPath } : b;\n });\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 backupInfo = otherBackups.find((b) => b.filePath === choice);\n const restoreTarget = backupInfo?.originalPath || join(configRoot, configFileName);\n if (isSafePath(restoreTarget)) {\n const restored = restoreBackup(choice, restoreTarget);\n if (restored) {\n logger.success(`${t(\"backup_restore_success\")}: ${backupInfo?.pluginName || \"\"} -> ${restoreTarget}`);\n deleteBackup(choice);\n }\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 { installPluginRouted } from \"../core/cannbot-delegate.js\";\nimport { ensureCannbotDiscovery, ensureCannbotInstaller } from \"../core/cannbot-installer.js\";\nimport { scanCannbotInstalled } from \"../core/cannbot-registry.js\";\nimport { findPlugin } 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 source: \"cannbot\" | \"skills\";\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 // + cannbot dual-source discovery\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 await ensureCannbotDiscovery();\n\n // Phase 2: scanInstalled (legacy manifests) + cannbot registry records\n const installed = scanInstalled();\n const cannbotInstalled = scanCannbotInstalled();\n\n let targets: UpdateTarget[] = [];\n\n if (pluginNames.length === 0) {\n if (installed.length === 0 && cannbotInstalled.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 = [\n ...installed.map((p) => ({ pluginId: p.id, tool: p.tool, level: p.level, source: \"skills\" as const })),\n ...cannbotInstalled.map((e) => ({ pluginId: e.id, tool: e.tool as AITool, level: \"project\" as InstallLevel, source: \"cannbot\" as const })),\n ];\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 // cannbot registry records win for same-name ids (migration policy);\n // legacy resolution must be source-scoped so a same-name cannbot\n // entry never shadows an installed legacy plugin\n const cannbotMatches = cannbotInstalled.filter((e) => e.id === name);\n const legacyPlugin = findPlugin(name, { source: \"skills\" });\n const anyPlugin = findPlugin(name);\n\n if (cannbotMatches.length === 0 && !legacyPlugin && !anyPlugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n continue;\n }\n\n const legacyMatches = cannbotMatches.length === 0 && legacyPlugin\n ? installed.filter((p) => p.id === legacyPlugin.id)\n : [];\n\n const matches = [\n ...cannbotMatches.map((e) => ({ pluginId: e.id, tool: e.tool as AITool, level: \"project\" as InstallLevel, source: \"cannbot\" as const })),\n ...legacyMatches.map((p) => ({ pluginId: p.id, tool: p.tool, level: p.level, source: \"skills\" as const })),\n ];\n\n if (matches.length > 0) {\n for (const match of matches) {\n if (defaultTool && match.tool !== defaultTool) continue;\n if (defaultLevel && match.level !== defaultLevel) continue;\n targets.push(match);\n }\n } else {\n const displayName = cannbotMatches.length\n ? cannbotMatches[0].id\n : legacyPlugin?.displayName || anyPlugin?.displayName || name;\n logger.warn(`${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 // Refresh the managed cannbot installer when cannbot targets are present\n // (update implies pulling the latest bundled plugins).\n if (targets.some((target) => target.source === \"cannbot\")) {\n try {\n await ensureCannbotInstaller({ force: true });\n } catch (error) {\n logger.warn(\n t(\"cannbot_installer_failed\").replace(\n \"{error}\",\n error instanceof Error ? error.message : t(\"error_unknown\")\n )\n );\n }\n }\n\n // Phase 3: reinstall each target (source-scoped lookup so same-name\n // cannbot entries never override a legacy target's metadata or routing)\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 = findPlugin(target.pluginId, { source: target.source });\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 installPluginRouted({\n pluginId: target.pluginId,\n tool: target.tool,\n level: target.level,\n repoPath,\n yes: options.yes,\n plugin,\n source: target.source,\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 for (const warning of result.warnings || []) {\n logger.warn(warning);\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => {\n const source = targets[index]?.source;\n const plugin = source ? findPlugin(result.pluginId, { source }) : undefined;\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 { scanCannbotInstalled } from \"../core/cannbot-registry.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 cannbotEntry = plugin.source === \"cannbot\"\n ? scanCannbotInstalled().find((e) => e.id === plugin.id)\n : undefined;\n const isInstalled = !!inst || !!cannbotEntry;\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 if (plugin.source === \"cannbot\") {\n console.log(chalk.magenta(\" [cannbot]\") + chalk.dim(` v${plugin.version || \"?\"}`));\n }\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 || cannbotEntry ? (cannbotEntry?.skillsCount ?? inst?.skillsCount) : plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${inst || cannbotEntry ? (cannbotEntry?.agentsCount ?? inst?.agentsCount) : plugin.agents}`);\n if (plugin.source !== \"cannbot\") {\n console.log(` ${chalk.dim(t(\"info_aliases\") + \":\")} ${plugin.aliases.join(\", \")}`);\n }\n console.log();\n\n if (plugin.source === \"cannbot\") {\n if (cannbotEntry) {\n console.log(` ${chalk.dim(t(\"info_source\") + \":\")} ${cannbotEntry.registryPath}`);\n }\n console.log();\n return;\n }\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":["join","existsSync","existsSync","unlinkSync","dirname","existsSync","readFileSync","join","dirname","fileURLToPath","__dirname","__filename","readdirSync","existsSync","join","existsSync","homedir","join","existsSync","readFileSync","join","i","chalk","existsSync","mkdirSync","readFileSync","join","chalk","choices","result","select","Separator","chalk","existsSync","mkdirSync","readFileSync","rmSync","join","dirname","fileURLToPath","execa","parseYaml","existsSync","readFileSync","statSync","readdirSync","join","installSkills","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","execa","existsSync","mkdirSync","rmSync","existsSync","readFileSync","writeFileSync","copyFileSync","unlinkSync","readdirSync","join","resolve","execa","existsSync","mkdirSync","readFileSync","readdirSync","writeFileSync","join","dirname","fileURLToPath","execa","parseYaml","__filename","__dirname","readManifest","setCannbotPlugins","existsSync","readFileSync","readdirSync","rmSync","unlinkSync","lstatSync","writeFileSync","join","resolve","sep","dirname","existsSync","mkdirSync","readFileSync","unlinkSync","readdirSync","join","join","existsSync","readFileSync","resolve","resolve","sep","lstatSync","rmSync","unlinkSync","readdirSync","dirname","existsSync","readFileSync","writeFileSync","join","existsSync","readFileSync","realpathSync","join","basename","execa","execaSync","existsSync","readdirSync","unlinkSync","join","dirname","resolve","join","existsSync","dirname","resolve","readdirSync","unlinkSync","select","chalk","existsSync","mkdirSync","copyFileSync","writeFileSync","rmSync","readFileSync","join","basename","execa","targetPath","execaSync","readFileSync","realpathSync","join","existsSync","backup","choice","basename","execa","join","readFileSync","copyFileSync","unlinkSync","writeFileSync","existsSync","readdirSync","execa","resolve","existsSync","mkdirSync","symlinkSync","readdirSync","rmSync","realpathSync","readlinkSync","cpSync","join","dirname","basename","isAbsolute","select","Separator","chalk","existsSync","mkdirSync","join","realpathSync","readlinkSync","symlinkSync","cpSync","readdirSync","rmSync","dirname","basename","Separator","select","chalk","action","isAbsolute","chalk","Table","existsSync","readFileSync","join","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","readFileSync","join","homedir","chalk","existsSync","readdirSync","mkdirSync","join","readFileSync","unlinkSync","homedir","lstatSync","chalk","chalk","confirm","chalk","scanSpinner","tool","level","existsSync","unlinkSync","rmdirSync","readdirSync","readFileSync","resolve","basename","sep","join","chalk","select","checkbox","Separator","confirm","chalk","confirm","Separator","select","stepLevel","checkbox","record","configRoot","join","existsSync","readFileSync","basename","resolve","sep","unlinkSync","readdirSync","rmdirSync","chalk","chalk","existsSync","readdirSync","join","chalk","join","existsSync","readdirSync","chalk","readFileSync","existsSync","fileURLToPath","dirname","join","__filename","__dirname","program"]}