@spaceflow/core 0.19.0 → 0.21.0
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 +36 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__mocks__/c12.ts +3 -1
- package/src/cli-runtime/i18n/i18n.spec.ts +2 -1
- package/src/commands/build/build.service.ts +1 -1
- package/src/commands/list/list.service.ts +1 -1
- package/src/commands/update/update.service.ts +2 -2
- package/src/config/spaceflow.config.ts +3 -3
- package/src/shared/git-provider/adapters/gitea.adapter.ts +30 -1
- package/src/shared/git-provider/detect-provider.ts +4 -4
- package/src/shared/git-provider/types.ts +2 -2
- package/src/shared/logger/logger.spec.ts +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["webpack://@spaceflow/core/./src/commands/build|lazy|referencedExports: default, |groupOptions: {}|namespace object","webpack://@spaceflow/core/./src/commands/list|sync","webpack://@spaceflow/core/webpack/runtime/compat_get_default_export","webpack://@spaceflow/core/webpack/runtime/define_property_getters","webpack://@spaceflow/core/webpack/runtime/ensure_chunk","webpack://@spaceflow/core/webpack/runtime/get javascript chunk filename","webpack://@spaceflow/core/webpack/runtime/has_own_property","webpack://@spaceflow/core/webpack/runtime/public_path","webpack://@spaceflow/core/webpack/runtime/module_chunk_loading","webpack://@spaceflow/core/./src/extension-system/extension.interface.ts","webpack://@spaceflow/core/./src/extension-system/define-extension.ts","webpack://@spaceflow/core/./src/extension-system/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/types.ts","webpack://@spaceflow/core/./src/shared/git-provider/detect-provider.ts","webpack://@spaceflow/core/./src/shared/git-provider/parse-repo-url.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk-diff.utils.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitea.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/github.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitlab.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/git-provider.service.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/index.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk.service.ts","webpack://@spaceflow/core/./src/shared/git-sdk/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/config.interface.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/llm-adapter.interface.ts","webpack://@spaceflow/core/./src/shared/verbose/index.ts","webpack://@spaceflow/core/./src/shared/claude-setup/claude-setup.service.ts","webpack://@spaceflow/core/./src/shared/claude-setup/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/claude-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/openai.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/open-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-session.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-proxy.service.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/stream-logger.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/card-action.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/feishu-sdk.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/fieshu-card.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/module.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/index.ts","webpack://@spaceflow/core/./src/shared/storage/storage.service.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/memory.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/file.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/index.ts","webpack://@spaceflow/core/./src/shared/storage/index.ts","webpack://@spaceflow/core/./src/shared/parallel/parallel-executor.ts","webpack://@spaceflow/core/./src/shared/parallel/index.ts","webpack://@spaceflow/core/./src/shared/output/output.service.ts","webpack://@spaceflow/core/./src/shared/output/index.ts","webpack://@spaceflow/core/./src/shared/editor-config/index.ts","webpack://@spaceflow/core/./src/shared/llm-jsonput/index.ts","webpack://@spaceflow/core/./src/shared/source-utils/index.ts","webpack://@spaceflow/core/./src/shared/package-manager/index.ts","webpack://@spaceflow/core/./src/shared/spaceflow-dir/index.ts","webpack://@spaceflow/core/./src/shared/rspack-config/rspack-config.ts","webpack://@spaceflow/core/./src/shared/rspack-config/index.ts","webpack://@spaceflow/core/./src/shared/mcp/index.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/i18n.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/locale-detect.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/init.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/index.ts","webpack://@spaceflow/core/./src/shared/logger/logger.interface.ts","webpack://@spaceflow/core/./src/shared/logger/renderers/plain.renderer.ts","webpack://@spaceflow/core/./src/shared/logger/logger.ts","webpack://@spaceflow/core/./src/shared/logger/index.ts","webpack://@spaceflow/core/./src/config/spaceflow.config.ts","webpack://@spaceflow/core/./src/config/schema-generator.service.ts","webpack://@spaceflow/core/./src/config/index.ts","webpack://@spaceflow/core/./src/cli-runtime/di/container.ts","webpack://@spaceflow/core/./src/cli-runtime/di/config.ts","webpack://@spaceflow/core/./src/cli-runtime/di/services.ts","webpack://@spaceflow/core/./src/cli-runtime/di/index.ts","webpack://@spaceflow/core/./src/cli-runtime/extension-loader.ts","webpack://@spaceflow/core/./src/commands/build/build.service.ts","webpack://@spaceflow/core/./src/commands/build/index.ts","webpack://@spaceflow/core/./src/commands/clear/clear.service.ts","webpack://@spaceflow/core/./src/commands/clear/index.ts","webpack://@spaceflow/core/./src/commands/commit/commit.config.ts","webpack://@spaceflow/core/./src/commands/commit/commit.service.ts","webpack://@spaceflow/core/./src/commands/commit/index.ts","webpack://@spaceflow/core/./src/commands/create/create.service.ts","webpack://@spaceflow/core/./src/commands/create/index.ts","webpack://@spaceflow/core/./src/commands/dev/index.ts","webpack://@spaceflow/core/./src/commands/install/install.service.ts","webpack://@spaceflow/core/./src/commands/install/index.ts","webpack://@spaceflow/core/./src/commands/list/list.service.ts","webpack://@spaceflow/core/./src/commands/list/index.ts","webpack://@spaceflow/core/./src/commands/mcp/mcp.service.ts","webpack://@spaceflow/core/./src/commands/mcp/index.ts","webpack://@spaceflow/core/./src/commands/runx/runx.service.ts","webpack://@spaceflow/core/./src/commands/runx/index.ts","webpack://@spaceflow/core/./src/commands/schema/index.ts","webpack://@spaceflow/core/./src/commands/setup/setup.service.ts","webpack://@spaceflow/core/./src/commands/setup/index.ts","webpack://@spaceflow/core/./src/commands/uninstall/uninstall.service.ts","webpack://@spaceflow/core/./src/commands/uninstall/index.ts","webpack://@spaceflow/core/./src/commands/update/update.service.ts","webpack://@spaceflow/core/./src/commands/update/index.ts","webpack://@spaceflow/core/./src/cli-runtime/internal-extensions.ts","webpack://@spaceflow/core/./src/cli-runtime/index.ts","webpack://@spaceflow/core/./src/index.ts"],"sourcesContent":["function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 778;\nmodule.exports = webpackEmptyAsyncContext;\n","function webpackEmptyContext(req) {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n}\nwebpackEmptyContext.keys = () => ([]);\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 777;\nmodule.exports = webpackEmptyContext;\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"\" + chunkId + \".js\"\n}","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.p = \"\";","// no BaseURI\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"410\": 0,};\n var installChunk = (data) => {\n var __rspack_esm_ids = data.__rspack_esm_ids;\n var __webpack_modules__ = data.__webpack_modules__;\n var __rspack_esm_runtime = data.__rspack_esm_runtime;\n // add \"modules\" to the modules object,\n // then flag all \"ids\" as loaded and fire callback\n var moduleId, chunkId, i = 0;\n for (moduleId in __webpack_modules__) {\n if (__webpack_require__.o(__webpack_modules__, moduleId)) {\n __webpack_require__.m[moduleId] = __webpack_modules__[moduleId];\n }\n }\n if (__rspack_esm_runtime) __rspack_esm_runtime(__webpack_require__);\n for (; i < __rspack_esm_ids.length; i++) {\n chunkId = __rspack_esm_ids[i];\n if (__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n installedChunks[chunkId][0]();\n }\n installedChunks[__rspack_esm_ids[i]] = 0;\n }\n \n};\n __webpack_require__.f.j = function (chunkId, promises) {\n // import() chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\nif (installedChunkData !== 0) { // 0 means \"already installed\".'\n // a Promise means \"currently loading\".\n if (installedChunkData) {\n promises.push(installedChunkData[1]);\n } else {\n if (true) {\n // setup Promise in chunk cache\n var promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n if (installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n throw e;\n });\n var promise = Promise.race([promise, new Promise((resolve) => {\n installedChunkData = installedChunks[chunkId] = [resolve];\n })]);\n promises.push(installedChunkData[1] = promise);\n }\n \n }\n}\n }\n // no external install chunk\n// no on chunks loaded\n// no HMR\n// no HMR manifest\n","/**\n * Extension 元数据\n */\nexport interface SpaceflowExtensionMetadata {\n /** Extension 名称 */\n name: string;\n /** 提供的命令列表 */\n commands: string[];\n /** 对应 spaceflow.json 中的配置 key(可选) */\n configKey?: string;\n /** 依赖的其他 Extension 配置 key 列表,读取其他 Extension 配置前必须在此声明 */\n configDependencies?: string[];\n /** 配置 schema 工厂函数,返回 zod schema,用于验证配置和生成 JSON Schema */\n configSchema?: () => unknown;\n /** Extension 版本 */\n version?: string;\n /** Extension 描述 */\n description?: string;\n}\n\n/**\n * .spaceflow/package.json 中的 dependencies\n */\nexport type ExtensionDependencies = Record<string, string>;\n\n/**\n * Spaceflow 导出类型\n * - flow: 子命令(默认),需要构建,注册为 CLI 子命令\n * - command: 编辑器命令,复制到 .claude/commands/ 等目录\n * - skill: 技能包,复制到 .claude/skills/ 等目录\n * - mcp: MCP Server,注册到编辑器的 mcp.json 配置\n */\nexport type SpaceflowExportType = \"flow\" | \"command\" | \"skill\" | \"mcp\";\n\n/**\n * MCP Server 配置\n */\nexport interface McpServerConfig {\n /** 启动命令,如 \"node\", \"python\" */\n command: string;\n /** 启动参数,如 [\"dist/index.js\"] */\n args?: string[];\n /** 需要的环境变量名列表,安装时会提示用户配置 */\n env?: string[];\n}\n\n/**\n * 单个导出项配置\n */\nexport interface SpaceflowExportConfig {\n /** 导出类型,默认为 flow */\n type?: SpaceflowExportType;\n /** 入口路径,相对于包根目录 */\n entry: string;\n /** 描述(可选) */\n description?: string;\n /** MCP Server 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * package.json 中的 spaceflow 配置\n *\n * 完整格式:\n * ```json\n * \"spaceflow\": {\n * \"exports\": {\n * \"review\": { \"type\": \"flow\", \"entry\": \".\" },\n * \"review-rules\": { \"type\": \"skill\", \"entry\": \"./skills\" },\n * \"my-mcp\": { \"type\": \"mcp\", \"entry\": \".\", \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] } }\n * }\n * }\n * ```\n *\n * 简化格式(单导出):\n * ```json\n * \"spaceflow\": {\n * \"type\": \"mcp\",\n * \"entry\": \".\",\n * \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] }\n * }\n * ```\n */\nexport interface SpaceflowPackageConfig {\n /** 多导出配置 */\n exports?: Record<string, SpaceflowExportConfig>;\n /** 简化格式:导出类型 */\n type?: SpaceflowExportType;\n /** 简化格式:入口路径 */\n entry?: string;\n /** 简化格式:描述 */\n description?: string;\n /** 简化格式:MCP 配置 */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析后的导出项\n */\nexport interface ResolvedSpaceflowExport {\n /** 导出名称 */\n name: string;\n /** 导出类型 */\n type: SpaceflowExportType;\n /** 入口路径(绝对路径) */\n entry: string;\n /** 描述 */\n description?: string;\n /** MCP 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析 spaceflow 配置,返回所有导出项\n */\nexport function resolveSpaceflowConfig(\n config: SpaceflowPackageConfig | undefined,\n packageName: string,\n packagePath: string,\n): ResolvedSpaceflowExport[] {\n const { join } = require(\"path\");\n\n if (!config) {\n return [];\n }\n\n // 完整格式:有 exports 字段\n if (config.exports) {\n return Object.entries(config.exports).map(([name, exportConfig]) => ({\n name,\n type: exportConfig.type || \"flow\",\n entry: join(packagePath, exportConfig.entry),\n description: exportConfig.description,\n mcp: exportConfig.mcp,\n }));\n }\n\n // 简化格式:直接有 type/entry 字段\n if (config.entry) {\n return [\n {\n name: packageName,\n type: config.type || \"flow\",\n entry: join(packagePath, config.entry),\n description: config.description,\n mcp: config.mcp,\n },\n ];\n }\n\n return [];\n}\n","import type { ExtensionDefinition } from \"./types\";\n\n/**\n * 定义扩展\n * 这是一个类型安全的工厂函数,用于创建扩展定义\n * @param definition 扩展定义\n * @returns 扩展定义(原样返回,仅用于类型推断)\n */\nexport function defineExtension(definition: ExtensionDefinition): ExtensionDefinition {\n return definition;\n}\n","// 旧版接口(保留兼容,后续移除)\nexport * from \"./extension.interface\";\n\n// 新版接口\nexport * from \"./types\";\nexport * from \"./define-extension\";\n","/**\n * Git Provider 通用类型定义\n * 适用于 Gitea、GitHub 等多种 Git 托管平台\n */\n\n/** Git Provider 平台类型 */\nexport type GitProviderType = \"gitea\" | \"github\" | \"gitlab\";\n\n/** Git Provider 模块配置选项 */\nexport interface GitProviderModuleOptions {\n /** Git Provider 平台类型 */\n provider: GitProviderType;\n /** 服务器 URL */\n baseUrl: string;\n /** API Token */\n token: string;\n}\n\n/** Git Provider 模块异步配置选项 */\nexport interface GitProviderModuleAsyncOptions {\n useFactory: (...args: unknown[]) => Promise<GitProviderModuleOptions> | GitProviderModuleOptions;\n inject?: any[];\n}\n\n/** 注入令牌 */\nexport const GIT_PROVIDER_MODULE_OPTIONS = \"GIT_PROVIDER_MODULE_OPTIONS\";\n\n/** 分支保护规则 */\nexport interface BranchProtection {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n branch_name?: string;\n created_at?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n rule_name?: string;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n updated_at?: string;\n}\n\n/** 创建分支保护规则选项 */\nexport interface CreateBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n /** 分支名称或通配符规则 */\n branch_name?: string;\n /** 规则名称 */\n rule_name?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 编辑分支保护规则选项 */\nexport interface EditBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 分支信息 */\nexport interface Branch {\n commit?: {\n id?: string;\n message?: string;\n timestamp?: string;\n };\n effective_branch_protection_name?: string;\n enable_status_check?: boolean;\n name?: string;\n protected?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n user_can_merge?: boolean;\n user_can_push?: boolean;\n}\n\n/** 仓库信息 */\nexport interface Repository {\n id?: number;\n owner?: {\n id?: number;\n login?: string;\n full_name?: string;\n };\n name?: string;\n full_name?: string;\n default_branch?: string;\n}\n\n/** Pull Request 信息 */\nexport interface PullRequest {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n head?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n base?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n user?: {\n id?: number;\n login?: string;\n };\n /** PR 指定的评审人(个人用户) */\n requested_reviewers?: Array<{\n id?: number;\n login?: string;\n }>;\n /** PR 指定的评审团队 */\n requested_reviewers_teams?: Array<{\n id?: number;\n name?: string;\n /** 团队成员 */\n members?: Array<{\n id?: number;\n login?: string;\n }>;\n }>;\n created_at?: string;\n updated_at?: string;\n merged_at?: string;\n merge_base?: string;\n}\n\n/** 编辑 PR 的选项 */\nexport interface EditPullRequestOption {\n title?: string;\n body?: string;\n state?: \"open\" | \"closed\";\n base?: string;\n}\n\n/** PR Commit 信息 */\nexport interface PullRequestCommit {\n sha?: string;\n commit?: {\n message?: string;\n author?: {\n name?: string;\n email?: string;\n date?: string;\n };\n };\n author?: {\n id?: number;\n login?: string;\n };\n committer?: {\n id?: number;\n login?: string;\n };\n}\n\n/** 文件变更信息 */\nexport interface ChangedFile {\n filename?: string;\n status?: string;\n additions?: number;\n deletions?: number;\n changes?: number;\n patch?: string;\n raw_url?: string;\n contents_url?: string;\n}\n\n/** Commit 详细信息(包含文件变更) */\nexport interface CommitInfo extends PullRequestCommit {\n files?: ChangedFile[];\n}\n\n/** Issue/PR 评论 */\nexport interface IssueComment {\n id?: number;\n body?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n}\n\n/** 创建 Issue 评论选项 */\nexport interface CreateIssueCommentOption {\n body: string;\n}\n\n/** 创建 Issue 的选项 */\nexport interface CreateIssueOption {\n /** Issue 标题 */\n title: string;\n /** Issue 内容 */\n body?: string;\n /** 指派人用户名列表 */\n assignees?: string[];\n /** 标签 ID 列表 */\n labels?: number[];\n /** 里程碑 ID */\n milestone?: number;\n /** 截止日期 */\n due_date?: string;\n}\n\n/** Issue 响应 */\nexport interface Issue {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n labels?: Array<{\n id?: number;\n name?: string;\n color?: string;\n }>;\n assignees?: Array<{\n id?: number;\n login?: string;\n }>;\n milestone?: {\n id?: number;\n title?: string;\n };\n created_at?: string;\n updated_at?: string;\n closed_at?: string;\n html_url?: string;\n}\n\n/** PR Review 事件类型 */\nexport type ReviewStateType = \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" | \"PENDING\";\n\n/** PR Review 事件常量 */\nexport const REVIEW_STATE = {\n APPROVE: \"APPROVE\",\n REQUEST_CHANGES: \"REQUEST_CHANGES\",\n COMMENT: \"COMMENT\",\n PENDING: \"PENDING\",\n} as const;\n\n/** PR Review 行级评论 Diff 方向 */\nexport const DIFF_SIDE = {\n RIGHT: \"RIGHT\",\n LEFT: \"LEFT\",\n} as const;\n\n/** PR Review 行级评论 */\nexport interface CreatePullReviewComment {\n /** 文件路径 */\n path: string;\n /** 评论内容 */\n body: string;\n /** 旧文件行号(删除行),新增行设为 0 */\n old_position?: number;\n /** 新文件行号(新增/修改行),删除行设为 0 */\n new_position?: number;\n}\n\n/** 创建 PR Review 的选项 */\nexport interface CreatePullReviewOption {\n /** Review 事件类型 */\n event?: ReviewStateType;\n /** Review 主体评论 */\n body?: string;\n /** 行级评论列表 */\n comments?: CreatePullReviewComment[];\n /** 提交 SHA(可选) */\n commit_id?: string;\n}\n\n/** PR Review 响应 */\nexport interface PullReview {\n id?: number;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n commit_id?: string;\n}\n\n/** PR Review 行级评论响应 */\nexport interface PullReviewComment {\n id?: number;\n body?: string;\n path?: string;\n position?: number;\n original_position?: number;\n commit_id?: string;\n original_commit_id?: string;\n diff_hunk?: string;\n pull_request_review_id?: number;\n user?: {\n id?: number;\n login?: string;\n };\n /** 解决者,如果不为 null 表示评论已被标记为已解决 */\n resolver?: {\n id?: number;\n login?: string;\n } | null;\n created_at?: string;\n updated_at?: string;\n html_url?: string;\n}\n\n/** PR Review Thread 已解决信息 */\nexport interface ResolvedThread {\n /** 文件路径 */\n path?: string;\n /** 行号(新文件中的行号) */\n line?: number;\n /** 解决者 */\n resolvedBy?: {\n id?: number;\n login?: string;\n } | null;\n /** 评论内容(用于提取 issue key 精确匹配) */\n body?: string;\n}\n\n/** 用户信息 */\nexport interface User {\n id?: number;\n login?: string;\n full_name?: string;\n email?: string;\n avatar_url?: string;\n}\n\n/** 仓库目录/文件条目 */\nexport interface RepositoryContent {\n /** 文件名 */\n name: string;\n /** 文件路径 */\n path: string;\n /** 类型:file 或 dir */\n type: \"file\" | \"dir\";\n /** 文件大小(字节) */\n size?: number;\n /** 下载 URL */\n download_url?: string;\n}\n\n/** 远程仓库引用(解析自浏览器 URL) */\nexport interface RemoteRepoRef {\n /** 仓库所有者 */\n owner: string;\n /** 仓库名称 */\n repo: string;\n /** 子目录路径(空字符串表示根目录) */\n path: string;\n /** 分支/标签(undefined 表示默认分支) */\n ref?: string;\n /** 来源平台类型 */\n provider: GitProviderType;\n /** 原始服务器 URL(如 https://git.bjxgj.com) */\n serverUrl: string;\n}\n\n/** 评论/Issue 的 Reaction(表情符号反应) */\nexport interface Reaction {\n /** 添加 reaction 的用户 */\n user?: {\n id?: number;\n login?: string;\n };\n /** reaction 内容,如 +1, -1, laugh, hooray, confused, heart, rocket, eyes */\n content?: string;\n /** 创建时间 */\n created_at?: string;\n}\n","import type { GitProviderType } from \"./types\";\n\n/** 环境检测结果 */\nexport interface DetectedProviderInfo {\n /** 检测到的 provider 类型 */\n provider: GitProviderType;\n /** 检测到的服务器 URL */\n serverUrl: string;\n /** 检测到的 API Token */\n token: string;\n /** 检测来源说明 */\n source: string;\n}\n\n/**\n * 从环境变量自动检测 Git Provider 类型和配置\n *\n * 检测优先级:\n * 1. 显式指定 `GIT_PROVIDER_TYPE` 环境变量(最高优先级)\n * 2. 存在 `GITEA_TOKEN` → Gitea\n * 3. 存在 `GITLAB_TOKEN` 或 `CI_JOB_TOKEN`(GitLab CI)→ GitLab\n * 4. 存在 `GITHUB_TOKEN` → GitHub\n * 5. 默认 → GitHub\n */\nexport function detectProvider(\n env: Record<string, string | undefined> = process.env,\n): DetectedProviderInfo {\n const explicit = env.GIT_PROVIDER_TYPE as GitProviderType | undefined;\n if (explicit && isValidProvider(explicit)) {\n return buildResult(explicit, env, \"GIT_PROVIDER_TYPE 环境变量\");\n }\n if (env.GITEA_TOKEN) {\n return buildResult(\"gitea\", env, \"检测到 GITEA_TOKEN\");\n }\n if (env.GITLAB_TOKEN || env.CI_JOB_TOKEN) {\n return buildResult(\n \"gitlab\",\n env,\n env.GITLAB_TOKEN ? \"检测到 GITLAB_TOKEN\" : \"检测到 CI_JOB_TOKEN(GitLab CI)\",\n );\n }\n if (env.GITHUB_TOKEN) {\n return buildResult(\"github\", env, \"检测到 GITHUB_TOKEN\");\n }\n return buildResult(\"github\", env, \"默认\");\n}\n\n/** 检查是否为有效的 provider 类型 */\nfunction isValidProvider(value: string): value is GitProviderType {\n return value === \"gitea\" || value === \"github\" || value === \"gitlab\";\n}\n\n/** 根据 provider 类型从环境变量中提取 serverUrl 和 token */\nfunction buildResult(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n source: string,\n): DetectedProviderInfo {\n const serverUrl = resolveServerUrl(provider, env);\n const token = resolveToken(provider, env);\n return { provider, serverUrl, token, source };\n}\n\n/**\n * 解析服务器 URL\n * - 优先使用 GIT_PROVIDER_URL\n * - Gitea: GITEA_SERVER_URL > GITHUB_SERVER_URL\n * - GitHub: GITHUB_API_URL > 默认 https://api.github.com\n * - GitLab: CI_SERVER_URL > GITLAB_URL\n */\nfunction resolveServerUrl(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n): string {\n if (env.GIT_PROVIDER_URL) {\n return env.GIT_PROVIDER_URL;\n }\n if (provider === \"github\") {\n return env.GITHUB_API_URL || \"https://api.github.com\";\n }\n if (provider === \"gitlab\") {\n return env.CI_SERVER_URL || env.GITLAB_URL || \"https://gitlab.com\";\n }\n // Gitea: 优先 GITEA_SERVER_URL,其次从 GITHUB_SERVER_URL 推导\n if (env.GITEA_SERVER_URL) {\n return env.GITEA_SERVER_URL;\n }\n if (env.GITHUB_SERVER_URL) {\n return env.GITHUB_SERVER_URL;\n }\n return \"\";\n}\n\n/**\n * 解析 API Token\n * - 优先使用 GIT_PROVIDER_TOKEN\n * - Gitea: GITEA_TOKEN > GITHUB_TOKEN\n * - GitHub: GITHUB_TOKEN\n * - GitLab: GITLAB_TOKEN > CI_JOB_TOKEN\n */\nfunction resolveToken(provider: GitProviderType, env: Record<string, string | undefined>): string {\n if (env.GIT_PROVIDER_TOKEN) {\n return env.GIT_PROVIDER_TOKEN;\n }\n if (provider === \"github\") {\n return env.GITHUB_TOKEN || \"\";\n }\n if (provider === \"gitlab\") {\n return env.GITLAB_TOKEN || env.CI_JOB_TOKEN || \"\";\n }\n return env.GITEA_TOKEN || env.GITHUB_TOKEN || \"\";\n}\n","import type { RemoteRepoRef, GitProviderType } from \"./types\";\nimport { detectProvider } from \"./detect-provider\";\n\n/** 已知的 GitHub 域名 */\nconst GITHUB_HOSTS = new Set([\"github.com\", \"www.github.com\"]);\n\n/** 已知的 GitLab 域名 */\nconst GITLAB_HOSTS = new Set([\"gitlab.com\", \"www.gitlab.com\"]);\n\n/**\n * 解析浏览器中复制的仓库 URL 为结构化的仓库引用\n *\n * 支持的 URL 格式:\n * - Gitea 仓库:https://git.example.com/owner/repo\n * - Gitea 目录:https://git.example.com/owner/repo/src/branch/main/path/to/dir\n * - Gitea 标签:https://git.example.com/owner/repo/src/tag/v1.0/path/to/dir\n * - Gitea commit:https://git.example.com/owner/repo/src/commit/abc123/path/to/dir\n * - GitHub 仓库:https://github.com/owner/repo\n * - GitHub 目录:https://github.com/owner/repo/tree/main/path/to/dir\n * - GitLab 仓库:https://gitlab.com/owner/repo\n * - GitLab 目录:https://gitlab.com/owner/repo/-/tree/main/path/to/dir\n * - git+ssh URL:git+ssh://git@host/owner/repo.git\n * - SSH URL:git@host:owner/repo.git\n *\n * @returns 解析后的仓库引用,无法解析时返回 null\n */\nexport function parseRepoUrl(url: string): RemoteRepoRef | null {\n const trimmed = url.trim();\n if (!trimmed) return null;\n // SSH 格式: git@host:owner/repo.git\n if (trimmed.startsWith(\"git@\")) {\n return parseSshUrl(trimmed);\n }\n // git+ssh:// 格式\n if (trimmed.startsWith(\"git+ssh://\")) {\n return parseGitSshUrl(trimmed);\n }\n // HTTP(S) URL\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n return parseHttpUrl(trimmed);\n }\n return null;\n}\n\n/** 解析 HTTP(S) URL */\nfunction parseHttpUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const hostname = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `${parsed.protocol}//${parsed.host}`;\n const isGithub = isGithubHost(hostname);\n const isGitlab = isGitlabHost(hostname);\n const provider: GitProviderType = isGithub\n ? \"github\"\n : isGitlab\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n // 仓库根目录(只有 owner/repo)\n if (segments.length === 2) {\n return { owner, repo, path: \"\", provider, serverUrl };\n }\n // GitHub: /owner/repo/tree/branch/path...\n if (isGithub && segments[2] === \"tree\" && segments.length >= 4) {\n const ref = segments[3];\n const path = segments.slice(4).join(\"/\");\n return { owner, repo, path, ref, provider, serverUrl };\n }\n // GitLab: /owner/repo/-/tree/branch/path...\n if (segments[2] === \"-\" && segments[3] === \"tree\" && segments.length >= 5) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: isGitlab ? \"gitlab\" : provider, serverUrl };\n }\n // Gitea: /owner/repo/src/branch/<branch>/path...\n // /owner/repo/src/tag/<tag>/path...\n // /owner/repo/src/commit/<sha>/path...\n if (segments[2] === \"src\" && segments.length >= 4) {\n const refType = segments[3]; // \"branch\", \"tag\", \"commit\"\n if (\n (refType === \"branch\" || refType === \"tag\" || refType === \"commit\") &&\n segments.length >= 5\n ) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: \"gitea\", serverUrl };\n }\n }\n // 无法识别的子路径,当作仓库根目录\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git@host:owner/repo.git 格式 */\nfunction parseSshUrl(url: string): RemoteRepoRef | null {\n const match = url.match(/^git@([^:]+):(.+?)(?:\\.git)?$/);\n if (!match) return null;\n const host = match[1];\n const pathPart = match[2];\n const segments = pathPart.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1];\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git+ssh://git@host/owner/repo.git 格式 */\nfunction parseGitSshUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url.replace(\"git+ssh://\", \"ssh://\"));\n } catch {\n return null;\n }\n const host = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 判断是否为 GitHub 域名 */\nfunction isGithubHost(hostname: string): boolean {\n return GITHUB_HOSTS.has(hostname) || hostname.endsWith(\".github.com\");\n}\n\n/** 判断是否为 GitLab 域名 */\nfunction isGitlabHost(hostname: string): boolean {\n return GITLAB_HOSTS.has(hostname) || hostname.endsWith(\".gitlab.com\");\n}\n\n/** 根据服务器 URL 检测 provider 类型(非 GitHub/GitLab 默认为 Gitea) */\nfunction detectProviderForHost(serverUrl: string): GitProviderType {\n const detected = detectProvider({ GIT_PROVIDER_URL: serverUrl });\n return detected.provider;\n}\n","import type { GitDiffFile } from \"./git-sdk.types\";\n\nconst GIT_STATUS_MAP: Record<string, string> = {\n A: \"added\",\n M: \"modified\",\n D: \"deleted\",\n R: \"renamed\",\n C: \"copied\",\n};\n\nexport function mapGitStatus(status: string): string {\n return GIT_STATUS_MAP[status] || \"modified\";\n}\n\nexport function parseChangedLinesFromPatch(patch?: string): Set<number> {\n const changedLines = new Set<number>();\n if (!patch) return changedLines;\n\n const lines = patch.split(\"\\n\");\n let currentLine = 0;\n\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n changedLines.add(currentLine);\n currentLine++;\n } else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n // 删除行,不增加 currentLine\n } else if (!line.startsWith(\"\\\\\")) {\n currentLine++;\n }\n }\n\n return changedLines;\n}\n\n/**\n * 表示一个 diff hunk 的行号变更信息\n */\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n}\n\n/**\n * 从 patch 中解析所有 hunk 信息\n */\nexport function parseHunksFromPatch(patch?: string): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n if (!patch) return hunks;\n\n const lines = patch.split(\"\\n\");\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (hunkMatch) {\n hunks.push({\n oldStart: parseInt(hunkMatch[1], 10),\n oldCount: parseInt(hunkMatch[2] ?? \"1\", 10),\n newStart: parseInt(hunkMatch[3], 10),\n newCount: parseInt(hunkMatch[4] ?? \"1\", 10),\n });\n }\n }\n return hunks;\n}\n\n/**\n * 根据 diff hunks 计算旧行号对应的新行号\n * @param oldLine 旧文件中的行号\n * @param hunks diff hunk 列表\n * @returns 新行号,如果该行被删除则返回 null\n */\nexport function calculateNewLineNumber(oldLine: number, hunks: DiffHunk[]): number | null {\n let offset = 0;\n\n for (const hunk of hunks) {\n const oldEnd = hunk.oldStart + hunk.oldCount - 1;\n\n if (oldLine < hunk.oldStart) {\n // 行号在这个 hunk 之前,应用之前累积的偏移\n break;\n }\n\n if (oldLine >= hunk.oldStart && oldLine <= oldEnd) {\n // 行号在这个 hunk 的删除范围内\n // 需要检查这一行是否被删除\n // 简化处理:如果 hunk 有删除(oldCount > 0),且行在范围内,认为可能被修改\n // 返回对应的新位置(基于 hunk 的起始位置)\n const lineOffsetInHunk = oldLine - hunk.oldStart;\n if (lineOffsetInHunk < hunk.newCount) {\n // 行仍然存在(可能被修改)\n return hunk.newStart + lineOffsetInHunk + offset;\n } else {\n // 行被删除\n return null;\n }\n }\n\n // 计算这个 hunk 带来的偏移\n offset += hunk.newCount - hunk.oldCount;\n }\n\n // 行号在所有 hunk 之后,应用总偏移\n return oldLine + offset;\n}\n\n/**\n * 批量计算文件中多个旧行号对应的新行号\n * @param oldLines 旧行号数组\n * @param patch diff patch 文本\n * @returns Map<旧行号, 新行号>,被删除的行不在结果中\n */\nexport function calculateLineOffsets(\n oldLines: number[],\n patch?: string,\n): Map<number, number | null> {\n const result = new Map<number, number | null>();\n const hunks = parseHunksFromPatch(patch);\n\n for (const oldLine of oldLines) {\n result.set(oldLine, calculateNewLineNumber(oldLine, hunks));\n }\n\n return result;\n}\n\nexport function parseDiffText(diffText: string): GitDiffFile[] {\n const files: GitDiffFile[] = [];\n const fileDiffs = diffText.split(/^diff --git /m).filter(Boolean);\n\n for (const fileDiff of fileDiffs) {\n const headerMatch = fileDiff.match(/^a\\/(.+?) b\\/(.+?)[\\r\\n]/);\n if (!headerMatch) continue;\n\n const filename = headerMatch[2];\n const patchStart = fileDiff.indexOf(\"@@\");\n if (patchStart === -1) continue;\n\n const patch = fileDiff.slice(patchStart);\n files.push({ filename, patch });\n }\n\n return files;\n}\n","import { execSync } from \"child_process\";\nimport { parseDiffText } from \"../../git-sdk/git-sdk-diff.utils\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * Gitea 平台适配器\n */\nexport class GiteaAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v1${path}`;\n const headers: Record<string, string> = {\n Authorization: `token ${this.token}`,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.request<Repository>(\"GET\", `/repos/${owner}/${repo}`);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.request<Branch>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.request<BranchProtection[]>(\"GET\", `/repos/${owner}/${repo}/branch_protections`);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"GET\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"POST\",\n `/repos/${owner}/${repo}/branch_protections`,\n options,\n );\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"PATCH\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n options,\n );\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const protectionOptions = hasWhitelist\n ? {\n enable_push: true,\n enable_push_whitelist: true,\n push_whitelist_usernames: pushWhitelistUsernames,\n }\n : { enable_push: false };\n if (existing) {\n return this.editBranchProtection(\n owner,\n repo,\n existing.rule_name || branch,\n protectionOptions,\n );\n } else {\n return this.createBranchProtection(owner, repo, {\n rule_name: branch,\n branch_name: branch,\n ...protectionOptions,\n });\n }\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n await this.deleteBranchProtection(owner, repo, existing.rule_name || branch);\n return existing;\n }\n return null;\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n const listResult = execSync(\n `curl -s -X GET \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n const protections = JSON.parse(listResult) as Array<{\n rule_name?: string;\n branch_name?: string;\n }>;\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n const ruleName = existing.rule_name || branch;\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections/${ruleName}\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${ruleName}`);\n } else {\n console.log(`✅ 分支本身没有保护规则,无需解锁`);\n }\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.request<PullRequest>(\"GET\", `/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.request<PullRequest>(\"PATCH\", `/repos/${owner}/${repo}/pulls/${index}`, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n return this.request<PullRequest[]>(\"GET\", `/repos/${owner}/${repo}/pulls${query}`);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"limit\", String(limit));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", options.sort);\n if (options?.milestone) params.set(\"milestone\", String(options.milestone));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const prs = await this.request<PullRequest[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!prs || prs.length === 0) break;\n allPRs.push(...prs);\n if (prs.length < limit) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const commits = await this.request<PullRequestCommit[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&limit=${limit}`,\n );\n if (!commits || commits.length === 0) break;\n allCommits.push(...commits);\n if (commits.length < limit) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const files = await this.request<ChangedFile[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files`,\n );\n const needsPatch = files.some((f) => !f.patch && f.status !== \"deleted\");\n if (!needsPatch) {\n return files;\n }\n try {\n const diffText = await this.getPullRequestDiff(owner, repo, index);\n const diffFiles = parseDiffText(diffText);\n const patchMap = new Map(diffFiles.map((f) => [f.filename, f.patch]));\n for (const file of files) {\n if (!file.patch && file.filename) {\n file.patch = patchMap.get(file.filename);\n }\n }\n } catch (error) {\n console.warn(`警告: 无法获取 PR diff 来填充 patch 字段:`, error);\n }\n return files;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/pulls/${index}.diff`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.request<CommitInfo>(\"GET\", `/repos/${owner}/${repo}/git/commits/${sha}`);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(\n `${this.baseUrl}/api/v1/repos/${owner}/${repo}/compare/${baseSha}...${headSha}.diff`,\n );\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/git/commits/${sha}.diff`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const url = `${this.baseUrl}/api/v1/repos/${owner}/${repo}/raw/${encodeURIComponent(filepath)}${query}`;\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${encodeURIComponent(path)}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<\n Array<{ name: string; path: string; type: string; size: number; download_url?: string }>\n >(\"GET\", `/repos/${owner}/${repo}/contents${encodedPath}${query}`);\n return result.map((item) => ({\n name: item.name,\n path: item.path,\n type: item.type === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size,\n download_url: item.download_url,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n return this.request<Issue>(\"POST\", `/repos/${owner}/${repo}/issues`, options);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.request<IssueComment[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/comments`);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n options,\n );\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.request<PullReview>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n options,\n );\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const allReviews: PullReview[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const reviews = await this.request<PullReview[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews?page=${page}&limit=${limit}`,\n );\n if (!reviews || reviews.length === 0) break;\n allReviews.push(...reviews);\n if (reviews.length < limit) break;\n page++;\n }\n return allReviews;\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // Gitea 不支持更新 review,使用删除+创建的方式模拟\n await this.deletePullReview(owner, repo, index, reviewId);\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.request<PullReviewComment[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n const result: ResolvedThread[] = [];\n try {\n const reviews = await this.listPullReviews(owner, repo, index);\n for (const review of reviews) {\n if (!review.id) continue;\n const comments = await this.listPullReviewComments(owner, repo, index, review.id);\n for (const comment of comments) {\n if (!comment.resolver) continue;\n result.push({\n path: comment.path,\n line: comment.position,\n resolvedBy: {\n id: comment.resolver.id,\n login: comment.resolver.login,\n },\n body: comment.body,\n });\n }\n }\n } catch {\n // 获取失败时返回空数组,不影响主流程\n }\n return result;\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n // Gitea: PR review comment reactions 使用与 issue comment 相同的路径\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.request<Reaction[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/reactions`);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"limit\", String(limit));\n const result = await this.request<{ data: User[] }>(\n \"GET\",\n `/users/search?${params.toString()}`,\n );\n return result.data || [];\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.request<User[]>(\"GET\", `/teams/${teamId}/members`);\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n DIFF_SIDE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/** GraphQL review thread 节点类型 */\ninterface GraphQLReviewThread {\n isResolved: boolean;\n resolvedBy?: { login: string; databaseId: number } | null;\n path?: string | null;\n line?: number | null;\n comments: { nodes: Array<{ databaseId: number; body?: string }> };\n}\n\n/**\n * GitHub 平台适配器\n */\nexport class GithubAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github+json\",\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async requestGraphQL<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const graphqlUrl =\n this.baseUrl.replace(/\\/v3\\/?$/, \"\").replace(/\\/api\\/v3\\/?$/, \"\") + \"/graphql\";\n const response = await fetch(graphqlUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ query, variables }),\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub GraphQL error: ${response.status} - ${errorText}`);\n }\n const json = (await response.json()) as { data: T; errors?: unknown[] };\n if (json.errors) {\n throw new Error(`GitHub GraphQL errors: ${JSON.stringify(json.errors)}`);\n }\n return json.data;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github.v3.diff\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const result = await this.request<Record<string, unknown>>(\"GET\", `/repos/${owner}/${repo}`);\n return this.mapRepository(result);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n return this.mapBranch(result);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n try {\n const rules = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/rules/rulesets`,\n );\n return rules.map((rule) => this.mapRulesetToProtection(rule));\n } catch {\n return [];\n }\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const branchName = options.branch_name || options.rule_name || \"\";\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branchName)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branchName);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const body: Record<string, unknown> = {\n required_status_checks: null,\n enforce_admins: true,\n required_pull_request_reviews: null,\n restrictions: hasWhitelist\n ? { users: pushWhitelistUsernames, teams: [] }\n : { users: [], teams: [] },\n };\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branch);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/repos/${owner}/${repo}/branches/${branch}/protection\" -H \"Authorization: Bearer ${this.token}\" -H \"Accept: application/vnd.github+json\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n );\n return this.mapPullRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n options,\n );\n return this.mapPullRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls${query}`,\n );\n return results.map((pr) => this.mapPullRequest(pr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", this.mapSortParam(options.sort));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allPRs.push(...results.map((pr) => this.mapPullRequest(pr)));\n if (results.length < perPage) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((f) => this.mapChangedFile(f)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/commits/${sha}`,\n );\n const commit = this.mapCommit(result);\n const files = ((result.files as Array<Record<string, unknown>>) || []).map((f) =>\n this.mapChangedFile(f),\n );\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/compare/${baseSha}...${headSha}`);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/commits/${sha}`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const result = await this.request<{ content?: string; encoding?: string }>(\n \"GET\",\n `/repos/${owner}/${repo}/contents/${filepath}${query}`,\n );\n if (result.content && result.encoding === \"base64\") {\n return Buffer.from(result.content, \"base64\").toString(\"utf-8\");\n }\n return result.content || \"\";\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${path}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/contents${encodedPath}${query}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size as number,\n download_url: item.download_url as string,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const body: Record<string, unknown> = {\n title: options.title,\n body: options.body,\n assignees: options.assignees,\n labels: options.labels,\n milestone: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n );\n return results.map((c) => this.mapIssueComment(c));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n { body: options.body },\n );\n return this.mapIssueComment(result);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n return this.mapIssueComment(result);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const body: Record<string, unknown> = {\n event: this.mapReviewEvent(options.event),\n body: options.body,\n commit_id: options.commit_id,\n };\n if (options.comments?.length) {\n body.comments = options.comments.map((c) => ({\n path: c.path,\n body: c.body,\n line: c.new_position,\n side: DIFF_SIDE.RIGHT,\n }));\n }\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n body,\n );\n return this.mapPullReview(result);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n );\n return results.map((r) => this.mapPullReview(r));\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // GitHub 的 updatePullReview 只能更新 PENDING 状态的 review\n // 已提交的 review 无法更新,所以使用删除+创建的方式\n try {\n await this.deletePullReview(owner, repo, index, reviewId);\n } catch {\n // 已提交的 review 无法删除,忽略错误\n }\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n const comments = results.map((c) => this.mapPullReviewComment(c));\n // 通过 GraphQL 补充 resolved 状态\n try {\n const resolvedMap = await this.fetchResolvedThreads(owner, repo, index);\n for (const comment of comments) {\n if (comment.id && resolvedMap.has(comment.id)) {\n comment.resolver = resolvedMap.get(comment.id) ?? null;\n }\n }\n } catch {\n // GraphQL 查询失败不影响主流程\n }\n return comments;\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"per_page\", String(limit));\n const result = await this.request<{ items: Array<Record<string, unknown>> }>(\n \"GET\",\n `/search/users?${params.toString()}`,\n );\n return (result.items || []).map((u) => this.mapUser(u));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/teams/${teamId}/members`,\n );\n return results.map((u) => this.mapUser(u));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapRepository(data: Record<string, unknown>): Repository {\n const owner = data.owner as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n owner: owner\n ? {\n id: owner.id as number,\n login: owner.login as string,\n full_name: owner.full_name as string,\n }\n : undefined,\n name: data.name as string,\n full_name: data.full_name as string,\n default_branch: data.default_branch as string,\n };\n }\n\n protected mapBranch(data: Record<string, unknown>): Branch {\n const commit = data.commit as Record<string, unknown> | undefined;\n const commitObj = commit?.commit as Record<string, unknown> | undefined;\n return {\n name: data.name as string,\n protected: data.protected as boolean,\n commit: commit\n ? {\n id: commit.sha as string,\n message: commitObj?.message as string,\n }\n : undefined,\n };\n }\n\n protected mapPullRequest(data: Record<string, unknown>): PullRequest {\n const head = data.head as Record<string, unknown> | undefined;\n const base = data.base as Record<string, unknown> | undefined;\n const user = data.user as Record<string, unknown> | undefined;\n const reviewers = data.requested_reviewers as Array<Record<string, unknown>> | undefined;\n const teams = data.requested_teams as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n head: head\n ? {\n ref: head.ref as string,\n sha: head.sha as string,\n repo: head.repo ? this.mapRepository(head.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n base: base\n ? {\n ref: base.ref as string,\n sha: base.sha as string,\n repo: base.repo ? this.mapRepository(base.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.login as string,\n })),\n requested_reviewers_teams: teams?.map((t) => ({\n id: t.id as number,\n name: t.name as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapCommit(data: Record<string, unknown>): PullRequestCommit {\n const commit = data.commit as Record<string, unknown> | undefined;\n const author = commit?.author as Record<string, unknown> | undefined;\n const ghAuthor = data.author as Record<string, unknown> | undefined;\n const ghCommitter = data.committer as Record<string, unknown> | undefined;\n return {\n sha: data.sha as string,\n commit: commit\n ? {\n message: commit.message as string,\n author: author\n ? {\n name: author.name as string,\n email: author.email as string,\n date: author.date as string,\n }\n : undefined,\n }\n : undefined,\n author: ghAuthor ? { id: ghAuthor.id as number, login: ghAuthor.login as string } : undefined,\n committer: ghCommitter\n ? { id: ghCommitter.id as number, login: ghCommitter.login as string }\n : undefined,\n };\n }\n\n protected mapChangedFile(data: Record<string, unknown>): ChangedFile {\n return {\n filename: data.filename as string,\n status: data.status as string,\n additions: data.additions as number,\n deletions: data.deletions as number,\n changes: data.changes as number,\n patch: data.patch as string,\n raw_url: data.raw_url as string,\n contents_url: data.contents_url as string,\n };\n }\n\n protected mapIssueComment(data: Record<string, unknown>): IssueComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const user = data.user as Record<string, unknown> | undefined;\n const labels = data.labels as Array<Record<string, unknown>> | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n labels: labels?.map((l) => ({\n id: l.id as number,\n name: l.name as string,\n color: l.color as string,\n })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.login as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapPullReview(data: Record<string, unknown>): PullReview {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.submitted_at as string,\n updated_at: data.submitted_at as string,\n commit_id: data.commit_id as string,\n };\n }\n\n /**\n * 通过 GraphQL 查询 PR 的 review threads resolved 状态\n * 返回 Map<commentId, resolver>(用于 listPullReviewComments 内部补充 resolver)\n */\n protected async fetchResolvedThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<Map<number, { id?: number; login?: string } | null>> {\n const threads = await this.queryReviewThreads(owner, repo, prNumber);\n const resolvedMap = new Map<number, { id?: number; login?: string } | null>();\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n const firstComment = thread.comments.nodes[0];\n if (!firstComment?.databaseId) continue;\n resolvedMap.set(\n firstComment.databaseId,\n thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n );\n }\n return resolvedMap;\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n const threads = await this.queryReviewThreads(owner, repo, index);\n const result: ResolvedThread[] = [];\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n const firstComment = thread.comments.nodes[0];\n result.push({\n path: thread.path ?? undefined,\n line: thread.line ?? undefined,\n resolvedBy: thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n body: firstComment?.body,\n });\n }\n return result;\n }\n\n /**\n * GraphQL 查询 PR 的所有 review threads\n */\n protected async queryReviewThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<GraphQLReviewThread[]> {\n const QUERY = `\n query($owner: String!, $repo: String!, $prNumber: Int!) {\n repository(owner: $owner, name: $repo) {\n pullRequest(number: $prNumber) {\n reviewThreads(first: 100) {\n nodes {\n isResolved\n resolvedBy { login databaseId }\n path\n line\n comments(first: 1) {\n nodes { databaseId body }\n }\n }\n }\n }\n }\n }\n `;\n interface GraphQLResult {\n repository: {\n pullRequest: {\n reviewThreads: {\n nodes: GraphQLReviewThread[];\n };\n };\n };\n }\n const data = await this.requestGraphQL<GraphQLResult>(QUERY, {\n owner,\n repo,\n prNumber,\n });\n return data.repository.pullRequest.reviewThreads.nodes;\n }\n\n protected mapPullReviewComment(data: Record<string, unknown>): PullReviewComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n path: data.path as string,\n position: data.position as number,\n original_position: data.original_position as number,\n commit_id: data.commit_id as string,\n original_commit_id: data.original_commit_id as string,\n diff_hunk: data.diff_hunk as string,\n pull_request_review_id: data.pull_request_review_id as number,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapReaction(data: Record<string, unknown>): Reaction {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n content: data.content as string,\n created_at: data.created_at as string,\n };\n }\n\n protected mapUser(data: Record<string, unknown>): User {\n return {\n id: data.id as number,\n login: data.login as string,\n full_name: data.name as string,\n email: data.email as string,\n avatar_url: data.avatar_url as string,\n };\n }\n\n protected mapGithubProtection(\n data: Record<string, unknown>,\n branchName: string,\n ): BranchProtection {\n const requiredReviews = data.required_pull_request_reviews as\n | Record<string, unknown>\n | undefined;\n return {\n branch_name: branchName,\n rule_name: branchName,\n required_approvals: requiredReviews?.required_approving_review_count as number,\n dismiss_stale_approvals: requiredReviews?.dismiss_stale_reviews as boolean,\n enable_push: true,\n };\n }\n\n protected mapRulesetToProtection(data: Record<string, unknown>): BranchProtection {\n return {\n rule_name: data.name as string,\n branch_name: data.name as string,\n };\n }\n\n protected buildGithubProtectionBody(\n options: CreateBranchProtectionOption | EditBranchProtectionOption,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n required_status_checks: options.enable_status_check\n ? { strict: true, contexts: options.status_check_contexts || [] }\n : null,\n enforce_admins: options.block_admin_merge_override ?? false,\n required_pull_request_reviews: options.required_approvals\n ? {\n required_approving_review_count: options.required_approvals,\n dismiss_stale_reviews: options.dismiss_stale_approvals ?? false,\n }\n : null,\n restrictions: options.enable_push_whitelist\n ? {\n users: options.push_whitelist_usernames || [],\n teams: options.push_whitelist_teams || [],\n }\n : null,\n };\n return body;\n }\n\n protected mapReviewEvent(event?: string): string {\n const eventMap: Record<string, string> = {\n [REVIEW_STATE.APPROVE]: REVIEW_STATE.APPROVE,\n [REVIEW_STATE.REQUEST_CHANGES]: REVIEW_STATE.REQUEST_CHANGES,\n [REVIEW_STATE.COMMENT]: REVIEW_STATE.COMMENT,\n [REVIEW_STATE.PENDING]: REVIEW_STATE.PENDING,\n };\n return event ? eventMap[event] || event : REVIEW_STATE.COMMENT;\n }\n\n protected mapSortParam(sort: string): string {\n const sortMap: Record<string, string> = {\n oldest: \"created\",\n recentupdate: \"updated\",\n leastupdate: \"updated\",\n mostcomment: \"comments\",\n leastcomment: \"comments\",\n };\n return sortMap[sort] || \"created\";\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * GitLab 平台适配器\n *\n * GitLab API 特点:\n * - 使用 PRIVATE-TOKEN 认证\n * - 项目通过 URL-encoded path(owner/repo)标识\n * - Merge Request(MR)对应 Pull Request\n * - Notes 对应 Comments/Reviews\n * - API 前缀 /api/v4\n */\nexport class GitlabAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n /** 将 owner/repo 编码为 GitLab 项目路径 */\n protected encodeProject(owner: string, repo: string): string {\n return encodeURIComponent(`${owner}/${repo}`);\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const headers: Record<string, string> = {\n \"PRIVATE-TOKEN\": this.token,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(path: string): Promise<string> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\"GET\", `/projects/${project}`);\n const namespace = result.namespace as Record<string, unknown> | undefined;\n return {\n id: result.id as number,\n name: result.name as string,\n full_name: result.path_with_namespace as string,\n default_branch: result.default_branch as string,\n owner: namespace\n ? {\n id: namespace.id as number,\n login: namespace.path as string,\n full_name: namespace.name as string,\n }\n : undefined,\n };\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/branches/${encodeURIComponent(branch)}`,\n );\n const commit = result.commit as Record<string, unknown> | undefined;\n return {\n name: result.name as string,\n protected: result.protected as boolean,\n commit: commit ? { id: commit.id as string, message: commit.message as string } : undefined,\n };\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/protected_branches`,\n );\n return results.map((p) => this.mapProtection(p));\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n return this.mapProtection(result);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const branchName = options.branch_name || options.rule_name || \"\";\n const body: Record<string, unknown> = {\n name: branchName,\n push_access_level: options.enable_push ? 30 : 0, // 30=Developer, 0=No one\n merge_access_level: 30,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/protected_branches`,\n body,\n );\n return this.mapProtection(result);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n // GitLab 不支持直接编辑,需要先删除再创建\n await this.deleteBranchProtection(owner, repo, name);\n return this.createBranchProtection(owner, repo, {\n branch_name: name,\n rule_name: name,\n ...options,\n });\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n // 先尝试删除已有保护\n try {\n await this.deleteBranchProtection(owner, repo, branch);\n } catch {\n // 不存在时忽略\n }\n const pushLevel = options?.pushWhitelistUsernames?.length ? 30 : 0;\n return this.createBranchProtection(owner, repo, {\n branch_name: branch,\n rule_name: branch,\n enable_push: pushLevel > 0,\n });\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n const project = this.encodeProject(owner, repo);\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v4/projects/${project}/protected_branches/${encodeURIComponent(branch)}\" -H \"PRIVATE-TOKEN: ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Merge Request(对应 Pull Request) ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}`,\n );\n return this.mapMergeRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {};\n if (options.title) body.title = options.title;\n if (options.body !== undefined) body.description = options.body;\n if (options.state) body.state_event = options.state === \"closed\" ? \"close\" : \"reopen\";\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}`,\n body,\n );\n return this.mapMergeRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const glState = this.mapStateParam(state);\n const query = glState ? `?state=${glState}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests${query}`,\n );\n return results.map((mr) => this.mapMergeRequest(mr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const allMRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", this.mapStateParam(options.state) || \"all\");\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allMRs.push(...results.map((mr) => this.mapMergeRequest(mr)));\n if (results.length < perPage) break;\n page++;\n }\n return allMRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const project = this.encodeProject(owner, repo);\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapGitlabCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const project = this.encodeProject(owner, repo);\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/diffs?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((d) => this.mapDiffToChangedFile(d)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n const project = this.encodeProject(owner, repo);\n return this.fetchText(`/projects/${project}/merge_requests/${index}/raw_diffs`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}`,\n );\n // 获取 commit 的 diff 来填充 files\n let files: ChangedFile[] = [];\n try {\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n files = diffs.map((d) => this.mapDiffToChangedFile(d));\n } catch {\n // diff 获取失败时忽略\n }\n const commit = this.mapGitlabCommit(result);\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<{ diffs: Array<Record<string, unknown>> }>(\n \"GET\",\n `/projects/${project}/repository/compare?from=${encodeURIComponent(baseSha)}&to=${encodeURIComponent(headSha)}`,\n );\n // 将 diffs 拼接为 unified diff 文本\n return (result.diffs || [])\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n return diffs\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const encodedPath = encodeURIComponent(filepath);\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const url = `${this.baseUrl}/api/v4/projects/${project}/repository/files/${encodedPath}/raw${query}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(\n `GitLab API error: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n return response.text();\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const project = this.encodeProject(owner, repo);\n const params = new URLSearchParams();\n if (path) params.set(\"path\", path);\n if (ref) params.set(\"ref\", ref);\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/tree?${params.toString()}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"tree\" ? (\"dir\" as const) : (\"file\" as const),\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {\n title: options.title,\n description: options.body,\n assignee_ids: options.assignees,\n labels: options.labels?.join(\",\"),\n milestone_id: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab: MR notes 作为 issue comments\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results.filter((n) => !(n.system as boolean)).map((n) => this.mapNote(n));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n return this.mapNote(result);\n }\n\n async updateIssueComment(\n _owner: string,\n _repo: string,\n _commentId: number,\n _body: string,\n ): Promise<IssueComment> {\n // GitLab 更新 note 需要 noteable_iid,接口签名不含此信息\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 更新评论,请使用 createIssueComment 替代\");\n }\n\n async deleteIssueComment(_owner: string, _repo: string, _commentId: number): Promise<void> {\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 删除评论\");\n }\n\n // ============ MR Review(对应 PR Review) ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 note 模拟\n // 如果有 body,创建一个总体评论\n if (options.body) {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n const note = this.mapNote(result);\n return {\n id: note.id,\n body: note.body,\n state: options.event || REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n }\n // 如果有行级评论,逐个创建\n if (options.comments?.length) {\n for (const comment of options.comments) {\n await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: `**${comment.path}** (line ${comment.new_position})\\n\\n${comment.body}` },\n );\n }\n }\n // 如果是 APPROVE 事件,调用 approve API\n if (options.event === REVIEW_STATE.APPROVE) {\n await this.request<void>(\"POST\", `/projects/${project}/merge_requests/${index}/approve`);\n }\n return {\n id: 0,\n body: options.body || \"\",\n state: options.event || REVIEW_STATE.COMMENT,\n };\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 notes 模拟\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !(n.system as boolean))\n .map((n) => {\n const note = this.mapNote(n);\n return {\n id: note.id,\n body: note.body,\n state: REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n });\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n { body },\n );\n return {\n id: result.id as number,\n body: result.body as string,\n state: REVIEW_STATE.COMMENT,\n user: result.author\n ? {\n id: (result.author as Record<string, unknown>).id as number,\n login: (result.author as Record<string, unknown>).username as string,\n }\n : undefined,\n };\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n _reviewId: number,\n ): Promise<PullReviewComment[]> {\n // GitLab 没有 review 下的 comments 概念,返回所有 diff notes\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !!(n.position as Record<string, unknown> | undefined))\n .map((n) => {\n const user = (n.author as Record<string, unknown>) || {};\n const position = (n.position as Record<string, unknown>) || {};\n return {\n id: n.id as number,\n body: n.body as string,\n path: (position.new_path || position.old_path) as string,\n position: position.new_line as number,\n original_position: position.old_line as number,\n user: { id: user.id as number, login: user.username as string },\n created_at: n.created_at as string,\n updated_at: n.updated_at as string,\n };\n });\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n // GitLab: 删除 MR note\n const project = this.encodeProject(owner, repo);\n // GitLab 删除 note 需要 merge_request_iid,但此处只有 commentId(note_id)\n // 使用全局 note 删除不可行,需要通过其他方式获取 MR iid\n // 暂时忽略,GitLab 场景下行级评论删除不常用\n console.warn(\n `⚠️ GitLab 暂不支持删除单条 review comment (id: ${commentId}, project: ${project})`,\n );\n }\n\n async listResolvedThreads(): Promise<ResolvedThread[]> {\n return [];\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getPullReviewCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const project = this.encodeProject(owner, repo);\n try {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/award_emoji`,\n );\n return results.map((r) => {\n const user = r.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.username as string } : undefined,\n content: r.name as string,\n created_at: r.created_at as string,\n };\n });\n } catch {\n return [];\n }\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"search\", query);\n params.set(\"per_page\", String(limit));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/users?${params.toString()}`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n email: u.email as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n // GitLab: group members\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/groups/${teamId}/members`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapProtection(data: Record<string, unknown>): BranchProtection {\n const pushAccess = data.push_access_levels as Array<Record<string, unknown>> | undefined;\n return {\n branch_name: data.name as string,\n rule_name: data.name as string,\n enable_push: pushAccess ? pushAccess.some((l) => (l.access_level as number) > 0) : false,\n };\n }\n\n protected mapMergeRequest(data: Record<string, unknown>): PullRequest {\n const author = data.author as Record<string, unknown> | undefined;\n const reviewers = data.reviewers as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n head: {\n ref: data.source_branch as string,\n sha: data.sha as string,\n },\n base: {\n ref: data.target_branch as string,\n sha: data.diff_refs\n ? ((data.diff_refs as Record<string, unknown>).base_sha as string)\n : undefined,\n },\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.username as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapGitlabCommit(data: Record<string, unknown>): PullRequestCommit {\n return {\n sha: (data.id || data.sha) as string,\n commit: {\n message: (data.message || data.title) as string,\n author: {\n name: data.author_name as string,\n email: data.author_email as string,\n date: (data.authored_date || data.created_at) as string,\n },\n },\n author: data.author_name ? { login: data.author_name as string } : undefined,\n committer: data.committer_name ? { login: data.committer_name as string } : undefined,\n };\n }\n\n protected mapDiffToChangedFile(data: Record<string, unknown>): ChangedFile {\n let status = \"modified\";\n if (data.new_file) status = \"added\";\n else if (data.deleted_file) status = \"deleted\";\n else if (data.renamed_file) status = \"renamed\";\n const diff = data.diff as string | undefined;\n // 从 diff 中计算 additions/deletions\n let additions = 0;\n let deletions = 0;\n if (diff) {\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) additions++;\n if (line.startsWith(\"-\") && !line.startsWith(\"---\")) deletions++;\n }\n }\n return {\n filename: (data.new_path || data.old_path) as string,\n status,\n additions,\n deletions,\n changes: additions + deletions,\n patch: diff,\n };\n }\n\n protected mapNote(data: Record<string, unknown>): IssueComment {\n const author = data.author as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const author = data.author as Record<string, unknown> | undefined;\n const labels = data.labels as string[] | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n labels: labels?.map((l) => ({ name: l })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.username as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.web_url as string,\n };\n }\n\n protected mapStateParam(state?: \"open\" | \"closed\" | \"all\"): string | undefined {\n if (!state) return undefined;\n const stateMap: Record<string, string> = {\n open: \"opened\",\n closed: \"closed\",\n all: \"all\",\n };\n return stateMap[state] || state;\n }\n}\n","import type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"./git-provider.interface\";\nimport {\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"./types\";\nimport { GiteaAdapter } from \"./adapters/gitea.adapter\";\nimport { GithubAdapter } from \"./adapters/github.adapter\";\nimport { GitlabAdapter } from \"./adapters/gitlab.adapter\";\n\n/**\n * Git Provider 统一服务\n * 根据配置的 provider 类型代理到对应的适配器实现\n */\nexport class GitProviderService implements GitProvider {\n protected readonly adapter: GitProvider;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.adapter = this.createAdapter(options);\n }\n\n /**\n * 根据 provider 类型创建对应的适配器\n */\n protected createAdapter(options: GitProviderModuleOptions): GitProvider {\n switch (options.provider) {\n case \"gitea\":\n return new GiteaAdapter(options);\n case \"github\":\n return new GithubAdapter(options);\n case \"gitlab\":\n return new GitlabAdapter(options);\n default:\n throw new Error(`不支持的 Git Provider 类型: ${options.provider}`);\n }\n }\n\n // ============ 配置验证 ============\n\n validateConfig(): void {\n this.adapter.validateConfig();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.adapter.getRepository(owner, repo);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.adapter.getBranch(owner, repo, branch);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.adapter.listBranchProtections(owner, repo);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.adapter.getBranchProtection(owner, repo, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.createBranchProtection(owner, repo, options);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.editBranchProtection(owner, repo, name, options);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n return this.adapter.deleteBranchProtection(owner, repo, name);\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n return this.adapter.lockBranch(owner, repo, branch, options);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n return this.adapter.unlockBranch(owner, repo, branch);\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n this.adapter.unlockBranchSync(owner, repo, branch);\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.adapter.getPullRequest(owner, repo, index);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.adapter.editPullRequest(owner, repo, index, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n return this.adapter.listPullRequests(owner, repo, state);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n return this.adapter.listAllPullRequests(owner, repo, options);\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n return this.adapter.getPullRequestCommits(owner, repo, index);\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n return this.adapter.getPullRequestFiles(owner, repo, index);\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.adapter.getPullRequestDiff(owner, repo, index);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.adapter.getCommit(owner, repo, sha);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.adapter.getCompareDiff(owner, repo, baseSha, headSha);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.adapter.getCommitDiff(owner, repo, sha);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n return this.adapter.getFileContent(owner, repo, filepath, ref);\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path?: string,\n ref?: string,\n ): Promise<RepositoryContent[]> {\n return this.adapter.listRepositoryContents(owner, repo, path, ref);\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n return this.adapter.createIssue(owner, repo, options);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.adapter.listIssueComments(owner, repo, index);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.adapter.createIssueComment(owner, repo, index, options);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.adapter.updateIssueComment(owner, repo, commentId, body);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deleteIssueComment(owner, repo, commentId);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.adapter.createPullReview(owner, repo, index, options);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n return this.adapter.listPullReviews(owner, repo, index);\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n return this.adapter.updatePullReview(owner, repo, index, reviewId, body);\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n return this.adapter.deletePullReview(owner, repo, index, reviewId);\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.adapter.listPullReviewComments(owner, repo, index, reviewId);\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deletePullReviewComment(owner, repo, commentId);\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n return this.adapter.listResolvedThreads(owner, repo, index);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getIssueCommentReactions(owner, repo, commentId);\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getPullReviewCommentReactions(owner, repo, commentId);\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.adapter.getIssueReactions(owner, repo, index);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit?: number): Promise<User[]> {\n return this.adapter.searchUsers(query, limit);\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.adapter.getTeamMembers(teamId);\n }\n}\n","export * from \"./gitea.adapter\";\nexport * from \"./github.adapter\";\nexport * from \"./gitlab.adapter\";\n","export * from \"./types\";\nexport * from \"./detect-provider\";\nexport * from \"./parse-repo-url\";\nexport * from \"./git-provider.interface\";\nexport * from \"./git-provider.service\";\nexport * from \"./adapters\";\n","import { spawn, execSync } from \"child_process\";\nimport type { GitCommit, GitChangedFile, GitDiffFile, GitRunOptions } from \"./git-sdk.types\";\nimport { mapGitStatus, parseDiffText } from \"./git-sdk-diff.utils\";\n\nexport class GitSdkService {\n protected readonly defaultOptions: GitRunOptions = {\n cwd: process.cwd(),\n maxBuffer: 10 * 1024 * 1024, // 10MB\n };\n\n runCommand(args: string[], options?: GitRunOptions): Promise<string> {\n const opts = { ...this.defaultOptions, ...options };\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd: opts.cwd,\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(`Git 命令失败 (${code}): ${stderr}`));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n runCommandSync(args: string[], options?: GitRunOptions): string {\n const opts = { ...this.defaultOptions, ...options };\n return execSync(`git ${args.join(\" \")}`, {\n cwd: opts.cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n maxBuffer: opts.maxBuffer,\n });\n }\n\n getRemoteUrl(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"remote\", \"get-url\", \"origin\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getCurrentBranch(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getDefaultBranch(options?: GitRunOptions): string {\n try {\n const result = this.runCommandSync(\n [\"symbolic-ref\", \"refs/remotes/origin/HEAD\"],\n options,\n ).trim();\n return result.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // 回退到常见默认分支\n for (const branch of [\"main\", \"master\"]) {\n try {\n this.runCommandSync([\"rev-parse\", \"--verify\", `origin/${branch}`], options);\n return branch;\n } catch {\n continue;\n }\n }\n return \"main\";\n }\n }\n\n parseRepositoryFromRemoteUrl(remoteUrl: string): { owner: string; repo: string } | null {\n const match = remoteUrl.match(/[/:]([\\w.-]+)\\/([\\w.-]+?)(?:\\.git)?$/);\n if (match) {\n return { owner: match[1], repo: match[2] };\n }\n return null;\n }\n\n async getChangedFilesBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitChangedFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"diff\", \"--name-status\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const files: GitChangedFile[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [status, filename] = line.split(\"\\t\");\n files.push({\n filename,\n status: mapGitStatus(status),\n });\n }\n\n return files;\n }\n\n /**\n * 获取两个 ref 之间的 diff(包含 patch 信息)\n * @param baseRef 基准 ref\n * @param headRef 目标 ref\n * @param options 运行选项\n * @returns 包含 filename 和 patch 的文件列表\n */\n async getDiffBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitDiffFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand([\"diff\", `${resolvedBase}..${resolvedHead}`], options);\n\n return parseDiffText(result);\n }\n\n async getCommitsBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitCommit[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"log\", \"--format=%H|%s|%an|%ae|%aI\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const commits: GitCommit[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [sha, message, authorName, authorEmail, date] = line.split(\"|\");\n commits.push({\n sha,\n message,\n author: {\n name: authorName,\n email: authorEmail,\n date,\n },\n });\n }\n\n return commits;\n }\n\n async getFilesForCommit(sha: string, options?: GitRunOptions): Promise<string[]> {\n const result = await this.runCommand([\"show\", \"--name-only\", \"--format=\", sha], options);\n return result.trim().split(\"\\n\").filter(Boolean);\n }\n\n async getFileContent(ref: string, filename: string, options?: GitRunOptions): Promise<string> {\n return this.runCommand([\"show\", `${ref}:${filename}`], options);\n }\n\n getCommitDiff(sha: string, options?: GitRunOptions): GitDiffFile[] {\n try {\n const output = this.runCommandSync([\"show\", \"--format=\", \"--patch\", sha], options);\n return parseDiffText(output);\n } catch (error) {\n console.warn(`⚠️ git show 失败: ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n }\n\n /**\n * 解析 ref,支持本地分支、远程分支、commit SHA\n * 优先级:commit SHA > 本地分支 > origin/分支 > fetch后重试 > 原始值\n */\n async resolveRef(ref: string, options?: GitRunOptions): Promise<string> {\n if (!ref) {\n throw new Error(`resolveRef: ref 参数不能为空。调用栈: ${new Error().stack}`);\n }\n if (/^[0-9a-f]{7,40}$/i.test(ref)) {\n return ref;\n }\n if (ref.startsWith(\"origin/\")) {\n return ref;\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", ref], options);\n return ref;\n } catch {\n // 本地分支不存在\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", `origin/${ref}`], options);\n return `origin/${ref}`;\n } catch {\n // origin/分支也不存在\n }\n try {\n await this.runCommand(\n [\"fetch\", \"origin\", `${ref}:refs/remotes/origin/${ref}`, \"--depth=1\"],\n options,\n );\n return `origin/${ref}`;\n } catch {\n // fetch 失败\n }\n return ref;\n }\n}\n","export * from \"./git-sdk.types\";\nexport * from \"./git-sdk-diff.utils\";\nexport { GitSdkService } from \"./git-sdk.service\";\n","export interface ClaudeAdapterConfig {\n model?: string;\n baseUrl?: string;\n authToken?: string;\n hasCompletedOnboarding?: boolean;\n}\n\nexport interface OpenAIAdapterConfig {\n model: string;\n baseUrl?: string;\n apiKey: string;\n}\n\nexport interface OpenCodeAdapterConfig {\n model?: string;\n /** OpenCode 服务地址,默认 http://localhost:4096 */\n serverUrl?: string;\n /** 云厂商 API 地址(会动态写入 opencode.json 配置) */\n baseUrl?: string;\n apiKey?: string;\n providerID?: string;\n}\n\nexport type LLMMode = \"claude-code\" | \"openai\" | \"gemini\" | \"open-code\";\n\nexport interface GeminiAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n}\n\nexport interface LlmProxyConfig {\n defaultAdapter?: LLMMode;\n claudeCode?: ClaudeAdapterConfig;\n openai?: OpenAIAdapterConfig;\n openCode?: OpenCodeAdapterConfig;\n gemini?: GeminiAdapterConfig;\n}\n\nexport const LLM_PROXY_CONFIG = Symbol(\"LLM_PROXY_CONFIG\");\n","export * from \"./message.interface\";\nexport * from \"./session.interface\";\nexport * from \"./config.interface\";\nexport type { VerboseLevel } from \"../../verbose\";\n","import type { LlmMessage, LlmRequestOptions, LlmResponse, LlmStreamEvent } from \"../interfaces\";\nimport type { VerboseLevel } from \"../../verbose\";\n\nexport interface LlmAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n verbose?: VerboseLevel;\n}\n\nexport interface LlmAdapter {\n readonly name: string;\n\n chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse>;\n\n chatStream(messages: LlmMessage[], options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent>;\n\n isConfigured(): boolean;\n\n isSupportJsonSchema(): boolean;\n}\n\nexport const LLM_ADAPTER = Symbol(\"LLM_ADAPTER\");\n","/**\n * 从 @spaceflow/shared 重导出 verbose 工具\n */\nexport type { LogLevel, VerboseLevel } from \"@spaceflow/shared\";\nexport {\n LOG_LEVEL_PRIORITY,\n toLogLevel,\n normalizeVerbose,\n shouldLog,\n parseVerbose,\n} from \"@spaceflow/shared\";\n","import { readFile, writeFile, mkdir, copyFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { LlmProxyConfig } from \"../llm-proxy/interfaces\";\nimport { shouldLog, type VerboseLevel } from \"../verbose\";\n\nexport class ClaudeSetupService {\n constructor(protected readonly llmConfig?: LlmProxyConfig) {}\n\n private getPaths() {\n const claudeDir = join(homedir(), \".claude\");\n return {\n claudeDir,\n settingsPath: join(claudeDir, \"settings.json\"),\n settingsBackupPath: join(claudeDir, \"settings.json.bak\"),\n claudeJsonPath: join(homedir(), \".claude.json\"),\n claudeJsonBackupPath: join(homedir(), \".claude.json.bak\"),\n };\n }\n\n async backup(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsPath, paths.settingsBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonPath, paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n }\n\n async restore(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsBackupPath, paths.settingsPath);\n await unlink(paths.settingsBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonBackupPath, paths.claudeJsonPath);\n await unlink(paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n }\n\n /**\n * 使用临时配置执行操作\n * 自动备份现有配置,执行完成后恢复\n */\n async withTemporaryConfig<T>(fn: () => Promise<T>, verbose?: VerboseLevel): Promise<T> {\n await this.backup();\n try {\n await this.configure(verbose);\n return await fn();\n } finally {\n await this.restore();\n }\n }\n\n async configure(verbose?: VerboseLevel): Promise<void> {\n const { claudeDir, settingsPath, claudeJsonPath } = this.getPaths();\n\n const claudeCode = this.llmConfig?.claudeCode;\n\n if (!claudeCode) {\n if (shouldLog(verbose, 1)) {\n console.log(\"未配置 claude 设置,跳过\");\n }\n return;\n }\n\n try {\n await mkdir(claudeDir, { recursive: true });\n } catch {\n // ignore if exists\n }\n\n let existingSettings = {};\n try {\n const content = await readFile(settingsPath, \"utf-8\");\n existingSettings = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n\n const existing = existingSettings as Record<string, Record<string, unknown>>;\n const env: Record<string, string> = { ...(existing.env as Record<string, string>) };\n if (claudeCode.baseUrl) env.ANTHROPIC_BASE_URL = claudeCode.baseUrl;\n if (claudeCode.authToken) {\n env.ANTHROPIC_AUTH_TOKEN = claudeCode.authToken;\n } else {\n throw new Error(\"未配置 claudeCode.authToken 设置\");\n }\n if (claudeCode.model) env.ANTHROPIC_MODEL = claudeCode.model;\n\n const mergedSettings = {\n ...existingSettings,\n env,\n };\n\n await writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${settingsPath}`);\n }\n\n if (claudeCode.hasCompletedOnboarding !== undefined) {\n let claudeJson: Record<string, unknown> = {};\n try {\n const content = await readFile(claudeJsonPath, \"utf-8\");\n claudeJson = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n claudeJson.hasCompletedOnboarding = claudeCode.hasCompletedOnboarding;\n await writeFile(claudeJsonPath, JSON.stringify(claudeJson, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${claudeJsonPath}`);\n }\n }\n }\n}\n","export * from \"./claude-setup.service\";\n","import { query, type SpawnOptions } from \"@anthropic-ai/claude-agent-sdk\";\nimport { spawn } from \"child_process\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { ClaudeSetupService } from \"../../claude-setup\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class ClaudeCodeAdapter implements LlmAdapter {\n readonly name = \"claude-code\";\n private readonly claudeSetupService: ClaudeSetupService;\n\n constructor(private readonly config: LlmProxyConfig) {\n // 创建 ClaudeSetupService 实例,传入 LLM 配置\n this.claudeSetupService = new ClaudeSetupService(config);\n }\n\n isConfigured(): boolean {\n return !!this.config.claudeCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n // 备份原有配置\n await this.claudeSetupService.backup();\n\n try {\n // 应用临时配置\n await this.claudeSetupService.configure(options?.verbose);\n\n const claudeConf = this.config.claudeCode;\n\n if (!claudeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.ClaudeCodeAdapter.chatStream] 未配置 claude 设置\",\n };\n return;\n }\n\n const model = options?.model || claudeConf.model || \"claude-sonnet-4-5\";\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] 配置: Model=${model}, BaseURL=${claudeConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n const handleUncaughtError = (err: Error) => {\n if ((err as any).code === \"EPIPE\") {\n console.error(\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] EPIPE 错误: Claude CLI 子进程意外退出\",\n );\n throw err;\n }\n };\n process.on(\"uncaughtException\", handleUncaughtError);\n\n try {\n const spawnEnv = { ...process.env };\n if (claudeConf.baseUrl) spawnEnv.ANTHROPIC_BASE_URL = claudeConf.baseUrl;\n if (claudeConf.authToken) spawnEnv.ANTHROPIC_AUTH_TOKEN = claudeConf.authToken;\n\n const spawnClaudeCodeProcess = (spawnOptions: SpawnOptions) => {\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] Spawning: ${spawnOptions.command} ${spawnOptions.args?.join(\" \")}`,\n );\n }\n const child = spawn(spawnOptions.command, spawnOptions.args || [], {\n ...spawnOptions,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: spawnEnv,\n });\n\n child.stderr?.on(\"data\", (data) => {\n console.error(`[LLMProxy.ClaudeCodeAdapter.chatStream] CLI stderr: ${data.toString()}`);\n });\n\n return child;\n };\n\n const queryOptions: Parameters<typeof query>[0][\"options\"] = {\n model,\n systemPrompt,\n permissionMode: \"default\",\n spawnClaudeCodeProcess,\n };\n\n if (options?.allowedTools?.length) {\n queryOptions.allowedTools = options.allowedTools as any;\n }\n\n if (options?.jsonSchema) {\n queryOptions.outputFormat = {\n type: \"json_schema\",\n schema: options.jsonSchema.getSchema(),\n };\n }\n\n const response = query({\n prompt: userPrompt,\n options: queryOptions,\n });\n\n let finalContent = \"\";\n let structuredOutput: unknown = undefined;\n\n for await (const message of response) {\n if (message.type === \"assistant\") {\n const content = message.message.content;\n if (typeof content === \"string\") {\n yield { type: \"text\", content };\n finalContent += content;\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (block.type === \"text\") {\n yield { type: \"text\", content: block.text };\n finalContent += block.text;\n } else if (block.type === \"tool_use\") {\n yield { type: \"tool_use\", name: block.name, input: block.input };\n } else if (block.type === (\"thought\" as any)) {\n yield { type: \"thought\", content: (block as any).thought };\n }\n }\n }\n }\n\n if (message.type === \"result\") {\n if (message.subtype === \"success\") {\n if (message.structured_output) {\n structuredOutput = message.structured_output;\n }\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n structuredOutput,\n },\n };\n } else {\n yield {\n type: \"error\",\n message: `[LLMProxy.ClaudeCodeAdapter.chatStream] ${message.errors?.join(\", \") || \"未知错误\"}`,\n };\n }\n }\n }\n } catch (error: any) {\n if (error?.code === \"EPIPE\" || error?.message?.includes(\"EPIPE\")) {\n yield {\n type: \"error\",\n message:\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] 连接中断 (EPIPE)。请检查:\\n\" +\n \"1. ANTHROPIC_AUTH_TOKEN 环境变量是否正确设置\\n\" +\n \"2. ANTHROPIC_BASE_URL 是否与 Claude Agent SDK 兼容\\n\" +\n \"3. Claude CLI 是否已正确安装\",\n };\n } else {\n throw error;\n }\n } finally {\n process.removeListener(\"uncaughtException\", handleUncaughtError);\n }\n } finally {\n // 恢复原有配置\n await this.claudeSetupService.restore();\n }\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return true;\n }\n}\n","import OpenAI from \"openai\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenAIAdapter implements LlmAdapter {\n readonly name = \"openai\";\n\n private client: OpenAI | null = null;\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openai;\n }\n\n private getClient(): OpenAI {\n if (this.client) {\n return this.client;\n }\n\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.getClient] 未配置 openai 设置\");\n }\n\n this.client = new OpenAI({\n apiKey: openaiConf.apiKey,\n baseURL: openaiConf.baseUrl || undefined,\n });\n\n return this.client;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.chat] 未配置 openai 设置\");\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 配置: Model=${model}, BaseURL=${openaiConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n try {\n const response = await client.chat.completions.create({\n model,\n messages: messages,\n });\n\n const content = response.choices[0]?.message?.content || \"\";\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 响应: Model=${response.model}, Usage=${response.usage?.total_tokens} tokens`,\n );\n }\n\n return {\n content,\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n throw new Error(\n `[LLMProxy.OpenAIAdapter.chat] API 错误 (${error.status}): ${error.message}\\n` +\n `请检查:\\n` +\n `1. API Key 是否正确\\n` +\n `2. Base URL 是否正确\\n` +\n `3. 模型名称是否有效`,\n );\n }\n throw error;\n }\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n yield { type: \"error\", message: \"[LLMProxy.OpenAIAdapter.chatStream] 未配置 openai 设置\" };\n return;\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chatStream] 配置: Model=${model}, BaseURL=${openaiConf.baseUrl || \"默认\"}`,\n );\n }\n try {\n const stream = await client.chat.completions.create({\n model,\n messages: messages,\n stream: true,\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) {\n yield { type: \"text\", content: delta };\n fullContent += delta;\n }\n }\n\n yield {\n type: \"result\",\n response: {\n content: fullContent,\n },\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n yield {\n type: \"error\",\n message: `[LLMProxy.OpenAIAdapter.chatStream] API 错误 (${error.status}): ${error.message}`,\n };\n } else {\n throw error;\n }\n }\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","import { createOpencode } from \"@opencode-ai/sdk\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n OpenCodeAdapterConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenCodeAdapter implements LlmAdapter {\n readonly name = \"open-code\";\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openCodeConf = this.config.openCode;\n\n if (!openCodeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 未配置 openCode 设置\",\n };\n return;\n }\n\n const providerID = openCodeConf.providerID || \"openai\";\n const configModel = options?.model || openCodeConf.model || \"gpt-4o\";\n const model = configModel.includes(\"/\") ? configModel : `${providerID}/${configModel}`;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 配置: Model=${model}, ProviderID=${providerID}, BaseURL=${openCodeConf.baseUrl || \"默认\"}`,\n );\n }\n\n // 创建 OpenCode 实例(自动启动服务器,使用动态端口避免冲突)\n let opencode: Awaited<ReturnType<typeof createOpencode>> | null = null;\n const port = 4096 + Math.floor(Math.random() * 1000);\n\n // 确保进程退出时关闭服务器\n const cleanup = () => {\n if (opencode?.server) {\n opencode.server.close();\n opencode = null;\n }\n };\n process.once(\"exit\", cleanup);\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n try {\n opencode = await createOpencode({\n port,\n config: this.buildOpenCodeConfig(openCodeConf, model),\n });\n\n const { client } = opencode;\n\n // 设置 provider 认证(使用自定义 provider ID)\n const customProviderID = \"custom-openai\";\n if (openCodeConf.apiKey) {\n await client.auth.set({\n path: { id: customProviderID },\n body: { type: \"api\", key: openCodeConf.apiKey },\n });\n }\n\n const session = await client.session.create({\n body: { title: `spaceflow-${Date.now()}` },\n });\n\n if (!session.data?.id) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 创建 session 失败\",\n };\n return;\n }\n\n const sessionId = session.data.id;\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (systemPrompt) {\n await client.session.prompt({\n path: { id: sessionId },\n body: {\n noReply: true,\n parts: [{ type: \"text\", text: systemPrompt }],\n },\n });\n }\n\n // 从原始 model 中提取 modelID,但使用自定义 provider ID\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 发送 prompt: model=${customProviderID}/${modelID}, userPrompt长度=${userPrompt.length}`,\n );\n }\n\n const result = await client.session.prompt({\n path: { id: sessionId },\n body: {\n model: { providerID: customProviderID, modelID },\n parts: [{ type: \"text\", text: userPrompt }],\n },\n });\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 完整响应对象:\\n${JSON.stringify(result, null, 2)}`,\n );\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] result.data:\\n${JSON.stringify(result.data, null, 2)}`,\n );\n }\n\n let finalContent = \"\";\n\n if (result.data?.parts) {\n for (const part of result.data.parts) {\n const partType = part.type;\n\n switch (partType) {\n case \"text\": {\n const text = (part as any).text || \"\";\n yield { type: \"text\", content: text };\n finalContent += text;\n break;\n }\n\n case \"tool\": {\n // 工具调用(ToolPart)\n const toolPart = part as any;\n const state = toolPart.state || {};\n yield {\n type: \"tool_use\",\n name: toolPart.tool || \"unknown\",\n input: state.input || {},\n status: state.status,\n output: state.output,\n title: state.title,\n };\n break;\n }\n\n case \"agent\": {\n // 子代理调用(AgentPart)\n const agentPart = part as any;\n yield {\n type: \"agent\",\n name: agentPart.name || \"unknown\",\n source: agentPart.source?.value,\n };\n break;\n }\n\n case \"subtask\": {\n // 子任务\n const subtaskPart = part as any;\n yield {\n type: \"subtask\",\n agent: subtaskPart.agent,\n prompt: subtaskPart.prompt,\n description: subtaskPart.description,\n };\n break;\n }\n\n case \"step-start\": {\n yield {\n type: \"step_start\",\n snapshot: (part as any).snapshot,\n };\n break;\n }\n\n case \"step-finish\": {\n const stepPart = part as any;\n yield {\n type: \"step_finish\",\n reason: stepPart.reason,\n tokens: stepPart.tokens,\n cost: stepPart.cost,\n };\n break;\n }\n\n case \"reasoning\": {\n const reasoningPart = part as any;\n yield {\n type: \"reasoning\",\n content: reasoningPart.text || \"\",\n };\n break;\n }\n\n default:\n // 其他类型(file, snapshot, patch, retry, compaction 等)暂不处理\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 未处理的 part 类型: ${partType}`,\n );\n }\n break;\n }\n }\n }\n\n if (shouldLog(options?.verbose, 1) && !finalContent) {\n console.warn(\n `[LLMProxy.OpenCodeAdapter.chatStream] 警告: 响应内容为空,parts=${JSON.stringify(result.data?.parts)}`,\n );\n }\n\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n },\n };\n\n try {\n await client.session.delete({ path: { id: sessionId } });\n } catch {\n // ignore cleanup errors\n }\n } catch (error: any) {\n yield {\n type: \"error\",\n message:\n `[LLMProxy.OpenCodeAdapter.chatStream] 错误: ${error.message}\\n` +\n `请检查:\\n` +\n `1. baseUrl 配置是否正确\\n` +\n `2. apiKey 是否有效\\n` +\n `3. 模型配置是否有效`,\n };\n } finally {\n // 移除事件监听器\n process.removeListener(\"exit\", cleanup);\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n // 关闭服务器\n cleanup();\n }\n }\n\n /**\n * 构建 OpenCode 配置\n */\n private buildOpenCodeConfig(\n openCodeConf: OpenCodeAdapterConfig,\n model: string,\n ): Record<string, any> {\n // 使用自定义 provider ID(如 custom-openai)而不是 openai\n // 因为 OpenCode 会根据 providerID 决定使用哪个 SDK 方法\n // openai provider 会调用 sdk.responses(),而自定义 provider 使用 @ai-sdk/openai-compatible\n const customProviderID = \"custom-openai\";\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n // 使用 @ai-sdk/openai-compatible,使用 Chat Completions API (/chat/completions)\n const config: Record<string, any> = {\n model: `${customProviderID}/${modelID}`,\n provider: {\n [customProviderID]: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Custom OpenAI Compatible\",\n },\n },\n };\n\n // 配置 provider baseURL\n if (openCodeConf.baseUrl) {\n config.provider[customProviderID].options = {\n baseURL: openCodeConf.baseUrl,\n };\n }\n\n // 注册自定义模型\n config.provider[customProviderID].models = {\n [modelID]: {\n name: modelID,\n attachment: true,\n reasoning: false,\n temperature: true,\n tool_call: true,\n cost: {\n input: 0,\n output: 0,\n },\n limit: {\n context: 128000,\n output: 16000,\n },\n },\n };\n\n return config;\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","export * from \"./llm-adapter.interface\";\nexport * from \"./claude-code.adapter\";\nexport * from \"./openai.adapter\";\nexport * from \"./open-code.adapter\";\n","import { randomUUID } from \"crypto\";\nimport type { LlmAdapter } from \"./adapters\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmSession,\n SessionOptions,\n} from \"./interfaces\";\nimport { type VerboseLevel, normalizeVerbose } from \"../verbose\";\n\nexport class LlmSessionImpl implements LlmSession {\n readonly id: string;\n readonly adapterName: string;\n\n private history: LlmMessage[] = [];\n private systemPrompt: string = \"\";\n private defaultModel?: string;\n private verbose: VerboseLevel = 0;\n\n constructor(\n private readonly adapter: LlmAdapter,\n options?: SessionOptions,\n ) {\n this.id = randomUUID();\n this.adapterName = adapter.name;\n\n if (options?.systemPrompt) {\n this.systemPrompt = options.systemPrompt;\n }\n if (options?.model) {\n this.defaultModel = options.model;\n }\n if (options?.verbose !== undefined) {\n this.verbose = normalizeVerbose(options.verbose);\n }\n }\n\n async send(content: string, options?: LlmRequestOptions): Promise<LlmResponse> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n const response = await this.adapter.chat(messages, mergedOptions);\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: response.content };\n this.history.push(assistantMessage);\n\n return response;\n }\n\n async *sendStream(content: string, options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n let fullContent = \"\";\n\n for await (const event of this.adapter.chatStream(messages, mergedOptions)) {\n yield event;\n\n if (event.type === \"text\") {\n fullContent += event.content;\n } else if (event.type === \"result\") {\n fullContent = event.response.content;\n }\n }\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: fullContent };\n this.history.push(assistantMessage);\n }\n\n getHistory(): LlmMessage[] {\n return [...this.history];\n }\n\n clearHistory(): void {\n this.history = [];\n }\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n private buildMessages(): LlmMessage[] {\n const messages: LlmMessage[] = [];\n\n if (this.systemPrompt) {\n messages.push({ role: \"system\", content: this.systemPrompt });\n }\n\n messages.push(...this.history);\n\n return messages;\n }\n\n private mergeOptions(options?: LlmRequestOptions): LlmRequestOptions {\n return {\n model: options?.model || this.defaultModel,\n verbose: options?.verbose ?? this.verbose,\n ...options,\n };\n }\n}\n","import type { LlmAdapter } from \"./adapters\";\nimport { ClaudeCodeAdapter } from \"./adapters/claude-code.adapter\";\nimport { OpenAIAdapter } from \"./adapters/openai.adapter\";\nimport { OpenCodeAdapter } from \"./adapters/open-code.adapter\";\nimport { LlmSessionImpl } from \"./llm-session\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmSession,\n SessionOptions,\n LlmProxyConfig,\n LLMMode,\n} from \"./interfaces\";\nimport type { LlmJsonPut } from \"../llm-jsonput\";\n\nexport interface ChatOptions extends LlmRequestOptions {\n adapter?: LLMMode;\n}\n\nexport class LlmProxyService {\n private adapters: Map<LLMMode, LlmAdapter> = new Map();\n\n constructor(private readonly config: LlmProxyConfig) {\n // 适配器接收完整配置,内部自行读取所需部分\n const claudeCodeAdapter = new ClaudeCodeAdapter(config);\n const openaiAdapter = new OpenAIAdapter(config);\n const openCodeAdapter = new OpenCodeAdapter(config);\n this.adapters.set(\"claude-code\", claudeCodeAdapter);\n this.adapters.set(\"openai\", openaiAdapter);\n this.adapters.set(\"open-code\", openCodeAdapter);\n }\n\n createSession(adapterType?: LLMMode, options?: SessionOptions): LlmSession {\n const type = adapterType || this.getDefaultAdapterType();\n const adapter = this.getAdapter(type);\n\n return new LlmSessionImpl(adapter, options);\n }\n\n async chat(messages: LlmMessage[], options?: ChatOptions): Promise<LlmResponse> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n const response = await adapter.chat(messages, options);\n\n if (options?.jsonSchema && response.content && !response.structuredOutput) {\n response.structuredOutput = await options.jsonSchema.parse(response.content);\n }\n\n return response;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: ChatOptions,\n ): AsyncIterable<import(\"./interfaces\").LlmStreamEvent> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n for await (const event of adapter.chatStream(messages, options)) {\n if (\n event.type === \"result\" &&\n options?.jsonSchema &&\n event.response.content &&\n !event.response.structuredOutput\n ) {\n try {\n event.response.structuredOutput = await options.jsonSchema.parse(event.response.content);\n } catch (error: any) {\n // JSON 解析失败,保持 structuredOutput 为 undefined\n console.error(\"[LLMProxyService.chatStream] JSON 解析失败:\", error);\n }\n }\n yield event;\n }\n }\n\n appendJsonSchemaSystemPrompt(messages: LlmMessage[], jsonSchema: LlmJsonPut): LlmMessage[] {\n const systemMsg = messages.find((msg) => msg.role === \"system\");\n if (jsonSchema.isMatched(systemMsg?.content || \"\")) {\n return messages;\n }\n if (systemMsg) {\n systemMsg.content += `\\n\\n${jsonSchema.jsonFormatInstruction}`;\n } else {\n messages.unshift({ role: \"system\", content: jsonSchema.jsonFormatInstruction });\n }\n return messages;\n }\n\n getAvailableAdapters(): LLMMode[] {\n const available: LLMMode[] = [];\n\n for (const [type, adapter] of this.adapters) {\n if (adapter.isConfigured()) {\n available.push(type);\n }\n }\n\n return available;\n }\n\n private getDefaultAdapterType(): LLMMode {\n return this.config.defaultAdapter || \"openai\";\n }\n\n private getAdapter(type: LLMMode): LlmAdapter {\n const adapter = this.adapters.get(type);\n\n if (!adapter) {\n throw new Error(`[LLMProxy.getAdapter] 不支持的 LLM 类型: ${type}`);\n }\n\n if (!adapter.isConfigured()) {\n throw new Error(`[LLMProxy.getAdapter] 适配器 \"${type}\" 未配置`);\n }\n\n return adapter;\n }\n}\n","import type { LlmStreamEvent } from \"./interfaces\";\n\nexport interface StreamLoggerState {\n isFirstText: boolean;\n}\n\n/**\n * 创建一个新的 StreamLogger 状态\n */\nexport function createStreamLoggerState(): StreamLoggerState {\n return { isFirstText: true };\n}\n\n/**\n * 记录 LLM 流式事件到终端\n * @param event LLM 流式事件\n * @param state 日志状态(用于跟踪是否是第一个文本块)\n */\nexport function logStreamEvent(event: LlmStreamEvent, state: StreamLoggerState): void {\n switch (event.type) {\n case \"text\":\n if (state.isFirstText) {\n process.stdout.write(\"\\n🤖 AI: \");\n state.isFirstText = false;\n }\n process.stdout.write(event.content);\n break;\n case \"tool_use\":\n console.log(`\\n🛠️ 工具调用: ${event.name}`);\n if (event.title) {\n console.log(` 标题: ${event.title}`);\n }\n console.log(` 输入: ${JSON.stringify(event.input)}`);\n if (event.status) {\n console.log(` 状态: ${event.status}`);\n }\n if (event.output) {\n console.log(\n ` 输出: ${event.output.substring(0, 200)}${event.output.length > 200 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"thought\":\n console.log(`\\n💭 思考: ${event.content}`);\n state.isFirstText = true;\n break;\n case \"result\":\n console.log(`\\n✅ 结果已返回`);\n state.isFirstText = true;\n break;\n case \"error\":\n console.error(`\\n❌ 错误: ${event.message}`);\n state.isFirstText = true;\n break;\n case \"agent\":\n console.log(`\\n🤖 子代理: ${event.name}`);\n if (event.source) {\n console.log(\n ` 来源: ${event.source.substring(0, 100)}${event.source.length > 100 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"subtask\":\n console.log(`\\n📋 子任务: ${event.description}`);\n console.log(` 代理: ${event.agent}`);\n console.log(\n ` 提示: ${event.prompt.substring(0, 100)}${event.prompt.length > 100 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n case \"step_start\":\n console.log(`\\n▶️ 步骤开始`);\n state.isFirstText = true;\n break;\n case \"step_finish\":\n console.log(`\\n⏹️ 步骤结束: ${event.reason}`);\n if (event.tokens) {\n const tokens = event.tokens as any;\n console.log(\n ` Token: 输入=${tokens.input || 0}, 输出=${tokens.output || 0}, 推理=${tokens.reasoning || 0}`,\n );\n }\n if (event.cost !== undefined) {\n console.log(` 成本: $${event.cost.toFixed(6)}`);\n }\n state.isFirstText = true;\n break;\n case \"reasoning\":\n console.log(\n `\\n🧠 推理: ${event.content.substring(0, 200)}${event.content.length > 200 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n }\n}\n","export * from \"./interfaces\";\nexport * from \"./adapters\";\nexport * from \"./llm-session\";\nexport * from \"./llm-proxy.service\";\nexport * from \"./stream-logger\";\n","/**\n * 飞书 SDK 卡片交互回调相关类型\n */\n\nimport type { I18nLocale } from \"./common\";\nimport type { CardData } from \"./card\";\n\n/** 卡片交互事件名称常量 */\nexport const FEISHU_CARD_ACTION_TRIGGER = \"card.action.trigger\" as const;\n\n/** 回调基本信息 (header) */\nexport interface CardActionHeader {\n /** 回调的唯一标识 */\n event_id: string;\n /** 应用的 Verification Token */\n token: string;\n /** 回调发送的时间,微秒级时间戳 */\n create_time: string;\n /** 回调类型,固定为 \"card.action.trigger\" */\n event_type: typeof FEISHU_CARD_ACTION_TRIGGER;\n /** 应用归属的 tenant key */\n tenant_key: string;\n /** 应用的 App ID */\n app_id: string;\n}\n\n/** 操作者信息 */\nexport interface CardActionOperator {\n /** 回调触发者的 tenant key */\n tenant_key: string;\n /** 回调触发者的 user_id (需开启权限) */\n user_id?: string;\n /** 回调触发者的 open_id */\n open_id: string;\n /** 回调触发者的 union_id */\n union_id?: string;\n}\n\n/** 交互信息 */\nexport interface CardActionInfo {\n /** 交互组件绑定的开发者自定义回传数据 */\n value?: Record<string, unknown> | string;\n /** 交互组件的标签 */\n tag: string;\n /** 用户当前所在地区的时区 */\n timezone?: string;\n /** 组件的自定义唯一标识 */\n name?: string;\n /** 表单容器内用户提交的数据 */\n form_value?: Record<string, unknown>;\n /** 输入框组件提交的数据 (未内嵌在表单中时) */\n input_value?: string;\n /** 单选组件的选项回调值 */\n option?: string;\n /** 多选组件的选项回调值 */\n options?: string[];\n /** 勾选器组件的回调数据 */\n checked?: boolean;\n}\n\n/** 展示场景上下文 */\nexport interface CardActionContext {\n /** 链接地址 (适用于链接预览场景) */\n url?: string;\n /** 链接预览的 token */\n preview_token?: string;\n /** 消息 ID */\n open_message_id: string;\n /** 会话 ID */\n open_chat_id: string;\n}\n\n/** 回调详细信息 (event) */\nexport interface CardActionEventData {\n /** 回调触发者信息 */\n operator: CardActionOperator;\n /** 更新卡片用的凭证,有效期 30 分钟,最多可更新 2 次 */\n token: string;\n /** 交互信息 */\n action: CardActionInfo;\n /** 卡片展示场景 */\n host?: string;\n /** 卡片分发类型,链接预览卡片时为 url_preview */\n delivery_type?: \"url_preview\";\n /** 展示场景上下文 */\n context: CardActionContext;\n}\n\n/** 回调结构体 (schema 2.0) */\nexport interface CardActionTriggerCallback {\n /** 回调版本,固定为 \"2.0\" */\n schema: \"2.0\";\n /** 回调基本信息 */\n header: CardActionHeader;\n /** 回调详细信息 */\n event: CardActionEventData;\n}\n\n/** Toast 提示配置 */\nexport interface CardActionToast {\n /** 弹窗提示的类型 */\n type?: \"info\" | \"success\" | \"error\" | \"warning\";\n /** 单语言提示文案 */\n content?: string;\n /** 多语言提示文案 */\n i18n?: Partial<Record<I18nLocale, string>>;\n}\n\n/** 响应回调的结构体 */\nexport interface CardActionTriggerResponse {\n /** Toast 弹窗提示 */\n toast?: CardActionToast;\n /** 卡片数据 (用于更新卡片) */\n card?: CardData;\n}\n\n/** 交互事件回调接口 */\nexport interface CardActionTriggerEventCallback {\n /** 完成回调,返回响应结果 */\n done: (result: CardActionTriggerResponse) => void;\n}\n\n/** 交互事件 (用于事件监听器),包含回调数据和 done 方法 */\nexport interface CardActionTriggerEvent\n extends CardActionTriggerEventCallback, CardActionTriggerCallback {}\n\n/** 事件注册类型 */\nexport interface CardEvents {\n [FEISHU_CARD_ACTION_TRIGGER]: (\n data: CardActionTriggerCallback,\n ) => Promise<CardActionTriggerResponse>;\n}\n","import { EventEmitter } from \"events\";\nimport * as lark from \"@larksuiteoapi/node-sdk\";\nimport {\n FeishuModuleOptions,\n FeishuUser,\n GetUserParams,\n FEISHU_CARD_ACTION_TRIGGER,\n type CardEvents,\n type CardActionTriggerResponse,\n type CardActionTriggerEvent,\n} from \"./types\";\n\n/**\n * 飞书 API 服务\n */\nexport class FeishuSdkService {\n protected readonly client: lark.Client;\n protected readonly eventEmitter: EventEmitter;\n private eventDispatcher: lark.EventDispatcher | null = null;\n\n constructor(protected readonly options: FeishuModuleOptions) {\n this.eventEmitter = new EventEmitter();\n this.client = new lark.Client({\n appId: options.appId,\n appSecret: options.appSecret,\n appType: options.appType === \"store\" ? lark.AppType.ISV : lark.AppType.SelfBuild,\n domain: options.domain === \"lark\" ? lark.Domain.Lark : lark.Domain.Feishu,\n });\n\n this.initEventDispatcher();\n }\n\n /**\n * 注册事件监听器\n */\n on(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n /**\n * 移除事件监听器\n */\n off(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.off(eventName, listener);\n }\n\n private initEventDispatcher(): void {\n this.eventDispatcher = new lark.EventDispatcher({\n encryptKey: \"encrypt key\",\n }).register<CardEvents>({\n [FEISHU_CARD_ACTION_TRIGGER]: async (data) => {\n let done: (result: CardActionTriggerResponse) => void = () => null;\n const p = new Promise<CardActionTriggerResponse>((resolve) => {\n done = resolve;\n });\n\n // 转换为事件监听器友好的格式\n const event: CardActionTriggerEvent = {\n ...data,\n done,\n };\n\n this.eventEmitter.emit(FEISHU_CARD_ACTION_TRIGGER, event);\n return await p;\n },\n });\n }\n\n destroy(): void {\n this.eventEmitter.removeAllListeners();\n }\n\n /**\n * 验证飞书配置\n */\n validateConfig(): void {\n if (!this.options?.appId) {\n throw new Error(\"缺少配置 feishu.appId (环境变量 FEISHU_APP_ID)\");\n }\n\n if (!this.options?.appSecret) {\n throw new Error(\"缺少配置 feishu.appSecret (环境变量 FEISHU_APP_SECRET)\");\n }\n }\n\n /**\n * 获取原始 Lark Client 实例\n * 用于调用 SDK 中未封装的 API\n */\n getClient(): lark.Client {\n return this.client;\n }\n\n /**\n * 获取用户信息\n * @param params 获取用户信息的参数\n * @returns 用户信息\n */\n async getUser(params: GetUserParams): Promise<FeishuUser | null> {\n const { userId, userIdType = \"open_id\", departmentIdType } = params;\n\n const response = await this.client.contact.user.get({\n path: {\n user_id: userId,\n },\n params: {\n user_id_type: userIdType,\n department_id_type: departmentIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return response.data?.user as FeishuUser | null;\n }\n\n /**\n * 批量获取用户信息\n * @param userIds 用户 ID 列表\n * @param userIdType 用户 ID 类型\n * @returns 用户信息列表\n */\n async batchGetUsers(\n userIds: string[],\n userIdType: \"open_id\" | \"union_id\" | \"user_id\" = \"open_id\",\n ): Promise<FeishuUser[]> {\n const response = await this.client.contact.user.batch({\n params: {\n user_ids: userIds,\n user_id_type: userIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return (response.data?.items || []) as FeishuUser[];\n }\n}\n","import { FeishuSdkService } from \"./feishu-sdk.service\";\nimport {\n SendCardParams,\n ReplyCardParams,\n UpdateCardParams,\n SendMessageResponse,\n CardContent,\n type CardActionTriggerCallback,\n} from \"./types\";\nimport { FEISHU_CARD_ACTION_TRIGGER } from \"./types\";\n\n/**\n * 飞书卡片消息服务\n * 提供卡片消息的发送、回复、更新功能\n */\nexport class FeishuCardService {\n constructor(protected readonly feishuSdkService: FeishuSdkService) {\n // 监听卡片动作触发事件\n feishuSdkService.on(FEISHU_CARD_ACTION_TRIGGER, (event) => {\n this.handleCardActionTrigger(event);\n });\n }\n\n async handleCardActionTrigger(event: CardActionTriggerCallback): Promise<void> {\n const _eventHook = event.header.event_type ?? event.event.action.tag;\n\n // console.log(_eventHook);\n }\n\n /**\n * 将卡片内容转换为字符串\n */\n protected serializeCard(card: CardContent): string {\n return typeof card === \"string\" ? card : JSON.stringify(card);\n }\n\n /**\n * 转换 API 响应为统一格式\n */\n protected transformMessageResponse(data: any): SendMessageResponse {\n return {\n messageId: data.message_id,\n rootId: data.root_id,\n parentId: data.parent_id,\n msgType: data.msg_type,\n createTime: data.create_time,\n updateTime: data.update_time,\n deleted: data.deleted,\n updated: data.updated,\n chatId: data.chat_id,\n sender: {\n id: data.sender?.id,\n idType: data.sender?.id_type,\n senderType: data.sender?.sender_type,\n tenantKey: data.sender?.tenant_key,\n },\n };\n }\n\n /**\n * 发送卡片消息\n * @param params 发送卡片消息的参数\n * @returns 发送结果\n */\n async sendCard(params: SendCardParams): Promise<SendMessageResponse> {\n const { receiveId, receiveIdType, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.create({\n params: {\n receive_id_type: receiveIdType,\n },\n data: {\n receive_id: receiveId,\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书发送卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 回复卡片消息\n * @param params 回复卡片消息的参数\n * @returns 回复结果\n */\n async replyCard(params: ReplyCardParams): Promise<SendMessageResponse> {\n const { messageId, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.reply({\n path: {\n message_id: messageId,\n },\n data: {\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书回复卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 更新卡片消息\n * @param params 更新卡片消息的参数\n * @returns 更新是否成功\n */\n async updateCard(params: UpdateCardParams): Promise<void> {\n const { messageId, card } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.patch({\n path: {\n message_id: messageId,\n },\n data: {\n content: this.serializeCard(card),\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书更新卡片失败: ${response.code} - ${response.msg}`);\n }\n }\n}\n","/**\n * 飞书 SDK 模块配置类型\n */\n\nexport const FEISHU_MODULE_OPTIONS = \"FEISHU_MODULE_OPTIONS\";\n\nexport interface FeishuModuleOptions {\n /** 应用 ID */\n appId: string;\n /** 应用密钥 */\n appSecret: string;\n /** 应用类型:自建应用或商店应用 */\n appType?: \"self_build\" | \"store\";\n /** 域名:飞书或 Lark */\n domain?: \"feishu\" | \"lark\";\n}\n\nexport interface FeishuModuleAsyncOptions {\n useFactory: (...args: any[]) => Promise<FeishuModuleOptions> | FeishuModuleOptions;\n inject?: any[];\n}\n","/**\n * 飞书 SDK 类型定义\n */\n\n// Module - 模块配置\nexport {\n FEISHU_MODULE_OPTIONS,\n type FeishuModuleOptions,\n type FeishuModuleAsyncOptions,\n} from \"./module\";\n\n// Common - 通用类型\nexport { type I18nLocale } from \"./common\";\n\n// User - 用户相关\nexport { type UserIdType, type FeishuUser, type GetUserParams } from \"./user\";\n\n// Message - 消息相关\nexport { type ReceiveIdType, type SendMessageResponse } from \"./message\";\n\n// Card - 卡片消息\nexport {\n type CardContent,\n type SendCardParams,\n type ReplyCardParams,\n type UpdateCardParams,\n type CardDataRaw,\n type CardDataTemplate,\n type CardData,\n} from \"./card\";\n\n// CardAction - 卡片交互回调\nexport {\n FEISHU_CARD_ACTION_TRIGGER,\n type CardActionHeader,\n type CardActionOperator,\n type CardActionInfo,\n type CardActionContext,\n type CardActionEventData,\n type CardActionTriggerCallback,\n type CardActionToast,\n type CardActionTriggerResponse,\n type CardActionTriggerEventCallback,\n type CardActionTriggerEvent,\n type CardEvents,\n} from \"./card-action\";\n","export * from \"./feishu-sdk.service\";\nexport * from \"./fieshu-card.service\";\nexport * from \"./types/index\";\n","import { type StorageAdapter } from \"./adapters/storage-adapter.interface\";\nimport type { IStorageService } from \"../../extension-system/types\";\n\n/**\n * Storage 服务配置选项\n */\nexport interface StorageServiceOptions {\n /** 默认过期时间(毫秒),0 表示永不过期 */\n defaultTtl?: number;\n /** 最大 key 数量,超过时会淘汰最早过期的 key,0 或 undefined 表示不限制 */\n maxKeys?: number;\n}\n\n/**\n * Storage 服务\n * 提供统一的键值存储接口,支持过期时间和层级 key\n *\n * Key 使用 : 作为层级分隔符,例如:\n * - user:123:profile\n * - cache:api:users\n */\nexport class StorageService implements IStorageService {\n protected cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n protected readonly adapter: StorageAdapter,\n protected readonly options: StorageServiceOptions = {},\n ) {\n // 启动定期清理过期项的定时器\n this.startCleanupTimer();\n }\n\n destroy(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * 启动定期清理过期项的定时器\n */\n protected startCleanupTimer(): void {\n // 每分钟清理一次过期项\n this.cleanupTimer = setInterval(() => {\n this.cleanup().catch(console.error);\n }, 60 * 1000);\n // 使用 unref() 让定时器不阻止进程退出\n this.cleanupTimer.unref();\n }\n\n /**\n * 清理所有过期项\n */\n async cleanup(): Promise<number> {\n const now = Date.now();\n const allKeys = await this.adapter.keys();\n let cleaned = 0;\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && item.expireAt && item.expireAt <= now) {\n await this.adapter.delete(key);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n\n /**\n * 获取值\n * @param key 键名,支持 : 分隔的层级结构\n * @returns 值,如果不存在或已过期返回 undefined\n */\n async get<T = any>(key: string): Promise<T | undefined> {\n const item = await this.adapter.get<T>(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n /**\n * 设置值\n * @param key 键名,支持 : 分隔的层级结构\n * @param value 值\n * @param ttl 过期时间(毫秒),0 或 undefined 表示使用默认值\n */\n async set<T = any>(key: string, value: T, ttl?: number): Promise<void> {\n const effectiveTtl = ttl ?? this.options.defaultTtl ?? 0;\n\n // 检查是否需要淘汰\n if (this.options.maxKeys && this.options.maxKeys > 0) {\n const exists = await this.adapter.has(key);\n if (!exists) {\n await this.evictIfNeeded();\n }\n }\n\n await this.adapter.set(key, {\n value,\n expireAt: effectiveTtl > 0 ? Date.now() + effectiveTtl : undefined,\n });\n }\n\n /**\n * 如果超过最大 key 数量,淘汰最早过期的 key\n */\n protected async evictIfNeeded(): Promise<void> {\n const maxKeys = this.options.maxKeys;\n if (!maxKeys || maxKeys <= 0) return;\n\n const currentSize = await this.adapter.size();\n if (currentSize < maxKeys) return;\n\n // 先清理过期的 key\n await this.cleanup();\n\n // 再次检查\n const sizeAfterCleanup = await this.adapter.size();\n if (sizeAfterCleanup < maxKeys) return;\n\n // 仍然超过限制,淘汰最早过期的 key\n const allKeys = await this.adapter.keys();\n const keyWithExpire: { key: string; expireAt: number }[] = [];\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item) {\n keyWithExpire.push({\n key,\n expireAt: item.expireAt ?? Infinity, // 永不过期的放最后\n });\n }\n }\n\n // 按过期时间排序,最早过期的在前面\n keyWithExpire.sort((a, b) => a.expireAt - b.expireAt);\n\n // 淘汰超出的 key\n const toEvict = sizeAfterCleanup - maxKeys + 1; // +1 为新 key 腾出空间\n for (let i = 0; i < toEvict && i < keyWithExpire.length; i++) {\n await this.adapter.delete(keyWithExpire[i].key);\n }\n }\n\n /**\n * 删除值\n * @param key 键名\n * @returns 是否删除成功\n */\n async del(key: string): Promise<boolean> {\n return this.adapter.delete(key);\n }\n\n /**\n * 检查键是否存在(且未过期)\n * @param key 键名\n */\n async has(key: string): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * 获取匹配的键名列表\n * @param pattern 匹配模式,支持 * 通配符\n *\n * 示例:\n * - keys('user:*') 获取所有以 user: 开头的键\n * - keys('*:profile') 获取所有以 :profile 结尾的键\n * - keys('user:*:settings') 获取匹配模式的键\n */\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = await this.adapter.keys(pattern);\n const now = Date.now();\n const validKeys: string[] = [];\n\n // 过滤掉已过期的键\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && (!item.expireAt || item.expireAt > now)) {\n validKeys.push(key);\n }\n }\n\n return validKeys;\n }\n\n /**\n * 获取指定前缀下的所有键\n * @param prefix 前缀,例如 'user:123'\n */\n async keysWithPrefix(prefix: string): Promise<string[]> {\n return this.keys(`${prefix}:*`);\n }\n\n /**\n * 删除指定前缀下的所有键\n * @param prefix 前缀\n * @returns 删除的键数量\n */\n async delByPrefix(prefix: string): Promise<number> {\n const keysToDelete = await this.keysWithPrefix(prefix);\n let deleted = 0;\n\n for (const key of keysToDelete) {\n if (await this.adapter.delete(key)) {\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * 设置过期时间\n * @param key 键名\n * @param ttl 过期时间(毫秒)\n * @returns 是否设置成功\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n await this.adapter.set(key, {\n ...item,\n expireAt: ttl > 0 ? Date.now() + ttl : undefined,\n });\n\n return true;\n }\n\n /**\n * 获取剩余过期时间\n * @param key 键名\n * @returns 剩余时间(毫秒),-1 表示永不过期,undefined 表示键不存在\n */\n async ttl(key: string): Promise<number | undefined> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n if (!item.expireAt) {\n return -1; // 永不过期\n }\n\n return item.expireAt - Date.now();\n }\n\n /**\n * 清空所有存储\n */\n async clear(): Promise<void> {\n await this.adapter.clear();\n }\n\n /**\n * 获取当前存储的 key 数量\n */\n async size(): Promise<number> {\n return this.adapter.size();\n }\n}\n","import { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 内存存储适配器\n * 数据存储在内存中,进程重启后数据丢失\n */\nexport class MemoryAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 文件存储适配器\n * 数据持久化到 JSON 文件,支持进程重启后恢复\n */\nexport class FileAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n protected filePath: string;\n protected saveTimer: ReturnType<typeof setTimeout> | null = null;\n protected readonly debounceMs = 100; // 防抖延迟\n\n constructor(filePath: string) {\n this.filePath = filePath;\n this.load();\n }\n\n /**\n * 从文件加载数据\n */\n protected load(): void {\n try {\n if (fs.existsSync(this.filePath)) {\n const data = fs.readFileSync(this.filePath, \"utf-8\");\n const parsed = JSON.parse(data) as Record<string, StorageItem>;\n this.store = new Map(Object.entries(parsed));\n }\n } catch {\n // 文件不存在或解析失败,使用空存储\n this.store = new Map();\n }\n }\n\n /**\n * 保存数据到文件(防抖)\n */\n protected save(): void {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = setTimeout(() => {\n this.saveSync();\n this.saveTimer = null;\n }, this.debounceMs);\n }\n\n /**\n * 同步保存数据到文件\n */\n protected saveSync(): void {\n try {\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const data = Object.fromEntries(this.store);\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf-8\");\n } catch (error) {\n console.error(\"Failed to save storage file:\", error);\n }\n }\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n this.save();\n }\n\n async delete(key: string): Promise<boolean> {\n const result = this.store.delete(key);\n if (result) {\n this.save();\n }\n return result;\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n this.save();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","export * from \"./storage-adapter.interface\";\nexport * from \"./memory.adapter\";\nexport * from \"./file.adapter\";\n","export * from \"./storage.service\";\nexport * from \"./types\";\nexport * from \"./adapters\";\n","export interface ParallelTask<T, R> {\n id: string;\n data: T;\n execute: (data: T) => Promise<R>;\n}\n\nexport interface ParallelResult<R> {\n id: string;\n success: boolean;\n result?: R;\n error?: Error;\n}\n\nexport interface ParallelExecutorOptions {\n concurrency?: number;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n onProgress?: (completed: number, total: number, taskId: string) => void;\n onTaskStart?: (taskId: string) => void;\n onTaskComplete?: (taskId: string, success: boolean) => void;\n onRetry?: (taskId: string, attempt: number, error: Error) => void;\n stopOnError?: boolean;\n}\n\nexport class ParallelExecutor {\n private readonly concurrency: number;\n private readonly timeout?: number;\n private readonly retries: number;\n private readonly retryDelay: number;\n private readonly onProgress?: (completed: number, total: number, taskId: string) => void;\n private readonly onTaskStart?: (taskId: string) => void;\n private readonly onTaskComplete?: (taskId: string, success: boolean) => void;\n private readonly onRetry?: (taskId: string, attempt: number, error: Error) => void;\n private readonly stopOnError: boolean;\n\n constructor(options: ParallelExecutorOptions = {}) {\n this.concurrency = options.concurrency ?? 5;\n this.timeout = options.timeout;\n this.retries = options.retries ?? 0;\n this.retryDelay = options.retryDelay ?? 1000;\n this.onProgress = options.onProgress;\n this.onTaskStart = options.onTaskStart;\n this.onTaskComplete = options.onTaskComplete;\n this.onRetry = options.onRetry;\n this.stopOnError = options.stopOnError ?? false;\n }\n\n async execute<T, R>(tasks: ParallelTask<T, R>[]): Promise<ParallelResult<R>[]> {\n if (tasks.length === 0) {\n return [];\n }\n\n const results: ParallelResult<R>[] = [];\n const total = tasks.length;\n let completed = 0;\n let shouldStop = false;\n\n const executeTask = async (task: ParallelTask<T, R>): Promise<ParallelResult<R>> => {\n if (shouldStop) {\n return { id: task.id, success: false, error: new Error(\"Execution stopped\") };\n }\n\n this.onTaskStart?.(task.id);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (attempt > 0) {\n this.onRetry?.(task.id, attempt, lastError!);\n await this.delay(this.retryDelay);\n }\n\n try {\n const result = await this.executeWithTimeout(task, task.data);\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, true);\n return { id: task.id, success: true, result };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, false);\n\n if (this.stopOnError) {\n shouldStop = true;\n }\n\n return {\n id: task.id,\n success: false,\n error: lastError,\n };\n };\n\n // 使用滑动窗口并发控制\n const pending: Promise<void>[] = [];\n const taskQueue = [...tasks];\n\n while (taskQueue.length > 0 || pending.length > 0) {\n // 填充到并发上限\n while (pending.length < this.concurrency && taskQueue.length > 0 && !shouldStop) {\n const task = taskQueue.shift()!;\n const promise = executeTask(task).then((result) => {\n results.push(result);\n // 从 pending 中移除\n const index = pending.indexOf(promise);\n if (index > -1) {\n pending.splice(index, 1);\n }\n });\n pending.push(promise);\n }\n\n // 等待任意一个完成\n if (pending.length > 0) {\n await Promise.race(pending);\n }\n }\n\n // 按原始顺序排序结果\n const taskIdOrder = new Map(tasks.map((t, i) => [t.id, i]));\n results.sort((a, b) => (taskIdOrder.get(a.id) ?? 0) - (taskIdOrder.get(b.id) ?? 0));\n\n return results;\n }\n\n async map<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n getId?: (item: T, index: number) => string,\n ): Promise<ParallelResult<R>[]> {\n const tasks: ParallelTask<{ item: T; index: number }, R>[] = items.map((item, index) => ({\n id: getId ? getId(item, index) : String(index),\n data: { item, index },\n execute: async ({ item, index }) => fn(item, index),\n }));\n\n return this.execute(tasks);\n }\n\n private async executeWithTimeout<T, R>(task: ParallelTask<T, R>, data: T): Promise<R> {\n if (!this.timeout) {\n return task.execute(data);\n }\n\n return Promise.race([\n task.execute(data),\n new Promise<R>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Task ${task.id} timed out after ${this.timeout}ms`)),\n this.timeout,\n ),\n ),\n ]);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport function parallel(options?: ParallelExecutorOptions): ParallelExecutor {\n return new ParallelExecutor(options);\n}\n","export * from \"./parallel-executor\";\n","import { randomUUID } from \"crypto\";\nimport type { IOutputService } from \"../../extension-system/types\";\n\nconst OUTPUT_MARKER_START = \"::spaceflow-output::\";\nconst OUTPUT_MARKER_END = \"::end::\";\n\n/**\n * OutputService - 用于标准化命令输出\n *\n * 命令可以通过此服务设置输出值,这些值会在命令执行完成后\n * 以特定格式输出到 stdout,供 CI 流程中的其他步骤使用。\n *\n * 输出格式: ::spaceflow-output::{\"key\":\"value\",\"_cacheId\":\"uuid\"}::end::\n *\n * _cacheId 用于 actions/cache 在不同 job 之间传递数据\n *\n * 使用示例:\n * ```typescript\n * const output = new OutputService();\n * output.set(\"version\", \"1.0.0\");\n * output.set(\"tag\", \"v1.0.0\");\n * output.flush();\n * ```\n */\nexport class OutputService implements IOutputService {\n protected outputs: Record<string, string> = {};\n protected cacheId: string = randomUUID();\n\n /**\n * 设置单个输出值\n */\n set(key: string, value: string | number | boolean): void {\n this.outputs[key] = String(value);\n }\n\n /**\n * 批量设置输出值\n */\n setAll(values: Record<string, string | number | boolean>): void {\n for (const [key, value] of Object.entries(values)) {\n this.set(key, value);\n }\n }\n\n /**\n * 获取所有输出值\n */\n getAll(): Record<string, string> {\n return { ...this.outputs };\n }\n\n /**\n * 清空所有输出值\n */\n clear(): void {\n this.outputs = {};\n }\n\n /**\n * 输出所有值到 stdout(带标记格式)\n * 通常在命令执行完成后调用\n * _cacheId 会被 actions 捕获并用于 actions/cache\n */\n flush(): void {\n if (Object.keys(this.outputs).length === 0) {\n return;\n }\n\n // 输出到 stdout,包含 cacheId 供 actions/cache 使用\n const outputWithCache = { ...this.outputs, _cacheId: this.cacheId };\n const json = JSON.stringify(outputWithCache);\n console.log(`${OUTPUT_MARKER_START}${json}${OUTPUT_MARKER_END}`);\n }\n\n /**\n * 检查是否有输出值\n */\n hasOutputs(): boolean {\n return Object.keys(this.outputs).length > 0;\n }\n\n /**\n * 获取当前 cacheId\n */\n getCacheId(): string {\n return this.cacheId;\n }\n\n /**\n * 输出信息\n */\n info(message: string): void {\n console.log(message);\n }\n\n /**\n * 输出成功信息\n */\n success(message: string): void {\n console.log(`✅ ${message}`);\n }\n\n /**\n * 输出警告\n */\n warn(message: string): void {\n console.warn(`⚠️ ${message}`);\n }\n\n /**\n * 输出错误\n */\n error(message: string): void {\n console.error(`❌ ${message}`);\n }\n\n /**\n * 输出调试信息\n */\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.debug(`🔍 ${message}`);\n }\n }\n}\n\nexport { OUTPUT_MARKER_START, OUTPUT_MARKER_END };\n","export * from \"./output.service\";\n","/**\n * 从 @spaceflow/shared 重导出 editor-config\n */\nexport { EDITOR_DIR_MAPPING, DEFAULT_EDITOR, getEditorDirName } from \"@spaceflow/shared\";\n","import { jsonrepair } from \"jsonrepair\";\nimport type { LlmJsonPutSchema, LlmJsonSchema } from \"./types\";\n\nexport type { LlmJsonPutSchema, LlmJsonSchema, LlmJsonSchemaType } from \"./types\";\n\nexport interface ParseOptions {\n disableRequestRetry?: boolean;\n}\n\nexport interface LlmJsonPutOptions {\n llmRequest?: (prompt: { systemPrompt: string; userPrompt: string }) => Promise<string>;\n systemPrompt?: string;\n}\n\nconst JSON_FORMAT_INSTRUCTION = `请严格以 JSON 格式输出结果,不要输出任何其他内容,格式如下:`;\n\nexport class LlmJsonPut<T = any> {\n public readonly jsonFormatInstruction: string;\n constructor(\n protected schema: LlmJsonPutSchema,\n protected opts?: LlmJsonPutOptions,\n ) {\n this.jsonFormatInstruction = this.getJsonFormatInstruction(schema);\n }\n\n isMatched(prompt: string): boolean {\n return prompt.includes(JSON_FORMAT_INSTRUCTION);\n }\n\n getSchema(): Record<string, unknown> {\n return this.schema as unknown as Record<string, unknown>;\n }\n\n getJsonFormatInstruction(schema: LlmJsonPutSchema): string {\n const generateExample = (s: LlmJsonSchema): any => {\n if (s.type === \"object\") {\n const obj: any = {};\n for (const [key, value] of Object.entries(s.properties || {})) {\n obj[key] = generateExample(value);\n }\n return obj;\n } else if (s.type === \"array\") {\n return [generateExample(s.items!)];\n }\n return s.description || `<${s.type}>`;\n };\n\n const example = JSON.stringify(generateExample(schema), null, 2);\n\n return `${JSON_FORMAT_INSTRUCTION}\\n\\`\\`\\`json\\n${example}\\`\\`\\`\\n注意:只输出 JSON,不要包含 markdown 代码块或其他文字。`;\n }\n\n async parse(input: string, opts?: ParseOptions): Promise<T> {\n let content = input.trim();\n\n // 尝试移除 markdown 代码块\n if (content.startsWith(\"```\")) {\n content = content.replace(/^```(?:json)?\\n?/, \"\").replace(/\\n?```$/, \"\");\n }\n\n try {\n try {\n return JSON.parse(content);\n } catch {\n // 如果原生解析失败,尝试修复\n const repaired = jsonrepair(content);\n return JSON.parse(repaired);\n }\n } catch (err) {\n // 如果以上都不行就都丢给大模型,然后在重新走parse,但是要记录重新执行的次数,最多5次\n let retryCount = 0;\n while (retryCount < 5 && !opts?.disableRequestRetry) {\n const response = await this.request(input);\n return response;\n }\n throw new Error(\n `无法解析或修复 LLM 返回的 JSON: ${err instanceof Error ? err.message : String(err)}\\n原始内容: ${input}`,\n );\n }\n }\n\n async request(userPrompt: string): Promise<T> {\n if (!this.opts?.llmRequest) {\n throw new Error(\"未配置 llmRequest 方法,无法发起请求\");\n }\n\n const systemPrompt = `${this.opts.systemPrompt ? this.opts.systemPrompt + \"\\n\" : \"\"}${this.jsonFormatInstruction}`;\n const response = await this.opts.llmRequest({\n systemPrompt,\n userPrompt,\n });\n return this.parse(response, { disableRequestRetry: true });\n }\n}\n","/**\n * 从 @spaceflow/shared 重导出 source-utils\n */\nexport type { SourceType } from \"@spaceflow/shared\";\nexport {\n isGitUrl,\n isLocalPath,\n getSourceType,\n normalizeSource,\n extractNpmPackageName,\n extractName,\n buildGitPackageSpec,\n} from \"@spaceflow/shared\";\n","/**\n * 从 @spaceflow/shared 重导出 package-manager 工具函数\n */\nexport { getPackageManager, detectPackageManager, isPnpmWorkspace } from \"@spaceflow/shared\";\n\n// addSpaceflowToDevDependencies 是 core 独有的,保留在这里\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\n\n/**\n * 将 .spaceflow 添加到根项目的 devDependencies 中\n * 使用 file: 协议,兼容 npm 和 pnpm\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否成功添加(如果已存在则返回 false)\n */\nexport function addSpaceflowToDevDependencies(cwd?: string): boolean {\n const workDir = cwd || process.cwd();\n const packageJsonPath = join(workDir, \"package.json\");\n\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n // 检查是否已存在\n if (pkg.devDependencies?.[\"spaceflow\"]) {\n return false;\n }\n\n // 添加到 devDependencies\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n pkg.devDependencies[\"spaceflow\"] = \"file:.spaceflow\";\n\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * 从 @spaceflow/shared 重导出 spaceflow-dir 工具函数\n */\nexport {\n getSpaceflowDir,\n ensureSpaceflowDir,\n getSpaceflowCoreVersion,\n ensureSpaceflowPackageJson,\n ensureDependencies,\n loadExtensionsFromDir,\n ensureEditorGitignore,\n SPACEFLOW_DIR,\n PACKAGE_JSON,\n} from \"@spaceflow/shared\";\n","import { resolve } from \"path\";\nimport type { Configuration, RuleSetRule } from \"@rspack/core\";\n\n/**\n * 插件构建配置选项\n */\nexport interface PluginBuildOptions {\n /** 插件名称 */\n name: string;\n /** 插件根目录路径 */\n path: string;\n /** 入口文件路径,默认 ./src/index.ts */\n entry?: string;\n /** 输出目录,默认 dist */\n outDir?: string;\n /** 是否压缩,默认 false */\n minimize?: boolean;\n /** 额外的外部依赖 */\n externals?: Configuration[\"externals\"];\n /** 额外的 resolve alias */\n alias?: Record<string, string>;\n /** 自定义 module rules */\n rules?: RuleSetRule[];\n}\n\n/**\n * 核心框架路径配置\n */\nexport interface CorePathOptions {\n /** core 包根目录 */\n coreRoot: string;\n}\n\n/**\n * 默认的外部依赖列表\n */\nexport const DEFAULT_EXTERNALS: Configuration[\"externals\"] = [\n // Spaceflow 核心 - 运行时从 core 加载\n { \"@spaceflow/core\": \"module @spaceflow/core\" },\n // 排除所有 node_modules(除了相对路径和 src/ 别名)\n /^(?!\\.\\/|\\.\\.\\/|src\\/)[^./]/,\n];\n\n/**\n * 默认的 TypeScript 编译规则\n */\nexport const DEFAULT_TS_RULE: RuleSetRule = {\n test: /\\.ts$/,\n exclude: /node_modules/,\n loader: \"builtin:swc-loader\",\n options: {\n jsc: {\n parser: {\n syntax: \"typescript\",\n decorators: true,\n },\n transform: {\n legacyDecorator: true,\n decoratorMetadata: true,\n },\n target: \"es2022\",\n },\n },\n};\n\n/**\n * 创建插件构建的 rspack 配置\n */\nexport function createPluginConfig(\n options: PluginBuildOptions,\n coreOptions: CorePathOptions,\n): Configuration {\n const {\n name,\n path: pluginPath,\n entry = \"./src/index.ts\",\n outDir = \"dist\",\n minimize = false,\n externals: customExternals = [],\n alias: customAlias = {},\n rules: customRules = [],\n } = options;\n\n const { coreRoot } = coreOptions;\n\n // 合并外部依赖\n const mergedExternals = Array.isArray(customExternals)\n ? [...(DEFAULT_EXTERNALS as any[]), ...customExternals]\n : [...(DEFAULT_EXTERNALS as any[]), customExternals];\n\n // 合并 alias\n const alias = {\n \"@spaceflow/core\": resolve(coreRoot, \"src\", \"index.ts\"),\n ...customAlias,\n };\n\n // 合并 rules\n const rules = [DEFAULT_TS_RULE, ...customRules];\n\n return {\n name,\n context: pluginPath,\n optimization: {\n minimize,\n },\n entry: {\n index: entry,\n },\n target: \"node\",\n mode: process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n output: {\n filename: \"[name].js\",\n path: resolve(pluginPath, outDir),\n library: { type: \"module\" },\n chunkFormat: \"module\",\n clean: true,\n },\n experiments: {\n outputModule: true,\n },\n externalsType: \"module-import\",\n externals: mergedExternals,\n resolve: {\n extensions: [\".ts\", \".js\"],\n extensionAlias: {\n \".js\": [\".ts\", \".js\"],\n },\n alias,\n },\n module: {\n rules,\n },\n };\n}\n\n/**\n * 创建多入口插件配置\n */\nexport function createMultiEntryPluginConfig(\n options: Omit<PluginBuildOptions, \"entry\"> & {\n entries: Record<string, string>;\n },\n coreOptions: CorePathOptions,\n): Configuration {\n const config = createPluginConfig({ ...options, entry: \"./src/index.ts\" }, coreOptions);\n\n return {\n ...config,\n entry: options.entries,\n };\n}\n","export * from \"./rspack-config\";\n","/**\n * MCP (Model Context Protocol) 支持模块\n *\n * 提供装饰器和基础设施,用于在服务中定义 MCP 工具\n *\n * 使用方式:\n * ```typescript\n * class ListRulesInput {\n * @ApiPropertyOptional({ description: \"项目目录\" })\n * @IsString()\n * @IsOptional()\n * cwd?: string;\n * }\n *\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({\n * name: \"list_rules\",\n * description: \"获取所有审查规则\",\n * dto: ListRulesInput,\n * })\n * async listRules(input: ListRulesInput) {\n * return { rules: [...] };\n * }\n * }\n * ```\n */\n\nimport \"reflect-metadata\";\n\n/** MCP 服务元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_SERVER_METADATA = Symbol.for(\"spaceflow:mcp:server\");\n\n/** MCP 工具元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_TOOL_METADATA = Symbol.for(\"spaceflow:mcp:tool\");\n\n/** JSON Schema 类型 */\nexport interface JsonSchema {\n type: string;\n properties?: Record<string, JsonSchema & { description?: string }>;\n required?: string[];\n items?: JsonSchema;\n description?: string;\n}\n\n/** MCP 服务定义 */\nexport interface McpServerDefinition {\n /** 服务名称 */\n name: string;\n /** 服务版本 */\n version?: string;\n /** 服务描述 */\n description?: string;\n}\n\n/** Swagger 元数据常量 */\nconst SWAGGER_API_MODEL_PROPERTIES = \"swagger/apiModelProperties\";\nconst SWAGGER_API_MODEL_PROPERTIES_ARRAY = \"swagger/apiModelPropertiesArray\";\n\n/**\n * 从 @nestjs/swagger 的 @ApiProperty / @ApiPropertyOptional 元数据生成 JSON Schema\n * 直接读取 swagger 装饰器存储的 reflect-metadata,无需自定义装饰器\n */\nexport function dtoToJsonSchema(dtoClass: new (...args: any[]) => any): JsonSchema {\n const prototype = dtoClass.prototype;\n\n // 读取属性名列表(swagger 存储格式为 \":propertyName\")\n const propertyKeys: string[] = (\n Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES_ARRAY, prototype) || []\n ).map((key: string) => key.replace(/^:/, \"\"));\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const key of propertyKeys) {\n const meta = Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES, prototype, key) || {};\n\n // 推断 JSON Schema type\n const typeMap: Record<string, string> = {\n String: \"string\",\n Number: \"number\",\n Boolean: \"boolean\",\n Array: \"array\",\n Object: \"object\",\n };\n\n let schemaType = meta.type;\n // meta.type 可能是构造函数(如 Boolean)或字符串(如 \"boolean\")\n if (typeof schemaType === \"function\") {\n schemaType = typeMap[schemaType.name] || \"string\";\n }\n // 从 reflect-metadata 的 design:type 推断\n if (!schemaType) {\n const reflectedType = Reflect.getMetadata(\"design:type\", prototype, key);\n if (reflectedType) {\n schemaType = typeMap[reflectedType.name] || \"string\";\n }\n }\n\n const prop: Record<string, any> = {};\n if (schemaType) prop.type = schemaType;\n if (meta.description) prop.description = meta.description;\n if (meta.default !== undefined) prop.default = meta.default;\n if (meta.enum) prop.enum = meta.enum;\n if (meta.example !== undefined) prop.example = meta.example;\n\n properties[key] = prop;\n\n // required 判断:swagger 的 @ApiProperty 默认 required=true,@ApiPropertyOptional 为 false\n if (meta.required !== false) {\n required.push(key);\n }\n }\n\n const schema: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) schema.required = required;\n return schema;\n}\n\n/** MCP 工具定义 */\nexport interface McpToolDefinition {\n /** 工具名称 */\n name: string;\n /** 工具描述 */\n description: string;\n /** 输入参数 schema (JSON Schema 格式,与 dto 二选一) */\n inputSchema?: JsonSchema;\n /** 输入参数 DTO 类(与 inputSchema 二选一,优先级高于 inputSchema) */\n dto?: new (...args: any[]) => any;\n}\n\n/** 存储的工具元数据 */\nexport interface McpToolMetadata extends McpToolDefinition {\n /** 方法名 */\n methodName: string;\n}\n\n/**\n * MCP 服务装饰器\n * 标记一个类为 MCP 服务,内部自动应用 @Injectable()\n *\n * @example\n * ```typescript\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({ name: \"list_rules\", description: \"获取规则\" })\n * async listRules() { ... }\n * }\n * ```\n */\nexport function McpServer(definition: McpServerDefinition): ClassDecorator {\n return (target: Function) => {\n // 使用静态属性存储元数据(跨模块可访问)\n (target as any).__mcp_server__ = definition;\n };\n}\n\n/**\n * MCP 工具装饰器\n * 标记一个方法为 MCP 工具\n */\nexport function McpTool(definition: McpToolDefinition): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor as any;\n // 使用静态属性存储工具列表(跨模块可访问)\n if (!constructor.__mcp_tools__) {\n constructor.__mcp_tools__ = [];\n }\n\n // 如果提供了 dto,自动从 swagger 元数据生成 inputSchema\n const resolvedDefinition = { ...definition };\n if (resolvedDefinition.dto) {\n resolvedDefinition.inputSchema = dtoToJsonSchema(resolvedDefinition.dto);\n }\n\n constructor.__mcp_tools__.push({\n ...resolvedDefinition,\n methodName: String(propertyKey),\n });\n };\n}\n\n/**\n * 检查一个类是否是 MCP 服务\n */\nexport function isMcpServer(target: any): boolean {\n const constructor = target?.constructor || target;\n return !!constructor?.__mcp_server__;\n}\n\n/**\n * 获取 MCP 服务元数据\n */\nexport function getMcpServerMetadata(target: any): McpServerDefinition | undefined {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_server__;\n}\n\n/**\n * 从服务类获取所有 MCP 工具定义\n */\nexport function getMcpTools(target: any): McpToolMetadata[] {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_tools__ || [];\n}\n\n/**\n * MCP Server 运行器\n * 收集服务中的 MCP 工具并启动 stdio 服务\n */\nexport async function runMcpServer(\n service: any,\n serverInfo: { name: string; version: string },\n): Promise<void> {\n const tools = getMcpTools(service);\n\n if (tools.length === 0) {\n console.error(\"没有找到 MCP 工具定义\");\n process.exit(1);\n }\n\n // 动态导入 MCP SDK(避免在不需要时加载)\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const server = new McpServer(serverInfo);\n\n // 注册所有工具(使用 v1 API: server.tool)\n for (const tool of tools) {\n // v1 API: server.tool(name, description, schema, callback)\n // 使用工具定义中的 inputSchema 转为 zod,如果没有则传空对象\n const schema = tool.inputSchema ? jsonSchemaToZod(tool.inputSchema) : {};\n server.tool(tool.name, tool.description, schema, async (args: any) => {\n try {\n const result = await service[tool.methodName](args || {});\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n });\n }\n\n /**\n * 将 JSON Schema 转换为简单的 zod 对象(MCP SDK 需要 zod)\n * 仅处理顶层 properties,满足 MCP 工具注册需求\n */\n function jsonSchemaToZod(jsonSchema: JsonSchema): Record<string, any> {\n const { z } = require(\"zod\") as typeof import(\"zod\");\n if (!jsonSchema.properties) return {};\n\n const shape: Record<string, any> = {};\n const requiredFields = jsonSchema.required || [];\n\n for (const [key, prop] of Object.entries(jsonSchema.properties)) {\n let field: any;\n switch (prop.type) {\n case \"number\":\n field = z.number();\n break;\n case \"boolean\":\n field = z.boolean();\n break;\n case \"array\":\n field = z.array(z.any());\n break;\n case \"object\":\n field = z.object({});\n break;\n default:\n field = z.string();\n }\n if (prop.description) field = field.describe(prop.description);\n if (!requiredFields.includes(key)) field = field.optional();\n shape[key] = field;\n }\n\n return shape;\n }\n\n // 启动 stdio 传输\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(`MCP Server \"${serverInfo.name}\" started with ${tools.length} tools`);\n}\n","/** globalThis 上的 key */\nconst GLOBAL_T_KEY = \"__spaceflow_t__\";\nconst GLOBAL_ADD_LOCALE_KEY = \"__spaceflow_add_locale__\";\n\n/** 翻译函数类型 */\nexport type TranslateFn = (key: string, options?: Record<string, unknown>) => string;\n\n/** 注册翻译资源函数类型 */\nexport type AddLocaleResourcesFn = (\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n) => void;\n\n/**\n * 设置全局翻译函数\n * 由 CLI 在启动时调用,将 i18next 的 t 函数挂载到 globalThis\n */\nexport function setGlobalT(fn: TranslateFn): void {\n (globalThis as Record<string, unknown>)[GLOBAL_T_KEY] = fn;\n}\n\n/**\n * 设置全局翻译资源注册函数\n * 由 CLI 在启动时调用\n */\nexport function setGlobalAddLocaleResources(fn: AddLocaleResourcesFn): void {\n (globalThis as Record<string, unknown>)[GLOBAL_ADD_LOCALE_KEY] = fn;\n}\n\n/**\n * 获取全局翻译函数\n */\nfunction getGlobalT(): TranslateFn | undefined {\n return (globalThis as Record<string, unknown>)[GLOBAL_T_KEY] as TranslateFn | undefined;\n}\n\n/**\n * 简单的模板插值(fallback 用)\n * 支持 {{key}} 格式\n */\nfunction interpolate(template: string, options?: Record<string, unknown>): string {\n if (!options) return template;\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, k: string) => {\n const val = options[k];\n return val !== undefined ? String(val) : `{{${k}}}`;\n });\n}\n\n/**\n * 翻译函数\n * 优先使用 CLI 通过 setGlobalT 挂载的翻译函数\n * 未挂载时回退到返回 key(带插值)\n * @param key 翻译 key\n * @param options 插值参数\n */\nexport function t(key: string, options?: Record<string, unknown>): string {\n const globalT = getGlobalT();\n if (globalT) {\n return globalT(key, options);\n }\n // fallback: 直接返回 key(带插值)\n return interpolate(key, options);\n}\n\n/**\n * 为外部 Extension 注册语言资源\n * 委托给 CLI 通过 setGlobalAddLocaleResources 挂载的实际实现\n * @param ns 命名空间(通常为 Extension name)\n * @param resources 语言资源,key 为语言代码,值为翻译对象\n */\nexport function addLocaleResources(\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n): void {\n const fn = (globalThis as Record<string, unknown>)[GLOBAL_ADD_LOCALE_KEY] as\n | AddLocaleResourcesFn\n | undefined;\n if (fn) {\n fn(ns, resources);\n }\n}\n\n/**\n * 重置全局翻译函数(仅用于测试)\n */\nexport function resetI18n(): void {\n (globalThis as Record<string, unknown>)[GLOBAL_T_KEY] = undefined;\n (globalThis as Record<string, unknown>)[GLOBAL_ADD_LOCALE_KEY] = undefined;\n}\n","import { readFileSync, existsSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { join } from \"path\";\nimport { homedir, platform } from \"os\";\n\n/** 默认语言 */\nconst DEFAULT_LOCALE = \"zh-CN\";\n\n/** 配置文件名 */\nconst CONFIG_FILE_NAME = \"spaceflow.json\";\n\n/** .spaceflow 目录名 */\nconst SPACEFLOW_DIR = \".spaceflow\";\n\n/**\n * 标准化 locale 字符串为 BCP 47 格式\n * @example \"zh_CN\" → \"zh-CN\", \"zh-Hans\" → \"zh-CN\", \"en_US.UTF-8\" → \"en-US\"\n */\nfunction normalizeLocale(raw: string): string | undefined {\n const cleaned = raw.replace(/\\..*$/, \"\").trim();\n // 处理 Apple 格式:zh-Hans → zh-CN, zh-Hant → zh-TW\n if (/^zh[-_]?Hans/i.test(cleaned)) return \"zh-CN\";\n if (/^zh[-_]?Hant/i.test(cleaned)) return \"zh-TW\";\n // 处理标准格式:zh_CN / zh-CN / en_US / en-US\n const match = cleaned.match(/^([a-z]{2})[-_]([A-Z]{2})/i);\n if (match) return `${match[1].toLowerCase()}-${match[2].toUpperCase()}`;\n // 处理纯语言代码:zh → zh-CN, en → en\n const langOnly = cleaned.match(/^([a-z]{2})$/i);\n if (langOnly) {\n const lang = langOnly[1].toLowerCase();\n return lang === \"zh\" ? \"zh-CN\" : lang;\n }\n return undefined;\n}\n\n/**\n * 从 spaceflow.json 读取 lang 字段\n * 按优先级从高到低查找:项目 > 全局\n */\nfunction readLangFromConfig(): string | undefined {\n const paths = [\n join(process.cwd(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n join(homedir(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n ];\n for (const configPath of paths) {\n if (!existsSync(configPath)) continue;\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(content) as Record<string, unknown>;\n if (typeof config.lang === \"string\" && config.lang.length > 0) {\n return normalizeLocale(config.lang) ?? config.lang;\n }\n } catch {\n // 忽略解析错误\n }\n }\n return undefined;\n}\n\n/**\n * 从系统环境变量推断 locale\n * 解析 LANG 格式如 \"zh_CN.UTF-8\" → \"zh-CN\"\n */\nfunction readEnvLocale(): string | undefined {\n const raw = process.env.LC_ALL || process.env.LANG;\n if (!raw) return undefined;\n return normalizeLocale(raw);\n}\n\n/**\n * macOS:通过 defaults read 获取系统首选语言\n * AppleLanguages 比 LANG 环境变量更准确地反映用户实际语言偏好\n */\nfunction readMacOSLocale(): string | undefined {\n try {\n const output = execSync(\"defaults read -g AppleLanguages\", {\n encoding: \"utf-8\",\n timeout: 500,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n // 输出格式: (\\n \"zh-Hans-CN\",\\n \"en-CN\"\\n)\n const match = output.match(/\"([^\"]+)\"/);\n if (!match) return undefined;\n return normalizeLocale(match[1]);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Windows:通过 PowerShell 获取系统 UI 语言\n */\nfunction readWindowsLocale(): string | undefined {\n try {\n const output = execSync('powershell -NoProfile -Command \"(Get-Culture).Name\"', {\n encoding: \"utf-8\",\n timeout: 1000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const trimmed = output.trim();\n if (!trimmed) return undefined;\n return normalizeLocale(trimmed);\n } catch {\n return undefined;\n }\n}\n\n/**\n * 读取操作系统级别的语言偏好\n * macOS: defaults read -g AppleLanguages\n * Windows: PowerShell Get-Culture\n */\nfunction readOSLocale(): string | undefined {\n const os = platform();\n if (os === \"darwin\") return readMacOSLocale();\n if (os === \"win32\") return readWindowsLocale();\n return undefined;\n}\n\n/**\n * 检测当前语言\n *\n * 优先级:\n * 1. 环境变量 SPACEFLOW_LANG\n * 2. spaceflow.json 中的 lang 字段(项目 > 全局)\n * 3. 操作系统语言偏好(macOS AppleLanguages / Windows Get-Culture)\n * 4. 系统环境变量 LC_ALL / LANG\n * 5. 回退到 zh-CN\n */\nexport function detectLocale(): string {\n const envLang = process.env.SPACEFLOW_LANG;\n if (envLang) return normalizeLocale(envLang) ?? envLang;\n return readLangFromConfig() || readOSLocale() || readEnvLocale() || DEFAULT_LOCALE;\n}\n","import * as i18nextModule from \"i18next\";\nimport type { i18n } from \"i18next\";\nimport { setGlobalT, setGlobalAddLocaleResources } from \"./i18n\";\nimport { detectLocale } from \"./locale-detect\";\n\n// core 基础翻译资源\nimport coreZhCN from \"../../locales/zh-cn/translation.json\";\nimport coreEn from \"../../locales/en/translation.json\";\n\n// 兼容 CJS/ESM 混合环境\nconst i18next: i18n =\n (i18nextModule as unknown as { default: i18n }).default || (i18nextModule as unknown as i18n);\n\n// ---- CLI 命令翻译 ----\nimport buildZhCN from \"../../locales/zh-cn/build.json\";\nimport buildEn from \"../../locales/en/build.json\";\nimport clearZhCN from \"../../locales/zh-cn/clear.json\";\nimport clearEn from \"../../locales/en/clear.json\";\nimport commitZhCN from \"../../locales/zh-cn/commit.json\";\nimport commitEn from \"../../locales/en/commit.json\";\nimport createZhCN from \"../../locales/zh-cn/create.json\";\nimport createEn from \"../../locales/en/create.json\";\nimport devZhCN from \"../../locales/zh-cn/dev.json\";\nimport devEn from \"../../locales/en/dev.json\";\nimport installZhCN from \"../../locales/zh-cn/install.json\";\nimport installEn from \"../../locales/en/install.json\";\nimport listZhCN from \"../../locales/zh-cn/list.json\";\nimport listEn from \"../../locales/en/list.json\";\nimport mcpZhCN from \"../../locales/zh-cn/mcp.json\";\nimport mcpEn from \"../../locales/en/mcp.json\";\nimport runxZhCN from \"../../locales/zh-cn/runx.json\";\nimport runxEn from \"../../locales/en/runx.json\";\nimport schemaZhCN from \"../../locales/zh-cn/schema.json\";\nimport schemaEn from \"../../locales/en/schema.json\";\nimport setupZhCN from \"../../locales/zh-cn/setup.json\";\nimport setupEn from \"../../locales/en/setup.json\";\nimport uninstallZhCN from \"../../locales/zh-cn/uninstall.json\";\nimport uninstallEn from \"../../locales/en/uninstall.json\";\nimport updateZhCN from \"../../locales/zh-cn/update.json\";\nimport updateEn from \"../../locales/en/update.json\";\n\ntype LocaleResource = Record<string, Record<string, string>>;\n\n/** 所有内部命令 i18n 资源映射(命名空间 → 语言 → 翻译) */\nconst allLocales: Record<string, LocaleResource> = {\n build: { \"zh-CN\": buildZhCN, en: buildEn },\n clear: { \"zh-CN\": clearZhCN, en: clearEn },\n commit: { \"zh-CN\": commitZhCN, en: commitEn },\n create: { \"zh-CN\": createZhCN, en: createEn },\n dev: { \"zh-CN\": devZhCN, en: devEn },\n install: { \"zh-CN\": installZhCN, en: installEn },\n list: { \"zh-CN\": listZhCN, en: listEn },\n mcp: { \"zh-CN\": mcpZhCN, en: mcpEn },\n runx: { \"zh-CN\": runxZhCN, en: runxEn },\n schema: { \"zh-CN\": schemaZhCN, en: schemaEn },\n setup: { \"zh-CN\": setupZhCN, en: setupEn },\n uninstall: { \"zh-CN\": uninstallZhCN, en: uninstallEn },\n update: { \"zh-CN\": updateZhCN, en: updateEn },\n};\n\n/** 默认命名空间 */\nconst DEFAULT_NS = \"translation\";\n\n/**\n * 初始化 CLI 的 i18n 系统\n * 1. 初始化 i18next(core 基础翻译 + CLI 命令翻译)\n * 2. 通过 setGlobalT 挂载翻译函数到 globalThis\n */\nexport function initCliI18n(lang?: string): void {\n const lng = lang || detectLocale();\n\n void i18next.init({\n lng,\n fallbackLng: \"zh-CN\",\n defaultNS: DEFAULT_NS,\n ns: [DEFAULT_NS, ...Object.keys(allLocales)],\n resources: {\n \"zh-CN\": { [DEFAULT_NS]: coreZhCN },\n en: { [DEFAULT_NS]: coreEn },\n },\n interpolation: { escapeValue: false },\n returnNull: false,\n returnEmptyString: false,\n initImmediate: false,\n showSupportNotice: false,\n });\n\n // 注册 CLI 命令翻译到各自命名空间\n for (const [ns, resources] of Object.entries(allLocales)) {\n for (const [lngKey, translations] of Object.entries(resources)) {\n i18next.addResourceBundle(lngKey, ns, translations, true, true);\n }\n }\n\n // 挂载到 globalThis,让 core 和扩展的 t() / addLocaleResources() 调用都能生效\n setGlobalT((key, options) => i18next.t(key, options) as string);\n setGlobalAddLocaleResources(addI18nextResources);\n}\n\n/**\n * 为外部 Extension 注册语言资源(i18next 实现)\n * @param ns 命名空间(通常为 Extension name)\n * @param resources 语言资源,key 为语言代码,值为翻译对象\n */\nexport function addI18nextResources(\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n): void {\n for (const [lng, translations] of Object.entries(resources)) {\n i18next.addResourceBundle(lng, ns, translations, true, true);\n }\n if (!i18next.options.ns) {\n i18next.options.ns = [DEFAULT_NS, ns];\n } else if (Array.isArray(i18next.options.ns) && !i18next.options.ns.includes(ns)) {\n i18next.options.ns.push(ns);\n }\n}\n","// ---- 基础 i18n 设施(globalThis 桥接) ----\nexport {\n t,\n setGlobalT,\n setGlobalAddLocaleResources,\n addLocaleResources,\n resetI18n,\n type TranslateFn,\n type AddLocaleResourcesFn,\n} from \"./i18n\";\n\n// ---- 语言检测 ----\nexport { detectLocale } from \"./locale-detect\";\n\n// ---- CLI i18n 初始化(i18next) ----\nexport { initCliI18n, addI18nextResources } from \"./init\";\n\n// ---- core 基础翻译资源 ----\nexport { default as coreZhCN } from \"../../locales/zh-cn/translation.json\";\nexport { default as coreEn } from \"../../locales/en/translation.json\";\n","import type { LogLevel } from \"../verbose\";\nimport { LOG_LEVEL_PRIORITY } from \"../verbose\";\n\nexport type { LogLevel };\nexport { LOG_LEVEL_PRIORITY };\n\n/** 渲染模式 */\nexport type RenderMode = \"plain\" | \"tui\" | \"auto\";\n\n/** Logger 配置 */\nexport interface LoggerOptions {\n /** 日志所属命名空间(通常为命令名) */\n readonly name: string;\n /** 输出模式,默认 \"auto\"(TTY=tui,CI/管道=plain) */\n readonly mode?: RenderMode;\n /** 日志级别,默认 \"info\" */\n readonly level?: LogLevel;\n}\n\n/** Spinner 控制接口 */\nexport interface Spinner {\n /** 更新 spinner 文本 */\n update(message: string): void;\n /** 成功结束 */\n succeed(message?: string): void;\n /** 失败结束 */\n fail(message?: string): void;\n /** 静默停止 */\n stop(): void;\n}\n\n/** 进度条控制接口 */\nexport interface ProgressBar {\n /** 更新进度 */\n update(current: number, message?: string): void;\n /** 完成 */\n finish(message?: string): void;\n}\n\n/** 进度条配置 */\nexport interface ProgressBarOptions {\n /** 总数 */\n readonly total: number;\n /** 标签 */\n readonly label?: string;\n /** 进度条宽度(字符数),默认 30 */\n readonly width?: number;\n}\n\n/** 任务控制接口 */\nexport interface TaskControl {\n /** 更新任务状态文本 */\n update(message: string): void;\n /** 跳过任务 */\n skip(reason?: string): void;\n}\n\n/** 任务项定义 */\nexport interface TaskItem<T = void> {\n /** 任务标题 */\n readonly title: string;\n /** 任务执行函数 */\n readonly task: (ctx: T, control: TaskControl) => Promise<T>;\n /** 是否启用,默认 true */\n readonly enabled?: boolean;\n}\n\n/** 任务执行结果 */\nexport type TaskStatus = \"pending\" | \"running\" | \"success\" | \"failed\" | \"skipped\";\n\n/** 渲染器接口(策略模式) */\nexport interface LogRenderer {\n /** 输出 info 级别日志 */\n info(prefix: string, message: string): void;\n /** 输出 success 级别日志 */\n success(prefix: string, message: string): void;\n /** 输出 warn 级别日志 */\n warn(prefix: string, message: string): void;\n /** 输出 error 级别日志 */\n error(prefix: string, message: string): void;\n /** 输出 debug 级别日志 */\n debug(prefix: string, message: string): void;\n /** 输出 verbose 级别日志 */\n verbose(prefix: string, message: string): void;\n /** 创建 Spinner */\n createSpinner(prefix: string, message: string): Spinner;\n /** 创建进度条 */\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar;\n /** 执行任务列表 */\n runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]>;\n /** 输出表格 */\n table(prefix: string, data: Record<string, unknown>[]): void;\n}\n","import type {\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"../logger.interface\";\n\n/** 时间戳格式化 */\nconst timestamp = (): string => {\n const now = new Date();\n return `${now.toLocaleTimeString()}`;\n};\n\n/** plain 模式渲染器:纯文本输出,适合 CI / 管道 */\nexport class PlainRenderer implements LogRenderer {\n info(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n success(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ✅ ${message}`);\n }\n\n warn(prefix: string, message: string): void {\n console.warn(`${timestamp()} ${prefix} ⚠️ ${message}`);\n }\n\n error(prefix: string, message: string): void {\n console.error(`${timestamp()} ${prefix} ❌ ${message}`);\n }\n\n debug(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} [DEBUG] ${message}`);\n }\n\n verbose(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n createSpinner(prefix: string, message: string): Spinner {\n console.log(`${timestamp()} ${prefix} ⏳ ${message}`);\n return {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ⏳ ${msg}`);\n },\n succeed: (msg?: string) => {\n console.log(`${timestamp()} ${prefix} ✅ ${msg ?? message}`);\n },\n fail: (msg?: string) => {\n console.error(`${timestamp()} ${prefix} ❌ ${msg ?? message}`);\n },\n stop: () => {},\n };\n }\n\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar {\n const { total, label = \"\" } = options;\n const tag = label ? `${label} ` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}0/${total}`);\n return {\n update: (current: number, msg?: string) => {\n const pct = Math.round((current / total) * 100);\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}${current}/${total} (${pct}%)${suffix}`);\n },\n finish: (msg?: string) => {\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ✅ ${tag}${total}/${total} (100%)${suffix}`);\n },\n };\n }\n\n async runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]> {\n const results: T[] = [];\n for (const item of items) {\n if (item.enabled === false) {\n console.log(`${timestamp()} ${prefix} ⏭️ [跳过] ${item.title}`);\n continue;\n }\n console.log(`${timestamp()} ${prefix} ▶ ${item.title}`);\n let skipped = false;\n let skipReason = \"\";\n const control: TaskControl = {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ${msg}`);\n },\n skip: (reason?: string) => {\n skipped = true;\n skipReason = reason ?? \"\";\n },\n };\n try {\n const ctx = (results.length > 0 ? results[results.length - 1] : undefined) as T;\n const result = await item.task(ctx, control);\n if (skipped) {\n const suffix = skipReason ? `: ${skipReason}` : \"\";\n console.log(`${timestamp()} ${prefix} ⏭️ ${item.title}${suffix}`);\n } else {\n console.log(`${timestamp()} ${prefix} ✅ ${item.title}`);\n }\n results.push(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`${timestamp()} ${prefix} ❌ ${item.title}: ${errMsg}`);\n throw err;\n }\n }\n return results;\n }\n\n table(_prefix: string, data: Record<string, unknown>[]): void {\n console.table(data);\n }\n}\n","import type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n} from \"./logger.interface\";\nimport { LOG_LEVEL_PRIORITY } from \"./logger.interface\";\nimport { PlainRenderer } from \"./renderers/plain.renderer\";\n\n/** 检测是否为 TUI 环境 */\nconst detectMode = (): RenderMode => {\n if (process.env.CI || !process.stdout.isTTY) return \"plain\";\n return \"tui\";\n};\n\n/** TUI 渲染器缓存(延迟加载,避免 ESM 兼容问题) */\nlet tuiRendererCache: LogRenderer | null = null;\n\n/** 延迟加载 TUI 渲染器(chalk/ora/log-update 均为纯 ESM 包) */\nconst loadTuiRenderer = async (): Promise<LogRenderer> => {\n if (tuiRendererCache) return tuiRendererCache;\n const { TuiRenderer } = await import(\"./renderers/tui.renderer\");\n tuiRendererCache = new TuiRenderer();\n return tuiRendererCache;\n};\n\n/** 解析渲染模式,返回实际模式标识 */\nconst resolveMode = (mode: RenderMode): \"plain\" | \"tui\" => {\n if (mode === \"auto\") return detectMode() === \"tui\" ? \"tui\" : \"plain\";\n return mode;\n};\n\n/**\n * 全局日志工具类\n *\n * 每个子命令创建独立实例,支持 plain / tui 两种输出模式。\n * TUI 模式提供 Spinner、进度条、任务列表等富交互能力,\n * plain 模式下自动降级为普通文本输出。\n *\n * @example\n * ```typescript\n * const logger = new Logger(\"build\");\n * logger.info(\"开始构建\");\n * const s = logger.spin(\"编译中...\");\n * s.succeed(\"编译完成\");\n * ```\n */\nexport class Logger {\n private readonly name: string;\n private readonly level: LogLevel;\n private readonly resolvedMode: \"plain\" | \"tui\";\n private readonly plainRenderer: PlainRenderer;\n private tuiRenderer: LogRenderer | null = null;\n\n constructor(options: LoggerOptions | string) {\n const opts = typeof options === \"string\" ? { name: options } : options;\n this.name = opts.name;\n this.level = opts.level ?? \"info\";\n this.resolvedMode = resolveMode(opts.mode ?? \"auto\");\n this.plainRenderer = new PlainRenderer();\n }\n\n /** 格式化前缀 */\n private get prefix(): string {\n return `[${this.name}]`;\n }\n\n /** 获取当前渲染器(TUI 未加载时降级为 plain) */\n private get renderer(): LogRenderer {\n if (this.resolvedMode === \"tui\" && this.tuiRenderer) return this.tuiRenderer;\n return this.plainRenderer;\n }\n\n /**\n * 初始化 TUI 渲染器(异步)\n * 在使用 TUI 特有功能前调用,确保渲染器已加载\n */\n async init(): Promise<void> {\n if (this.resolvedMode === \"tui\" && !this.tuiRenderer) {\n this.tuiRenderer = await loadTuiRenderer();\n }\n }\n\n /** 判断是否应输出指定级别的日志 */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.level];\n }\n\n /** 输出 info 级别日志 */\n info(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.info(this.prefix, message);\n }\n }\n\n /** 输出 success 级别日志 */\n success(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.success(this.prefix, message);\n }\n }\n\n /** 输出 warn 级别日志 */\n warn(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.warn(this.prefix, message);\n }\n }\n\n /** 输出 error 级别日志 */\n error(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.error(this.prefix, message);\n }\n }\n\n /** 输出 verbose 级别日志(level >= verbose 才输出) */\n verbose(message: string): void {\n if (this.shouldLog(\"verbose\")) {\n this.renderer.verbose(this.prefix, message);\n }\n }\n\n /** 输出 debug 级别日志(level >= debug 才输出) */\n debug(message: string): void {\n if (this.shouldLog(\"debug\")) {\n this.renderer.debug(this.prefix, message);\n }\n }\n\n /**\n * 创建 Spinner\n * TUI 模式下显示动画 spinner,plain 模式下降级为普通日志\n */\n spin(message: string): Spinner {\n return this.renderer.createSpinner(this.prefix, message);\n }\n\n /**\n * 创建进度条\n * TUI 模式下显示实时进度条,plain 模式下降级为百分比日志\n */\n progress(options: ProgressBarOptions): ProgressBar {\n return this.renderer.createProgressBar(this.prefix, options);\n }\n\n /**\n * 执行任务列表\n * TUI 模式下多行实时更新,plain 模式下顺序输出\n */\n async tasks<T>(items: TaskItem<T>[]): Promise<T[]> {\n return this.renderer.runTasks<T>(this.prefix, items);\n }\n\n /** 输出表格 */\n table(data: Record<string, unknown>[]): void {\n this.renderer.table(this.prefix, data);\n }\n\n /**\n * 创建子 Logger\n * 命名空间自动拼接,如 \"build\" → \"build:compile\"\n */\n child(name: string): Logger {\n return new Logger({\n name: `${this.name}:${name}`,\n level: this.level,\n mode: this.resolvedMode,\n });\n }\n}\n","export { Logger } from \"./logger\";\nexport type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"./logger.interface\";\n","import { z } from \"zod\";\nimport type { LLMMode } from \"../shared/llm-proxy\";\nimport { detectProvider } from \"../shared/git-provider/detect-provider\";\n\n// 从 @spaceflow/shared 重导出配置工具函数\nexport {\n DEFAULT_SUPPORT_EDITOR,\n CONFIG_FILE_NAME,\n RC_FILE_NAME,\n deepMerge,\n getConfigPath,\n getConfigPaths,\n getEnvFilePaths,\n readConfigSync,\n writeConfigSync,\n getSupportedEditors,\n getDependencies,\n findConfigFileWithField,\n updateDependency,\n removeDependency,\n} from \"@spaceflow/shared\";\n\nimport { DEFAULT_SUPPORT_EDITOR, readConfigSync } from \"@spaceflow/shared\";\n\n// ============ 子模块配置 Schema ============\n\n/** 从环境自动检测的默认值 */\nconst detected = detectProvider();\n\n/** Git Provider 配置 Schema */\nconst GitProviderConfigSchema = z.object({\n provider: z\n .enum([\"gitea\", \"github\", \"gitlab\"])\n .default(detected.provider)\n .describe(\"Git Provider 类型 (github | gitea | gitlab),未指定时自动检测\"),\n serverUrl: z.string().default(detected.serverUrl).describe(\"Git Provider 服务器 URL\"),\n token: z.string().default(detected.token).describe(\"Git Provider API Token\"),\n});\n\n/** CI 配置 Schema */\nconst CiConfigSchema = z.object({\n repository: z\n .string()\n .default(process.env.GITHUB_REPOSITORY || \"\")\n .describe(\"仓库名称 (owner/repo 格式)\"),\n refName: z\n .string()\n .default(process.env.GITHUB_REF_NAME || \"\")\n .describe(\"当前分支名称\"),\n actor: z\n .string()\n .default(process.env.GITHUB_ACTOR || \"\")\n .describe(\"当前操作者\"),\n});\n\n/** Claude Code 适配器配置 Schema */\nconst ClaudeCodeConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.CLAUDE_CODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n authToken: z\n .string()\n .default(process.env.CLAUDE_CODE_AUTH_TOKEN || \"\")\n .describe(\"认证令牌\"),\n model: z\n .string()\n .default(process.env.CLAUDE_CODE_MODEL || \"claude-sonnet-4-5\")\n .describe(\"模型名称\"),\n hasCompletedOnboarding: z.boolean().optional().describe(\"是否已完成 Claude Code 引导流程\"),\n});\n\n/** OpenAI 适配器配置 Schema */\nconst OpenAIConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.OPENAI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENAI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.OPENAI_MODEL || \"gpt-4o\")\n .describe(\"模型名称\"),\n});\n\n/** OpenCode 适配器配置 Schema */\nconst OpenCodeConfigSchema = z.object({\n serverUrl: z\n .string()\n .default(process.env.OPENCODE_SERVER_URL || \"http://localhost:4096\")\n .describe(\"服务器 URL\"),\n baseUrl: z\n .string()\n .default(process.env.OPENCODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENCODE_API_KEY || \"\")\n .describe(\"API Key\"),\n providerID: z\n .string()\n .default(process.env.OPENCODE_PROVIDER_ID || \"openai\")\n .describe(\"Provider ID\"),\n model: z\n .string()\n .default(process.env.OPENCODE_MODEL || \"\")\n .describe(\"模型名称\"),\n});\n\n/** Gemini 适配器配置 Schema */\nconst GeminiConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.GEMINI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.GEMINI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.GEMINI_MODEL || \"\")\n .describe(\"模型名称\"),\n});\n\n/** LLM 配置 Schema */\nconst LlmConfigSchema = z.object({\n claudeCode: z\n .preprocess((v) => v ?? {}, ClaudeCodeConfigSchema)\n .describe(\"Claude Code 适配器配置\"),\n openai: z.preprocess((v) => v ?? {}, OpenAIConfigSchema).describe(\"OpenAI 适配器配置\"),\n openCode: z.preprocess((v) => v ?? {}, OpenCodeConfigSchema).describe(\"OpenCode 适配器配置\"),\n gemini: z.preprocess((v) => v ?? {}, GeminiConfigSchema).describe(\"Gemini 适配器配置\"),\n});\n\n/** 飞书配置 Schema */\nconst FeishuConfigSchema = z.object({\n appId: z\n .string()\n .default(process.env.FEISHU_APP_ID || \"\")\n .describe(\"飞书应用 ID\"),\n appSecret: z\n .string()\n .default(process.env.FEISHU_APP_SECRET || \"\")\n .describe(\"飞书应用密钥\"),\n appType: z\n .enum([\"self_build\", \"store\"])\n .default((process.env.FEISHU_APP_TYPE as \"self_build\" | \"store\") || \"self_build\")\n .describe(\"应用类型\"),\n domain: z\n .enum([\"feishu\", \"lark\"])\n .default((process.env.FEISHU_DOMAIN as \"feishu\" | \"lark\") || \"feishu\")\n .describe(\"域名\"),\n});\n\n/** Storage 配置 Schema */\nconst StorageConfigSchema = z.object({\n adapter: z\n .enum([\"memory\", \"file\"])\n .default((process.env.STORAGE_ADAPTER as \"memory\" | \"file\") || \"memory\")\n .describe(\"适配器类型\"),\n filePath: z.string().optional().describe(\"文件存储路径\"),\n defaultTtl: z\n .number()\n .default(process.env.STORAGE_DEFAULT_TTL ? parseInt(process.env.STORAGE_DEFAULT_TTL, 10) : 0)\n .describe(\"默认过期时间(毫秒)\"),\n maxKeys: z\n .number()\n .default(process.env.STORAGE_MAX_KEYS ? parseInt(process.env.STORAGE_MAX_KEYS, 10) : 0)\n .describe(\"最大 key 数量\"),\n});\n\n// ============ 统一配置 Schema ============\n\n/** Spaceflow 完整配置 Schema */\nexport const SpaceflowConfigSchema = z.object({\n /** 界面语言,如 zh-CN、en */\n lang: z.string().optional().describe(\"界面语言,如 zh-CN、en\"),\n /** 已安装的技能包注册表 */\n dependencies: z.record(z.string(), z.string()).optional().describe(\"已安装的技能包注册表\"),\n /** 支持的编辑器列表 */\n support: z.array(z.string()).default([DEFAULT_SUPPORT_EDITOR]).describe(\"支持的编辑器列表\"),\n /** Git Provider 配置 */\n gitProvider: z\n .preprocess((v) => v ?? {}, GitProviderConfigSchema)\n .describe(\"Git Provider 服务配置\"),\n /** CI 配置 */\n ci: z.preprocess((v) => v ?? {}, CiConfigSchema).describe(\"CI 环境配置\"),\n /** LLM 配置 */\n llm: z.preprocess((v) => v ?? {}, LlmConfigSchema).describe(\"LLM 服务配置\"),\n /** 飞书配置 */\n feishu: z.preprocess((v) => v ?? {}, FeishuConfigSchema).describe(\"飞书 SDK 配置\"),\n /** Storage 配置 */\n storage: z.preprocess((v) => v ?? {}, StorageConfigSchema).describe(\"存储服务配置\"),\n});\n\n// ============ 类型导出 ============\n\n/** Spaceflow 完整配置类型 */\nexport type SpaceflowConfig = z.infer<typeof SpaceflowConfigSchema> & {\n /** 扩展插件配置,由各插件自行定义类型 */\n [key: string]: unknown;\n};\n\n/** Git Provider 配置类型 */\nexport type GitProviderConfig = z.infer<typeof GitProviderConfigSchema>;\n\n/** CI 配置类型 */\nexport type CiConfig = z.infer<typeof CiConfigSchema>;\n\n/** LLM 系统配置类型 */\nexport type LlmConfig = z.infer<typeof LlmConfigSchema>;\n\n/** Claude Code 适配器配置类型 */\nexport type ClaudeCodeConfig = z.infer<typeof ClaudeCodeConfigSchema>;\n\n/** OpenAI 适配器配置类型 */\nexport type OpenAIConfig = z.infer<typeof OpenAIConfigSchema>;\n\n/** OpenCode 适配器配置类型 */\nexport type OpenCodeConfig = z.infer<typeof OpenCodeConfigSchema>;\n\n/** Gemini 适配器配置类型 */\nexport type GeminiConfig = z.infer<typeof GeminiConfigSchema>;\n\n/** 飞书配置类型 */\nexport type FeishuConfig = z.infer<typeof FeishuConfigSchema>;\n\n/** Storage 配置类型 */\nexport type StorageConfig = z.infer<typeof StorageConfigSchema>;\n\n// ============ 配置加载 ============\n\n/**\n * 加载 spaceflow.json 配置\n * 从多级配置文件读取并合并,使用 zod 验证和填充默认值\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function loadSpaceflowConfig(cwd?: string): SpaceflowConfig {\n const fileConfig = readConfigSync(cwd);\n\n const result = SpaceflowConfigSchema.safeParse(fileConfig);\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Spaceflow 配置验证失败:\\n${errors}`);\n }\n\n return {\n ...fileConfig,\n ...result.data,\n } as SpaceflowConfig;\n}\n\n/**\n * 获取 spaceflow 配置(兼容旧 API)\n * @deprecated 请使用 loadSpaceflowConfig()\n */\nexport function spaceflowConfig(): SpaceflowConfig {\n return loadSpaceflowConfig();\n}\n\nexport type { LLMMode };\n","import { z } from \"zod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { SpaceflowConfigSchema } from \"./spaceflow.config\";\n\n/** Schema 注册信息 */\nexport interface SchemaRegistry {\n /** 配置 key */\n configKey: string;\n /** zod schema 工厂函数 */\n schemaFactory: () => z.ZodType;\n /** 描述 */\n description?: string;\n}\n\n/** 全局 schema 注册表 */\nconst schemaRegistry = new Map<string, SchemaRegistry>();\n\n/**\n * 注册插件配置 schema(由插件加载器调用)\n */\nexport function registerPluginSchema(registry: SchemaRegistry): void {\n schemaRegistry.set(registry.configKey, registry);\n}\n\n/**\n * 获取所有已注册的 schema\n */\nexport function getRegisteredSchemas(): Map<string, SchemaRegistry> {\n return schemaRegistry;\n}\n\n/**\n * Schema 生成服务\n * 用于生成 JSON Schema 文件\n */\nexport class SchemaGeneratorService {\n /**\n * 生成完整的 spaceflow.json 的 JSON Schema\n * @param outputPath 输出路径\n */\n generateJsonSchema(outputPath: string): void {\n // 从 SpaceflowConfigSchema 生成基础 JSON Schema\n const baseSchema = z.toJSONSchema(SpaceflowConfigSchema, {\n target: \"draft-07\",\n }) as { properties?: Record<string, unknown>; [key: string]: unknown };\n\n const properties: Record<string, unknown> = { ...(baseSchema.properties || {}) };\n\n // 添加所有插件的 schema(扩展插件配置)\n for (const [configKey, registry] of schemaRegistry) {\n try {\n const schema = registry.schemaFactory();\n const jsonSchema = z.toJSONSchema(schema, {\n target: \"draft-07\",\n });\n properties[configKey] = {\n ...jsonSchema,\n description: registry.description || `${configKey} 插件配置`,\n };\n } catch (error) {\n console.warn(`⚠️ 无法转换 ${configKey} 的 schema:`, error);\n }\n }\n\n const fullSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: \"Spaceflow Configuration\",\n description: \"Spaceflow 配置文件 schema\",\n type: \"object\",\n properties,\n additionalProperties: true,\n };\n\n // 确保目录存在\n const dir = path.dirname(outputPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // 写入文件\n fs.writeFileSync(outputPath, JSON.stringify(fullSchema, null, 2), \"utf-8\");\n\n // 自动添加到 .gitignore\n this.addToGitignore(dir, path.basename(outputPath));\n }\n\n /**\n * 生成 JSON Schema 到默认路径 (.spaceflow/config-schema.json)\n */\n generate(): void {\n const outputPath = path.join(process.cwd(), \".spaceflow\", \"config-schema.json\");\n this.generateJsonSchema(outputPath);\n }\n\n /**\n * 将文件添加到 .gitignore(如果不存在)\n */\n private addToGitignore(dir: string, filename: string): void {\n const gitignorePath = path.join(dir, \".gitignore\");\n let content = \"\";\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, \"utf-8\");\n // 检查是否已存在\n const lines = content.split(\"\\n\").map((line) => line.trim());\n if (lines.includes(filename)) {\n return;\n }\n } else {\n content = \"# 自动生成的 .gitignore\\n\";\n }\n\n // 追加文件名\n const newContent = content.endsWith(\"\\n\")\n ? `${content}${filename}\\n`\n : `${content}\\n${filename}\\n`;\n\n fs.writeFileSync(gitignorePath, newContent, \"utf-8\");\n }\n}\n","export * from \"./spaceflow.config\";\nexport * from \"./schema-generator.service\";\nexport { loadEnvFiles, getEnvFilePaths } from \"@spaceflow/shared\";\n","import type {\n SpaceflowContext,\n IConfigReader,\n IOutputService,\n IStorageService,\n} from \"@spaceflow/core\";\n\n/**\n * 服务工厂函数类型\n */\nexport type ServiceFactory<T = unknown> = (container: ServiceContainer) => T;\n\n/**\n * 服务注册信息\n */\ninterface ServiceRegistration<T = unknown> {\n factory: ServiceFactory<T>;\n instance?: T;\n initialized: boolean;\n}\n\n/**\n * 服务容器\n * 提供懒加载的依赖注入功能\n */\nexport class ServiceContainer implements SpaceflowContext {\n private registrations = new Map<string, ServiceRegistration>();\n private _cwd!: string;\n private _config!: IConfigReader;\n private _output!: IOutputService;\n private _storage!: IStorageService;\n\n /**\n * 设置核心服务(config, output, storage)\n */\n setCoreServices(\n config: IConfigReader,\n output: IOutputService,\n storage: IStorageService,\n cwd: string,\n ): void {\n this._cwd = cwd;\n this._config = config;\n this._output = output;\n this._storage = storage;\n }\n\n /**\n * 注册服务工厂(懒加载)\n */\n registerFactory<T>(key: string, factory: ServiceFactory<T>): void {\n this.registrations.set(key, {\n factory: factory as ServiceFactory,\n initialized: false,\n });\n }\n\n /**\n * 注册服务实例(立即可用)\n */\n registerService(key: string, service: unknown): void {\n this.registrations.set(key, {\n factory: () => service,\n instance: service,\n initialized: true,\n });\n }\n\n /**\n * 获取服务(懒加载)\n */\n getService<T = unknown>(key: string): T {\n const registration = this.registrations.get(key);\n if (!registration) {\n throw new Error(`服务 \"${key}\" 未注册`);\n }\n if (!registration.initialized) {\n registration.instance = registration.factory(this);\n registration.initialized = true;\n }\n return registration.instance as T;\n }\n\n /**\n * 检查服务是否已注册\n */\n hasService(key: string): boolean {\n return this.registrations.has(key);\n }\n\n /**\n * 尝试获取服务(不抛错)\n */\n tryGetService<T = unknown>(key: string): T | undefined {\n if (!this.hasService(key)) {\n return undefined;\n }\n try {\n return this.getService<T>(key);\n } catch {\n return undefined;\n }\n }\n\n get cwd(): string {\n return this._cwd;\n }\n\n get config(): IConfigReader {\n return this._config;\n }\n\n get output(): IOutputService {\n return this._output;\n }\n\n get storage(): IStorageService {\n return this._storage;\n }\n\n /**\n * 销毁容器\n */\n async destroy(): Promise<void> {\n // 销毁 storage 服务(清理定时器)\n if (this._storage && typeof (this._storage as any).destroy === \"function\") {\n (this._storage as any).destroy();\n }\n this.registrations.clear();\n }\n}\n","import { type IConfigReader, loadSpaceflowConfig } from \"@spaceflow/core\";\nimport type { ZodSchema } from \"zod\";\n\n/**\n * 环境变量映射配置\n * key: 配置路径(如 \"gitProvider.token\")\n * value: 环境变量名或环境变量名数组(按优先级)\n */\nconst ENV_MAPPINGS: Record<string, string | string[]> = {\n // Git Provider\n \"gitProvider.token\": [\"GIT_PROVIDER_TOKEN\", \"GITHUB_TOKEN\", \"GITLAB_TOKEN\", \"GITEA_TOKEN\"],\n \"gitProvider.serverUrl\": [\"GIT_PROVIDER_SERVER_URL\", \"GITHUB_API_URL\"],\n // OpenAI\n \"llm.openai.apiKey\": \"OPENAI_API_KEY\",\n \"llm.openai.baseUrl\": \"OPENAI_BASE_URL\",\n \"llm.openai.model\": \"OPENAI_MODEL\",\n // Gemini\n \"llm.gemini.apiKey\": \"GEMINI_API_KEY\",\n \"llm.gemini.model\": \"GEMINI_MODEL\",\n // Claude\n \"llm.claudeCode.authToken\": \"ANTHROPIC_API_KEY\",\n};\n\n/**\n * 从环境变量获取值\n */\nfunction getEnvValue(envNames: string | string[]): string | undefined {\n const names = Array.isArray(envNames) ? envNames : [envNames];\n for (const name of names) {\n const value = process.env[name];\n if (value) return value;\n }\n return undefined;\n}\n\n/**\n * 设置嵌套对象的值\n */\nfunction setNestedValue(obj: Record<string, any>, path: string, value: any): void {\n const parts = path.split(\".\");\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current)) {\n current[part] = {};\n }\n current = current[part];\n }\n current[parts[parts.length - 1]] = value;\n}\n\n/**\n * 获取嵌套对象的值\n */\nfunction getNestedValue(obj: Record<string, any>, path: string): any {\n const parts = path.split(\".\");\n let current = obj;\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = current[part];\n }\n return current;\n}\n\n/**\n * 统一配置服务\n * 负责从配置文件和环境变量读取配置\n */\nexport class UnifiedConfigReader implements IConfigReader {\n private mergedConfig: Record<string, unknown>;\n private schemas = new Map<string, ZodSchema>();\n\n constructor(cwd?: string) {\n const config = loadSpaceflowConfig(cwd) as Record<string, unknown>;\n this.mergedConfig = this.mergeEnvConfig(config);\n }\n\n /**\n * 合并环境变量到配置\n */\n private mergeEnvConfig(config: Record<string, unknown>): Record<string, unknown> {\n const merged = JSON.parse(JSON.stringify(config));\n for (const [path, envNames] of Object.entries(ENV_MAPPINGS)) {\n const envValue = getEnvValue(envNames);\n if (envValue && !getNestedValue(merged, path)) {\n setNestedValue(merged, path, envValue);\n }\n }\n // 特殊处理:如果有 OPENAI_API_KEY 但没有 llm.openai,创建默认配置\n if (process.env.OPENAI_API_KEY && !merged.llm) {\n merged.llm = {\n openai: {\n apiKey: process.env.OPENAI_API_KEY,\n baseUrl: process.env.OPENAI_BASE_URL || \"https://api.openai.com/v1\",\n model: process.env.OPENAI_MODEL,\n },\n };\n }\n return merged;\n }\n\n /**\n * 获取配置值\n */\n get<T>(key: string): T | undefined {\n const parts = key.split(\".\");\n let current: unknown = this.mergedConfig;\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current as T | undefined;\n }\n\n /**\n * 获取插件配置(带 schema 验证)\n */\n getPluginConfig<T>(key: string): T | undefined {\n const rawConfig = this.mergedConfig[key] ?? {};\n const schema = this.schemas.get(key);\n if (!schema) {\n return rawConfig as T;\n }\n try {\n return schema.parse(rawConfig) as T;\n } catch (error) {\n console.warn(`⚠️ 配置 \"${key}\" 验证失败:`, error);\n return rawConfig as T;\n }\n }\n\n /**\n * 注册配置 schema\n */\n registerSchema(key: string, schema: ZodSchema): void {\n this.schemas.set(key, schema);\n }\n\n /**\n * 重新加载配置\n */\n reload(cwd?: string): void {\n const config = loadSpaceflowConfig(cwd) as Record<string, unknown>;\n this.mergedConfig = this.mergeEnvConfig(config);\n }\n\n /**\n * 获取原始配置对象\n */\n getRawConfig(): Record<string, unknown> {\n return this.mergedConfig;\n }\n}\n","import {\n OutputService,\n StorageService,\n GitSdkService,\n GitProviderService,\n LlmProxyService,\n FileAdapter,\n} from \"@spaceflow/core\";\nimport { findProjectRoot } from \"@spaceflow/shared\";\nimport { join } from \"path\";\nimport type { ServiceContainer } from \"./container\";\nimport { UnifiedConfigReader } from \"./config\";\n\n/**\n * 初始化服务容器\n */\nexport function initializeContainer(container: ServiceContainer, cwd?: string): void {\n const workDir = cwd || process.env.SPACEFLOW_CWD || findProjectRoot();\n // 初始化核心服务(.env 已在 CLI 壳子阶段加载)\n const config = new UnifiedConfigReader(workDir);\n const output = new OutputService();\n const storageDir = join(workDir, \".spaceflow\", \"cache\");\n const storage = new StorageService(new FileAdapter(storageDir));\n container.setCoreServices(config, output, storage, workDir);\n // 注册服务工厂\n registerServiceFactories(container);\n}\n\n/**\n * 注册所有服务工厂\n */\nfunction registerServiceFactories(container: ServiceContainer): void {\n // Config - 返回已初始化的 config\n container.registerFactory(\"config\", (c) => c.config);\n // GitSdk - 无依赖\n container.registerFactory(\"gitSdk\", () => new GitSdkService());\n // GitProvider - 依赖配置(环境变量已在 UnifiedConfigReader 中合并)\n container.registerFactory(\"gitProvider\", (c) => {\n const config = c.config.get<any>(\"gitProvider\");\n if (!config?.provider) {\n throw new Error(\"缺少 gitProvider 配置\");\n }\n const baseUrl = config.serverUrl || config.baseUrl;\n return new GitProviderService({ ...config, baseUrl });\n });\n // LlmProxy - 依赖配置(环境变量已在 UnifiedConfigReader 中合并)\n container.registerFactory(\"llmProxy\", (c) => {\n const config = c.config.get<any>(\"llm\");\n if (!config || (!config.openai && !config.gemini && !config.claudeCode && !config.openCode)) {\n throw new Error(\"缺少 llm 配置,请在 spaceflow.json 中配置或设置 OPENAI_API_KEY 环境变量\");\n }\n return new LlmProxyService(config);\n });\n}\n","export { ServiceContainer, type ServiceFactory } from \"./container\";\nexport { initializeContainer } from \"./services\";\nexport { UnifiedConfigReader } from \"./config\";\n","import type { ExtensionDefinition, CommandDefinition } from \"@spaceflow/core\";\nimport type { SpaceflowContext } from \"@spaceflow/core\";\n\n/**\n * 扩展加载器\n * 加载新格式的扩展(使用 defineExtension)\n */\nexport class ExtensionLoader {\n private extensions = new Map<string, ExtensionDefinition>();\n private commands = new Map<string, CommandDefinition>();\n\n constructor(private readonly ctx: SpaceflowContext) {}\n\n /** 当前工作目录(项目根) */\n get cwd(): string {\n return this.ctx.cwd;\n }\n\n /** 获取上下文(供内部命令使用) */\n getContext(): SpaceflowContext {\n return this.ctx;\n }\n\n /**\n * 注册扩展\n */\n registerExtension(extension: ExtensionDefinition): void {\n this.extensions.set(extension.name, extension);\n\n // 注册配置 schema\n if (extension.configSchema && extension.configKey) {\n this.ctx.config.registerSchema(extension.configKey, extension.configSchema());\n }\n\n // 注册命令\n for (const cmd of extension.commands) {\n this.commands.set(cmd.name, cmd);\n }\n\n // 注册服务\n if (extension.services) {\n for (const svc of extension.services) {\n const instance = svc.factory(this.ctx);\n this.ctx.registerService(svc.key, instance);\n }\n }\n\n // 调用初始化钩子\n if (extension.onInit) {\n extension.onInit(this.ctx);\n }\n }\n\n /**\n * 获取所有命令\n */\n getCommands(): CommandDefinition[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * 获取所有扩展\n */\n getExtensions(): ExtensionDefinition[] {\n return Array.from(this.extensions.values());\n }\n\n /**\n * 获取所有 MCP 工具\n * 返回扩展中定义的 tools 字段\n */\n getTools(): Array<{ extensionName: string; tools: NonNullable<ExtensionDefinition[\"tools\"]> }> {\n const result: Array<{\n extensionName: string;\n tools: NonNullable<ExtensionDefinition[\"tools\"]>;\n }> = [];\n for (const ext of this.extensions.values()) {\n if (ext.tools && ext.tools.length > 0) {\n result.push({ extensionName: ext.name, tools: ext.tools });\n }\n }\n return result;\n }\n\n /**\n * 获取所有 MCP 资源\n * 返回扩展中定义的 resources 字段\n */\n getResources(): Array<{\n extensionName: string;\n resources: NonNullable<ExtensionDefinition[\"resources\"]>;\n }> {\n const result: Array<{\n extensionName: string;\n resources: NonNullable<ExtensionDefinition[\"resources\"]>;\n }> = [];\n for (const ext of this.extensions.values()) {\n if (ext.resources && ext.resources.length > 0) {\n result.push({ extensionName: ext.name, resources: ext.resources });\n }\n }\n return result;\n }\n}\n","import { rspack, type Compiler, type Configuration, type Stats } from \"@rspack/core\";\nimport { readdir, stat } from \"fs/promises\";\nimport { join, dirname, resolve } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { createRequire } from \"module\";\nimport { createPluginConfig, getDependencies } from \"@spaceflow/core\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\n\nexport interface ExtensionInfo {\n name: string;\n path: string;\n hasPackageJson: boolean;\n}\n\nexport interface BuildResult {\n extension: string;\n success: boolean;\n duration?: number;\n errors?: string[];\n warnings?: string[];\n}\n\nexport class BuildService {\n private readonly projectRoot = this.findProjectRoot();\n private readonly extensionDirs = this.discoverExtensionDirs();\n private readonly coreRoot = this.resolveCoreRoot();\n private watchers: Map<string, Compiler> = new Map();\n\n /**\n * 查找项目根目录(包含 spaceflow.json 或 .spaceflow/spaceflow.json 的目录)\n */\n private findProjectRoot(): string {\n let dir = process.cwd();\n while (dir !== dirname(dir)) {\n // 检查根目录下的 spaceflow.json\n if (existsSync(join(dir, \"spaceflow.json\"))) {\n return dir;\n }\n // 检查 .spaceflow/spaceflow.json\n if (existsSync(join(dir, \".spaceflow\", \"spaceflow.json\"))) {\n return dir;\n }\n dir = dirname(dir);\n }\n // 如果找不到,回退到 cwd\n return process.cwd();\n }\n\n /**\n * 构建插件\n */\n async build(extensionName?: string, verbose: VerboseLevel = 1): Promise<BuildResult[]> {\n const extensions = await this.getExtensionsToBuild(extensionName);\n\n if (extensions.length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"build:noPlugins\"));\n return [];\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"build:startBuilding\", { count: extensions.length }) + \"\\n\");\n\n const results: BuildResult[] = [];\n for (const ext of extensions) {\n const result = await this.buildExtension(ext, verbose);\n results.push(result);\n }\n\n const successCount = results.filter((r) => r.success).length;\n const failCount = results.filter((r) => !r.success).length;\n\n if (shouldLog(verbose, 1))\n console.log(\"\\n\" + t(\"build:buildComplete\", { success: successCount, fail: failCount }));\n return results;\n }\n\n /**\n * 监听模式构建\n */\n async watch(extensionName?: string, verbose: VerboseLevel = 1): Promise<void> {\n const extensions = await this.getExtensionsToBuild(extensionName);\n\n if (extensions.length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"build:noPlugins\"));\n return;\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"build:startWatching\", { count: extensions.length }) + \"\\n\");\n\n // 并行启动所有 watcher\n await Promise.all(extensions.map((ext) => this.watchExtension(ext, verbose)));\n\n // 保持进程运行\n await new Promise(() => {});\n }\n\n /**\n * 停止所有 watcher\n */\n async stopWatch(verbose: VerboseLevel = 1): Promise<void> {\n for (const [name, compiler] of this.watchers) {\n await new Promise<void>((resolve) => {\n compiler.close(() => {\n if (shouldLog(verbose, 1)) console.log(t(\"build:stopWatching\", { name }));\n resolve();\n });\n });\n }\n this.watchers.clear();\n }\n\n /**\n * 从 spaceflow.json 的 dependencies 中发现本地 extension 所在的目录\n * 解析所有 link: 路径,收集去重后的父目录\n */\n private discoverExtensionDirs(): string[] {\n const dependencies = getDependencies(this.projectRoot);\n const parentDirs = new Set<string>();\n for (const source of Object.values(dependencies)) {\n if (!source.startsWith(\"link:\")) continue;\n const linkPath = source.slice(5);\n const absolutePath = resolve(this.projectRoot, linkPath);\n parentDirs.add(dirname(absolutePath));\n }\n return Array.from(parentDirs);\n }\n\n /**\n * 动态解析 @spaceflow/core 的根目录\n * 优先通过 require.resolve 定位,回退到 node_modules\n */\n private resolveCoreRoot(): string {\n try {\n const req = createRequire(join(this.projectRoot, \"package.json\"));\n const corePkgPath = req.resolve(\"@spaceflow/core/package.json\");\n return dirname(corePkgPath);\n } catch {\n return join(this.projectRoot, \"node_modules\", \"@spaceflow\", \"core\");\n }\n }\n\n /**\n * 获取需要构建的 Extension 列表\n */\n private async getExtensionsToBuild(extensionName?: string): Promise<ExtensionInfo[]> {\n // 如果没有指定名称,检查是否在 Extension 目录中运行\n if (!extensionName) {\n const current = this.detectCurrentExtension();\n if (current) {\n return [current];\n }\n }\n // 从所有 extension 目录中扫描\n const result: ExtensionInfo[] = [];\n for (const extDir of this.extensionDirs) {\n if (!existsSync(extDir)) continue;\n const entries = await readdir(extDir);\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue;\n const extPath = join(extDir, entry);\n const stats = await stat(extPath);\n if (!stats.isDirectory()) continue;\n if (extensionName && entry !== extensionName) continue;\n const packageJsonPath = join(extPath, \"package.json\");\n if (existsSync(packageJsonPath)) {\n result.push({ name: entry, path: extPath, hasPackageJson: true });\n }\n }\n }\n return result;\n }\n\n /**\n * 检测当前目录是否为 spaceflow Extension\n * 通过检查 package.json 中的 spaceflow 配置判断,不依赖固定目录名\n */\n private detectCurrentExtension(): ExtensionInfo | null {\n const cwd = process.cwd();\n const packageJsonPath = join(cwd, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (!pkg.spaceflow) {\n return null;\n }\n const name = cwd.split(\"/\").pop() || \"\";\n return { name, path: cwd, hasPackageJson: true };\n } catch {\n return null;\n }\n }\n\n /**\n * 构建单个 Extension\n */\n private async buildExtension(\n ext: ExtensionInfo,\n verbose: VerboseLevel = 1,\n ): Promise<BuildResult> {\n const startTime = Date.now();\n if (shouldLog(verbose, 1)) console.log(t(\"build:building\", { name: ext.name }));\n\n try {\n const config = await this.getConfig(ext);\n const compiler = rspack(config);\n\n const stats = await new Promise<Stats>((resolve, reject) => {\n compiler.run((err, stats) => {\n compiler.close((closeErr) => {\n if (err) return reject(err);\n if (closeErr) return reject(closeErr);\n if (!stats) return reject(new Error(\"No stats returned\"));\n resolve(stats);\n });\n });\n });\n\n const duration = Date.now() - startTime;\n const info = stats.toJson({ errors: true, warnings: true });\n\n if (stats.hasErrors()) {\n const errors = info.errors?.map((e) => e.message) || [];\n console.log(t(\"build:buildFailedWithDuration\", { duration }));\n errors.forEach((e) => console.log(` ${e}`));\n return { extension: ext.name, success: false, duration, errors };\n }\n\n if (stats.hasWarnings()) {\n const warnings = info.warnings?.map((w) => w.message) || [];\n if (shouldLog(verbose, 1))\n console.log(t(\"build:buildWarnings\", { duration, count: warnings.length }));\n return { extension: ext.name, success: true, duration, warnings };\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"build:buildSuccess\", { duration }));\n return { extension: ext.name, success: true, duration };\n } catch (error) {\n const duration = Date.now() - startTime;\n const message = error instanceof Error ? error.message : String(error);\n console.log(t(\"build:buildFailedWithMessage\", { duration, message }));\n return { extension: ext.name, success: false, duration, errors: [message] };\n }\n }\n\n /**\n * 监听单个 Extension\n */\n private async watchExtension(ext: ExtensionInfo, verbose: VerboseLevel = 1): Promise<void> {\n if (shouldLog(verbose, 1)) console.log(t(\"build:watching\", { name: ext.name }));\n\n try {\n const config = await this.getConfig(ext);\n const compiler = rspack(config);\n\n this.watchers.set(ext.name, compiler);\n\n compiler.watch({}, (err, stats) => {\n if (err) {\n console.log(t(\"build:watchError\", { name: ext.name, message: err.message }));\n return;\n }\n\n if (!stats) return;\n\n const info = stats.toJson({ errors: true, warnings: true });\n\n if (stats.hasErrors()) {\n console.log(t(\"build:watchBuildFailed\", { name: ext.name }));\n info.errors?.forEach((e) => console.log(` ${e.message}`));\n } else if (stats.hasWarnings()) {\n if (shouldLog(verbose, 1))\n console.log(\n t(\"build:watchBuildWarnings\", { name: ext.name, count: info.warnings?.length }),\n );\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"build:watchBuildSuccess\", { name: ext.name }));\n }\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(t(\"build:watchInitFailed\", { name: ext.name, message }));\n }\n }\n\n /**\n * 获取 Extension 的 rspack 配置\n */\n private async getConfig(ext: ExtensionInfo): Promise<Configuration> {\n const customConfigPath = join(ext.path, \"rspack.config.mjs\");\n const customConfigPathJs = join(ext.path, \"rspack.config.js\");\n\n if (existsSync(customConfigPath)) {\n const module = await import(customConfigPath);\n return module.default || module;\n }\n\n if (existsSync(customConfigPathJs)) {\n const module = await import(customConfigPathJs);\n return module.default || module;\n }\n\n return this.getDefaultConfig(ext);\n }\n\n /**\n * 生成默认的 rspack 配置\n */\n private getDefaultConfig(ext: ExtensionInfo): Configuration {\n return createPluginConfig(\n {\n name: ext.name,\n path: ext.path,\n },\n {\n coreRoot: this.coreRoot,\n },\n );\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { BuildService } from \"./build.service\";\n\n/**\n * Build 命令扩展\n */\nexport const buildExtension = defineExtension({\n name: \"build\",\n version: \"1.0.0\",\n description: \"构建 Extension 插件包\",\n commands: [\n {\n name: \"build\",\n description: \"构建指定或所有 Extension\",\n arguments: \"[extension]\",\n options: [\n {\n flags: \"-w, --watch\",\n description: \"监听模式\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const extensionName = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const buildService = new BuildService();\n try {\n if (options?.watch) {\n await buildService.watch(extensionName, verbose);\n } else {\n const results = await buildService.build(extensionName, verbose);\n const hasErrors = results.some((r) => !r.success);\n if (hasErrors) {\n process.exit(1);\n }\n }\n } catch (error) {\n ctx.output.error(`构建失败: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n },\n },\n ],\n});\n\nexport * from \"./build.service\";\n","import { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync, readdirSync, lstatSync } from \"fs\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\nimport { getEditorDirName, DEFAULT_EDITOR } from \"@spaceflow/core\";\n\nexport class ClearService {\n /**\n * 获取支持的编辑器列表\n */\n protected async getSupportedEditors(configPath: string): Promise<string[]> {\n try {\n if (!existsSync(configPath)) return [DEFAULT_EDITOR];\n const content = await readFile(configPath, \"utf-8\");\n const config = JSON.parse(content);\n return config.support || [DEFAULT_EDITOR];\n } catch {\n return [DEFAULT_EDITOR];\n }\n }\n\n /**\n * 执行清理\n */\n async execute(isGlobal = false, verbose: VerboseLevel = 1): Promise<void> {\n if (shouldLog(verbose, 1)) {\n if (isGlobal) {\n console.log(t(\"clear:clearingGlobal\"));\n } else {\n console.log(t(\"clear:clearing\"));\n }\n }\n\n const cwd = process.cwd();\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const configPath = join(cwd, \"spaceflow.json\");\n\n // 1. 清理 .spaceflow/deps 目录\n await this.clearSpaceflowDeps(isGlobal, verbose);\n\n // 2. 清理各编辑器的 skills 和 commands 目录\n const editors = await this.getSupportedEditors(configPath);\n\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n const editorRoot = isGlobal ? join(home, editorDirName) : join(cwd, editorDirName);\n await this.clearEditorDir(editorRoot, editor, verbose);\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"clear:clearDone\"));\n }\n\n /**\n * 清理 .spaceflow 目录内部文件(保留 spaceflow.json)\n */\n private async clearSpaceflowDeps(isGlobal: boolean, verbose: VerboseLevel = 1): Promise<void> {\n const cwd = process.cwd();\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const spaceflowRoot = isGlobal ? join(home, \".spaceflow\") : join(cwd, \".spaceflow\");\n\n if (!existsSync(spaceflowRoot)) {\n if (shouldLog(verbose, 1)) console.log(t(\"clear:spaceflowNotExist\"));\n return;\n }\n\n // 需要保留的文件\n const preserveFiles = [\"spaceflow.json\", \"package.json\"];\n\n const entries = readdirSync(spaceflowRoot);\n const toDelete = entries.filter((entry) => !preserveFiles.includes(entry));\n\n if (toDelete.length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"clear:spaceflowNoClean\"));\n return;\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"clear:clearingSpaceflow\", { count: toDelete.length }));\n\n for (const entry of toDelete) {\n const entryPath = join(spaceflowRoot, entry);\n try {\n await rm(entryPath, { recursive: true, force: true });\n if (shouldLog(verbose, 2)) console.log(t(\"clear:deleted\", { entry }));\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.warn(\n t(\"clear:deleteFailed\", { entry }),\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n }\n\n /**\n * 清理编辑器目录下的 skills 和 commands\n */\n private async clearEditorDir(\n editorRoot: string,\n editorName: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n if (!existsSync(editorRoot)) {\n return;\n }\n\n // 清理 skills 目录\n const skillsDir = join(editorRoot, \"skills\");\n if (existsSync(skillsDir)) {\n const entries = readdirSync(skillsDir);\n if (entries.length > 0) {\n if (shouldLog(verbose, 1))\n console.log(t(\"clear:clearingSkills\", { editor: editorName, count: entries.length }));\n for (const entry of entries) {\n const entryPath = join(skillsDir, entry);\n try {\n await rm(entryPath, { recursive: true, force: true });\n if (shouldLog(verbose, 2)) console.log(t(\"clear:deleted\", { entry }));\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.warn(\n t(\"clear:deleteFailed\", { entry }),\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n }\n }\n\n // 清理 commands 目录中的 .md 文件\n const commandsDir = join(editorRoot, \"commands\");\n if (existsSync(commandsDir)) {\n const entries = readdirSync(commandsDir).filter((f) => f.endsWith(\".md\"));\n if (entries.length > 0) {\n if (shouldLog(verbose, 1))\n console.log(t(\"clear:clearingCommands\", { editor: editorName, count: entries.length }));\n for (const entry of entries) {\n const entryPath = join(commandsDir, entry);\n try {\n const stats = lstatSync(entryPath);\n if (stats.isFile()) {\n await rm(entryPath);\n if (shouldLog(verbose, 2)) console.log(t(\"clear:deleted\", { entry }));\n }\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.warn(\n t(\"clear:deleteFailed\", { entry }),\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n }\n }\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { ClearService } from \"./clear.service\";\n\n/**\n * Clear 命令扩展\n */\nexport const clearExtension = defineExtension({\n name: \"clear\",\n version: \"1.0.0\",\n description: \"清除缓存\",\n commands: [\n {\n name: \"clear\",\n description: \"清除缓存\",\n options: [\n {\n flags: \"-g, --global\",\n description: \"清除全局缓存\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const isGlobal = !!options?.global;\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const clearService = new ClearService();\n await clearService.execute(isGlobal, verbose);\n },\n },\n ],\n});\n\nexport * from \"./clear.service\";\n","import { z } from \"zod\";\nimport type { VerboseLevel } from \"@spaceflow/core\";\n\n/**\n * Commit 类型定义\n */\nexport interface CommitType {\n type: string;\n section: string;\n}\n\n/**\n * Changelog 配置\n */\nexport interface CommitConfig {\n changelog?: {\n preset?: {\n type?: CommitType[];\n };\n };\n}\n\n/**\n * Scope 匹配规则 schema\n */\nexport const ScopeRuleSchema = z.object({\n /** glob 模式,如 \"src/components/**\", \"docs/**\" */\n pattern: z.string().describe(\"glob 模式,用于匹配文件路径\"),\n /** 匹配后使用的 scope 名称 */\n scope: z.string().describe(\"匹配后使用的 scope 名称\"),\n});\n\nexport type ScopeRule = z.infer<typeof ScopeRuleSchema>;\n\n/**\n * Commit scope 配置 schema\n */\nexport const CommitScopeConfigSchema = z.object({\n /**\n * 分组策略\n * - \"package\": 按最近的 package.json 目录分组(默认)\n * - \"rules\": 仅使用自定义规则\n * - \"rules-first\": 优先使用自定义规则,未匹配则回退到 package 策略\n */\n strategy: z.enum([\"package\", \"rules\", \"rules-first\"]).default(\"package\").describe(\"文件分组策略\"),\n /** 自定义匹配规则列表 */\n rules: z.array(ScopeRuleSchema).default([]).describe(\"自定义 scope 匹配规则\"),\n});\n\nexport type CommitScopeConfig = z.infer<typeof CommitScopeConfigSchema>;\n\n/**\n * Commit 命令选项\n */\nexport interface CommitOptions {\n verbose?: VerboseLevel;\n dryRun?: boolean;\n noVerify?: boolean;\n split?: boolean;\n}\n\n/**\n * Commit 执行结果\n */\nexport interface CommitResult {\n success: boolean;\n message?: string;\n error?: string;\n commitCount?: number;\n}\n\n/**\n * Commit 分组\n */\nexport interface CommitGroup {\n files: string[];\n reason: string;\n packageInfo?: { name: string; description?: string };\n}\n\n/**\n * 拆分分析结果\n */\nexport interface SplitAnalysis {\n groups: CommitGroup[];\n}\n\n/**\n * 包信息\n */\nexport interface PackageInfo {\n /** 包名(package.json 中的 name) */\n name: string;\n /** 包描述 */\n description?: string;\n /** package.json 所在目录的绝对路径 */\n path: string;\n}\n\n/**\n * 结构化 Commit Message schema(仅 AI 生成的部分)\n */\nexport const CommitMessageContentSchema = z.object({\n /** commit 类型,如 feat, fix, refactor 等 */\n type: z.string().describe(\"commit 类型\"),\n /** 影响范围,可选 */\n scope: z.string().optional().describe(\"影响范围(包名、模块名)\"),\n /** 简短描述,不超过 50 个字符 */\n subject: z.string().describe(\"简短描述\"),\n /** 详细描述,可选 */\n body: z.string().optional().describe(\"详细描述\"),\n});\n\nexport type CommitMessageContent = z.infer<typeof CommitMessageContentSchema>;\n\n/**\n * 完整的 Commit Message,包含文件和包上下文\n */\nexport interface CommitMessage extends CommitMessageContent {\n /** 涉及的文件列表(相对路径) */\n files?: string[];\n /** 所属包信息 */\n packageInfo?: PackageInfo;\n}\n\n/**\n * 解析 commit message 字符串为结构化对象\n */\nexport function parseCommitMessage(message: string): CommitMessage {\n const lines = message.trim().split(\"\\n\");\n const firstLine = lines[0] || \"\";\n\n // 匹配 type(scope): subject 或 type: subject\n const headerRegex = /^(\\w+)(?:\\(([^)]+)\\))?:\\s*(.+)$/;\n const match = firstLine.match(headerRegex);\n\n if (!match) {\n // 无法解析,将整个内容作为 subject\n return {\n type: \"chore\",\n subject: firstLine || message.trim(),\n body: lines.slice(1).join(\"\\n\").trim() || undefined,\n };\n }\n\n const [, type, scope, subject] = match;\n const body = lines.slice(1).join(\"\\n\").trim() || undefined;\n\n return {\n type,\n scope: scope || undefined,\n subject,\n body,\n };\n}\n\n/**\n * 格式化结构化 commit message 为字符串\n */\nexport function formatCommitMessage(commit: CommitMessage): string {\n const { type, scope, subject, body } = commit;\n const header = scope ? `${type}(${scope}): ${subject}` : `${type}: ${subject}`;\n\n if (body) {\n return `${header}\\n\\n${body}`;\n }\n return header;\n}\n","import type { IConfigReader } from \"@spaceflow/core\";\nimport { execSync, spawnSync } from \"child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport micromatch from \"micromatch\";\nimport { dirname, join } from \"path\";\nimport {\n LlmProxyService,\n type LlmMessage,\n LlmJsonPut,\n parallel,\n shouldLog,\n t,\n} from \"@spaceflow/core\";\nimport {\n CommitScopeConfigSchema,\n formatCommitMessage,\n parseCommitMessage,\n type CommitConfig,\n type CommitGroup,\n type CommitMessage,\n type CommitOptions,\n type CommitResult,\n type CommitScopeConfig,\n type CommitType,\n type PackageInfo,\n type ScopeRule,\n type SplitAnalysis,\n} from \"./commit.config\";\n\n// 重新导出类型,保持向后兼容\nexport type {\n CommitConfig,\n CommitGroup,\n CommitMessage,\n CommitOptions,\n CommitResult,\n CommitScopeConfig,\n CommitType,\n PackageInfo,\n ScopeRule,\n SplitAnalysis,\n};\nexport { formatCommitMessage, parseCommitMessage };\n\n/**\n * Commit 上下文,包含生成 commit message 所需的所有信息\n */\ninterface CommitContext {\n files: string[];\n diff: string;\n scope: string;\n packageInfo?: PackageInfo;\n}\n\nexport class CommitService {\n constructor(\n private readonly configReader: IConfigReader,\n private readonly llmProxyService: LlmProxyService,\n ) {}\n\n // ============================================================\n // Git 基础操作\n // ============================================================\n\n /**\n * 执行 git 命令并返回输出\n */\n private execGit(command: string, options?: { maxBuffer?: number }): string {\n return execSync(command, {\n encoding: \"utf-8\",\n maxBuffer: options?.maxBuffer ?? 1024 * 1024 * 10,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n }\n\n /**\n * 安全执行 git 命令,失败返回空字符串\n */\n private execGitSafe(command: string, options?: { maxBuffer?: number }): string {\n try {\n return this.execGit(command, options);\n } catch {\n return \"\";\n }\n }\n\n /**\n * 获取文件列表(从 git 命令输出解析)\n */\n private parseFileList(output: string): string[] {\n return output\n .split(\"\\n\")\n .map((f) => f.trim())\n .filter((f) => f.length > 0);\n }\n\n // ============================================================\n // 暂存区操作\n // ============================================================\n\n getStagedFiles(): string[] {\n return this.parseFileList(this.execGitSafe(\"git diff --cached --name-only\"));\n }\n\n getStagedDiff(): string {\n try {\n return this.execGit(\"git diff --cached --no-color\");\n } catch {\n throw new Error(t(\"commit:getDiffFailed\"));\n }\n }\n\n hasStagedFiles(): boolean {\n return this.getStagedFiles().length > 0;\n }\n\n getFileDiff(files: string[]): string {\n if (files.length === 0) return \"\";\n const fileArgs = files.map((f) => `\"${f}\"`).join(\" \");\n return this.execGitSafe(`git diff --cached --no-color -- ${fileArgs}`);\n }\n\n // ============================================================\n // 工作区操作\n // ============================================================\n\n getUnstagedFiles(): string[] {\n return this.parseFileList(this.execGitSafe(\"git diff --name-only\"));\n }\n\n getUntrackedFiles(): string[] {\n return this.parseFileList(this.execGitSafe(\"git ls-files --others --exclude-standard\"));\n }\n\n getAllWorkingFiles(): string[] {\n return [...new Set([...this.getUnstagedFiles(), ...this.getUntrackedFiles()])];\n }\n\n hasWorkingFiles(): boolean {\n return this.getAllWorkingFiles().length > 0;\n }\n\n getUnstagedFileDiff(files: string[]): string {\n if (files.length === 0) return \"\";\n const fileArgs = files.map((f) => `\"${f}\"`).join(\" \");\n return this.execGitSafe(`git diff --no-color -- ${fileArgs}`);\n }\n\n // ============================================================\n // 历史记录\n // ============================================================\n\n getRecentCommits(count: number = 10): string {\n return this.execGitSafe(`git log --oneline -n ${count} --no-color`);\n }\n\n // ============================================================\n // 配置获取\n // ============================================================\n\n getCommitTypes(): CommitType[] {\n const publishConfig = this.configReader.getPluginConfig<CommitConfig>(\"publish\");\n\n const defaultTypes: CommitType[] = [\n { type: \"feat\", section: \"新特性\" },\n { type: \"fix\", section: \"修复BUG\" },\n { type: \"perf\", section: \"性能优化\" },\n { type: \"refactor\", section: \"代码重构\" },\n { type: \"docs\", section: \"文档更新\" },\n { type: \"style\", section: \"代码格式\" },\n { type: \"test\", section: \"测试用例\" },\n { type: \"chore\", section: \"其他修改\" },\n ];\n\n return publishConfig?.changelog?.preset?.type || defaultTypes;\n }\n\n getScopeConfig(): CommitScopeConfig {\n const commitConfig = this.configReader.getPluginConfig<Record<string, unknown>>(\"commit\");\n return CommitScopeConfigSchema.parse(commitConfig ?? {});\n }\n\n // ============================================================\n // Package.json 和 Scope 处理\n // ============================================================\n\n /**\n * 从路径提取 scope(目录名)\n * 根目录返回空字符串\n */\n extractScopeFromPath(packagePath: string): string {\n if (!packagePath || packagePath === process.cwd()) return \"\";\n const parts = packagePath.split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"\";\n }\n\n /**\n * 查找文件所属的 package.json\n */\n findPackageForFile(file: string): PackageInfo {\n const cwd = process.cwd();\n let dir = dirname(join(cwd, file));\n\n while (dir !== dirname(dir)) {\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return {\n name: pkg.name || \"root\",\n description: pkg.description,\n path: dir,\n };\n } catch {\n // 解析失败,继续向上\n }\n }\n dir = dirname(dir);\n }\n\n // 回退到根目录\n return this.getRootPackageInfo();\n }\n\n /**\n * 获取根目录的 package.json 信息\n */\n private getRootPackageInfo(): PackageInfo {\n const cwd = process.cwd();\n const pkgPath = join(cwd, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return { name: pkg.name || \"root\", description: pkg.description, path: cwd };\n } catch {\n // ignore\n }\n }\n return { name: \"root\", path: cwd };\n }\n\n /**\n * 按 package.json 对文件分组\n */\n groupFilesByPackage(files: string[]): Map<string, { files: string[]; packageInfo: PackageInfo }> {\n const groups = new Map<string, { files: string[]; packageInfo: PackageInfo }>();\n\n for (const file of files) {\n const pkgInfo = this.findPackageForFile(file);\n const key = pkgInfo.path;\n\n if (!groups.has(key)) {\n groups.set(key, { files: [], packageInfo: pkgInfo });\n }\n groups.get(key)!.files.push(file);\n }\n\n return groups;\n }\n\n /**\n * 根据自定义规则匹配文件的 scope\n */\n matchFileToScope(file: string, rules: ScopeRule[]): string | null {\n for (const rule of rules) {\n if (micromatch.isMatch(file, rule.pattern)) {\n return rule.scope;\n }\n }\n return null;\n }\n\n /**\n * 根据配置策略对文件分组\n */\n groupFiles(\n files: string[],\n ): Map<string, { files: string[]; scope: string; packageInfo?: PackageInfo }> {\n const config = this.getScopeConfig();\n const groups = new Map<string, { files: string[]; scope: string; packageInfo?: PackageInfo }>();\n\n for (const file of files) {\n let scope: string | null = null;\n let packageInfo: PackageInfo | undefined;\n\n // 规则匹配\n if (config.strategy === \"rules\" || config.strategy === \"rules-first\") {\n scope = this.matchFileToScope(file, config.rules || []);\n }\n\n // 包目录匹配\n if (scope === null && (config.strategy === \"package\" || config.strategy === \"rules-first\")) {\n packageInfo = this.findPackageForFile(file);\n scope = this.extractScopeFromPath(packageInfo.path);\n }\n\n const finalScope = scope || \"\";\n if (!groups.has(finalScope)) {\n groups.set(finalScope, { files: [], scope: finalScope, packageInfo });\n }\n groups.get(finalScope)!.files.push(file);\n }\n\n return groups;\n }\n\n // ============================================================\n // Commit 上下文获取\n // ============================================================\n\n /**\n * 获取 commit 上下文(统一获取 files, diff, scope, packageInfo)\n */\n getCommitContext(files: string[], useUnstaged = false): CommitContext {\n const diff = useUnstaged ? this.getUnstagedFileDiff(files) : this.getFileDiff(files);\n const packageGroups = this.groupFilesByPackage(files);\n const firstGroup = [...packageGroups.values()][0];\n const packageInfo = firstGroup?.packageInfo;\n const scope = packageInfo ? this.extractScopeFromPath(packageInfo.path) : \"\";\n\n return { files, diff, scope, packageInfo };\n }\n\n // ============================================================\n // Prompt 构建\n // ============================================================\n\n /**\n * 构建 commit message 生成的 prompt\n */\n private buildCommitPrompt(ctx: CommitContext): { system: string; user: string } {\n const commitTypes = this.getCommitTypes();\n const typesList = commitTypes.map((t) => `- ${t.type}: ${t.section}`).join(\"\\n\");\n const recentCommits = this.getRecentCommits();\n\n const packageContext = ctx.packageInfo\n ? `\\n## 包信息\\n- 包名: ${ctx.packageInfo.name}\\n- scope: ${ctx.scope || \"无(根目录)\"}${ctx.packageInfo.description ? `\\n- 描述: ${ctx.packageInfo.description}` : \"\"}`\n : \"\";\n\n const system = `你是一个专业的 Git commit message 生成器。请根据提供的代码变更生成符合 Conventional Commits 规范的 commit message。\n\n## Commit 类型规范\n${typesList}\n\n## 输出格式\n请严格按照以下 JSON 格式输出,不要包含任何其他内容:\n{\n \"type\": \"feat\",\n \"scope\": \"${ctx.scope}\",\n \"subject\": \"简短描述(不超过50字符,中文)\",\n \"body\": \"详细描述(可选,中文)\"\n}\n\n## 规则\n1. type 必须是上述类型之一\n2. scope ${ctx.scope ? `必须使用 \"${ctx.scope}\"` : \"必须为空字符串(根目录不需要 scope)\"}\n3. subject 是简短描述,不超过 50 个字符,使用中文\n4. body 是详细描述,可选,使用中文,如果没有则设为空字符串\n5. 如果变更涉及多个方面,选择最主要的类型`;\n\n const truncatedDiff =\n ctx.diff.length > 8000 ? ctx.diff.substring(0, 8000) + \"\\n... (diff 过长,已截断)\" : ctx.diff;\n\n const user = `请根据以下信息生成 commit message:\n${packageContext}\n## 暂存的文件\n${ctx.files.join(\"\\n\")}\n\n## 最近的 commit 历史(参考风格)\n${recentCommits || \"无历史记录\"}\n\n## 代码变更 (diff)\n\\`\\`\\`diff\n${truncatedDiff}\n\\`\\`\\`\n\n请直接输出 JSON 格式的 commit message。`;\n\n return { system, user };\n }\n\n // ============================================================\n // AI 响应解析\n // ============================================================\n\n /**\n * 解析 AI 响应为结构化 CommitMessage\n */\n private async parseAIResponse(content: string, expectedScope: string): Promise<CommitMessage> {\n const jsonPut = new LlmJsonPut<{\n type: string;\n scope?: string;\n subject: string;\n body?: string;\n }>({\n type: \"object\",\n properties: {\n type: { type: \"string\", description: \"commit 类型\" },\n scope: { type: \"string\", description: \"影响范围\" },\n subject: { type: \"string\", description: \"简短描述\" },\n body: { type: \"string\", description: \"详细描述\" },\n },\n required: [\"type\", \"subject\"],\n });\n\n try {\n const parsed = await jsonPut.parse(content, { disableRequestRetry: true });\n return this.normalizeScope(\n {\n type: parsed.type || \"chore\",\n subject: parsed.subject || \"\",\n scope: parsed.scope || undefined,\n body: parsed.body || undefined,\n },\n expectedScope,\n );\n } catch {\n return this.normalizeScope(parseCommitMessage(content), expectedScope);\n }\n }\n\n /**\n * 规范化 scope(强制使用预期值或移除)\n */\n private normalizeScope(commit: CommitMessage, expectedScope: string): CommitMessage {\n return expectedScope ? { ...commit, scope: expectedScope } : { ...commit, scope: undefined };\n }\n\n // ============================================================\n // Commit Message 生成\n // ============================================================\n\n /**\n * 生成 commit message(核心方法)\n */\n async generateCommitMessage(\n options?: CommitOptions & { files?: string[]; useUnstaged?: boolean },\n ): Promise<CommitMessage> {\n // 获取文件列表\n const files = options?.files ?? this.getStagedFiles();\n if (files.length === 0) {\n throw new Error(t(\"commit:noFilesToCommit\"));\n }\n\n // 获取上下文\n const ctx = this.getCommitContext(files, options?.useUnstaged);\n if (!ctx.diff) {\n throw new Error(t(\"commit:noChanges\"));\n }\n\n // 构建 prompt\n const prompt = this.buildCommitPrompt(ctx);\n const messages: LlmMessage[] = [\n { role: \"system\", content: prompt.system },\n { role: \"user\", content: prompt.user },\n ];\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:generatingMessage\"));\n }\n\n // 调用 AI\n const response = await this.llmProxyService.chat(messages, {\n verbose: options?.verbose,\n });\n\n // 解析响应并填充上下文\n const commit = await this.parseAIResponse(response.content, ctx.scope);\n return {\n ...commit,\n files: ctx.files,\n packageInfo: ctx.packageInfo,\n };\n }\n\n /**\n * 为指定文件生成 commit message(兼容旧 API)\n */\n async generateCommitMessageForFiles(\n files: string[],\n options?: CommitOptions,\n useUnstaged = false,\n _packageInfo?: { name: string; description?: string },\n ): Promise<CommitMessage> {\n return this.generateCommitMessage({ ...options, files, useUnstaged });\n }\n\n // ============================================================\n // 拆分分析\n // ============================================================\n\n /**\n * 分析如何拆分 commit\n */\n async analyzeSplitStrategy(options?: CommitOptions, useUnstaged = false): Promise<SplitAnalysis> {\n const files = useUnstaged ? this.getUnstagedFiles() : this.getStagedFiles();\n const config = this.getScopeConfig();\n\n if (shouldLog(options?.verbose, 1)) {\n const strategyName =\n config.strategy === \"rules\"\n ? t(\"commit:strategyRules\")\n : config.strategy === \"rules-first\"\n ? t(\"commit:strategyRulesFirst\")\n : t(\"commit:strategyPackage\");\n console.log(t(\"commit:groupingByStrategy\", { strategy: strategyName }));\n }\n\n const scopeGroups = this.groupFiles(files);\n\n // 单个组:让 AI 进一步分析\n if (scopeGroups.size === 1) {\n const [, groupData] = [...scopeGroups.entries()][0];\n const packageInfo = groupData.packageInfo || {\n name: groupData.scope || \"root\",\n path: process.cwd(),\n };\n return this.analyzeWithinPackage(groupData.files, packageInfo, options, useUnstaged);\n }\n\n // 多个组:每个组作为独立 commit\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:detectedGroups\", { count: scopeGroups.size }));\n }\n\n const groups: CommitGroup[] = [];\n for (const [, groupData] of scopeGroups) {\n groups.push({\n files: groupData.files,\n reason: groupData.scope\n ? t(\"commit:scopeChanges\", { scope: groupData.scope })\n : t(\"commit:rootChanges\"),\n packageInfo: groupData.packageInfo\n ? { name: groupData.packageInfo.name, description: groupData.packageInfo.description }\n : undefined,\n });\n }\n\n return { groups };\n }\n\n /**\n * 在单个包内分析拆分策略\n */\n private async analyzeWithinPackage(\n files: string[],\n packageInfo: PackageInfo,\n options?: CommitOptions,\n useUnstaged = false,\n ): Promise<SplitAnalysis> {\n const diff = useUnstaged ? this.getUnstagedFileDiff(files) : this.getFileDiff(files);\n const scope = this.extractScopeFromPath(packageInfo.path);\n const commitTypes = this.getCommitTypes();\n const typesList = commitTypes.map((t) => `- ${t.type}: ${t.section}`).join(\"\\n\");\n\n const systemPrompt = `你是一个专业的 Git commit 拆分分析器。请根据暂存的文件和代码变更,分析如何将这些变更拆分为多个独立的 commit。\n\n## 当前包信息\n- 包名: ${packageInfo.name}\n- scope: ${scope || \"无\"}\n${packageInfo.description ? `- 描述: ${packageInfo.description}` : \"\"}\n\n## Commit 类型规范\n${typesList}\n\n## 拆分原则\n1. **按逻辑拆分**:相关的功能变更放在一起\n2. **按业务拆分**:不同业务模块的变更分开\n3. **保持原子性**:每个 commit 是完整的、可独立理解的变更\n4. **最小化拆分**:如果变更本身是整体,不要强行拆分\n\n## 输出格式\n请严格按照以下 JSON 格式输出:\n{\n \"groups\": [\n { \"files\": [\"file1.ts\", \"file2.ts\"], \"reason\": \"简短描述\" }\n ]\n}`;\n\n const truncatedDiff =\n diff.length > 12000 ? diff.substring(0, 12000) + \"\\n... (diff 过长,已截断)\" : diff;\n\n const userPrompt = `请分析以下改动文件,决定如何拆分 commit:\n\n## 改动的文件\n${files.join(\"\\n\")}\n\n## 代码变更 (diff)\n\\`\\`\\`diff\n${truncatedDiff}\n\\`\\`\\`\n\n请输出 JSON 格式的拆分策略。`;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:analyzingSplit\"));\n }\n\n const response = await this.llmProxyService.chat(\n [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n { verbose: options?.verbose },\n );\n\n return this.parseSplitAnalysis(response.content, files, packageInfo);\n }\n\n /**\n * 解析拆分分析结果\n */\n private parseSplitAnalysis(\n content: string,\n files: string[],\n packageInfo: PackageInfo,\n ): SplitAnalysis {\n let text = content\n .trim()\n .replace(/^```[\\w]*\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim();\n\n try {\n const analysis = JSON.parse(text) as SplitAnalysis;\n\n if (!analysis.groups || !Array.isArray(analysis.groups)) {\n throw new Error(\"Invalid response\");\n }\n\n const validFiles = new Set(files);\n\n // 过滤无效文件,移除空组\n for (const group of analysis.groups) {\n group.files = (group.files || []).filter((f) => validFiles.has(f));\n }\n analysis.groups = analysis.groups.filter((g) => g.files.length > 0);\n\n // 补充未分配的文件\n const assignedFiles = new Set(analysis.groups.flatMap((g) => g.files));\n const missingFiles = files.filter((f) => !assignedFiles.has(f));\n if (missingFiles.length > 0) {\n if (analysis.groups.length > 0) {\n analysis.groups[analysis.groups.length - 1].files.push(...missingFiles);\n } else {\n analysis.groups.push({ files: missingFiles, reason: t(\"commit:otherChanges\") });\n }\n }\n\n // 添加 packageInfo\n for (const group of analysis.groups) {\n group.packageInfo = { name: packageInfo.name, description: packageInfo.description };\n }\n\n return analysis;\n } catch {\n return {\n groups: [\n {\n files,\n reason: t(\"commit:allChanges\"),\n packageInfo: { name: packageInfo.name, description: packageInfo.description },\n },\n ],\n };\n }\n }\n\n // ============================================================\n // Commit 执行\n // ============================================================\n\n /**\n * 执行 git commit\n */\n async commit(message: string, options?: CommitOptions): Promise<CommitResult> {\n if (options?.dryRun) {\n return { success: true, message: t(\"commit:dryRunMessage\", { message }) };\n }\n\n try {\n const args = [\"commit\", \"-m\", message];\n if (options?.noVerify) args.push(\"--no-verify\");\n\n const result = spawnSync(\"git\", args, { encoding: \"utf-8\", stdio: \"pipe\" });\n\n if (result.status !== 0) {\n return { success: false, error: result.stderr || result.stdout || t(\"commit:commitFail\") };\n }\n return { success: true, message: result.stdout };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n /**\n * 暂存文件\n */\n private stageFiles(files: string[]): { success: boolean; error?: string } {\n const result = spawnSync(\"git\", [\"add\", ...files], { encoding: \"utf-8\", stdio: \"pipe\" });\n if (result.status !== 0) {\n return { success: false, error: t(\"commit:stageFilesFailed\", { error: result.stderr }) };\n }\n return { success: true };\n }\n\n /**\n * 重置暂存区\n */\n private resetStaging(): boolean {\n try {\n execSync(\"git reset HEAD\", { encoding: \"utf-8\", stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n }\n\n // ============================================================\n // 批量提交\n // ============================================================\n\n /**\n * 排序 groups:子包优先,根目录最后\n */\n private sortGroupsForCommit(groups: CommitGroup[]): CommitGroup[] {\n return [...groups].sort((a, b) => {\n const aScope = this.getGroupScope(a);\n const bScope = this.getGroupScope(b);\n if (!aScope && bScope) return 1;\n if (aScope && !bScope) return -1;\n return 0;\n });\n }\n\n private getGroupScope(group: CommitGroup): string {\n if (!group.packageInfo) return \"\";\n const pkgGroups = this.groupFilesByPackage(group.files);\n const first = [...pkgGroups.values()][0];\n return first ? this.extractScopeFromPath(first.packageInfo.path) : \"\";\n }\n\n /**\n * 分批提交\n */\n async commitInBatches(options?: CommitOptions, useWorking = false): Promise<CommitResult> {\n const files = useWorking ? this.getAllWorkingFiles() : this.getStagedFiles();\n\n if (files.length === 0) {\n return {\n success: false,\n error: useWorking ? t(\"commit:noWorkingChanges\") : t(\"commit:noStagedFiles\"),\n };\n }\n\n const analysis = await this.analyzeSplitStrategy(options, useWorking);\n const sortedGroups = this.sortGroupsForCommit(analysis.groups);\n\n // 单个组:简化处理\n if (sortedGroups.length <= 1) {\n const group = sortedGroups[0];\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:singleCommit\"));\n }\n\n if (useWorking) {\n const stageResult = this.stageFiles(files);\n if (!stageResult.success) return { success: false, error: stageResult.error };\n }\n\n const commitObj = await this.generateCommitMessage({ ...options, files });\n const message = formatCommitMessage(commitObj);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:generatedMessage\"));\n console.log(\"─\".repeat(50));\n console.log(message);\n console.log(\"─\".repeat(50));\n }\n\n return this.commit(message, options);\n }\n\n // 多个组:并行生成 message,顺序提交\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:splitIntoCommits\", { count: sortedGroups.length }));\n sortedGroups.forEach((g, i) => {\n const pkgStr = g.packageInfo ? ` [${g.packageInfo.name}]` : \"\";\n console.log(\n t(\"commit:groupItem\", {\n index: i + 1,\n reason: g.reason,\n pkg: pkgStr,\n count: g.files.length,\n }),\n );\n });\n console.log(t(\"commit:parallelGenerating\", { count: sortedGroups.length }));\n }\n\n // 并行生成 messages\n const executor = parallel({ concurrency: 5 });\n const messageResults = await executor.map(\n sortedGroups,\n async (group: CommitGroup) =>\n this.generateCommitMessage({ ...options, files: group.files, useUnstaged: useWorking }),\n (group: CommitGroup) => group.files[0] || \"unknown\",\n );\n\n const failedResults = messageResults.filter((r) => !r.success);\n if (failedResults.length > 0) {\n return {\n success: false,\n error: t(\"commit:generateMessageFailed\", {\n errors: failedResults.map((r) => r.error?.message).join(\", \"),\n }),\n };\n }\n\n const generatedMessages = messageResults.map((r) => r.result!);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:allMessagesGenerated\"));\n }\n\n // Dry run 模式\n if (options?.dryRun) {\n const preview = sortedGroups\n .map((g, i) => {\n const pkgStr = g.packageInfo ? `\\n包: ${g.packageInfo.name}` : \"\";\n return `[Commit ${i + 1}/${sortedGroups.length}] ${g.reason}${pkgStr}\\n文件: ${g.files.join(\", \")}\\n\\n${formatCommitMessage(generatedMessages[i])}`;\n })\n .join(\"\\n\\n\" + \"═\".repeat(50) + \"\\n\\n\");\n return { success: true, message: preview, commitCount: sortedGroups.length };\n }\n\n // 实际提交\n if (this.hasStagedFiles() && !this.resetStaging()) {\n return { success: false, error: t(\"commit:resetStagingFailed\") };\n }\n\n const committedMessages: string[] = [];\n let successCount = 0;\n\n for (let i = 0; i < sortedGroups.length; i++) {\n const group = sortedGroups[i];\n const commitObj = generatedMessages[i];\n const messageStr = formatCommitMessage(commitObj);\n\n if (shouldLog(options?.verbose, 1)) {\n const pkgStr = group.packageInfo ? ` [${group.packageInfo.name}]` : \"\";\n console.log(\n t(\"commit:committingGroup\", {\n current: i + 1,\n total: sortedGroups.length,\n reason: group.reason,\n pkg: pkgStr,\n }),\n );\n }\n\n try {\n const stageResult = this.stageFiles(group.files);\n if (!stageResult.success) throw new Error(stageResult.error);\n\n const diff = this.getFileDiff(group.files);\n if (!diff) {\n if (shouldLog(options?.verbose, 1)) console.log(t(\"commit:skippingNoChanges\"));\n continue;\n }\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:commitMessage\"));\n console.log(\"─\".repeat(50));\n console.log(messageStr);\n console.log(\"─\".repeat(50));\n }\n\n const commitResult = await this.commit(messageStr, options);\n if (!commitResult.success) throw new Error(commitResult.error);\n\n successCount++;\n const shortMsg = formatCommitMessage({ ...commitObj, body: undefined });\n committedMessages.push(`✅ Commit ${i + 1}: ${shortMsg}`);\n console.log(committedMessages[committedMessages.length - 1]);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n committedMessages.push(t(\"commit:commitItemFailed\", { index: i + 1, error: errorMsg }));\n\n // 恢复剩余文件\n const remaining = sortedGroups.slice(i).flatMap((g) => g.files);\n if (remaining.length > 0) this.stageFiles(remaining);\n\n return {\n success: false,\n error: t(\"commit:commitItemFailedDetail\", {\n index: i + 1,\n error: errorMsg,\n committed: committedMessages.join(\"\\n\"),\n }),\n commitCount: successCount,\n };\n }\n }\n\n return { success: true, message: committedMessages.join(\"\\n\"), commitCount: successCount };\n }\n\n // ============================================================\n // 主入口\n // ============================================================\n\n /**\n * 生成并提交(主入口)\n */\n async generateAndCommit(options?: CommitOptions): Promise<CommitResult> {\n // Split 模式\n if (options?.split) {\n const hasWorking = this.hasWorkingFiles();\n const hasStaged = this.hasStagedFiles();\n\n if (!hasWorking && !hasStaged) {\n return { success: false, error: t(\"commit:noChangesAll\") };\n }\n\n return this.commitInBatches(options, hasWorking);\n }\n\n // 普通模式\n if (!this.hasStagedFiles()) {\n return { success: false, error: t(\"commit:noStagedFilesHint\") };\n }\n\n try {\n const commitObj = await this.generateCommitMessage(options);\n const message = formatCommitMessage(commitObj);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:generatedMessage\"));\n console.log(\"─\".repeat(50));\n console.log(message);\n console.log(\"─\".repeat(50));\n }\n\n return this.commit(message, options);\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n}\n","import { defineExtension, type LlmProxyService } from \"@spaceflow/core\";\nimport { CommitService } from \"./commit.service\";\nimport { CommitScopeConfigSchema } from \"./commit.config\";\n\n/**\n * Commit 命令扩展\n */\nexport const commitExtension = defineExtension({\n name: \"commit\",\n version: \"1.0.0\",\n description: \"提交代码\",\n configKey: \"commit\",\n configSchema: () => CommitScopeConfigSchema,\n commands: [\n {\n name: \"commit\",\n description: \"AI 辅助生成 commit message\",\n options: [\n {\n flags: \"-m, --message <message>\",\n description: \"直接使用指定的提交信息\",\n },\n {\n flags: \"-s, --split\",\n description: \"自动拆分提交\",\n },\n {\n flags: \"--dry-run\",\n description: \"仅生成 message,不执行提交\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (_args, options, ctx) => {\n const configReader = ctx.config;\n const llmProxy = ctx.getService<LlmProxyService>(\"llmProxy\");\n if (!llmProxy) {\n ctx.output.error(\"commit 命令需要配置 LLM 服务,请在 spaceflow.json 中配置 llm 字段\");\n process.exit(1);\n }\n const commitService = new CommitService(configReader, llmProxy);\n const verbose = options?.verbose ? 2 : 1;\n if (options?.message) {\n await commitService.commit(options.message as string, { verbose });\n } else if (options?.split) {\n await commitService.commitInBatches({ verbose, dryRun: !!options?.dryRun });\n } else {\n await commitService.generateAndCommit({ verbose, dryRun: !!options?.dryRun });\n }\n },\n },\n ],\n});\n\nexport * from \"./commit.config\";\nexport * from \"./commit.service\";\n","import { mkdir, writeFile, readFile, readdir, stat } from \"fs/promises\";\nimport { join, resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport { homedir } from \"os\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\n\nexport interface CreateOptions {\n directory?: string;\n from?: string;\n ref?: string;\n}\n\ninterface TemplateContext {\n name: string;\n pascalName: string;\n camelName: string;\n kebabName: string;\n}\n\n/**\n * 创建插件服务\n */\nexport class CreateService {\n // 缓存当前使用的远程模板目录\n private remoteTemplatesDir: string | null = null;\n\n /**\n * 获取缓存目录路径\n */\n protected getCacheDir(): string {\n return join(homedir(), \".cache\", \"spaceflow\", \"templates\");\n }\n\n /**\n * 计算仓库 URL 的哈希值(用于缓存目录名)\n */\n protected getRepoHash(repoUrl: string): string {\n return createHash(\"md5\").update(repoUrl).digest(\"hex\").slice(0, 12);\n }\n\n /**\n * 从仓库 URL 提取名称\n */\n protected getRepoName(repoUrl: string): string {\n // 处理 git@host:org/repo.git 或 https://host/org/repo.git\n const match = repoUrl.match(/[/:]([^/]+\\/[^/]+?)(?:\\.git)?$/);\n if (match) {\n return match[1].replace(\"/\", \"-\");\n }\n return this.getRepoHash(repoUrl);\n }\n\n /**\n * 确保远程模板仓库已克隆/更新\n */\n async ensureRemoteTemplates(\n repoUrl: string,\n ref?: string,\n verbose: VerboseLevel = 1,\n ): Promise<string> {\n const cacheDir = this.getCacheDir();\n const repoName = this.getRepoName(repoUrl);\n const repoHash = this.getRepoHash(repoUrl);\n const targetDir = join(cacheDir, `${repoName}-${repoHash}`);\n\n // 确保缓存目录存在\n await mkdir(cacheDir, { recursive: true });\n\n if (existsSync(targetDir)) {\n // 已存在,更新仓库\n if (shouldLog(verbose, 1)) console.log(t(\"create:updatingRepo\", { url: repoUrl }));\n try {\n execSync(\"git fetch --all\", { cwd: targetDir, stdio: \"pipe\" });\n if (ref) {\n execSync(`git checkout ${ref}`, { cwd: targetDir, stdio: \"pipe\" });\n // 如果是分支,尝试 pull\n try {\n execSync(`git pull origin ${ref}`, { cwd: targetDir, stdio: \"pipe\" });\n } catch {\n // 可能是 tag,忽略 pull 错误\n }\n } else {\n execSync(\"git pull\", { cwd: targetDir, stdio: \"pipe\" });\n }\n } catch (error) {\n if (shouldLog(verbose, 1)) console.warn(t(\"create:updateFailed\"));\n }\n } else {\n // 不存在,克隆仓库\n if (shouldLog(verbose, 1)) console.log(t(\"create:cloningRepo\", { url: repoUrl }));\n try {\n execSync(`git clone ${repoUrl} ${targetDir}`, { stdio: \"pipe\" });\n if (ref) {\n execSync(`git checkout ${ref}`, { cwd: targetDir, stdio: \"pipe\" });\n }\n } catch (error) {\n throw new Error(\n t(\"create:cloneFailed\", { error: error instanceof Error ? error.message : error }),\n );\n }\n }\n\n // 设置当前使用的远程模板目录\n this.remoteTemplatesDir = targetDir;\n if (shouldLog(verbose, 1)) console.log(t(\"create:repoReady\", { dir: targetDir }));\n return targetDir;\n }\n\n /**\n * 获取模板目录路径\n */\n protected getTemplatesDir(options?: CreateOptions): string {\n // 如果有远程模板目录,优先使用\n if (options?.from && this.remoteTemplatesDir) {\n return this.remoteTemplatesDir;\n }\n // 尝试从项目根目录查找 templates\n const cwd = process.cwd();\n const templatesInCwd = join(cwd, \"templates\");\n if (existsSync(templatesInCwd)) {\n return templatesInCwd;\n }\n\n // 尝试从父目录查找(在 core 子目录运行时)\n const templatesInParent = join(cwd, \"..\", \"templates\");\n if (existsSync(templatesInParent)) {\n return resolve(templatesInParent);\n }\n\n // 尝试从 spaceflow 包目录查找\n const spaceflowRoot = join(cwd, \"node_modules\", \"spaceflow\", \"templates\");\n if (existsSync(spaceflowRoot)) {\n return spaceflowRoot;\n }\n\n // 回退到相对于当前文件的路径(开发模式)\n // 从 core/dist/commands/create 回溯到项目根目录\n const devPath = resolve(__dirname, \"..\", \"..\", \"..\", \"..\", \"templates\");\n if (existsSync(devPath)) {\n return devPath;\n }\n\n throw new Error(t(\"create:templatesDirNotFound\"));\n }\n\n /**\n * 获取可用的模板列表\n */\n async getAvailableTemplates(options?: CreateOptions): Promise<string[]> {\n try {\n const templatesDir = this.getTemplatesDir(options);\n const entries = await readdir(templatesDir);\n const templates: string[] = [];\n\n for (const entry of entries) {\n // 跳过隐藏目录\n if (entry.startsWith(\".\")) {\n continue;\n }\n const entryPath = join(templatesDir, entry);\n const entryStat = await stat(entryPath);\n if (entryStat.isDirectory()) {\n templates.push(entry);\n }\n }\n\n return templates;\n } catch {\n return [];\n }\n }\n\n /**\n * 基于模板创建插件\n */\n async createFromTemplate(\n template: string,\n name: string,\n options: CreateOptions,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const cwd = process.cwd();\n // 默认目录为 <template>/<name>\n const targetDir = options.directory || join(template, name);\n const fullPath = join(cwd, targetDir);\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"create:creatingPlugin\", { template, name }));\n console.log(t(\"create:targetDir\", { dir: targetDir }));\n }\n\n // 检查目录是否已存在\n if (existsSync(fullPath)) {\n throw new Error(t(\"create:dirExists\", { dir: targetDir }));\n }\n\n // 从模板生成文件\n const templatesDir = this.getTemplatesDir(options);\n const templateDir = join(templatesDir, template);\n\n if (!existsSync(templateDir)) {\n const available = await this.getAvailableTemplates(options);\n throw new Error(\n t(\"create:templateNotFound\", {\n template,\n available: available.join(\", \") || t(\"create:noTemplatesAvailable\"),\n }),\n );\n }\n\n const context = this.createContext(name);\n await this.copyTemplateDir(templateDir, fullPath, context, verbose);\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"create:pluginCreated\", { template, name }));\n console.log(\"\");\n console.log(t(\"create:nextSteps\"));\n console.log(` cd ${targetDir}`);\n }\n }\n\n /**\n * 创建模板上下文\n */\n protected createContext(name: string): TemplateContext {\n return {\n name,\n pascalName: this.toPascalCase(name),\n camelName: this.toCamelCase(name),\n kebabName: this.toKebabCase(name),\n };\n }\n\n /**\n * 递归复制模板目录\n */\n protected async copyTemplateDir(\n templateDir: string,\n targetDir: string,\n context: TemplateContext,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n // 确保目标目录存在\n await mkdir(targetDir, { recursive: true });\n\n const entries = await readdir(templateDir);\n\n for (const entry of entries) {\n const templatePath = join(templateDir, entry);\n const entryStat = await stat(templatePath);\n\n if (entryStat.isDirectory()) {\n // 递归处理子目录\n const targetSubDir = join(targetDir, entry);\n await this.copyTemplateDir(templatePath, targetSubDir, context, verbose);\n } else if (entry.endsWith(\".hbs\")) {\n // 处理模板文件\n const content = await readFile(templatePath, \"utf-8\");\n const rendered = this.renderTemplate(content, context);\n\n // 计算目标文件名(移除 .hbs 后缀,替换 __name__ 占位符)\n let targetFileName = entry.slice(0, -4); // 移除 .hbs\n targetFileName = targetFileName.replace(/__name__/g, context.kebabName);\n\n const targetPath = join(targetDir, targetFileName);\n await writeFile(targetPath, rendered);\n if (shouldLog(verbose, 1)) console.log(t(\"create:fileCreated\", { file: targetFileName }));\n } else {\n // 直接复制非模板文件\n const content = await readFile(templatePath);\n const targetPath = join(targetDir, entry);\n await writeFile(targetPath, content);\n if (shouldLog(verbose, 1)) console.log(t(\"create:fileCopied\", { file: entry }));\n }\n }\n }\n\n /**\n * 渲染模板(简单的 Handlebars 风格替换)\n */\n protected renderTemplate(template: string, context: TemplateContext): string {\n return template\n .replace(/\\{\\{name\\}\\}/g, context.name)\n .replace(/\\{\\{pascalName\\}\\}/g, context.pascalName)\n .replace(/\\{\\{camelName\\}\\}/g, context.camelName)\n .replace(/\\{\\{kebabName\\}\\}/g, context.kebabName);\n }\n\n /**\n * 转换为 PascalCase\n */\n protected toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\"\");\n }\n\n /**\n * 转换为 camelCase\n */\n protected toCamelCase(str: string): string {\n const pascal = this.toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n\n /**\n * 转换为 kebab-case\n */\n protected toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[_\\s]+/g, \"-\")\n .toLowerCase();\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { CreateService } from \"./create.service\";\n\n/**\n * Create 命令扩展\n */\nexport const createExtension = defineExtension({\n name: \"create\",\n version: \"1.0.0\",\n description: \"创建 Extension\",\n commands: [\n {\n name: \"create\",\n description: \"创建 Extension\",\n arguments: \"<name>\",\n options: [\n {\n flags: \"-t, --template <template>\",\n description: \"模板类型 (command, mcp, skills)\",\n default: \"command\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const name = args[0];\n if (!name) {\n ctx.output.error(\"请指定扩展名称\");\n process.exit(1);\n }\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const createService = new CreateService();\n const template = (options?.template as string) || \"command\";\n await createService.createFromTemplate(template, name, {}, verbose);\n },\n },\n ],\n});\n\nexport * from \"./create.service\";\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { BuildService } from \"../build/build.service\";\n\n/**\n * Dev 命令扩展\n */\nexport const devExtension = defineExtension({\n name: \"dev\",\n version: \"1.0.0\",\n description: \"开发模式运行 Extension\",\n commands: [\n {\n name: \"dev\",\n description: \"开发模式(监听构建)\",\n arguments: \"[extension]\",\n options: [\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const extensionName = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const buildService = new BuildService();\n await buildService.watch(extensionName, verbose);\n },\n },\n ],\n});\n","import { execSync } from \"child_process\";\nimport { readFile, writeFile, access, mkdir, symlink, unlink, readlink, stat } from \"fs/promises\";\nimport { join, resolve, relative } from \"path\";\nimport { existsSync } from \"fs\";\nimport {\n shouldLog,\n type VerboseLevel,\n t,\n getEditorDirName,\n type SourceType,\n getSourceType,\n normalizeSource,\n extractNpmPackageName,\n extractName,\n buildGitPackageSpec,\n getPackageManager,\n detectPackageManager,\n getSpaceflowDir,\n ensureSpaceflowPackageJson,\n ensureEditorGitignore,\n SchemaGeneratorService,\n findConfigFileWithField,\n getSupportedEditors,\n getDependencies,\n updateDependency,\n SPACEFLOW_DIR,\n} from \"@spaceflow/core\";\n\nexport type { SourceType } from \"@spaceflow/core\";\n\n/**\n * 扩展配置项,支持字符串或对象格式\n * 字符串: \"git@xxx.git\" 或 \"@scope/package@version\" 或 \"./path\"\n * 对象: { source: \"git@xxx.git\", ref: \"v1.0.0\" }\n */\nexport type ExtensionConfig =\n | string\n | {\n source: string;\n ref?: string; // git: branch/tag/commit, npm: version\n };\n\nexport interface InstallOptions {\n source: string;\n name?: string;\n ref?: string; // 版本号/分支/tag/commit\n}\n\nexport interface InstallContext extends InstallOptions {\n type: SourceType;\n depsDir: string;\n depPath: string;\n configPath: string;\n}\n\n/**\n * MCP 导出项配置\n */\nexport interface McpExportItem {\n name: string;\n entry: string;\n mcp?: { command: string; args?: string[]; env?: string[] };\n}\n\n/**\n * 插件配置类型\n */\nexport type PluginConfig = Record<\n \"flows\" | \"commands\" | \"extensions\",\n Array<{ name: string; entry: string }>\n> & {\n mcps: McpExportItem[];\n};\n\nexport class InstallService {\n constructor(private readonly schemaGenerator: SchemaGeneratorService) {}\n\n getContext(options: InstallOptions): InstallContext {\n const cwd = process.cwd();\n const type = getSourceType(options.source);\n const name = options.name || extractName(options.source);\n const spaceflowDir = join(cwd, SPACEFLOW_DIR);\n // Extension 安装到 .spaceflow/node_modules/ 中\n // 对 npm 包使用完整包名(含 @scope/ 前缀)作为 node_modules 路径\n const depName = type === \"npm\" ? extractNpmPackageName(options.source) : name;\n const depPath = join(spaceflowDir, \"node_modules\", depName);\n const configPath = findConfigFileWithField(\"dependencies\", cwd);\n\n return {\n ...options,\n type,\n depsDir: spaceflowDir,\n depPath,\n configPath,\n };\n }\n\n /**\n * 将插件关联到各个编辑器的目录\n * pluginConfig 包含 flows/commands/extensions/mcps 四种类型\n * - flows: CLI 子命令,不需要复制到编辑器目录\n * - commands: 编辑器命令,复制到 .claude/commands/ 等目录\n * - extensions: 扩展包,复制到 .claude/skills/ 等目录\n * - mcps: MCP Server,注册到编辑器的 mcp.json 配置\n */\n protected async linkPluginToEditors(options: {\n name: string;\n depPath: string;\n pluginConfig: PluginConfig;\n cwd?: string;\n isGlobal?: boolean;\n verbose?: VerboseLevel;\n }): Promise<void> {\n const { name, depPath, pluginConfig, cwd, isGlobal = false, verbose = 1 } = options;\n const editors = getSupportedEditors(cwd);\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const workingDir = cwd || process.cwd();\n\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n const editorRoot = isGlobal ? join(home, editorDirName) : join(workingDir, editorDirName);\n\n // 处理 extensions\n if (pluginConfig.extensions.length > 0) {\n const editorExtensionsDir = join(editorRoot, \"skills\");\n await this.ensureDir(editorExtensionsDir, verbose);\n\n for (const ext of pluginConfig.extensions) {\n const extPath = ext.entry === \".\" ? depPath : join(depPath, ext.entry);\n const installName = ext.name || name;\n const targetPath = join(editorExtensionsDir, installName);\n\n await this.copyExtensionToTarget(extPath, targetPath, installName);\n\n // 将生成的扩展加入编辑器目录的 .gitignore\n await ensureEditorGitignore(editorRoot, \"skills\", installName);\n }\n }\n\n // 处理 commands(编辑器命令)\n if (pluginConfig.commands.length > 0) {\n const editorCommandsDir = join(editorRoot, \"commands\");\n await this.ensureDir(editorCommandsDir);\n\n for (const cmd of pluginConfig.commands) {\n const commandPath = cmd.entry === \".\" ? depPath : join(depPath, cmd.entry);\n const installName = cmd.name || name;\n await this.generateCommandMd(commandPath, editorCommandsDir, installName, verbose);\n\n // 将生成的 command 加入编辑器目录的 .gitignore\n await ensureEditorGitignore(editorRoot, \"commands\", installName);\n }\n }\n\n // 处理 mcps(MCP Server)\n if (pluginConfig.mcps.length > 0) {\n for (const mcpItem of pluginConfig.mcps) {\n const mcpPath = mcpItem.entry === \".\" ? depPath : join(depPath, mcpItem.entry);\n const installName = mcpItem.name || name;\n await this.registerMcpServer(editorRoot, installName, mcpPath, mcpItem.mcp, verbose);\n }\n }\n\n // flows 类型不需要复制到编辑器目录,它们是 CLI 子命令\n }\n }\n\n /**\n * 注册 MCP Server 到编辑器的 mcp.json 配置\n */\n protected async registerMcpServer(\n editorRoot: string,\n name: string,\n mcpPath: string,\n mcpConfig?: { command: string; args?: string[]; env?: string[] },\n verbose?: VerboseLevel,\n ): Promise<void> {\n const mcpJsonPath = join(editorRoot, \"mcp.json\");\n\n // 读取现有配置或创建新配置\n let config: { mcpServers?: Record<string, any> } = { mcpServers: {} };\n try {\n if (existsSync(mcpJsonPath)) {\n const content = await readFile(mcpJsonPath, \"utf-8\");\n config = JSON.parse(content);\n if (!config.mcpServers) {\n config.mcpServers = {};\n }\n }\n } catch {\n config = { mcpServers: {} };\n }\n\n // 构建 MCP Server 配置\n const command = mcpConfig?.command || \"node\";\n const args = mcpConfig?.args || [\"dist/index.js\"];\n\n // 将相对路径转换为绝对路径\n const resolvedArgs = args.map((arg) => {\n if (arg.startsWith(\"./\") || arg.startsWith(\"../\") || !arg.includes(\"/\")) {\n // 可能是相对路径,转换为绝对路径\n if (arg.endsWith(\".js\") || arg.endsWith(\".mjs\") || arg.endsWith(\".cjs\")) {\n return join(mcpPath, arg);\n }\n }\n return arg;\n });\n\n const serverConfig: Record<string, any> = {\n command,\n args: resolvedArgs,\n };\n\n // 如果有环境变量需求,添加空的 env 对象供用户填写\n if (mcpConfig?.env && mcpConfig.env.length > 0) {\n serverConfig.env = {};\n for (const envKey of mcpConfig.env) {\n serverConfig.env[envKey] = t(\"install:envPlaceholder\", { key: envKey });\n }\n }\n\n config.mcpServers![name] = serverConfig;\n\n // 确保目录存在\n await this.ensureDir(editorRoot);\n\n // 写入配置\n await writeFile(mcpJsonPath, JSON.stringify(config, null, 2), \"utf-8\");\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:registerMcp\", { name }));\n if (mcpConfig?.env && mcpConfig.env.length > 0) {\n console.log(t(\"install:mcpEnvHint\", { path: mcpJsonPath, vars: mcpConfig.env.join(\", \") }));\n }\n }\n }\n\n async execute(context: InstallContext, verbose: VerboseLevel = 1): Promise<void> {\n const { source, type, depPath } = context;\n const name = context.name || extractName(source);\n const cwd = process.cwd();\n const isGlobal = false;\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:installingExtension\", { source }));\n\n // 所有类型都通过 pnpm add 安装到 .spaceflow/node_modules/\n await this.installExtension(source, type, context.ref, isGlobal, verbose);\n\n // 读取插件配置并关联到编辑器\n const pluginConfig = await this.getPluginConfigFromPackageJson(depPath);\n await this.linkPluginToEditors({\n name,\n depPath,\n pluginConfig,\n cwd,\n isGlobal,\n verbose,\n });\n\n // 安装依赖和构建(对于本地路径的 Extension)\n if (type === \"local\") {\n const sourcePath = resolve(cwd, source);\n await this.ensureDependenciesAndBuild(sourcePath, name, verbose);\n }\n\n // 更新配置文件\n await this.updateConfigFile(context, verbose);\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:installDone\", { name }));\n\n // 自动生成 schema\n this.generateSchema();\n }\n\n /**\n * 安装 Extension 到 .spaceflow/node_modules/\n * 支持 npm 包、本地路径(link:)、git 仓库(git+)\n * @param source 源(npm 包名、本地路径、git URL)\n * @param type 源类型\n * @param ref 版本/分支/tag(可选)\n * @param isGlobal 是否安装到全局 ~/.spaceflow/\n * @param verbose 日志级别\n */\n protected async installExtension(\n source: string,\n type: SourceType,\n ref?: string,\n isGlobal: boolean = false,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const spaceflowDir = getSpaceflowDir(isGlobal);\n\n // 确保 .spaceflow 目录和 package.json 存在\n ensureSpaceflowPackageJson(spaceflowDir);\n\n // 根据类型构建 pnpm add 的参数\n let packageSpec: string;\n if (type === \"local\") {\n // 本地路径使用 link: 协议,相对于 .spaceflow 目录\n const normalizedSource = normalizeSource(source);\n // 计算相对于 .spaceflow 目录的路径\n const relativePath = join(\"..\", normalizedSource);\n packageSpec = `link:${relativePath}`;\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:typeLocal\"));\n console.log(t(\"install:sourcePath\", { path: relativePath }));\n }\n } else if (type === \"git\") {\n // git 仓库:如果已经是 git+ 格式则直接使用,否则转换\n packageSpec = source.startsWith(\"git+\") ? source : buildGitPackageSpec(source, ref);\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:typeGit\"));\n console.log(t(\"install:sourceUrl\", { url: packageSpec }));\n }\n } else {\n // npm 包直接使用包名\n packageSpec = source;\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:typeNpm\"));\n }\n }\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:targetDir\", { dir: spaceflowDir }));\n }\n\n const pm = detectPackageManager(spaceflowDir);\n let cmd: string;\n if (pm === \"pnpm\") {\n cmd = `pnpm add --prefix \"${spaceflowDir}\" \"${packageSpec}\"`;\n } else {\n cmd = `npm install --prefix \"${spaceflowDir}\" \"${packageSpec}\"`;\n }\n\n try {\n execSync(cmd, {\n cwd: process.cwd(),\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch (error) {\n throw new Error(t(\"install:extensionInstallFailed\", { source }));\n }\n }\n\n /**\n * 从源获取实际的包名(用于确定 node_modules 中的路径)\n * 本地路径:读取 package.json 的 name 字段\n * npm 包:直接使用包名\n * git 仓库:安装后从 node_modules 查找\n */\n protected async getPackageNameFromSource(\n source: string,\n type: SourceType,\n spaceflowDir: string,\n ): Promise<string> {\n if (type === \"local\") {\n // 本地路径:读取 package.json 的 name 字段(先规范化)\n const normalizedSource = normalizeSource(source);\n const sourcePath = resolve(process.cwd(), normalizedSource);\n const pkgJsonPath = join(sourcePath, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n try {\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.name) {\n return pkg.name;\n }\n } catch {\n // 解析失败,使用目录名\n }\n }\n // 回退到目录名\n return extractName(source);\n } else if (type === \"npm\") {\n // npm 包:直接使用包名(去除版本号)\n return extractNpmPackageName(source);\n } else {\n // git 仓库:pnpm 会将 git URL 安装为 xxx.git 格式\n // 例如: git+ssh://git@host/org/repo.git -> repo.git\n const baseName = extractName(source);\n // pnpm 安装 git 仓库时会保留 .git 后缀\n const gitName = baseName.endsWith(\".git\") ? baseName : `${baseName}.git`;\n\n // 尝试在 node_modules 中查找\n const nodeModulesPath = join(spaceflowDir, \"node_modules\");\n if (existsSync(nodeModulesPath)) {\n // 优先检查 xxx.git 格式\n if (existsSync(join(nodeModulesPath, gitName))) {\n return gitName;\n }\n // 回退检查不带 .git 的格式\n if (existsSync(join(nodeModulesPath, baseName))) {\n return baseName;\n }\n }\n return gitName;\n }\n }\n\n protected async ensureDir(dirPath: string, verbose: VerboseLevel = 1): Promise<void> {\n try {\n await access(dirPath);\n } catch {\n if (shouldLog(verbose, 1)) console.log(t(\"install:creatingDir\", { dir: dirPath }));\n await mkdir(dirPath, { recursive: true });\n }\n }\n\n /**\n * 克隆 git 仓库并移除 .git 目录\n */\n protected async cloneAndRemoveGit(\n repoUrl: string,\n targetPath: string,\n ref?: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const { rm } = await import(\"fs/promises\");\n\n // 检查目标目录是否已存在\n if (existsSync(targetPath)) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:dirExistsSkip\"));\n return;\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:cloningRepo\"));\n try {\n const cloneCmd = ref\n ? `git clone --depth 1 --branch ${ref} ${repoUrl} ${targetPath}`\n : `git clone --depth 1 ${repoUrl} ${targetPath}`;\n execSync(cloneCmd, { stdio: verbose ? \"inherit\" : \"pipe\" });\n } catch {\n // 如果 --branch 失败(可能是 commit hash),先 clone 再 checkout\n try {\n execSync(`git clone --depth 1 ${repoUrl} ${targetPath}`, {\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n if (ref) {\n execSync(`git fetch --depth 1 origin ${ref}`, {\n cwd: targetPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n execSync(`git checkout ${ref}`, { cwd: targetPath, stdio: verbose ? \"inherit\" : \"pipe\" });\n }\n } catch (error) {\n throw new Error(\n t(\"install:cloneFailed\", { error: error instanceof Error ? error.message : error }),\n );\n }\n }\n\n // 移除 .git 目录\n const gitDir = join(targetPath, \".git\");\n if (existsSync(gitDir)) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:removingGit\"));\n await rm(gitDir, { recursive: true, force: true });\n }\n }\n\n /**\n * 创建 deps 目录下的符号链接(本地路径依赖)\n */\n protected async createDepsSymlink(\n sourcePath: string,\n depPath: string,\n name: string,\n ): Promise<void> {\n // 检查目标是否已存在\n if (existsSync(depPath)) {\n try {\n const linkTarget = await readlink(depPath);\n const resolvedTarget = resolve(join(depPath, \"..\"), linkTarget);\n if (resolvedTarget === sourcePath) {\n console.log(t(\"install:depsLinkExists\"));\n return;\n }\n await unlink(depPath);\n } catch {\n console.log(t(\"install:depsExists\", { name }));\n return;\n }\n }\n\n // 计算相对路径\n const cwd = process.cwd();\n const depsDir = join(depPath, \"..\");\n const relativeSource = relative(depsDir, sourcePath);\n\n // 显示相对于 cwd 的路径\n const displayDepPath = relative(cwd, depPath);\n const displaySourcePath = relative(cwd, sourcePath);\n console.log(t(\"install:createDepsLink\", { dep: displayDepPath, source: displaySourcePath }));\n await symlink(relativeSource, depPath);\n }\n\n /**\n * 将扩展链接到 .claude/skills 目录\n */\n protected async linkExtensionToTarget(\n sourcePath: string,\n targetPath: string,\n name: string,\n ): Promise<void> {\n const { rm } = await import(\"fs/promises\");\n\n // 检查目标是否已存在\n if (existsSync(targetPath)) {\n try {\n const linkTarget = await readlink(targetPath);\n const resolvedTarget = resolve(join(targetPath, \"..\"), linkTarget);\n if (resolvedTarget === sourcePath) {\n console.log(t(\"install:extensionLinkExists\", { name }));\n return;\n }\n // 链接指向不同目标,删除后重建\n await rm(targetPath, { recursive: true, force: true });\n } catch {\n // 不是符号链接,删除后重建\n await rm(targetPath, { recursive: true, force: true });\n }\n }\n\n // 计算相对路径\n const targetDir = join(targetPath, \"..\");\n const relativeSource = relative(targetDir, sourcePath);\n\n console.log(t(\"install:createExtensionLink\", { name, target: relativeSource }));\n await symlink(relativeSource, targetPath);\n }\n\n /**\n * 将扩展复制到 .claude/skills 目录\n */\n protected async copyExtensionToTarget(\n sourcePath: string,\n targetPath: string,\n name: string,\n ): Promise<void> {\n const { rm, cp } = await import(\"fs/promises\");\n\n // 如果目标已存在,先删除\n if (existsSync(targetPath)) {\n await rm(targetPath, { recursive: true, force: true });\n }\n\n console.log(t(\"install:copyExtension\", { name }));\n await cp(sourcePath, targetPath, { recursive: true });\n }\n\n /**\n * 解析扩展配置,支持字符串和对象格式\n */\n parseExtensionConfig(config: ExtensionConfig): { source: string; ref?: string } {\n if (typeof config === \"string\") {\n return { source: config };\n }\n return { source: config.source, ref: config.ref };\n }\n\n /**\n * 获取安装根目录\n * @param isGlobal 是否全局安装\n */\n protected getInstallRoot(isGlobal: boolean): string {\n if (isGlobal) {\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n return join(home, \".spaceflow\");\n }\n return join(process.cwd(), \".spaceflow\");\n }\n\n /**\n * 全局安装单个依赖\n * 安装到 ~/.spaceflow/node_modules/\n */\n async installGlobal(options: InstallOptions, verbose: VerboseLevel = 1): Promise<void> {\n const { source, name, ref } = options;\n const spaceflowDir = getSpaceflowDir(true);\n const depName = name || extractName(source);\n\n if (shouldLog(verbose, 1))\n console.log(t(\"install:globalInstalling\", { name: depName, dir: spaceflowDir }));\n\n const sourceType = getSourceType(source);\n\n // 通过 pnpm add 安装到 ~/.spaceflow/node_modules/\n await this.installExtension(source, sourceType, ref, true, verbose);\n\n // Extension 安装后的路径\n // 对 npm 包使用完整包名(含 @scope/ 前缀)作为 node_modules 路径\n const depModuleName = sourceType === \"npm\" ? name || extractNpmPackageName(source) : depName;\n const depPath = join(spaceflowDir, \"node_modules\", depModuleName);\n\n // 读取插件配置\n const pluginConfig = await this.getPluginConfigFromPackageJson(depPath);\n\n const activeTypes = Object.entries(pluginConfig)\n .filter(([, items]) => items.length > 0)\n .map(([type]) => type);\n if (activeTypes.length > 0 && shouldLog(verbose, 1)) {\n console.log(t(\"install:pluginTypes\", { types: activeTypes.join(\", \") }));\n }\n\n // 将插件关联到各个编辑器的目录\n await this.linkPluginToEditors({\n name: depName,\n depPath,\n pluginConfig,\n cwd: process.cwd(),\n isGlobal: true,\n verbose,\n });\n\n // 对于本地路径的 Extension,需要安装依赖和构建\n if (sourceType === \"local\") {\n const sourcePath = resolve(process.cwd(), source);\n await this.ensureDependenciesAndBuild(sourcePath, depName, verbose);\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:globalInstallDone\"));\n\n // 自动生成 schema\n this.generateSchema();\n }\n\n /**\n * 检查 .spaceflowrc 中声明的依赖是否有未安装的\n */\n hasMissingExtensions(): boolean {\n const cwd = process.cwd();\n const dependencies = this.parseExtensionsFromConfig(cwd);\n const spaceflowDir = getSpaceflowDir(false);\n const globalDir = getSpaceflowDir(true);\n\n for (const name of Object.keys(dependencies)) {\n const localInstalled = existsSync(join(spaceflowDir, \"node_modules\", name, \"package.json\"));\n const globalInstalled = existsSync(join(globalDir, \"node_modules\", name, \"package.json\"));\n if (!localInstalled && !globalInstalled) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * 更新配置文件中的所有依赖\n * 先更新 .spaceflow/package.json,然后一次性安装所有依赖\n */\n async updateAllExtensions(options?: { verbose?: VerboseLevel }): Promise<void> {\n const cwd = process.cwd();\n const spaceflowDir = getSpaceflowDir(false);\n const verbose = options?.verbose ?? true;\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:updatingAll\"));\n\n // 读取配置文件中的 dependencies\n const dependencies = this.parseExtensionsFromConfig(cwd);\n\n if (Object.keys(dependencies).length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:noDeps\"));\n return;\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"install:foundDeps\", { count: Object.keys(dependencies).length }));\n\n // 1. 先更新 .spaceflow/package.json 中的所有依赖\n await this.updateSpaceflowPackageJson(dependencies, spaceflowDir, verbose);\n\n // 2. 一次性安装所有依赖\n if (shouldLog(verbose, 1)) console.log(t(\"install:installingDeps\"));\n const pm = detectPackageManager(spaceflowDir);\n try {\n execSync(`${pm} install`, { cwd: spaceflowDir, stdio: verbose ? \"inherit\" : \"pipe\" });\n } catch {\n console.warn(t(\"install:pmInstallFailed\", { pm }));\n }\n\n // 3. 处理每个依赖的 extensions/commands 关联\n for (const [name, config] of Object.entries(dependencies)) {\n const { source } = this.parseExtensionConfig(config);\n const sourceType = getSourceType(source);\n\n // 获取安装后的路径\n // workspace: 和 npm 类型时,name(.spaceflowrc 的 key)就是包名\n const packageName =\n source.startsWith(\"workspace:\") || sourceType === \"npm\"\n ? name\n : await this.getPackageNameFromSource(source, sourceType, spaceflowDir);\n const depPath = join(spaceflowDir, \"node_modules\", packageName);\n\n if (!existsSync(depPath)) {\n console.warn(t(\"install:depNotInstalled\", { name }));\n continue;\n }\n\n // 读取插件配置并关联到编辑器\n const pluginConfig = await this.getPluginConfigFromPackageJson(depPath);\n const activeTypes = Object.entries(pluginConfig)\n .filter(([, items]) => items.length > 0)\n .map(([type]) => type);\n\n if (activeTypes.length > 0) {\n if (shouldLog(verbose, 1)) console.log(`\\n📦 ${name}: ${activeTypes.join(\", \")}`);\n await this.linkPluginToEditors({\n name,\n depPath,\n pluginConfig,\n cwd,\n isGlobal: false,\n verbose,\n });\n }\n\n // 对于本地路径的 Extension,需要构建(workspace: 类型不需要,已在 workspace 中构建)\n if (sourceType === \"local\" && !source.startsWith(\"workspace:\")) {\n const normalizedSource = normalizeSource(source);\n const sourcePath = resolve(cwd, normalizedSource);\n await this.ensureDependenciesAndBuild(sourcePath, name, verbose);\n }\n }\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"install:allExtensionsDone\"));\n }\n\n // 自动生成 schema\n this.generateSchema();\n }\n\n /**\n * 更新 .spaceflow/package.json 中的依赖\n */\n protected async updateSpaceflowPackageJson(\n dependencies: Record<string, ExtensionConfig>,\n spaceflowDir: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n // 确保目录和 package.json 存在\n ensureSpaceflowPackageJson(spaceflowDir);\n\n const packageJsonPath = join(spaceflowDir, \"package.json\");\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n if (!pkg.dependencies) {\n pkg.dependencies = {};\n }\n\n let updated = false;\n for (const [name, config] of Object.entries(dependencies)) {\n const { source, ref } = this.parseExtensionConfig(config);\n const sourceType = getSourceType(source);\n\n let packageSpec: string;\n let packageName: string;\n\n if (source.startsWith(\"workspace:\")) {\n // workspace 协议:直接透传\n packageName = name;\n packageSpec = source;\n } else if (sourceType === \"local\") {\n const normalizedSource = normalizeSource(source);\n const relativePath = join(\"..\", normalizedSource);\n packageSpec = `link:${relativePath}`;\n packageName = await this.getPackageNameFromSource(source, sourceType, spaceflowDir);\n } else if (sourceType === \"git\") {\n packageSpec = source.startsWith(\"git+\") ? source : buildGitPackageSpec(source, ref);\n packageName = await this.getPackageNameFromSource(source, sourceType, spaceflowDir);\n } else {\n // npm 类型:.spaceflowrc 中 key 是包名,value 是版本范围(如 \"^0.37.0\")\n packageName = name;\n packageSpec = source;\n }\n\n if (pkg.dependencies[packageName] !== packageSpec) {\n pkg.dependencies[packageName] = packageSpec;\n updated = true;\n if (shouldLog(verbose, 2)) console.log(` + ${packageName}: ${packageSpec}`);\n }\n }\n\n if (updated) {\n await writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n if (shouldLog(verbose, 1)) console.log(t(\"install:updatedPackageJson\"));\n }\n }\n\n /**\n * 从配置文件解析扩展\n */\n protected parseExtensionsFromConfig(cwd?: string): Record<string, ExtensionConfig> {\n return getDependencies(cwd);\n }\n\n /**\n * 获取 git 仓库当前的 ref (commit hash 或 tag)\n */\n protected async getCurrentGitRef(extPath: string): Promise<string | null> {\n if (!existsSync(extPath)) {\n return null;\n }\n try {\n const result = execSync(\"git rev-parse HEAD\", {\n cwd: extPath,\n encoding: \"utf-8\",\n }).trim();\n return result.substring(0, 7); // 短 hash\n } catch {\n return null;\n }\n }\n\n /**\n * 检查 ref 是否匹配(支持 tag、branch、commit)\n */\n protected async isRefMatch(\n extPath: string,\n targetRef: string,\n currentCommit: string | null,\n ): Promise<boolean> {\n if (!currentCommit) return false;\n\n try {\n // 检查 targetRef 是否是 tag 或 branch,获取其对应的 commit\n const targetCommit = execSync(`git rev-parse ${targetRef}`, {\n cwd: extPath,\n encoding: \"utf-8\",\n }).trim();\n\n // 比较 commit hash(前7位)\n return (\n targetCommit.startsWith(currentCommit) ||\n currentCommit.startsWith(targetCommit.substring(0, 7))\n );\n } catch {\n return false;\n }\n }\n\n /**\n * 创建符号链接(使用绝对路径,用于全局安装)\n */\n protected async createSymlinkAbsolute(\n source: string,\n target: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n try {\n const existingTarget = await readlink(target);\n if (existingTarget === source) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:symlinkExists\"));\n return;\n }\n await unlink(target);\n } catch {\n // 链接不存在,继续创建\n }\n\n try {\n await symlink(source, target);\n if (shouldLog(verbose, 1)) console.log(t(\"install:createSymlink\", { target, source }));\n } catch (error) {\n throw new Error(\n t(\"install:createSymlinkFailed\", { error: error instanceof Error ? error.message : error }),\n );\n }\n }\n\n /**\n * 检查 ref 是否是分支\n */\n protected async isBranchRef(extPath: string, ref: string): Promise<boolean> {\n if (!existsSync(extPath)) {\n return false;\n }\n try {\n // 检查是否是远程分支\n const result = execSync(`git branch -r --list \"origin/${ref}\"`, {\n cwd: extPath,\n encoding: \"utf-8\",\n }).trim();\n return result.length > 0;\n } catch {\n return false;\n }\n }\n\n /**\n * 拉取最新代码\n */\n protected async pullLatest(extPath: string, verbose: VerboseLevel = 1): Promise<void> {\n try {\n execSync(\"git pull\", {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:pullFailed\"));\n }\n }\n\n /**\n * 切换到指定的 git ref\n */\n protected async checkoutGitRef(\n extPath: string,\n ref: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n try {\n if (shouldLog(verbose, 1)) console.log(t(\"install:checkoutVersion\", { ref }));\n // 先 fetch 确保有最新的 refs\n execSync(\"git fetch --all --tags\", {\n cwd: extPath,\n stdio: \"pipe\",\n });\n // checkout 到指定 ref\n execSync(`git checkout ${ref}`, {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:checkoutFailed\"));\n }\n }\n\n /**\n * 检查依赖和构建(仅在需要时执行)\n * 用于版本已匹配的情况,只检查 dist 是否存在\n */\n protected async ensureDependenciesAndBuildIfNeeded(\n extPath: string,\n _name: string,\n ): Promise<void> {\n const pkgJsonPath = join(extPath, \"package.json\");\n\n // 检查是否有 package.json(命令型插件)\n if (!existsSync(pkgJsonPath)) {\n return;\n }\n\n const distIndexPath = join(extPath, \"dist\", \"index.js\");\n const nodeModulesPath = join(extPath, \"node_modules\");\n\n // 检查 node_modules 是否存在\n if (!existsSync(nodeModulesPath)) {\n console.log(t(\"install:installingDepsEllipsis\"));\n try {\n execSync(`${this.getPackageManager()} install`, {\n cwd: extPath,\n stdio: \"inherit\",\n });\n } catch {\n console.warn(t(\"install:depsInstallFailed\"));\n return;\n }\n } else {\n console.log(t(\"install:depsInstalled\"));\n }\n\n // 检查 dist 是否存在\n if (!existsSync(distIndexPath)) {\n console.log(t(\"install:buildingPlugin\"));\n try {\n execSync(\"pnpm build\", {\n cwd: extPath,\n stdio: \"inherit\",\n });\n } catch {\n console.warn(t(\"install:buildFailed\"));\n }\n } else {\n console.log(t(\"install:buildExists\"));\n }\n }\n\n /**\n * 克隆或更新 git 仓库(用于全局安装)\n */\n protected async cloneOrUpdateRepo(\n source: string,\n depPath: string,\n ref?: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const gitDir = join(depPath, \".git\");\n\n if (existsSync(gitDir)) {\n // 仓库已存在,更新\n if (shouldLog(verbose, 1)) console.log(t(\"install:repoExists\"));\n try {\n execSync(\"git fetch --all\", { cwd: depPath, stdio: verbose ? \"inherit\" : \"pipe\" });\n if (ref) {\n const isBranch = await this.isBranchRef(depPath, ref);\n if (isBranch) {\n await this.checkoutGitRef(depPath, ref, verbose);\n await this.pullLatest(depPath, verbose);\n } else {\n await this.checkoutGitRef(depPath, ref, verbose);\n }\n } else {\n execSync(\"git pull\", { cwd: depPath, stdio: verbose ? \"inherit\" : \"pipe\" });\n }\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:repoUpdateFailed\"));\n }\n } else {\n // 仓库不存在,克隆\n if (shouldLog(verbose, 1)) console.log(t(\"install:cloningRepo\"));\n try {\n const cloneCmd = ref\n ? `git clone --branch ${ref} ${source} ${depPath}`\n : `git clone ${source} ${depPath}`;\n execSync(cloneCmd, { stdio: verbose ? \"inherit\" : \"pipe\" });\n } catch {\n // 如果 --branch 失败(可能是 commit hash),先 clone 再 checkout\n try {\n execSync(`git clone ${source} ${depPath}`, { stdio: verbose ? \"inherit\" : \"pipe\" });\n if (ref) {\n await this.checkoutGitRef(depPath, ref, verbose);\n }\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:cloneRepoFailed\"));\n }\n }\n }\n }\n\n /**\n * 从 package.json 读取插件配置\n * 返回 { flows: [], commands: [], extensions: [], mcps: [] } 格式的导出映射\n */\n protected async getPluginConfigFromPackageJson(extPath: string): Promise<PluginConfig> {\n const createEmptyConfig = (): PluginConfig => ({\n flows: [],\n commands: [],\n extensions: [],\n mcps: [],\n });\n const createDefaultExtension = (name = \"\"): PluginConfig => ({\n flows: [],\n commands: [],\n extensions: [{ name, entry: \".\" }],\n mcps: [],\n });\n\n const addExport = (\n config: PluginConfig,\n type: string,\n name: string,\n entry: string,\n mcp?: { command: string; args?: string[]; env?: string[] },\n ) => {\n if (type === \"flow\") config.flows.push({ name, entry });\n else if (type === \"command\") config.commands.push({ name, entry });\n else if (type === \"extension\") config.extensions.push({ name, entry });\n else if (type === \"mcp\") config.mcps.push({ name, entry, mcp });\n };\n\n const pkgJsonPath = join(extPath, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n return createDefaultExtension();\n }\n\n try {\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const spaceflowConfig = pkg.spaceflow;\n\n if (!spaceflowConfig) {\n return createDefaultExtension(pkg.name);\n }\n\n const config = createEmptyConfig();\n\n // 完整格式:exports 对象\n if (spaceflowConfig.exports) {\n for (const [name, exp] of Object.entries(spaceflowConfig.exports)) {\n const {\n type = \"flow\",\n entry = \".\",\n mcp,\n } = exp as { type?: string; entry?: string; mcp?: any };\n addExport(config, type, name, entry, mcp);\n }\n return config;\n }\n\n // 简化格式:type/entry\n if (spaceflowConfig.entry) {\n addExport(\n config,\n spaceflowConfig.type || \"flow\",\n pkg.name || \"\",\n spaceflowConfig.entry,\n spaceflowConfig.mcp,\n );\n return config;\n }\n\n return createDefaultExtension(pkg.name);\n } catch {\n return createDefaultExtension();\n }\n }\n\n /**\n * 获取包管理器\n * 必须同时满足:命令可用 AND lock 文件存在\n */\n protected getPackageManager(): string {\n const cwd = process.cwd();\n\n // pnpm: 命令可用 + pnpm-lock.yaml 存在\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n // pnpm 命令不可用,继续检测其他\n }\n }\n\n // yarn: 命令可用 + yarn.lock 存在\n if (existsSync(join(cwd, \"yarn.lock\"))) {\n try {\n execSync(\"yarn --version\", { stdio: \"ignore\" });\n return \"yarn\";\n } catch {\n // yarn 命令不可用,继续检测其他\n }\n }\n\n // npm: 命令可用 + package-lock.json 存在\n if (existsSync(join(cwd, \"package-lock.json\"))) {\n try {\n execSync(\"npm --version\", { stdio: \"ignore\" });\n return \"npm\";\n } catch {\n // npm 命令不可用\n }\n }\n\n // 默认回退到 npm\n return \"npm\";\n }\n\n /**\n * 检测当前目录是否为 pnpm workspace\n */\n protected isPnpmWorkspace(): boolean {\n const cwd = process.cwd();\n return existsSync(join(cwd, \"pnpm-workspace.yaml\"));\n }\n\n /**\n * 生成 EXTENSION.md 文件\n * 解析 README.md 和 package.json,生成标准化的 EXTENSION.md\n */\n protected async generateExtensionMd(extPath: string, name: string): Promise<void> {\n const extensionMdPath = join(extPath, \"EXTENSION.md\");\n\n // 如果已存在 EXTENSION.md,跳过\n if (existsSync(extensionMdPath)) {\n console.log(t(\"install:extensionMdExists\"));\n return;\n }\n\n let content = \"\";\n let pkgName = name;\n let pkgDescription = \"\";\n\n // 读取 package.json\n const pkgJsonPath = join(extPath, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n try {\n const pkgContent = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n pkgName = pkg.name || name;\n pkgDescription = pkg.description || \"\";\n } catch {\n // 解析失败,使用默认值\n }\n }\n\n // 读取 README.md(支持大小写)\n let readmeContent = \"\";\n const readmePaths = [\n join(extPath, \"README.md\"),\n join(extPath, \"readme.md\"),\n join(extPath, \"Readme.md\"),\n ];\n for (const readmePath of readmePaths) {\n if (existsSync(readmePath)) {\n try {\n readmeContent = await readFile(readmePath, \"utf-8\");\n break;\n } catch {\n // 读取失败,继续尝试\n }\n }\n }\n\n // 生成 EXTENSION.md 内容\n content = `# ${pkgName}\\n\\n`;\n\n if (pkgDescription) {\n content += `${pkgDescription}\\n\\n`;\n }\n\n if (readmeContent) {\n // 移除 README 中的标题(如果和 name 相同)\n const lines = readmeContent.split(\"\\n\");\n const firstLine = lines[0]?.trim();\n if (firstLine?.startsWith(\"#\") && firstLine.includes(name)) {\n readmeContent = lines.slice(1).join(\"\\n\").trim();\n }\n\n if (readmeContent) {\n content += `## ${t(\"install:detailSection\")}\\n\\n${readmeContent}\\n`;\n }\n }\n\n // 写入 EXTENSION.md\n try {\n await writeFile(extensionMdPath, content);\n console.log(t(\"install:extensionMdGenerated\"));\n } catch {\n console.warn(t(\"install:extensionMdFailed\"));\n }\n }\n\n /**\n * 生成 command 文档到 .claude/commands/xxx.md\n * 格式遵循 Claude Code 的 slash commands 规范\n */\n protected async generateCommandMd(\n commandPath: string,\n commandsDir: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const commandMdPath = join(commandsDir, `${name}.md`);\n\n let pkgName = name;\n let pkgDescription = \"\";\n\n // 读取 package.json\n const cmdPkgJsonPath = join(commandPath, \"package.json\");\n if (existsSync(cmdPkgJsonPath)) {\n try {\n const pkgContent = await readFile(cmdPkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n pkgName = pkg.name?.replace(/^@[^/]+\\//, \"\") || name;\n pkgDescription = pkg.description || \"\";\n } catch {\n // 解析失败,使用默认值\n }\n }\n\n // 读取 README.md\n let readmeContent = \"\";\n const readmePaths = [\n join(commandPath, \"README.md\"),\n join(commandPath, \"readme.md\"),\n join(commandPath, \"Readme.md\"),\n ];\n for (const readmePath of readmePaths) {\n if (existsSync(readmePath)) {\n try {\n readmeContent = await readFile(readmePath, \"utf-8\");\n break;\n } catch {\n // 读取失败,继续尝试\n }\n }\n }\n\n // 获取命令的 help 内容\n let helpContent = \"\";\n try {\n helpContent = execSync(`pnpm spaceflow ${name} --help 2>/dev/null`, {\n cwd: process.cwd(),\n encoding: \"utf-8\",\n timeout: 10000,\n }).trim();\n // 移除 \"📦 已加载 x 个插件\" 这行\n helpContent = helpContent\n .split(\"\\n\")\n .filter((line) => !line.includes(\"已加载\") && !line.includes(\"插件\"))\n .join(\"\\n\")\n .trim();\n } catch {\n // 获取 help 失败,忽略\n }\n\n // 生成 command md 内容(遵循 Claude Code 规范)\n let content = `---\nname: ${name}\ndescription: ${pkgDescription || t(\"install:commandDefault\", { name })}\n---\n\n# ${pkgName}\n\n`;\n\n if (pkgDescription) {\n content += `${pkgDescription}\\n\\n`;\n }\n\n // 添加 help 内容\n if (helpContent) {\n helpContent = helpContent.replace(/^Usage: cli/, \"Usage: spaceflow\");\n content += `## ${t(\"install:usageSection\")}\\n\\n\\`\\`\\`\\n${helpContent}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (readmeContent) {\n // 移除 README 中的标题(如果和 name 相同)\n const lines = readmeContent.split(\"\\n\");\n const firstLine = lines[0]?.trim();\n if (firstLine?.startsWith(\"#\") && firstLine.includes(name)) {\n readmeContent = lines.slice(1).join(\"\\n\").trim();\n }\n\n if (readmeContent) {\n content += `## ${t(\"install:detailSection\")}\\n\\n${readmeContent}\\n`;\n }\n }\n\n // 写入 command md\n try {\n await writeFile(commandMdPath, content);\n if (shouldLog(verbose, 1)) console.log(t(\"install:commandMdGenerated\", { name }));\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:commandMdFailed\", { name }));\n }\n }\n\n protected async updateConfigFile(\n context: InstallContext,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const { source, type, depPath } = context;\n // dependencies key 使用完整包名(npm 类型保留 @scope/ 前缀)\n const name =\n context.name || (type === \"npm\" ? extractNpmPackageName(source) : extractName(source));\n const cwd = process.cwd();\n\n // 根据类型生成正确的 value(和 package.json 格式一致)\n let depValue: string;\n if (type === \"npm\") {\n // npm 类型:从已安装包的 package.json 读取实际版本号\n const pkgJsonPath = join(depPath, \"package.json\");\n try {\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n depValue = pkg.version ? `^${pkg.version}` : source;\n } catch {\n depValue = source;\n }\n } else if (type === \"local\") {\n // local 类型:写入 link: 格式\n depValue = source.startsWith(\"link:\") ? source : `link:${normalizeSource(source)}`;\n } else {\n // git 类型:写入 git URL\n depValue = source.startsWith(\"git+\") ? source : buildGitPackageSpec(source, context.ref);\n }\n\n const updated = updateDependency(name, depValue, cwd);\n\n if (updated) {\n if (shouldLog(verbose, 1))\n console.log(\n t(\"install:configUpdated\", { path: findConfigFileWithField(\"dependencies\", cwd) }),\n );\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"install:configAlreadyExists\"));\n }\n }\n\n /**\n * 确保依赖已安装且 dist 是最新的\n */\n protected async ensureDependenciesAndBuild(\n extPath: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const pkgJsonPath = join(extPath, \"package.json\");\n\n // 检查是否有 package.json(命令型插件)\n if (!existsSync(pkgJsonPath)) {\n // 资源型插件,无需处理\n return;\n }\n\n // 检查依赖是否已安装\n const nodeModulesPath = join(extPath, \"node_modules\");\n const needInstall = await this.needsInstallDependencies(extPath, nodeModulesPath);\n\n if (needInstall) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:installingDepsEllipsis\"));\n try {\n execSync(`${getPackageManager()} install`, {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:depsInstallFailed\"));\n return;\n }\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"install:depsUpToDate\"));\n }\n\n // 检查是否需要构建\n const needBuild = await this.needsBuild(extPath);\n\n if (needBuild) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:buildingPlugin\"));\n try {\n execSync(\"pnpm build\", {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:buildFailed\"));\n }\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"install:buildUpToDate\"));\n }\n }\n\n /**\n * 检查是否需要安装依赖\n * 比较 package.json 和 node_modules 的修改时间\n */\n protected async needsInstallDependencies(\n extPath: string,\n nodeModulesPath: string,\n ): Promise<boolean> {\n // 如果 node_modules 不存在,需要安装\n if (!existsSync(nodeModulesPath)) {\n return true;\n }\n\n try {\n const pkgJsonPath = join(extPath, \"package.json\");\n const lockfilePath = join(extPath, \"pnpm-lock.yaml\");\n\n const nodeModulesStat = await stat(nodeModulesPath);\n const pkgJsonStat = await stat(pkgJsonPath);\n\n // 如果 package.json 比 node_modules 新,需要安装\n if (pkgJsonStat.mtime > nodeModulesStat.mtime) {\n return true;\n }\n\n // 如果有 lockfile 且比 node_modules 新,需要安装\n if (existsSync(lockfilePath)) {\n const lockfileStat = await stat(lockfilePath);\n if (lockfileStat.mtime > nodeModulesStat.mtime) {\n return true;\n }\n }\n\n return false;\n } catch {\n return true;\n }\n }\n\n /**\n * 检查是否需要构建\n * 比较 src 目录和 dist 目录的修改时间\n */\n protected async needsBuild(extPath: string): Promise<boolean> {\n const srcPath = join(extPath, \"src\");\n const distPath = join(extPath, \"dist\");\n const distIndexPath = join(distPath, \"index.js\");\n\n // 如果没有 src 目录,不需要构建\n if (!existsSync(srcPath)) {\n return false;\n }\n\n // 如果 dist/index.js 不存在,需要构建\n if (!existsSync(distIndexPath)) {\n return true;\n }\n\n try {\n const distStat = await stat(distIndexPath);\n const srcMtime = await this.getLatestMtime(srcPath);\n\n // 如果 src 中有文件比 dist 新,需要构建\n return srcMtime > distStat.mtime;\n } catch {\n return true;\n }\n }\n\n /**\n * 递归获取目录中最新的修改时间\n */\n protected async getLatestMtime(dirPath: string): Promise<Date> {\n const { readdir } = await import(\"fs/promises\");\n let latestMtime = new Date(0);\n\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n const subMtime = await this.getLatestMtime(entryPath);\n if (subMtime > latestMtime) {\n latestMtime = subMtime;\n }\n } else {\n const entryStat = await stat(entryPath);\n if (entryStat.mtime > latestMtime) {\n latestMtime = entryStat.mtime;\n }\n }\n }\n\n return latestMtime;\n }\n\n /**\n * 生成 JSON Schema\n */\n protected generateSchema(): void {\n this.schemaGenerator.generate();\n }\n}\n","import { defineExtension, SchemaGeneratorService, type VerboseLevel } from \"@spaceflow/core\";\nimport { InstallService } from \"./install.service\";\n\n/**\n * Install 命令扩展\n */\nexport const installExtension = defineExtension({\n name: \"install\",\n version: \"1.0.0\",\n description: \"安装 Extension\",\n commands: [\n {\n name: \"install\",\n description: \"安装 Extension(无参数时安装配置文件中的所有依赖)\",\n aliases: [\"i\"],\n arguments: \"[source]\",\n options: [\n {\n flags: \"-n, --name <name>\",\n description: \"指定安装名称\",\n },\n {\n flags: \"-r, --ref <ref>\",\n description: \"指定版本/分支/tag\",\n },\n {\n flags: \"-g, --global\",\n description: \"全局安装\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const source = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const schemaGenerator = new SchemaGeneratorService();\n const installService = new InstallService(schemaGenerator);\n // 无参数时,安装配置文件中的所有依赖\n if (!source) {\n if (options?.global) {\n ctx.output.error(\"全局安装需要指定 source 参数\");\n process.exit(1);\n }\n await installService.updateAllExtensions({ verbose });\n return;\n }\n const installOptions = {\n source,\n name: options?.name as string,\n ref: options?.ref as string,\n };\n if (options?.global) {\n await installService.installGlobal(installOptions, verbose);\n } else {\n const context = installService.getContext(installOptions);\n await installService.execute(context, verbose);\n }\n },\n },\n ],\n});\n\nexport * from \"./install.service\";\n","import { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\nimport {\n shouldLog,\n type VerboseLevel,\n getEditorDirName,\n getSourceType,\n normalizeSource,\n getDependencies,\n getSupportedEditors,\n t,\n} from \"@spaceflow/core\";\n\ninterface ExtensionListInfo {\n name: string;\n source: string;\n type: \"npm\" | \"git\" | \"local\";\n commands: string[];\n installed: boolean;\n}\n\nexport class ListService {\n constructor(private readonly extensionLoader: ExtensionLoader) {}\n\n /**\n * 执行列表展示\n */\n async execute(verbose: VerboseLevel = 1): Promise<void> {\n const cwd = process.cwd();\n\n // 读取合并后的 dependencies(支持 .spaceflowrc、.spaceflow/spaceflow.json 等所有配置源)\n const dependencies = getDependencies(cwd);\n\n if (Object.keys(dependencies).length === 0) {\n if (shouldLog(verbose, 1)) {\n console.log(t(\"list:noSkills\"));\n console.log(\"\");\n console.log(t(\"list:installHint\"));\n console.log(\" spaceflow install <npm-package>\");\n console.log(\" spaceflow install <git-url> --name <name>\");\n }\n return;\n }\n\n const editors = getSupportedEditors(cwd);\n // 收集所有外部扩展信息\n const extensionInfos: ExtensionListInfo[] = [];\n for (const [name, source] of Object.entries(dependencies)) {\n const type = getSourceType(source);\n const installed = await this.checkInstalled(name, source, type, editors);\n extensionInfos.push({ name, source, type, installed, commands: [] });\n }\n if (!shouldLog(verbose, 1)) return;\n // 计算最大名称宽度用于对齐\n const maxNameLen = Math.max(...extensionInfos.map((e) => e.name.length), 10);\n const installedCount = extensionInfos.filter((e) => e.installed).length;\n console.log(\n t(\"list:installedExtensions\", { installed: installedCount, total: extensionInfos.length }) +\n \"\\n\",\n );\n for (const ext of extensionInfos) {\n const icon = ext.installed ? \"\\x1b[32m✔\\x1b[0m\" : \"\\x1b[33m○\\x1b[0m\";\n const typeLabel =\n ext.type === \"local\"\n ? \"\\x1b[36mlocal\\x1b[0m\"\n : ext.type === \"npm\"\n ? \"\\x1b[35mnpm\\x1b[0m\"\n : \"\\x1b[33mgit\\x1b[0m\";\n const displaySource = this.getDisplaySource(ext.source, ext.type);\n console.log(` ${icon} ${ext.name.padEnd(maxNameLen + 2)} ${typeLabel} ${displaySource}`);\n // 显示命令列表\n if (ext.commands.length > 0) {\n console.log(\n ` ${\"\".padEnd(maxNameLen)} ${t(\"list:commands\", { commands: ext.commands.join(\", \") })}`,\n );\n }\n }\n console.log(\"\");\n }\n\n /**\n * 获取用于展示的 source 字符串\n */\n private getDisplaySource(source: string, type: \"npm\" | \"git\" | \"local\"): string {\n if (type === \"local\") {\n return normalizeSource(source);\n }\n if (type === \"git\") {\n // 简化 git URL 展示\n const match = source.match(/[/:](\\w+\\/[\\w.-]+?)(?:\\.git)?$/);\n return match ? match[1] : source;\n }\n return source;\n }\n\n /**\n * 检查是否已安装\n */\n private async checkInstalled(\n name: string,\n source: string,\n type: \"npm\" | \"git\" | \"local\",\n editors: string[],\n ): Promise<boolean> {\n const cwd = process.cwd();\n if (type === \"local\") {\n const localPath = join(cwd, normalizeSource(source));\n return existsSync(localPath);\n } else if (type === \"npm\") {\n try {\n require.resolve(source);\n return true;\n } catch {\n return false;\n }\n } else {\n const possiblePaths = [join(cwd, \"skills\", name)];\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n possiblePaths.push(join(cwd, editorDirName, \"skills\", name));\n possiblePaths.push(join(cwd, editorDirName, \"commands\", name));\n }\n return possiblePaths.some((p) => existsSync(p));\n }\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { ListService } from \"./list.service\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\n\n/**\n * List 命令扩展\n */\nexport const listExtension = defineExtension({\n name: \"list\",\n version: \"1.0.0\",\n description: \"列出已安装的 Extension\",\n commands: [\n {\n name: \"list\",\n description: \"列出已安装的 Extension\",\n aliases: [\"ls\"],\n options: [\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const extensionLoader = ctx.getService<ExtensionLoader>(\"extensionLoader\");\n const listService = new ListService(extensionLoader);\n await listService.execute(verbose);\n },\n },\n ],\n});\n\nexport * from \"./list.service\";\n","import { t } from \"@spaceflow/core\";\nimport type { VerboseLevel, McpResourceDefinition, SpaceflowContext } from \"@spaceflow/core\";\nimport { shouldLog, type McpToolMetadata } from \"@spaceflow/core\";\nimport { readConfigSync } from \"@spaceflow/shared\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { spawn } from \"child_process\";\n\n/** 内部 resource 收集结构 */\ninterface CollectedResource {\n resource: McpResourceDefinition;\n ctx: SpaceflowContext;\n}\n\nexport class McpService {\n constructor(private readonly extensionLoader: ExtensionLoader) {}\n\n /**\n * 启动 MCP Server\n * 收集所有扩展的 MCP 工具并启动服务\n */\n async startServer(verbose?: VerboseLevel, inspector?: boolean): Promise<void> {\n // 如果启用 inspector 模式,使用 npx 启动 inspector\n if (inspector) {\n await this.startWithInspector();\n return;\n }\n if (shouldLog(verbose, 1)) {\n const cwd = this.extensionLoader.cwd;\n console.error(t(\"mcp:cwdInfo\", { cwd }));\n console.error(t(\"mcp:scanning\"));\n }\n\n const extensions = this.extensionLoader.getExtensions();\n const extensionTools = this.extensionLoader.getTools();\n\n if (shouldLog(verbose, 2)) {\n console.error(t(\"mcp:foundExtensions\", { count: extensions.length }));\n }\n\n const allTools: Array<{ tool: McpToolMetadata; handler: any; ctx: any }> = [];\n for (const { extensionName, tools } of extensionTools) {\n if (shouldLog(verbose, 2)) {\n console.error(` 扩展 ${extensionName} 提供 ${tools.length} 个 MCP 工具`);\n }\n for (const tool of tools) {\n if (shouldLog(verbose, 3)) {\n console.error(` - ${tool.name}: ${tool.description}`);\n }\n allTools.push({\n tool: {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema\n ? (this.zodToJsonSchema(tool.inputSchema) as any)\n : undefined,\n methodName: \"handler\",\n },\n handler: tool.handler,\n ctx: this.extensionLoader.getContext(),\n });\n }\n }\n\n // 收集扩展 resources + 内置 resources\n const allResources = this.collectResources(verbose);\n\n if (allTools.length === 0 && allResources.length === 0) {\n console.error(t(\"mcp:noToolsFound\"));\n console.error(t(\"mcp:noToolsHint\"));\n process.exit(1);\n }\n\n if (shouldLog(verbose, 1)) {\n if (allTools.length > 0) {\n console.error(t(\"mcp:toolsFound\", { count: allTools.length }));\n for (const { tool } of allTools) {\n console.error(` - ${tool.name}`);\n }\n }\n if (allResources.length > 0) {\n console.error(t(\"mcp:resourcesFound\", { count: allResources.length }));\n for (const { resource } of allResources) {\n console.error(` - ${resource.name} (${resource.uri})`);\n }\n }\n }\n\n // 如果 stdin 是 TTY(用户手动在终端运行),只打印信息不阻塞\n if (process.stdin.isTTY) {\n console.error(\"\");\n console.error(t(\"mcp:ttyHint\"));\n return;\n }\n\n // 被 MCP 客户端通过管道调用,正常启动 stdio server\n await this.runServer(allTools, allResources, verbose);\n }\n\n /**\n * 收集所有 MCP 资源(扩展 + 内置)\n */\n private collectResources(verbose?: VerboseLevel): CollectedResource[] {\n const ctx = this.extensionLoader.getContext();\n const allResources: CollectedResource[] = [];\n\n // 1. 收集扩展声明的 resources\n const extensionResources = this.extensionLoader.getResources();\n for (const { extensionName, resources } of extensionResources) {\n if (shouldLog(verbose, 2)) {\n console.error(` 扩展 ${extensionName} 提供 ${resources.length} 个 MCP 资源`);\n }\n for (const resource of resources) {\n allResources.push({ resource, ctx });\n }\n }\n\n // 2. 内置资源:项目配置(过滤敏感字段)\n allResources.push({\n resource: {\n name: \"spaceflow-config\",\n uri: \"spaceflow://config\",\n title: \"Spaceflow Configuration\",\n description: \"当前项目的 Spaceflow 配置(已过滤敏感字段)\",\n mimeType: \"application/json\",\n handler: async (_uri, ctx) => {\n const config = readConfigSync(ctx.cwd);\n return JSON.stringify(this.sanitizeConfig(config), null, 2);\n },\n },\n ctx,\n });\n\n // 3. 内置资源:扩展列表\n allResources.push({\n resource: {\n name: \"spaceflow-extensions\",\n uri: \"spaceflow://extensions\",\n title: \"Installed Extensions\",\n description: \"当前项目已安装的 Spaceflow 扩展及其工具/资源\",\n mimeType: \"application/json\",\n handler: async () => {\n const extensions = this.extensionLoader.getExtensions();\n const summary = extensions.map((ext) => ({\n name: ext.name,\n version: ext.version,\n description: ext.description,\n commands: ext.commands.map((c) => c.name),\n tools: (ext.tools || []).map((t) => ({ name: t.name, description: t.description })),\n resources: (ext.resources || []).map((r) => ({\n name: r.name,\n uri: r.uri,\n description: r.description,\n })),\n }));\n return JSON.stringify(summary, null, 2);\n },\n },\n ctx,\n });\n\n return allResources;\n }\n\n /**\n * 过滤配置中的敏感字段\n */\n private sanitizeConfig(config: Record<string, any>): Record<string, any> {\n const sensitiveKeys = [\"token\", \"apiKey\", \"appSecret\", \"authToken\", \"apikey\", \"secret\"];\n const sanitize = (obj: any): any => {\n if (obj === null || obj === undefined || typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(sanitize);\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (sensitiveKeys.some((sk) => key.toLowerCase().includes(sk.toLowerCase()))) {\n result[key] = value ? \"***\" : \"\";\n } else {\n result[key] = sanitize(value);\n }\n }\n return result;\n };\n return sanitize(config);\n }\n\n /**\n * 运行 MCP Server\n */\n private async runServer(\n allTools: Array<{ tool: McpToolMetadata; handler: any; ctx: any }>,\n allResources: CollectedResource[],\n verbose?: VerboseLevel,\n ): Promise<void> {\n const server = new McpServer({ name: \"spaceflow\", version: \"1.0.0\" });\n\n // 注册所有工具(使用 v2 API: server.registerTool)\n for (const { tool, handler, ctx } of allTools) {\n // 将 JSON Schema 转换为 Zod schema\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: Object.keys(schema).length > 0 ? z.object(schema) : z.object({}),\n },\n async (args: any) => {\n try {\n const result = await handler(args || {}, ctx);\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n },\n );\n }\n\n // 注册所有资源(使用 v2 API: server.registerResource)\n for (const { resource, ctx } of allResources) {\n server.registerResource(\n resource.name,\n resource.uri,\n {\n title: resource.title,\n description: resource.description,\n mimeType: resource.mimeType || \"application/json\",\n },\n async (uri) => {\n try {\n const text = await resource.handler(uri.href, ctx);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: resource.mimeType || \"application/json\",\n text,\n },\n ],\n };\n } catch (error) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"text/plain\",\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n };\n }\n },\n );\n }\n\n // 启动 stdio 传输\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n if (shouldLog(verbose, 1)) {\n console.error(t(\"mcp:serverStarted\", { count: allTools.length }));\n }\n\n // 保持进程运行\n await new Promise<void>((resolve) => {\n process.stdin.on(\"close\", resolve);\n process.on(\"SIGINT\", resolve);\n process.on(\"SIGTERM\", resolve);\n });\n }\n\n /**\n * 使用 MCP Inspector 启动\n */\n private async startWithInspector(): Promise<void> {\n const args = process.argv.slice(2).filter((arg) => arg !== \"--inspector\");\n const child = spawn(\n \"npx\",\n [\"-y\", \"@modelcontextprotocol/inspector\", \"node\", process.argv[1], ...args],\n {\n stdio: \"inherit\",\n env: { ...process.env, FORCE_COLOR: \"1\" },\n },\n );\n child.on(\"exit\", (code) => {\n process.exit(code || 0);\n });\n }\n\n /**\n * 将 Zod schema 转换为 JSON Schema\n */\n private zodToJsonSchema(zodSchema: any): Record<string, any> {\n if (!zodSchema || typeof zodSchema.shape !== \"object\") {\n return {};\n }\n const properties: Record<string, any> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(zodSchema.shape)) {\n const zodType = value as any;\n let type = \"string\";\n let description = zodType._def?.description;\n // 检查是否可选\n const isOptional = zodType._def?.typeName === \"ZodOptional\";\n const innerType = isOptional ? zodType._def?.innerType : zodType;\n // 获取类型\n switch (innerType?._def?.typeName) {\n case \"ZodString\":\n type = \"string\";\n break;\n case \"ZodNumber\":\n type = \"number\";\n break;\n case \"ZodBoolean\":\n type = \"boolean\";\n break;\n case \"ZodArray\":\n type = \"array\";\n break;\n default:\n type = \"string\";\n }\n properties[key] = { type };\n if (description) {\n properties[key].description = description;\n }\n if (!isOptional) {\n required.push(key);\n }\n }\n return { properties, required };\n }\n\n /**\n * 将 JSON Schema 转换为 Zod schema\n */\n private jsonSchemaToZod(jsonSchema?: Record<string, any>): Record<string, any> {\n if (!jsonSchema || !jsonSchema.properties) {\n return {};\n }\n\n const zodShape: Record<string, any> = {};\n for (const [key, prop] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n const isRequired = jsonSchema.required?.includes(key);\n let zodType: any;\n\n switch (prop.type) {\n case \"string\":\n zodType = z.string();\n break;\n case \"number\":\n zodType = z.number();\n break;\n case \"boolean\":\n zodType = z.boolean();\n break;\n case \"array\":\n zodType = z.array(z.any());\n break;\n default:\n zodType = z.any();\n }\n\n if (prop.description) {\n zodType = zodType.describe(prop.description);\n }\n\n zodShape[key] = isRequired ? zodType : zodType.optional();\n }\n\n return zodShape;\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { McpService } from \"./mcp.service\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\n\n/**\n * MCP 命令扩展\n */\nexport const mcpExtension = defineExtension({\n name: \"mcp\",\n version: \"1.0.0\",\n description: \"MCP 工具\",\n commands: [\n {\n name: \"mcp\",\n description: \"启动 MCP Server\",\n options: [\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n {\n flags: \"--inspector\",\n description: \"启动 MCP Inspector\",\n },\n ],\n run: async (_args, options, ctx) => {\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const extensionLoader = ctx.getService<ExtensionLoader>(\"extensionLoader\");\n const mcpService = new McpService(extensionLoader);\n const inspector = options?.inspector as boolean | undefined;\n await mcpService.startServer(verbose, inspector);\n },\n },\n ],\n});\n\nexport * from \"./mcp.service\";\n","import { join } from \"path\";\nimport { existsSync, realpathSync } from \"fs\";\nimport { spawn } from \"child_process\";\nimport { InstallService } from \"../install/install.service\";\nimport type { VerboseLevel } from \"@spaceflow/core\";\nimport { extractName, getSourceType, t } from \"@spaceflow/core\";\n\nexport interface RunxOptions {\n source: string;\n name?: string;\n args: string[];\n verbose?: VerboseLevel;\n}\n\n/**\n * Runx 服务\n * 全局安装依赖后运行命令\n */\nexport class RunxService {\n constructor(private readonly installService: InstallService) {}\n\n /**\n * 执行 runx:全局安装 + 运行命令\n */\n async execute(options: RunxOptions): Promise<void> {\n const { source, args } = options;\n const verbose = options.verbose ?? true;\n const name = options.name || extractName(source);\n const sourceType = getSourceType(source);\n\n // npm 包直接使用 npx 执行\n if (sourceType === \"npm\") {\n if (verbose)\n console.log(t(\"runx:runningCommand\", { command: `npx ${source} ${args.join(\" \")}` }));\n await this.runWithNpx(source, args);\n return;\n }\n\n // 第一步:全局安装(静默模式)\n await this.installService.installGlobal(\n {\n source,\n name: options.name,\n },\n false,\n );\n // 第二步:运行命令\n if (verbose) console.log(t(\"runx:runningCommand\", { command: `${name} ${args.join(\" \")}` }));\n await this.runCommand(name, args);\n }\n\n /**\n * 使用 npx 运行 npm 包\n */\n private runWithNpx(packageName: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"npx\", [packageName, ...args], {\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(t(\"runx:npxExitCode\", { package: packageName, code })));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n /**\n * 运行已安装的命令\n * TODO: 迁移到新架构后实现\n */\n protected async runCommand(name: string, args: string[]): Promise<void> {\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const depPath = join(home, \".spaceflow\", \"node_modules\", name);\n // 检查命令是否存在\n if (!existsSync(depPath)) {\n throw new Error(t(\"runx:commandNotInstalled\", { name }));\n }\n // 解析符号链接获取真实路径\n const realDepPath = realpathSync(depPath);\n // 检查是否有 dist/index.js\n const distPath = join(realDepPath, \"dist\", \"index.js\");\n if (!existsSync(distPath)) {\n throw new Error(t(\"runx:commandNotBuilt\", { name }));\n }\n // 动态加载插件(使用 Function 构造器绕过 rspack 转换)\n const importUrl = `file://${distPath}`;\n const dynamicImport = new Function(\"url\", \"return import(url)\");\n const pluginModule = await dynamicImport(importUrl);\n const extensionDef = pluginModule.default;\n if (!extensionDef) {\n throw new Error(t(\"runx:pluginNoExport\", { name }));\n }\n // 新架构:extensionDef 是 ExtensionDefinition 对象\n // 查找匹配的命令并执行\n const commands = extensionDef.commands || [];\n const finalArgs = this.autoCompleteCommand(\n args,\n commands.map((c: { name: string }) => c.name),\n );\n // 查找要执行的命令\n const cmdName = finalArgs[0];\n const cmdDef = commands.find((c: { name: string }) => c.name === cmdName);\n if (!cmdDef) {\n throw new Error(t(\"runx:commandNotFound\", { name: cmdName }));\n }\n // TODO: 需要创建 SpaceflowContext 来执行命令\n // 暂时抛出未实现错误\n throw new Error(`runx 命令正在迁移到新架构,暂不可用。请直接使用 space ${cmdName} 命令。`);\n }\n\n /**\n * 自动补充命令名\n * 如果插件只有一个命令,且用户没有指定子命令,自动在参数前补充命令名\n */\n private autoCompleteCommand(args: string[], commands?: string[]): string[] {\n // 没有命令列表或为空,直接返回\n if (!commands || commands.length === 0) {\n return args;\n }\n // 如果只有一个命令\n if (commands.length === 1) {\n const cmdName = commands[0];\n // 检查用户是否已经指定了该命令\n if (args.length === 0 || args[0] !== cmdName) {\n // 如果第一个参数是选项(以 - 开头),说明用户没有指定子命令\n if (args.length === 0 || args[0].startsWith(\"-\")) {\n return [cmdName, ...args];\n }\n }\n }\n return args;\n }\n}\n","import { defineExtension, SchemaGeneratorService, type VerboseLevel } from \"@spaceflow/core\";\nimport { RunxService } from \"./runx.service\";\nimport { InstallService } from \"../install/install.service\";\n\n/**\n * Runx 命令扩展\n */\nexport const runxExtension = defineExtension({\n name: \"runx\",\n version: \"1.0.0\",\n description: \"运行 x 命令\",\n commands: [\n {\n name: \"runx\",\n description: \"全局安装并运行扩展命令\",\n aliases: [\"x\"],\n arguments: \"<source> [args...]\",\n options: [\n {\n flags: \"-n, --name <name>\",\n description: \"指定安装名称\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const source = args[0];\n const cmdArgs = args.slice(1);\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const schemaGenerator = new SchemaGeneratorService();\n const installService = new InstallService(schemaGenerator);\n const runxService = new RunxService(installService);\n await runxService.execute({\n source,\n name: options?.name as string,\n args: cmdArgs,\n verbose,\n });\n },\n },\n ],\n});\n\nexport * from \"./runx.service\";\nexport * from \"./runx.utils\";\n","import { defineExtension, SchemaGeneratorService } from \"@spaceflow/core\";\n\n/**\n * Schema 命令扩展\n */\nexport const schemaExtension = defineExtension({\n name: \"schema\",\n version: \"1.0.0\",\n description: \"生成 schema\",\n commands: [\n {\n name: \"schema\",\n description: \"生成 JSON Schema 配置文件\",\n options: [\n {\n flags: \"-o, --output <path>\",\n description: \"输出路径\",\n },\n ],\n run: async (_args, options, _ctx) => {\n const schemaGenerator = new SchemaGeneratorService();\n if (options?.output) {\n schemaGenerator.generateJsonSchema(options.output as string);\n } else {\n schemaGenerator.generate();\n }\n },\n },\n ],\n});\n","import { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { t } from \"@spaceflow/core\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport stringify from \"json-stringify-pretty-compact\";\nimport {\n CONFIG_FILE_NAME,\n RC_FILE_NAME,\n getConfigPath,\n readConfigSync,\n type SpaceflowConfig,\n SchemaGeneratorService,\n SPACEFLOW_DIR,\n ensureSpaceflowPackageJson,\n} from \"@spaceflow/core\";\n\nexport class SetupService {\n constructor(private readonly schemaGenerator: SchemaGeneratorService) {}\n /**\n * 本地初始化:创建 .spaceflow/ 目录和 package.json\n */\n async setupLocal(): Promise<void> {\n const cwd = process.cwd();\n\n // 1. 创建 .spaceflow/ 目录和 package.json\n const spaceflowDir = join(cwd, SPACEFLOW_DIR);\n ensureSpaceflowPackageJson(spaceflowDir);\n console.log(t(\"setup:dirCreated\", { dir: spaceflowDir }));\n\n // 2. 创建 spaceflow.json 配置文件(运行时配置)\n const configPath = getConfigPath(cwd);\n const rcPath = join(cwd, RC_FILE_NAME);\n if (!existsSync(configPath) && !existsSync(rcPath)) {\n this.schemaGenerator.generate();\n const defaultConfig: Partial<SpaceflowConfig> = {\n $schema: \"./config-schema.json\",\n support: [\"claudeCode\"],\n };\n writeFileSync(configPath, stringify(defaultConfig, { indent: 2 }) + \"\\n\");\n console.log(t(\"setup:configGenerated\", { path: configPath }));\n } else {\n const existingPath = existsSync(rcPath) ? rcPath : configPath;\n console.log(t(\"setup:configExists\", { path: existingPath }));\n }\n }\n\n /**\n * 全局初始化:创建 ~/.spaceflow/ 目录和 package.json,并合并配置\n */\n async setupGlobal(): Promise<void> {\n const cwd = process.cwd();\n const globalDir = join(homedir(), SPACEFLOW_DIR);\n const globalConfigPath = join(globalDir, CONFIG_FILE_NAME);\n\n // 1. 创建 ~/.spaceflow/ 目录和 package.json\n ensureSpaceflowPackageJson(globalDir);\n console.log(t(\"setup:dirCreated\", { dir: globalDir }));\n\n // 读取本地配置(支持 .spaceflow/spaceflow.json 和 .spaceflowrc)\n const localConfig = readConfigSync(cwd);\n if (Object.keys(localConfig).length > 0) {\n console.log(t(\"setup:localConfigRead\"));\n }\n\n // 读取本地 .env 文件并解析为配置\n const envPath = join(cwd, \".env\");\n const envConfig = this.parseEnvToConfig(envPath);\n\n const instanceConfig = (global as any).spaceflowConfig ?? {};\n\n // 合并配置:本地配置(已含全局) < 实例配置 < 环境变量配置\n const mergedConfig = this.deepMerge(localConfig, instanceConfig, envConfig);\n\n // 写入全局配置\n writeFileSync(globalConfigPath, stringify(mergedConfig, { indent: 2 }) + \"\\n\");\n console.log(t(\"setup:globalConfigGenerated\", { path: globalConfigPath }));\n\n // 显示合并的环境变量\n if (Object.keys(envConfig).length > 0) {\n console.log(t(\"setup:envConfigMerged\"));\n this.printConfigTree(envConfig, \" \");\n }\n }\n\n /**\n * 解析 .env 文件为配置对象\n * 支持嵌套格式:SPACEFLOW_GIT_PROVIDER_SERVER_URL -> { gitProvider: { serverUrl: \"...\" } }\n */\n private parseEnvToConfig(envPath: string): Record<string, unknown> {\n if (!existsSync(envPath)) {\n return {};\n }\n\n const config: Record<string, unknown> = {};\n\n try {\n const content = readFileSync(envPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n // 跳过空行和注释\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // 移除引号\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n // 只处理 SPACEFLOW_ 前缀的环境变量\n if (!key.startsWith(\"SPACEFLOW_\")) continue;\n\n // 转换为嵌套配置\n // SPACEFLOW_GIT_PROVIDER_SERVER_URL -> gitProvider.serverUrl\n const parts = key\n .slice(\"SPACEFLOW_\".length)\n .toLowerCase()\n .split(\"_\")\n .map((part, index) => {\n // 第一个部分保持小写,后续部分转为 camelCase\n if (index === 0) return part;\n return part.charAt(0).toUpperCase() + part.slice(1);\n });\n\n // 重新组织为嵌套结构\n // 例如: [\"git\", \"Provider\", \"Server\", \"Url\"] -> { gitProviderServerUrl: value }\n // 简化处理:按照常见模式分组\n this.setNestedValue(config, parts, value);\n }\n\n console.log(t(\"setup:envRead\", { path: envPath }));\n } catch {\n console.warn(t(\"setup:envReadFailed\", { path: envPath }));\n }\n\n return config;\n }\n\n /**\n * 设置嵌套值\n * 例如: [\"review\", \"Gitea\", \"Server\", \"Url\"] 和 value\n * 结果: { review: { giteaServerUrl: value } }\n */\n private setNestedValue(obj: Record<string, unknown>, parts: string[], value: string): void {\n if (parts.length === 0) return;\n\n // 第一个部分作为顶级 key(如 review, commit 等)\n const topKey = parts[0];\n\n if (parts.length === 1) {\n obj[topKey] = value;\n return;\n }\n\n // 剩余部分合并为 camelCase 作为嵌套 key\n // 例如: [\"Gitea\", \"Server\", \"Url\"] -> giteaServerUrl\n const restParts = parts.slice(1);\n const nestedKey = restParts\n .map((part, index) => (index === 0 ? part.toLowerCase() : part))\n .join(\"\");\n\n if (!obj[topKey] || typeof obj[topKey] !== \"object\") {\n obj[topKey] = {};\n }\n\n (obj[topKey] as Record<string, unknown>)[nestedKey] = value;\n }\n\n /**\n * 深度合并对象\n */\n private deepMerge<T extends Record<string, unknown>>(...objects: Partial<T>[]): Partial<T> {\n const result: Record<string, unknown> = {};\n\n for (const obj of objects) {\n for (const key in obj) {\n const value = obj[key];\n const existing = result[key];\n\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing)\n ) {\n result[key] = this.deepMerge(\n existing as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n\n return result as Partial<T>;\n }\n\n /**\n * 打印配置树\n */\n private printConfigTree(config: Record<string, unknown>, prefix: string): void {\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n console.log(`${prefix}${key}:`);\n this.printConfigTree(value as Record<string, unknown>, prefix + \" \");\n } else {\n // 隐藏敏感值\n const displayValue = this.isSensitiveKey(key) ? \"***\" : String(value);\n console.log(`${prefix}${key}: ${displayValue}`);\n }\n }\n }\n\n /**\n * 判断是否为敏感 key\n */\n private isSensitiveKey(key: string): boolean {\n const sensitivePatterns = [\"token\", \"secret\", \"password\", \"key\", \"apikey\"];\n const lowerKey = key.toLowerCase();\n return sensitivePatterns.some((pattern) => lowerKey.includes(pattern));\n }\n}\n","import { defineExtension, SchemaGeneratorService } from \"@spaceflow/core\";\nimport { SetupService } from \"./setup.service\";\n\n/**\n * Setup 命令扩展\n */\nexport const setupExtension = defineExtension({\n name: \"setup\",\n version: \"1.0.0\",\n description: \"设置配置\",\n commands: [\n {\n name: \"setup\",\n description: \"设置配置\",\n options: [\n {\n flags: \"-g, --global\",\n description: \"全局设置\",\n },\n ],\n run: async (_args, options, _ctx) => {\n const schemaGenerator = new SchemaGeneratorService();\n const setupService = new SetupService(schemaGenerator);\n if (options?.global) {\n await setupService.setupGlobal();\n } else {\n await setupService.setupLocal();\n }\n },\n },\n ],\n});\n\nexport * from \"./setup.service\";\n","import { execSync } from \"child_process\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync, readdirSync } from \"fs\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\nimport { getEditorDirName } from \"@spaceflow/core\";\nimport { detectPackageManager } from \"@spaceflow/core\";\nimport { getSpaceflowDir } from \"@spaceflow/core\";\nimport { getConfigPath, getSupportedEditors, removeDependency } from \"@spaceflow/core\";\n\nexport class UninstallService {\n /**\n * 从 .spaceflow/node_modules/ 目录卸载 Extension\n * 所有类型的 Extension 都通过 pnpm remove 卸载\n */\n private async uninstallExtension(\n name: string,\n isGlobal: boolean = false,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const spaceflowDir = getSpaceflowDir(isGlobal);\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"uninstall:uninstallingExtension\", { name }));\n console.log(t(\"uninstall:targetDir\", { dir: spaceflowDir }));\n }\n\n const pm = detectPackageManager(spaceflowDir);\n let cmd: string;\n if (pm === \"pnpm\") {\n cmd = `pnpm remove --prefix \"${spaceflowDir}\" ${name}`;\n } else {\n cmd = `npm uninstall --prefix \"${spaceflowDir}\" ${name}`;\n }\n\n try {\n execSync(cmd, {\n cwd: process.cwd(),\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"uninstall:extensionUninstallFailed\", { name }));\n }\n }\n\n /**\n * 执行卸载\n */\n async execute(name: string, isGlobal = false, verbose: VerboseLevel = 1): Promise<void> {\n if (shouldLog(verbose, 1)) {\n if (isGlobal) {\n console.log(t(\"uninstall:uninstallingGlobal\", { name }));\n } else {\n console.log(t(\"uninstall:uninstalling\", { name }));\n }\n }\n\n const cwd = process.cwd();\n const configPath = getConfigPath(cwd);\n\n // 1. 读取配置获取 source\n const dependencies = await this.parseSkillsFromConfig(configPath);\n let actualName = name;\n let config = dependencies[name];\n\n // 如果通过 name 找不到,尝试通过 source 值查找(支持 @spaceflow/review 这样的 npm 包名)\n if (!config) {\n for (const [key, value] of Object.entries(dependencies)) {\n if (value === name) {\n actualName = key;\n config = value;\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:foundDependency\", { key, value }));\n break;\n }\n }\n }\n\n if (!config && !isGlobal) {\n throw new Error(t(\"uninstall:notRegistered\", { name }));\n }\n\n // 使用实际的 name 进行后续操作\n name = actualName;\n\n // 2. 从 .spaceflow/node_modules/ 卸载 Extension\n await this.uninstallExtension(name, isGlobal, verbose);\n\n // 3. 删除各个编辑器 commands/skills 中的复制文件\n const editors = getSupportedEditors(cwd);\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n const installRoot = isGlobal ? join(home, editorDirName) : join(cwd, editorDirName);\n await this.removeEditorFiles(installRoot, name, verbose);\n }\n\n // 4. 从配置文件中移除(仅本地安装)\n if (!isGlobal && config) {\n this.removeFromConfig(name, cwd, verbose);\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:uninstallDone\"));\n }\n\n /**\n * 删除编辑器目录中的 commands/skills 文件\n * install 现在是复制文件到编辑器目录,所以卸载时需要删除这些复制的文件/目录\n */\n private async removeEditorFiles(\n installRoot: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n // 删除 skills 目录中的文件\n const skillsDir = join(installRoot, \"skills\");\n if (existsSync(skillsDir)) {\n const entries = readdirSync(skillsDir);\n for (const entry of entries) {\n // 匹配 name 或 name-xxx 格式\n if (entry === name || entry.startsWith(`${name}-`)) {\n const targetPath = join(skillsDir, entry);\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:deletingSkill\", { entry }));\n await rm(targetPath, { recursive: true, force: true });\n }\n }\n }\n\n // 删除 commands 目录中的 .md 文件\n const commandsDir = join(installRoot, \"commands\");\n if (existsSync(commandsDir)) {\n const entries = readdirSync(commandsDir);\n for (const entry of entries) {\n // 匹配 name.md 或 name-xxx.md 格式\n if (entry === `${name}.md` || entry.startsWith(`${name}-`)) {\n const targetPath = join(commandsDir, entry);\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:deletingCommand\", { entry }));\n await rm(targetPath, { force: true });\n }\n }\n }\n }\n\n /**\n * 从配置文件解析 dependencies\n */\n private async parseSkillsFromConfig(configPath: string): Promise<Record<string, unknown>> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const config = JSON.parse(content);\n return config.dependencies || {};\n } catch {\n return {};\n }\n }\n\n /**\n * 从配置文件中移除依赖\n */\n private removeFromConfig(name: string, cwd: string, verbose: VerboseLevel = 1): void {\n const removed = removeDependency(name, cwd);\n if (removed && shouldLog(verbose, 1)) {\n console.log(t(\"uninstall:configUpdated\", { path: getConfigPath(cwd) }));\n }\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { UninstallService } from \"./uninstall.service\";\n\n/**\n * Uninstall 命令扩展\n */\nexport const uninstallExtension = defineExtension({\n name: \"uninstall\",\n version: \"1.0.0\",\n description: \"卸载 Extension\",\n commands: [\n {\n name: \"uninstall\",\n description: \"卸载 Extension\",\n aliases: [\"un\"],\n arguments: \"<name>\",\n options: [\n {\n flags: \"-g, --global\",\n description: \"全局卸载\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const name = args[0];\n if (!name) {\n ctx.output.error(\"请指定要卸载的扩展名称\");\n process.exit(1);\n }\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const isGlobal = !!options?.global;\n const uninstallService = new UninstallService();\n await uninstallService.execute(name, isGlobal, verbose);\n },\n },\n ],\n});\n\nexport * from \"./uninstall.service\";\n","import { execSync } from \"child_process\";\nimport { readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\nimport { getDependencies } from \"@spaceflow/core\";\nimport type { ExtensionConfig } from \"../install/install.service\";\n\nexport interface UpdateOptions {\n name?: string;\n self?: boolean;\n verbose?: VerboseLevel;\n}\n\nexport class UpdateService {\n protected getPackageManager(): string {\n const cwd = process.cwd();\n\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n // pnpm 不可用\n }\n }\n\n if (existsSync(join(cwd, \"yarn.lock\"))) {\n try {\n execSync(\"yarn --version\", { stdio: \"ignore\" });\n return \"yarn\";\n } catch {\n // yarn 不可用\n }\n }\n\n return \"npm\";\n }\n\n protected isPnpmWorkspace(): boolean {\n return existsSync(join(process.cwd(), \"pnpm-workspace.yaml\"));\n }\n\n isGitUrl(source: string): boolean {\n return (\n source.startsWith(\"git@\") ||\n (source.startsWith(\"https://\") && source.endsWith(\".git\")) ||\n source.endsWith(\".git\")\n );\n }\n\n isLocalPath(source: string): boolean {\n return (\n source.startsWith(\"./\") ||\n source.startsWith(\"../\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"skills/\")\n );\n }\n\n getSourceType(source: string): \"npm\" | \"git\" | \"local\" {\n if (this.isLocalPath(source)) return \"local\";\n if (this.isGitUrl(source)) return \"git\";\n return \"npm\";\n }\n\n parseExtensionConfig(config: ExtensionConfig): { source: string; ref?: string } {\n if (typeof config === \"string\") {\n return { source: config };\n }\n return { source: config.source, ref: config.ref };\n }\n\n async getLatestNpmVersion(packageName: string): Promise<string | null> {\n try {\n const result = execSync(`npm view ${packageName} version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return result;\n } catch {\n return null;\n }\n }\n\n async getCurrentNpmVersion(packageName: string): Promise<string | null> {\n const packageJsonPath = join(process.cwd(), \"package.json\");\n\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const version = pkg.dependencies?.[packageName] || pkg.devDependencies?.[packageName];\n if (version) {\n return version.replace(/^[\\^~>=<]+/, \"\");\n }\n return null;\n } catch {\n return null;\n }\n }\n\n async updateNpmPackage(packageName: string, verbose: VerboseLevel = 1): Promise<boolean> {\n const pm = this.getPackageManager();\n const latestVersion = await this.getLatestNpmVersion(packageName);\n const currentVersion = await this.getCurrentNpmVersion(packageName);\n\n if (!latestVersion) {\n if (shouldLog(verbose, 1)) console.log(t(\"update:cannotGetLatest\", { package: packageName }));\n return false;\n }\n\n if (currentVersion === latestVersion) {\n if (shouldLog(verbose, 1))\n console.log(t(\"update:alreadyLatest\", { package: packageName, version: currentVersion }));\n return true;\n }\n\n if (shouldLog(verbose, 1)) {\n console.log(\n t(\"update:versionChange\", {\n package: packageName,\n current: currentVersion || t(\"update:unknown\"),\n latest: latestVersion,\n }),\n );\n }\n\n let cmd: string;\n if (pm === \"pnpm\") {\n cmd = this.isPnpmWorkspace()\n ? `pnpm add -wD ${packageName}@latest`\n : `pnpm add -D ${packageName}@latest`;\n } else if (pm === \"yarn\") {\n cmd = `yarn add -D ${packageName}@latest`;\n } else {\n cmd = `npm install -D ${packageName}@latest`;\n }\n\n try {\n execSync(cmd, {\n cwd: process.cwd(),\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n return true;\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.error(\n t(\"update:npmUpdateFailed\", { package: packageName }),\n error instanceof Error ? error.message : error,\n );\n }\n return false;\n }\n }\n\n async updateGitRepo(depPath: string, name: string, verbose: VerboseLevel = 1): Promise<boolean> {\n const gitDir = join(depPath, \".git\");\n\n if (!existsSync(gitDir)) {\n if (shouldLog(verbose, 1)) {\n console.log(t(\"update:notGitRepo\", { name }));\n console.log(t(\"update:reinstallHint\"));\n }\n return false;\n }\n\n try {\n if (shouldLog(verbose, 1)) console.log(t(\"update:pullingLatest\"));\n execSync(\"git pull\", {\n cwd: depPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n return true;\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.error(\n t(\"update:gitUpdateFailed\", { name }),\n error instanceof Error ? error.message : error,\n );\n }\n return false;\n }\n }\n\n /**\n * 检测 CLI 的安装方式\n * 返回: { isGlobal: boolean, pm: 'pnpm' | 'npm' | 'yarn', cwd?: string }\n */\n protected detectCliInstallation(): { isGlobal: boolean; pm: string; cwd?: string } {\n try {\n // 获取当前执行的 CLI 路径\n const cliPath = process.argv[1];\n\n // 检查是否在 node_modules 中(本地安装)\n if (cliPath.includes(\"node_modules\")) {\n // 提取项目根目录(node_modules 的父目录)\n const nodeModulesIndex = cliPath.indexOf(\"node_modules\");\n const projectRoot = cliPath.substring(0, nodeModulesIndex - 1);\n\n // 检测项目使用的包管理器\n let pm = \"npm\";\n if (existsSync(join(projectRoot, \"pnpm-lock.yaml\"))) {\n pm = \"pnpm\";\n } else if (existsSync(join(projectRoot, \"yarn.lock\"))) {\n pm = \"yarn\";\n }\n\n return { isGlobal: false, pm, cwd: projectRoot };\n }\n\n // 检查是否是全局安装\n // 尝试检测 pnpm 全局\n try {\n const pnpmGlobalDir = execSync(\"pnpm root -g\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (cliPath.startsWith(pnpmGlobalDir) || cliPath.includes(\".pnpm\")) {\n return { isGlobal: true, pm: \"pnpm\" };\n }\n } catch {\n // pnpm 不可用\n }\n\n // 尝试检测 npm 全局\n try {\n const npmGlobalDir = execSync(\"npm root -g\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (cliPath.startsWith(npmGlobalDir)) {\n return { isGlobal: true, pm: \"npm\" };\n }\n } catch {\n // npm 不可用\n }\n\n // 默认认为是全局安装\n return { isGlobal: true, pm: \"npm\" };\n } catch {\n return { isGlobal: true, pm: \"npm\" };\n }\n }\n\n async updateSelf(verbose: VerboseLevel = 1): Promise<boolean> {\n if (shouldLog(verbose, 1)) console.log(t(\"update:updatingCli\"));\n\n const cliPackageName = \"@spaceflow/cli\";\n const installation = this.detectCliInstallation();\n\n if (shouldLog(verbose, 1)) {\n console.log(\n t(\"update:installMethod\", {\n method: installation.isGlobal ? t(\"update:installGlobal\") : t(\"update:installLocal\"),\n pm: installation.pm,\n }),\n );\n }\n\n try {\n if (installation.isGlobal) {\n // 全局安装:使用对应包管理器的全局更新命令\n const cmd =\n installation.pm === \"pnpm\"\n ? `pnpm update -g ${cliPackageName}`\n : installation.pm === \"yarn\"\n ? `yarn global upgrade ${cliPackageName}`\n : `npm update -g ${cliPackageName}`;\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:executing\", { cmd }));\n execSync(cmd, { stdio: verbose ? \"inherit\" : \"pipe\" });\n } else {\n // 本地安装:在项目目录中更新\n const cwd = installation.cwd || process.cwd();\n let cmd: string;\n\n if (installation.pm === \"pnpm\") {\n const isPnpmWorkspace = existsSync(join(cwd, \"pnpm-workspace.yaml\"));\n cmd = isPnpmWorkspace\n ? `pnpm add -wD ${cliPackageName}@latest`\n : `pnpm add -D ${cliPackageName}@latest`;\n } else if (installation.pm === \"yarn\") {\n cmd = `yarn add -D ${cliPackageName}@latest`;\n } else {\n cmd = `npm install -D ${cliPackageName}@latest`;\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:executing\", { cmd }));\n execSync(cmd, { cwd, stdio: verbose ? \"inherit\" : \"pipe\" });\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:cliUpdateDone\"));\n return true;\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.error(t(\"update:cliUpdateFailed\"), error instanceof Error ? error.message : error);\n }\n return false;\n }\n }\n\n async updateDependency(name: string, verbose: VerboseLevel = 1): Promise<boolean> {\n const cwd = process.cwd();\n const dependencies = getDependencies(cwd);\n\n if (!dependencies[name]) {\n if (shouldLog(verbose, 1)) console.log(t(\"update:depNotFound\", { name }));\n return false;\n }\n\n const { source } = this.parseExtensionConfig(dependencies[name]);\n const sourceType = this.getSourceType(source);\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:updating\", { name }));\n\n if (sourceType === \"npm\") {\n return this.updateNpmPackage(source, verbose);\n } else if (sourceType === \"git\") {\n const depPath = join(cwd, \".spaceflow\", \"deps\", name);\n return this.updateGitRepo(depPath, name, verbose);\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"update:localNoUpdate\"));\n return true;\n }\n }\n\n async updateAll(verbose: VerboseLevel = 1): Promise<void> {\n const cwd = process.cwd();\n const dependencies = getDependencies(cwd);\n\n if (Object.keys(dependencies).length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"update:noDeps\"));\n return;\n }\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"update:updatingAll\", { count: Object.keys(dependencies).length }));\n }\n\n let successCount = 0;\n let failCount = 0;\n\n for (const [name, config] of Object.entries(dependencies)) {\n const { source } = this.parseExtensionConfig(config);\n const sourceType = this.getSourceType(source);\n\n console.log(`\\n📦 ${name}`);\n\n let success = false;\n if (sourceType === \"npm\") {\n success = await this.updateNpmPackage(source, verbose);\n } else if (sourceType === \"git\") {\n const depPath = join(cwd, \".spaceflow\", \"deps\", name);\n success = await this.updateGitRepo(depPath, name, verbose);\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"update:localNoUpdate\"));\n success = true;\n }\n\n if (success) {\n successCount++;\n } else {\n failCount++;\n }\n }\n\n console.log(\"\\n\" + t(\"update:updateComplete\", { success: successCount, fail: failCount }));\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { UpdateService } from \"./update.service\";\n\n/**\n * Update 命令扩展\n */\nexport const updateExtension = defineExtension({\n name: \"update\",\n version: \"1.0.0\",\n description: \"更新 Extension\",\n commands: [\n {\n name: \"update\",\n description: \"更新 Extension\",\n arguments: \"[name]\",\n options: [\n {\n flags: \"-a, --all\",\n description: \"更新所有扩展\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const name = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const updateService = new UpdateService();\n if (options?.all) {\n await updateService.updateAll(verbose);\n } else if (name) {\n await updateService.updateDependency(name, verbose);\n } else {\n await updateService.updateSelf(verbose);\n }\n },\n },\n ],\n});\n\nexport * from \"./update.service\";\n","import { buildExtension } from \"../commands/build\";\nimport { clearExtension } from \"../commands/clear\";\nimport { commitExtension } from \"../commands/commit\";\nimport { createExtension } from \"../commands/create\";\nimport { devExtension } from \"../commands/dev\";\nimport { installExtension } from \"../commands/install\";\nimport { listExtension } from \"../commands/list\";\nimport { mcpExtension } from \"../commands/mcp\";\nimport { runxExtension } from \"../commands/runx\";\nimport { schemaExtension } from \"../commands/schema\";\nimport { setupExtension } from \"../commands/setup\";\nimport { uninstallExtension } from \"../commands/uninstall\";\nimport { updateExtension } from \"../commands/update\";\n\n/**\n * 内部扩展列表\n * 从各命令目录导入 defineExtension 定义\n */\nexport const internalExtensions = [\n buildExtension,\n clearExtension,\n commitExtension,\n createExtension,\n devExtension,\n installExtension,\n listExtension,\n mcpExtension,\n runxExtension,\n schemaExtension,\n setupExtension,\n uninstallExtension,\n updateExtension,\n];\n","declare const __CORE_VERSION__: string;\n\nimport { Command } from \"commander\";\nimport type { ExtensionDefinition } from \"@spaceflow/core\";\nimport { ServiceContainer, initializeContainer } from \"./di\";\nimport { ExtensionLoader } from \"./extension-loader\";\nimport { internalExtensions } from \"./internal-extensions\";\nimport { initCliI18n } from \"./i18n\";\n\nexport { ServiceContainer } from \"./di\";\nexport { ExtensionLoader } from \"./extension-loader\";\nexport { initCliI18n } from \"./i18n\";\nexport { internalExtensions } from \"./internal-extensions\";\n\n/**\n * Core.exec() — CLI 运行时入口\n * 接收外部扩展列表,结合内部扩展,构建并执行 commander 程序\n *\n * @param extensions 外部扩展定义列表(来自 .spaceflow/bin/index.js 的静态导入)\n */\nexport interface ExecOptions {\n cliVersion?: string;\n}\n\nexport async function exec(\n extensions: ExtensionDefinition[] = [],\n options: ExecOptions = {},\n): Promise<void> {\n // 1. 初始化 i18n(如果尚未初始化,由生成的 bin/index.js 提前调用)\n initCliI18n();\n\n // 2. 创建并初始化服务容器\n const container = new ServiceContainer();\n initializeContainer(container);\n\n // 3. 创建扩展加载器\n const extensionLoader = new ExtensionLoader(container);\n container.registerService(\"extensionLoader\", extensionLoader);\n\n // 4. 注册内部扩展\n for (const ext of internalExtensions) {\n extensionLoader.registerExtension(ext);\n }\n\n // 5. 注册外部扩展(由 CLI 壳子加载并传入)\n for (const ext of extensions) {\n extensionLoader.registerExtension(ext);\n }\n\n // 6. 创建 CLI 程序\n const program = new Command();\n const cliVersion = options.cliVersion || \"0.0.0\";\n const coreVersion = typeof __CORE_VERSION__ !== \"undefined\" ? __CORE_VERSION__ : \"0.0.0\";\n const versionOutput = `spaceflow/${cliVersion} core/${coreVersion}`;\n\n program\n .name(\"spaceflow\")\n .description(\"Spaceflow CLI\")\n .version(versionOutput, \"-V, --version\", \"显示版本信息\");\n\n // 定义全局 verbose 选项(支持计数:-v, -vv, -vvv)\n program.option(\n \"-v, --verbose\",\n \"详细输出(可叠加:-v, -vv, -vvv)\",\n (_, prev: number) => prev + 1,\n 0,\n );\n\n // 全局选项列表\n const globalOptions = [\"-h, --help\", \"-V, --version\", \"-v, --verbose\"];\n\n // 8. 注册所有命令\n const commands = extensionLoader.getCommands();\n for (const cmd of commands) {\n const command = new Command(cmd.name).description(cmd.description);\n\n // 添加别名\n if (cmd.aliases) {\n for (const alias of cmd.aliases) {\n command.alias(alias);\n }\n }\n\n // 添加参数\n if (cmd.arguments) {\n command.arguments(cmd.arguments);\n }\n\n // 添加选项(排除已定义的全局选项)\n if (cmd.options) {\n for (const opt of cmd.options) {\n if (!globalOptions.some((go) => opt.flags.startsWith(go.split(\",\")[0].trim()))) {\n if (opt.isCount) {\n command.option(\n opt.flags as string,\n opt.description as string,\n (_, prev: number) => prev + 1,\n 0,\n );\n } else {\n const defaultValue = opt.default as string | boolean | string[] | undefined;\n command.option(opt.flags as string, opt.description as string, defaultValue);\n }\n }\n }\n }\n\n // 添加子命令\n if (cmd.subcommands) {\n for (const sub of cmd.subcommands) {\n const subCmd = new Command(sub.name).description(sub.description);\n if (sub.options) {\n for (const opt of sub.options) {\n if (!globalOptions.some((go) => opt.flags.startsWith(go.split(\",\")[0].trim()))) {\n const defaultValue = opt.default as string | boolean | string[] | undefined;\n subCmd.option(opt.flags as string, opt.description as string, defaultValue);\n }\n }\n }\n subCmd.action(async (args, options) => {\n await sub.run([args], options, container);\n });\n command.addCommand(subCmd);\n }\n }\n\n // 添加执行函数\n command.action(async (...actionArgs) => {\n const opts = actionArgs[actionArgs.length - 2] || {};\n const positionalArgs = actionArgs.slice(0, -2);\n // 合并全局 verbose 选项\n const globalOpts = program.opts();\n if (globalOpts.verbose && !opts.verbose) {\n opts.verbose = globalOpts.verbose;\n }\n await cmd.run(positionalArgs, opts, container);\n });\n\n program.addCommand(command);\n }\n\n // 9. 解析命令行参数\n await program.parseAsync(process.argv);\n\n // 10. 清理\n await container.destroy();\n}\n","// ============ 插件系统 ============\nexport * from \"./extension-system\";\n\n// ============ 基础能力模块 ============\n// Git Provider - 多平台 Git 托管 API 操作(GitHub、Gitea、GitLab)\nexport * from \"./shared/git-provider\";\n\n// Git SDK - Git 命令操作\nexport * from \"./shared/git-sdk\";\n\n// LLM Proxy - 多 LLM 适配器\nexport * from \"./shared/llm-proxy\";\n\n// Feishu SDK - 飞书 API 操作\nexport * from \"./shared/feishu-sdk\";\n\n// Storage - 存储服务\nexport * from \"./shared/storage\";\n\n// Claude Setup - Claude Agent 配置\nexport * from \"./shared/claude-setup\";\n\n// Parallel - 并行执行工具\nexport * from \"./shared/parallel\";\n\n// Output - 输出服务\nexport * from \"./shared/output\";\n\n// Verbose - 日志级别\nexport * from \"./shared/verbose\";\n\n// Editor Config - 编辑器配置\nexport * from \"./shared/editor-config\";\n\n// LLM JsonPut - JSON 结构化输出\nexport * from \"./shared/llm-jsonput\";\n\n// Source Utils - 源类型判断工具\nexport * from \"./shared/source-utils\";\n\n// Package Manager - 包管理器检测\nexport * from \"./shared/package-manager\";\n\n// Spaceflow Dir - .spaceflow 目录管理\nexport * from \"./shared/spaceflow-dir\";\n\n// Rspack Config - Rspack 配置工具\nexport * from \"./shared/rspack-config\";\n\n// MCP - Model Context Protocol 支持\n// 注意:McpToolDefinition 已在 extension-system/types.ts 中定义(用于 defineExtension 的 tools 字段)\n// 这里只导出装饰器和工具函数,避免重复导出\nexport {\n MCP_SERVER_METADATA,\n MCP_TOOL_METADATA,\n type JsonSchema,\n dtoToJsonSchema,\n type McpToolMetadata,\n McpServer,\n McpTool,\n isMcpServer,\n getMcpServerMetadata,\n getMcpTools,\n runMcpServer,\n} from \"./shared/mcp\";\n\n// I18n - 国际化\nexport * from \"./cli-runtime/i18n\";\n\n// Logger - 全局日志工具\nexport * from \"./shared/logger\";\n\n// ============ 配置相关 ============\nexport * from \"./config\";\n\n// ============ CLI Runtime ============\n// exec 入口、DI 容器、扩展加载器、i18n 初始化\nexport {\n exec,\n ServiceContainer,\n ExtensionLoader,\n initCliI18n,\n internalExtensions,\n} from \"./cli-runtime\";\n\n// ============ Zod 重导出 ============\nexport { z } from \"zod\";\n"],"names":["resolveSpaceflowConfig","config","packageName","packagePath","join","require","Object","name","exportConfig","defineExtension","definition","GIT_PROVIDER_MODULE_OPTIONS","REVIEW_STATE","DIFF_SIDE","detectProvider","env","process","explicit","isValidProvider","buildResult","value","provider","source","serverUrl","resolveServerUrl","token","resolveToken","GITHUB_HOSTS","Set","GITLAB_HOSTS","parseRepoUrl","url","trimmed","parseSshUrl","parseGitSshUrl","parseHttpUrl","parsed","URL","hostname","segments","Boolean","owner","repo","isGithub","isGithubHost","isGitlab","isGitlabHost","detectProviderForHost","ref","path","refType","match","host","pathPart","detected","GIT_STATUS_MAP","mapGitStatus","status","parseChangedLinesFromPatch","patch","changedLines","lines","currentLine","line","hunkMatch","parseInt","parseHunksFromPatch","hunks","calculateNewLineNumber","oldLine","offset","hunk","oldEnd","lineOffsetInHunk","calculateLineOffsets","oldLines","result","Map","parseDiffText","diffText","files","fileDiffs","fileDiff","headerMatch","filename","patchStart","execSync","GiteaAdapter","options","Error","method","body","headers","response","fetch","JSON","undefined","errorText","branch","encodeURIComponent","protections","existing","p","pushWhitelistUsernames","hasWhitelist","protectionOptions","listResult","ruleName","console","error","index","state","query","allPRs","page","limit","params","URLSearchParams","String","prs","allCommits","commits","needsPatch","f","diffFiles","patchMap","file","sha","baseSha","headSha","filepath","encodedPath","item","commentId","allReviews","reviews","reviewId","review","comments","comment","teamId","GithubAdapter","variables","graphqlUrl","json","rules","rule","branchName","results","pr","perPage","c","allFiles","commit","Buffer","r","resolvedMap","u","data","commitObj","head","base","user","reviewers","teams","t","author","ghAuthor","ghCommitter","labels","assignees","milestone","l","a","prNumber","threads","thread","firstComment","QUERY","requiredReviews","event","eventMap","sort","sortMap","GitlabAdapter","project","namespace","pushLevel","glState","mr","allMRs","d","diffs","oldPath","newPath","diff","n","_owner","_repo","_commentId","_body","note","_reviewId","position","pushAccess","additions","deletions","stateMap","GitProviderService","spawn","GitSdkService","args","opts","Promise","resolve","reject","child","stdout","stderr","code","err","remoteUrl","baseRef","headRef","resolvedBase","resolvedHead","message","authorName","authorEmail","date","output","LLM_PROXY_CONFIG","Symbol","LLM_ADAPTER","LOG_LEVEL_PRIORITY","toLogLevel","normalizeVerbose","shouldLog","parseVerbose","readFile","writeFile","mkdir","copyFile","unlink","homedir","ClaudeSetupService","llmConfig","claudeDir","paths","e","fn","verbose","settingsPath","claudeJsonPath","claudeCode","existingSettings","content","mergedSettings","claudeJson","ClaudeCodeAdapter","messages","claudeConf","model","systemPrompt","userPrompt","handleUncaughtError","spawnEnv","spawnClaudeCodeProcess","spawnOptions","queryOptions","finalContent","structuredOutput","Array","block","systemMessage","m","userMessages","OpenAI","OpenAIAdapter","openaiConf","client","stream","fullContent","chunk","delta","createOpencode","OpenCodeAdapter","openCodeConf","providerID","configModel","opencode","port","Math","cleanup","customProviderID","session","Date","sessionId","modelID","part","partType","text","toolPart","agentPart","subtaskPart","stepPart","reasoningPart","randomUUID","LlmSessionImpl","adapter","userMessage","mergedOptions","assistantMessage","prompt","LlmProxyService","claudeCodeAdapter","openaiAdapter","openCodeAdapter","adapterType","type","jsonSchema","systemMsg","msg","available","createStreamLoggerState","logStreamEvent","tokens","FEISHU_CARD_ACTION_TRIGGER","EventEmitter","lark","FeishuSdkService","eventName","listener","done","userId","userIdType","departmentIdType","userIds","FeishuCardService","feishuSdkService","_eventHook","card","receiveId","receiveIdType","uuid","messageId","FEISHU_MODULE_OPTIONS","StorageService","clearInterval","setInterval","now","allKeys","cleaned","key","ttl","effectiveTtl","exists","maxKeys","currentSize","sizeAfterCleanup","keyWithExpire","Infinity","b","toEvict","i","pattern","validKeys","prefix","keysToDelete","deleted","MemoryAdapter","regexPattern","regex","RegExp","fs","FileAdapter","filePath","clearTimeout","setTimeout","dir","ParallelExecutor","tasks","total","completed","shouldStop","executeTask","task","lastError","attempt","pending","taskQueue","promise","taskIdOrder","items","getId","_","ms","parallel","OUTPUT_MARKER_START","OUTPUT_MARKER_END","OutputService","values","outputWithCache","EDITOR_DIR_MAPPING","DEFAULT_EDITOR","getEditorDirName","jsonrepair","JSON_FORMAT_INSTRUCTION","LlmJsonPut","schema","generateExample","s","obj","example","input","repaired","retryCount","isGitUrl","isLocalPath","getSourceType","normalizeSource","extractNpmPackageName","extractName","buildGitPackageSpec","getPackageManager","detectPackageManager","isPnpmWorkspace","existsSync","readFileSync","writeFileSync","addSpaceflowToDevDependencies","cwd","workDir","packageJsonPath","pkg","getSpaceflowDir","ensureSpaceflowDir","getSpaceflowCoreVersion","ensureSpaceflowPackageJson","ensureDependencies","loadExtensionsFromDir","ensureEditorGitignore","SPACEFLOW_DIR","PACKAGE_JSON","DEFAULT_EXTERNALS","DEFAULT_TS_RULE","createPluginConfig","coreOptions","pluginPath","entry","outDir","minimize","customExternals","customAlias","customRules","coreRoot","mergedExternals","alias","createMultiEntryPluginConfig","MCP_SERVER_METADATA","MCP_TOOL_METADATA","SWAGGER_API_MODEL_PROPERTIES","SWAGGER_API_MODEL_PROPERTIES_ARRAY","dtoToJsonSchema","dtoClass","prototype","propertyKeys","Reflect","properties","required","meta","typeMap","schemaType","reflectedType","prop","McpServer","target","McpTool","propertyKey","_descriptor","constructor","resolvedDefinition","isMcpServer","getMcpServerMetadata","getMcpTools","runMcpServer","service","serverInfo","tools","StdioServerTransport","server","tool","jsonSchemaToZod","z","shape","requiredFields","field","transport","GLOBAL_T_KEY","GLOBAL_ADD_LOCALE_KEY","setGlobalT","globalThis","setGlobalAddLocaleResources","getGlobalT","interpolate","template","k","val","globalT","addLocaleResources","ns","resources","resetI18n","platform","DEFAULT_LOCALE","CONFIG_FILE_NAME","normalizeLocale","raw","langOnly","lang","readLangFromConfig","configPath","readEnvLocale","readMacOSLocale","readWindowsLocale","readOSLocale","os","detectLocale","envLang","i18nextModule","coreZhCN","coreEn","i18next","buildZhCN","buildEn","clearZhCN","clearEn","commitZhCN","commitEn","createZhCN","createEn","devZhCN","devEn","installZhCN","installEn","listZhCN","listEn","mcpZhCN","mcpEn","runxZhCN","runxEn","schemaZhCN","schemaEn","setupZhCN","setupEn","uninstallZhCN","uninstallEn","updateZhCN","updateEn","allLocales","DEFAULT_NS","initCliI18n","lng","lngKey","translations","addI18nextResources","default","timestamp","PlainRenderer","label","tag","current","pct","suffix","skipped","skipReason","control","reason","ctx","errMsg","_prefix","detectMode","tuiRendererCache","loadTuiRenderer","TuiRenderer","resolveMode","mode","Logger","level","DEFAULT_SUPPORT_EDITOR","RC_FILE_NAME","deepMerge","getConfigPath","getConfigPaths","getEnvFilePaths","readConfigSync","writeConfigSync","getSupportedEditors","getDependencies","findConfigFileWithField","updateDependency","removeDependency","GitProviderConfigSchema","CiConfigSchema","ClaudeCodeConfigSchema","OpenAIConfigSchema","OpenCodeConfigSchema","GeminiConfigSchema","LlmConfigSchema","v","FeishuConfigSchema","StorageConfigSchema","SpaceflowConfigSchema","loadSpaceflowConfig","fileConfig","errors","spaceflowConfig","schemaRegistry","registerPluginSchema","registry","getRegisteredSchemas","SchemaGeneratorService","outputPath","baseSchema","configKey","fullSchema","gitignorePath","newContent","loadEnvFiles","ServiceContainer","storage","factory","registration","ENV_MAPPINGS","getEnvValue","envNames","names","setNestedValue","parts","getNestedValue","UnifiedConfigReader","merged","envValue","rawConfig","findProjectRoot","initializeContainer","container","storageDir","registerServiceFactories","baseUrl","ExtensionLoader","extension","cmd","svc","instance","ext","rspack","readdir","stat","dirname","createRequire","BuildService","extensionName","extensions","successCount","failCount","compiler","dependencies","parentDirs","linkPath","absolutePath","req","corePkgPath","extDir","entries","extPath","stats","startTime","closeErr","duration","info","warnings","w","customConfigPath","customConfigPathJs","module","buildExtension","buildService","hasErrors","rm","readdirSync","lstatSync","ClearService","isGlobal","home","editors","editor","editorDirName","editorRoot","spaceflowRoot","preserveFiles","toDelete","entryPath","editorName","skillsDir","commandsDir","clearExtension","_ctx","clearService","ScopeRuleSchema","CommitScopeConfigSchema","CommitMessageContentSchema","parseCommitMessage","firstLine","headerRegex","scope","subject","formatCommitMessage","header","spawnSync","micromatch","CommitService","configReader","llmProxyService","command","fileArgs","count","publishConfig","defaultTypes","commitConfig","pkgPath","groups","pkgInfo","packageInfo","finalScope","useUnstaged","packageGroups","firstGroup","commitTypes","typesList","recentCommits","packageContext","system","truncatedDiff","expectedScope","jsonPut","_packageInfo","strategyName","scopeGroups","groupData","analysis","validFiles","group","g","assignedFiles","missingFiles","aScope","bScope","pkgGroups","first","useWorking","sortedGroups","stageResult","pkgStr","executor","messageResults","failedResults","generatedMessages","preview","committedMessages","messageStr","commitResult","shortMsg","errorMsg","remaining","hasWorking","hasStaged","commitExtension","_args","llmProxy","commitService","createHash","CreateService","repoUrl","cacheDir","repoName","repoHash","targetDir","templatesInCwd","templatesInParent","devPath","__dirname","templatesDir","templates","entryStat","fullPath","templateDir","context","templatePath","targetSubDir","rendered","targetFileName","targetPath","str","word","pascal","createExtension","createService","devExtension","access","symlink","readlink","relative","InstallService","schemaGenerator","spaceflowDir","depName","depPath","pluginConfig","workingDir","editorExtensionsDir","installName","editorCommandsDir","commandPath","mcpItem","mcpPath","mcpConfig","mcpJsonPath","resolvedArgs","arg","serverConfig","envKey","sourcePath","packageSpec","normalizedSource","relativePath","pm","pkgJsonPath","baseName","gitName","nodeModulesPath","dirPath","cloneCmd","gitDir","linkTarget","resolvedTarget","depsDir","relativeSource","displayDepPath","displaySourcePath","cp","sourceType","depModuleName","activeTypes","globalDir","localInstalled","globalInstalled","updated","targetRef","currentCommit","targetCommit","existingTarget","_name","distIndexPath","isBranch","createEmptyConfig","createDefaultExtension","addExport","mcp","exp","extensionMdPath","pkgName","pkgDescription","pkgContent","readmeContent","readmePaths","readmePath","commandMdPath","cmdPkgJsonPath","helpContent","depValue","needInstall","needBuild","lockfilePath","nodeModulesStat","pkgJsonStat","lockfileStat","srcPath","distPath","distStat","srcMtime","latestMtime","subMtime","installExtension","installService","installOptions","ListService","extensionLoader","extensionInfos","installed","maxNameLen","installedCount","icon","typeLabel","displaySource","localPath","possiblePaths","listExtension","listService","McpService","inspector","extensionTools","allTools","allResources","resource","extensionResources","_uri","summary","sensitiveKeys","sanitize","sk","handler","uri","zodSchema","zodType","description","isOptional","innerType","zodShape","isRequired","mcpExtension","mcpService","realpathSync","RunxService","realDepPath","importUrl","dynamicImport","Function","pluginModule","extensionDef","commands","finalArgs","cmdName","cmdDef","runxExtension","cmdArgs","runxService","schemaExtension","stringify","SetupService","rcPath","defaultConfig","existingPath","globalConfigPath","localConfig","envPath","envConfig","instanceConfig","global","mergedConfig","eqIndex","topKey","restParts","nestedKey","objects","displayValue","sensitivePatterns","lowerKey","setupExtension","setupService","UninstallService","actualName","installRoot","removed","uninstallExtension","uninstallService","UpdateService","version","latestVersion","currentVersion","cliPath","nodeModulesIndex","projectRoot","pnpmGlobalDir","npmGlobalDir","cliPackageName","installation","success","updateExtension","updateService","internalExtensions","Command","exec","program","cliVersion","coreVersion","__CORE_VERSION__","versionOutput","prev","globalOptions","opt","go","defaultValue","sub","subCmd","actionArgs","positionalArgs","globalOpts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA,iCAAiC,WAAW;AAC5C;AACA;;;;;ACPA;AACA;AACA;AACA,kDAAkD,wCAAwC;AAC1F;AACA;AACA,E;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,E;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA,C;;;;ACNA,wF;;;;ACAA,2B;;;;ACAA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6BAA6B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrDA;;CAEC,GA8GD;;CAEC,GACM,SAASA,uBACdC,MAA0C,EAC1CC,WAAmB,EACnBC,WAAmB;IAEnB,MAAM,EAAEC,IAAI,EAAE,GAAGC,mBAAOA,CAAC,GAAM;IAE/B,IAAI,CAACJ,QAAQ;QACX,OAAO,EAAE;IACX;IAEA,oBAAoB;IACpB,IAAIA,OAAO,OAAO,EAAE;QAClB,OAAOK,OAAO,OAAO,CAACL,OAAO,OAAO,EAAE,GAAG,CAAC,CAAC,CAACM,MAAMC,aAAa,GAAM;gBACnED;gBACA,MAAMC,aAAa,IAAI,IAAI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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["webpack://@spaceflow/core/./src/commands/build|lazy|referencedExports: default, |groupOptions: {}|namespace object","webpack://@spaceflow/core/./src/commands/list|sync","webpack://@spaceflow/core/webpack/runtime/compat_get_default_export","webpack://@spaceflow/core/webpack/runtime/define_property_getters","webpack://@spaceflow/core/webpack/runtime/ensure_chunk","webpack://@spaceflow/core/webpack/runtime/get javascript chunk filename","webpack://@spaceflow/core/webpack/runtime/has_own_property","webpack://@spaceflow/core/webpack/runtime/public_path","webpack://@spaceflow/core/webpack/runtime/module_chunk_loading","webpack://@spaceflow/core/./src/extension-system/extension.interface.ts","webpack://@spaceflow/core/./src/extension-system/define-extension.ts","webpack://@spaceflow/core/./src/extension-system/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/types.ts","webpack://@spaceflow/core/./src/shared/git-provider/detect-provider.ts","webpack://@spaceflow/core/./src/shared/git-provider/parse-repo-url.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk-diff.utils.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitea.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/github.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitlab.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/git-provider.service.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/index.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk.service.ts","webpack://@spaceflow/core/./src/shared/git-sdk/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/config.interface.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/llm-adapter.interface.ts","webpack://@spaceflow/core/./src/shared/verbose/index.ts","webpack://@spaceflow/core/./src/shared/claude-setup/claude-setup.service.ts","webpack://@spaceflow/core/./src/shared/claude-setup/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/claude-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/openai.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/open-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-session.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-proxy.service.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/stream-logger.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/card-action.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/feishu-sdk.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/fieshu-card.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/module.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/index.ts","webpack://@spaceflow/core/./src/shared/storage/storage.service.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/memory.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/file.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/index.ts","webpack://@spaceflow/core/./src/shared/storage/index.ts","webpack://@spaceflow/core/./src/shared/parallel/parallel-executor.ts","webpack://@spaceflow/core/./src/shared/parallel/index.ts","webpack://@spaceflow/core/./src/shared/output/output.service.ts","webpack://@spaceflow/core/./src/shared/output/index.ts","webpack://@spaceflow/core/./src/shared/editor-config/index.ts","webpack://@spaceflow/core/./src/shared/llm-jsonput/index.ts","webpack://@spaceflow/core/./src/shared/source-utils/index.ts","webpack://@spaceflow/core/./src/shared/package-manager/index.ts","webpack://@spaceflow/core/./src/shared/spaceflow-dir/index.ts","webpack://@spaceflow/core/./src/shared/rspack-config/rspack-config.ts","webpack://@spaceflow/core/./src/shared/rspack-config/index.ts","webpack://@spaceflow/core/./src/shared/mcp/index.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/i18n.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/locale-detect.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/init.ts","webpack://@spaceflow/core/./src/cli-runtime/i18n/index.ts","webpack://@spaceflow/core/./src/shared/logger/logger.interface.ts","webpack://@spaceflow/core/./src/shared/logger/renderers/plain.renderer.ts","webpack://@spaceflow/core/./src/shared/logger/logger.ts","webpack://@spaceflow/core/./src/shared/logger/index.ts","webpack://@spaceflow/core/./src/config/spaceflow.config.ts","webpack://@spaceflow/core/./src/config/schema-generator.service.ts","webpack://@spaceflow/core/./src/config/index.ts","webpack://@spaceflow/core/./src/cli-runtime/di/container.ts","webpack://@spaceflow/core/./src/cli-runtime/di/config.ts","webpack://@spaceflow/core/./src/cli-runtime/di/services.ts","webpack://@spaceflow/core/./src/cli-runtime/di/index.ts","webpack://@spaceflow/core/./src/cli-runtime/extension-loader.ts","webpack://@spaceflow/core/./src/commands/build/build.service.ts","webpack://@spaceflow/core/./src/commands/build/index.ts","webpack://@spaceflow/core/./src/commands/clear/clear.service.ts","webpack://@spaceflow/core/./src/commands/clear/index.ts","webpack://@spaceflow/core/./src/commands/commit/commit.config.ts","webpack://@spaceflow/core/./src/commands/commit/commit.service.ts","webpack://@spaceflow/core/./src/commands/commit/index.ts","webpack://@spaceflow/core/./src/commands/create/create.service.ts","webpack://@spaceflow/core/./src/commands/create/index.ts","webpack://@spaceflow/core/./src/commands/dev/index.ts","webpack://@spaceflow/core/./src/commands/install/install.service.ts","webpack://@spaceflow/core/./src/commands/install/index.ts","webpack://@spaceflow/core/./src/commands/list/list.service.ts","webpack://@spaceflow/core/./src/commands/list/index.ts","webpack://@spaceflow/core/./src/commands/mcp/mcp.service.ts","webpack://@spaceflow/core/./src/commands/mcp/index.ts","webpack://@spaceflow/core/./src/commands/runx/runx.service.ts","webpack://@spaceflow/core/./src/commands/runx/index.ts","webpack://@spaceflow/core/./src/commands/schema/index.ts","webpack://@spaceflow/core/./src/commands/setup/setup.service.ts","webpack://@spaceflow/core/./src/commands/setup/index.ts","webpack://@spaceflow/core/./src/commands/uninstall/uninstall.service.ts","webpack://@spaceflow/core/./src/commands/uninstall/index.ts","webpack://@spaceflow/core/./src/commands/update/update.service.ts","webpack://@spaceflow/core/./src/commands/update/index.ts","webpack://@spaceflow/core/./src/cli-runtime/internal-extensions.ts","webpack://@spaceflow/core/./src/cli-runtime/index.ts","webpack://@spaceflow/core/./src/index.ts"],"sourcesContent":["function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 778;\nmodule.exports = webpackEmptyAsyncContext;\n","function webpackEmptyContext(req) {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n}\nwebpackEmptyContext.keys = () => ([]);\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 777;\nmodule.exports = webpackEmptyContext;\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"\" + chunkId + \".js\"\n}","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.p = \"\";","// no BaseURI\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"410\": 0,};\n var installChunk = (data) => {\n var __rspack_esm_ids = data.__rspack_esm_ids;\n var __webpack_modules__ = data.__webpack_modules__;\n var __rspack_esm_runtime = data.__rspack_esm_runtime;\n // add \"modules\" to the modules object,\n // then flag all \"ids\" as loaded and fire callback\n var moduleId, chunkId, i = 0;\n for (moduleId in __webpack_modules__) {\n if (__webpack_require__.o(__webpack_modules__, moduleId)) {\n __webpack_require__.m[moduleId] = __webpack_modules__[moduleId];\n }\n }\n if (__rspack_esm_runtime) __rspack_esm_runtime(__webpack_require__);\n for (; i < __rspack_esm_ids.length; i++) {\n chunkId = __rspack_esm_ids[i];\n if (__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n installedChunks[chunkId][0]();\n }\n installedChunks[__rspack_esm_ids[i]] = 0;\n }\n \n};\n __webpack_require__.f.j = function (chunkId, promises) {\n // import() chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\nif (installedChunkData !== 0) { // 0 means \"already installed\".'\n // a Promise means \"currently loading\".\n if (installedChunkData) {\n promises.push(installedChunkData[1]);\n } else {\n if (true) {\n // setup Promise in chunk cache\n var promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n if (installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n throw e;\n });\n var promise = Promise.race([promise, new Promise((resolve) => {\n installedChunkData = installedChunks[chunkId] = [resolve];\n })]);\n promises.push(installedChunkData[1] = promise);\n }\n \n }\n}\n }\n // no external install chunk\n// no on chunks loaded\n// no HMR\n// no HMR manifest\n","/**\n * Extension 元数据\n */\nexport interface SpaceflowExtensionMetadata {\n /** Extension 名称 */\n name: string;\n /** 提供的命令列表 */\n commands: string[];\n /** 对应 spaceflow.json 中的配置 key(可选) */\n configKey?: string;\n /** 依赖的其他 Extension 配置 key 列表,读取其他 Extension 配置前必须在此声明 */\n configDependencies?: string[];\n /** 配置 schema 工厂函数,返回 zod schema,用于验证配置和生成 JSON Schema */\n configSchema?: () => unknown;\n /** Extension 版本 */\n version?: string;\n /** Extension 描述 */\n description?: string;\n}\n\n/**\n * .spaceflow/package.json 中的 dependencies\n */\nexport type ExtensionDependencies = Record<string, string>;\n\n/**\n * Spaceflow 导出类型\n * - flow: 子命令(默认),需要构建,注册为 CLI 子命令\n * - command: 编辑器命令,复制到 .claude/commands/ 等目录\n * - skill: 技能包,复制到 .claude/skills/ 等目录\n * - mcp: MCP Server,注册到编辑器的 mcp.json 配置\n */\nexport type SpaceflowExportType = \"flow\" | \"command\" | \"skill\" | \"mcp\";\n\n/**\n * MCP Server 配置\n */\nexport interface McpServerConfig {\n /** 启动命令,如 \"node\", \"python\" */\n command: string;\n /** 启动参数,如 [\"dist/index.js\"] */\n args?: string[];\n /** 需要的环境变量名列表,安装时会提示用户配置 */\n env?: string[];\n}\n\n/**\n * 单个导出项配置\n */\nexport interface SpaceflowExportConfig {\n /** 导出类型,默认为 flow */\n type?: SpaceflowExportType;\n /** 入口路径,相对于包根目录 */\n entry: string;\n /** 描述(可选) */\n description?: string;\n /** MCP Server 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * package.json 中的 spaceflow 配置\n *\n * 完整格式:\n * ```json\n * \"spaceflow\": {\n * \"exports\": {\n * \"review\": { \"type\": \"flow\", \"entry\": \".\" },\n * \"review-rules\": { \"type\": \"skill\", \"entry\": \"./skills\" },\n * \"my-mcp\": { \"type\": \"mcp\", \"entry\": \".\", \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] } }\n * }\n * }\n * ```\n *\n * 简化格式(单导出):\n * ```json\n * \"spaceflow\": {\n * \"type\": \"mcp\",\n * \"entry\": \".\",\n * \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] }\n * }\n * ```\n */\nexport interface SpaceflowPackageConfig {\n /** 多导出配置 */\n exports?: Record<string, SpaceflowExportConfig>;\n /** 简化格式:导出类型 */\n type?: SpaceflowExportType;\n /** 简化格式:入口路径 */\n entry?: string;\n /** 简化格式:描述 */\n description?: string;\n /** 简化格式:MCP 配置 */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析后的导出项\n */\nexport interface ResolvedSpaceflowExport {\n /** 导出名称 */\n name: string;\n /** 导出类型 */\n type: SpaceflowExportType;\n /** 入口路径(绝对路径) */\n entry: string;\n /** 描述 */\n description?: string;\n /** MCP 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析 spaceflow 配置,返回所有导出项\n */\nexport function resolveSpaceflowConfig(\n config: SpaceflowPackageConfig | undefined,\n packageName: string,\n packagePath: string,\n): ResolvedSpaceflowExport[] {\n const { join } = require(\"path\");\n\n if (!config) {\n return [];\n }\n\n // 完整格式:有 exports 字段\n if (config.exports) {\n return Object.entries(config.exports).map(([name, exportConfig]) => ({\n name,\n type: exportConfig.type || \"flow\",\n entry: join(packagePath, exportConfig.entry),\n description: exportConfig.description,\n mcp: exportConfig.mcp,\n }));\n }\n\n // 简化格式:直接有 type/entry 字段\n if (config.entry) {\n return [\n {\n name: packageName,\n type: config.type || \"flow\",\n entry: join(packagePath, config.entry),\n description: config.description,\n mcp: config.mcp,\n },\n ];\n }\n\n return [];\n}\n","import type { ExtensionDefinition } from \"./types\";\n\n/**\n * 定义扩展\n * 这是一个类型安全的工厂函数,用于创建扩展定义\n * @param definition 扩展定义\n * @returns 扩展定义(原样返回,仅用于类型推断)\n */\nexport function defineExtension(definition: ExtensionDefinition): ExtensionDefinition {\n return definition;\n}\n","// 旧版接口(保留兼容,后续移除)\nexport * from \"./extension.interface\";\n\n// 新版接口\nexport * from \"./types\";\nexport * from \"./define-extension\";\n","/**\n * Git Provider 通用类型定义\n * 适用于 Gitea、GitHub 等多种 Git 托管平台\n */\n\n/** Git Provider 平台类型 */\nexport type GitProviderType = \"gitea\" | \"github\" | \"gitlab\";\n\n/** Git Provider 模块配置选项 */\nexport interface GitProviderModuleOptions {\n /** Git Provider 平台类型 */\n provider: GitProviderType;\n /** 服务器 URL */\n baseUrl: string;\n /** API Token */\n token: string;\n}\n\n/** Git Provider 模块异步配置选项 */\nexport interface GitProviderModuleAsyncOptions {\n useFactory: (...args: unknown[]) => Promise<GitProviderModuleOptions> | GitProviderModuleOptions;\n inject?: any[];\n}\n\n/** 注入令牌 */\nexport const GIT_PROVIDER_MODULE_OPTIONS = \"GIT_PROVIDER_MODULE_OPTIONS\";\n\n/** 分支保护规则 */\nexport interface BranchProtection {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n branch_name?: string;\n created_at?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n rule_name?: string;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n updated_at?: string;\n}\n\n/** 创建分支保护规则选项 */\nexport interface CreateBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n /** 分支名称或通配符规则 */\n branch_name?: string;\n /** 规则名称 */\n rule_name?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 编辑分支保护规则选项 */\nexport interface EditBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 分支信息 */\nexport interface Branch {\n commit?: {\n id?: string;\n message?: string;\n timestamp?: string;\n };\n effective_branch_protection_name?: string;\n enable_status_check?: boolean;\n name?: string;\n protected?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n user_can_merge?: boolean;\n user_can_push?: boolean;\n}\n\n/** 仓库信息 */\nexport interface Repository {\n id?: number;\n owner?: {\n id?: number;\n login?: string;\n full_name?: string;\n };\n name?: string;\n full_name?: string;\n default_branch?: string;\n}\n\n/** Pull Request 信息 */\nexport interface PullRequest {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n head?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n base?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n user?: {\n id?: number;\n login?: string;\n };\n /** PR 指定的评审人(个人用户) */\n requested_reviewers?: Array<{\n id?: number;\n login?: string;\n }>;\n /** PR 指定的评审团队 */\n requested_reviewers_teams?: Array<{\n id?: number;\n name?: string;\n /** 团队成员 */\n members?: Array<{\n id?: number;\n login?: string;\n }>;\n }>;\n created_at?: string;\n updated_at?: string;\n merged_at?: string;\n merge_base?: string;\n}\n\n/** 编辑 PR 的选项 */\nexport interface EditPullRequestOption {\n title?: string;\n body?: string;\n state?: \"open\" | \"closed\";\n base?: string;\n}\n\n/** PR Commit 信息 */\nexport interface PullRequestCommit {\n sha?: string;\n commit?: {\n message?: string;\n author?: {\n name?: string;\n email?: string;\n date?: string;\n };\n };\n author?: {\n id?: number;\n login?: string;\n };\n committer?: {\n id?: number;\n login?: string;\n };\n}\n\n/** 文件变更信息 */\nexport interface ChangedFile {\n filename?: string;\n status?: string;\n additions?: number;\n deletions?: number;\n changes?: number;\n patch?: string;\n raw_url?: string;\n contents_url?: string;\n}\n\n/** Commit 详细信息(包含文件变更) */\nexport interface CommitInfo extends PullRequestCommit {\n files?: ChangedFile[];\n}\n\n/** Issue/PR 评论 */\nexport interface IssueComment {\n id?: number;\n body?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n}\n\n/** 创建 Issue 评论选项 */\nexport interface CreateIssueCommentOption {\n body: string;\n}\n\n/** 创建 Issue 的选项 */\nexport interface CreateIssueOption {\n /** Issue 标题 */\n title: string;\n /** Issue 内容 */\n body?: string;\n /** 指派人用户名列表 */\n assignees?: string[];\n /** 标签名称列表,各平台 adapter 内部负责名称到 ID 的转换 */\n labels?: string[];\n /** 里程碑 ID */\n milestone?: number;\n /** 截止日期 */\n due_date?: string;\n}\n\n/** Issue 响应 */\nexport interface Issue {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n labels?: Array<{\n id?: number;\n name?: string;\n color?: string;\n }>;\n assignees?: Array<{\n id?: number;\n login?: string;\n }>;\n milestone?: {\n id?: number;\n title?: string;\n };\n created_at?: string;\n updated_at?: string;\n closed_at?: string;\n html_url?: string;\n}\n\n/** PR Review 事件类型 */\nexport type ReviewStateType = \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" | \"PENDING\";\n\n/** PR Review 事件常量 */\nexport const REVIEW_STATE = {\n APPROVE: \"APPROVE\",\n REQUEST_CHANGES: \"REQUEST_CHANGES\",\n COMMENT: \"COMMENT\",\n PENDING: \"PENDING\",\n} as const;\n\n/** PR Review 行级评论 Diff 方向 */\nexport const DIFF_SIDE = {\n RIGHT: \"RIGHT\",\n LEFT: \"LEFT\",\n} as const;\n\n/** PR Review 行级评论 */\nexport interface CreatePullReviewComment {\n /** 文件路径 */\n path: string;\n /** 评论内容 */\n body: string;\n /** 旧文件行号(删除行),新增行设为 0 */\n old_position?: number;\n /** 新文件行号(新增/修改行),删除行设为 0 */\n new_position?: number;\n}\n\n/** 创建 PR Review 的选项 */\nexport interface CreatePullReviewOption {\n /** Review 事件类型 */\n event?: ReviewStateType;\n /** Review 主体评论 */\n body?: string;\n /** 行级评论列表 */\n comments?: CreatePullReviewComment[];\n /** 提交 SHA(可选) */\n commit_id?: string;\n}\n\n/** PR Review 响应 */\nexport interface PullReview {\n id?: number;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n commit_id?: string;\n}\n\n/** PR Review 行级评论响应 */\nexport interface PullReviewComment {\n id?: number;\n body?: string;\n path?: string;\n position?: number;\n original_position?: number;\n commit_id?: string;\n original_commit_id?: string;\n diff_hunk?: string;\n pull_request_review_id?: number;\n user?: {\n id?: number;\n login?: string;\n };\n /** 解决者,如果不为 null 表示评论已被标记为已解决 */\n resolver?: {\n id?: number;\n login?: string;\n } | null;\n created_at?: string;\n updated_at?: string;\n html_url?: string;\n}\n\n/** PR Review Thread 已解决信息 */\nexport interface ResolvedThread {\n /** 文件路径 */\n path?: string;\n /** 行号(新文件中的行号) */\n line?: number;\n /** 解决者 */\n resolvedBy?: {\n id?: number;\n login?: string;\n } | null;\n /** 评论内容(用于提取 issue key 精确匹配) */\n body?: string;\n}\n\n/** 用户信息 */\nexport interface User {\n id?: number;\n login?: string;\n full_name?: string;\n email?: string;\n avatar_url?: string;\n}\n\n/** 仓库目录/文件条目 */\nexport interface RepositoryContent {\n /** 文件名 */\n name: string;\n /** 文件路径 */\n path: string;\n /** 类型:file 或 dir */\n type: \"file\" | \"dir\";\n /** 文件大小(字节) */\n size?: number;\n /** 下载 URL */\n download_url?: string;\n}\n\n/** 远程仓库引用(解析自浏览器 URL) */\nexport interface RemoteRepoRef {\n /** 仓库所有者 */\n owner: string;\n /** 仓库名称 */\n repo: string;\n /** 子目录路径(空字符串表示根目录) */\n path: string;\n /** 分支/标签(undefined 表示默认分支) */\n ref?: string;\n /** 来源平台类型 */\n provider: GitProviderType;\n /** 原始服务器 URL(如 https://git.bjxgj.com) */\n serverUrl: string;\n}\n\n/** 评论/Issue 的 Reaction(表情符号反应) */\nexport interface Reaction {\n /** 添加 reaction 的用户 */\n user?: {\n id?: number;\n login?: string;\n };\n /** reaction 内容,如 +1, -1, laugh, hooray, confused, heart, rocket, eyes */\n content?: string;\n /** 创建时间 */\n created_at?: string;\n}\n","import type { GitProviderType } from \"./types\";\n\n/** 环境检测结果 */\nexport interface DetectedProviderInfo {\n /** 检测到的 provider 类型 */\n provider: GitProviderType;\n /** 检测到的服务器 URL */\n serverUrl: string;\n /** 检测到的 API Token */\n token: string;\n /** 检测来源说明 */\n source: string;\n}\n\n/**\n * 从环境变量自动检测 Git Provider 类型和配置\n *\n * 检测优先级:\n * 1. 显式指定 `GIT_PROVIDER_TYPE` 环境变量(最高优先级)\n * 2. 存在 `GITEA_TOKEN` → Gitea\n * 3. 存在 `GITLAB_TOKEN` 或 `CI_JOB_TOKEN`(GitLab CI)→ GitLab\n * 4. 存在 `GITHUB_TOKEN` → GitHub\n * 5. 默认 → GitHub\n */\nexport function detectProvider(\n env: Record<string, string | undefined> = process.env,\n): DetectedProviderInfo {\n const explicit = env.GIT_PROVIDER_TYPE as GitProviderType | undefined;\n if (explicit && isValidProvider(explicit)) {\n return buildResult(explicit, env, \"GIT_PROVIDER_TYPE 环境变量\");\n }\n if (env.GITEA_TOKEN) {\n return buildResult(\"gitea\", env, \"检测到 GITEA_TOKEN\");\n }\n if (env.GITLAB_TOKEN || env.CI_JOB_TOKEN) {\n return buildResult(\n \"gitlab\",\n env,\n env.GITLAB_TOKEN ? \"检测到 GITLAB_TOKEN\" : \"检测到 CI_JOB_TOKEN(GitLab CI)\",\n );\n }\n if (env.GITHUB_TOKEN) {\n return buildResult(\"github\", env, \"检测到 GITHUB_TOKEN\");\n }\n return buildResult(\"github\", env, \"默认\");\n}\n\n/** 检查是否为有效的 provider 类型 */\nfunction isValidProvider(value: string): value is GitProviderType {\n return value === \"gitea\" || value === \"github\" || value === \"gitlab\";\n}\n\n/** 根据 provider 类型从环境变量中提取 serverUrl 和 token */\nfunction buildResult(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n source: string,\n): DetectedProviderInfo {\n const serverUrl = resolveServerUrl(provider, env);\n const token = resolveToken(provider, env);\n return { provider, serverUrl, token, source };\n}\n\n/**\n * 解析服务器 URL\n * - 优先使用 GIT_PROVIDER_URL\n * - Gitea: GITEA_SERVER_URL > GITHUB_SERVER_URL\n * - GitHub: GITHUB_API_URL > GITEA_API_URL > 默认 https://api.github.com\n * - GitLab: CI_SERVER_URL > GITLAB_URL\n */\nfunction resolveServerUrl(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n): string {\n if (env.GIT_PROVIDER_URL) {\n return env.GIT_PROVIDER_URL;\n }\n if (provider === \"github\") {\n return env.GITHUB_API_URL || env.GITEA_API_URL || \"https://api.github.com\";\n }\n if (provider === \"gitlab\") {\n return env.CI_SERVER_URL || env.GITLAB_URL || \"https://gitlab.com\";\n }\n // Gitea: 优先 GITEA_SERVER_URL,其次从 GITHUB_SERVER_URL 推导\n if (env.GITEA_SERVER_URL) {\n return env.GITEA_SERVER_URL;\n }\n if (env.GITHUB_SERVER_URL) {\n return env.GITHUB_SERVER_URL;\n }\n return \"\";\n}\n\n/**\n * 解析 API Token\n * - 优先使用 GIT_PROVIDER_TOKEN\n * - Gitea: GITEA_TOKEN > GITHUB_TOKEN\n * - GitHub: GITHUB_TOKEN > GITEA_TOKEN\n * - GitLab: GITLAB_TOKEN > CI_JOB_TOKEN\n */\nfunction resolveToken(provider: GitProviderType, env: Record<string, string | undefined>): string {\n if (env.GIT_PROVIDER_TOKEN) {\n return env.GIT_PROVIDER_TOKEN;\n }\n if (provider === \"github\") {\n return env.GITHUB_TOKEN || env.GITEA_TOKEN || \"\";\n }\n if (provider === \"gitlab\") {\n return env.GITLAB_TOKEN || env.CI_JOB_TOKEN || \"\";\n }\n return env.GITEA_TOKEN || env.GITHUB_TOKEN || \"\";\n}\n","import type { RemoteRepoRef, GitProviderType } from \"./types\";\nimport { detectProvider } from \"./detect-provider\";\n\n/** 已知的 GitHub 域名 */\nconst GITHUB_HOSTS = new Set([\"github.com\", \"www.github.com\"]);\n\n/** 已知的 GitLab 域名 */\nconst GITLAB_HOSTS = new Set([\"gitlab.com\", \"www.gitlab.com\"]);\n\n/**\n * 解析浏览器中复制的仓库 URL 为结构化的仓库引用\n *\n * 支持的 URL 格式:\n * - Gitea 仓库:https://git.example.com/owner/repo\n * - Gitea 目录:https://git.example.com/owner/repo/src/branch/main/path/to/dir\n * - Gitea 标签:https://git.example.com/owner/repo/src/tag/v1.0/path/to/dir\n * - Gitea commit:https://git.example.com/owner/repo/src/commit/abc123/path/to/dir\n * - GitHub 仓库:https://github.com/owner/repo\n * - GitHub 目录:https://github.com/owner/repo/tree/main/path/to/dir\n * - GitLab 仓库:https://gitlab.com/owner/repo\n * - GitLab 目录:https://gitlab.com/owner/repo/-/tree/main/path/to/dir\n * - git+ssh URL:git+ssh://git@host/owner/repo.git\n * - SSH URL:git@host:owner/repo.git\n *\n * @returns 解析后的仓库引用,无法解析时返回 null\n */\nexport function parseRepoUrl(url: string): RemoteRepoRef | null {\n const trimmed = url.trim();\n if (!trimmed) return null;\n // SSH 格式: git@host:owner/repo.git\n if (trimmed.startsWith(\"git@\")) {\n return parseSshUrl(trimmed);\n }\n // git+ssh:// 格式\n if (trimmed.startsWith(\"git+ssh://\")) {\n return parseGitSshUrl(trimmed);\n }\n // HTTP(S) URL\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n return parseHttpUrl(trimmed);\n }\n return null;\n}\n\n/** 解析 HTTP(S) URL */\nfunction parseHttpUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const hostname = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `${parsed.protocol}//${parsed.host}`;\n const isGithub = isGithubHost(hostname);\n const isGitlab = isGitlabHost(hostname);\n const provider: GitProviderType = isGithub\n ? \"github\"\n : isGitlab\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n // 仓库根目录(只有 owner/repo)\n if (segments.length === 2) {\n return { owner, repo, path: \"\", provider, serverUrl };\n }\n // GitHub: /owner/repo/tree/branch/path...\n if (isGithub && segments[2] === \"tree\" && segments.length >= 4) {\n const ref = segments[3];\n const path = segments.slice(4).join(\"/\");\n return { owner, repo, path, ref, provider, serverUrl };\n }\n // GitLab: /owner/repo/-/tree/branch/path...\n if (segments[2] === \"-\" && segments[3] === \"tree\" && segments.length >= 5) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: isGitlab ? \"gitlab\" : provider, serverUrl };\n }\n // Gitea: /owner/repo/src/branch/<branch>/path...\n // /owner/repo/src/tag/<tag>/path...\n // /owner/repo/src/commit/<sha>/path...\n if (segments[2] === \"src\" && segments.length >= 4) {\n const refType = segments[3]; // \"branch\", \"tag\", \"commit\"\n if (\n (refType === \"branch\" || refType === \"tag\" || refType === \"commit\") &&\n segments.length >= 5\n ) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: \"gitea\", serverUrl };\n }\n }\n // 无法识别的子路径,当作仓库根目录\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git@host:owner/repo.git 格式 */\nfunction parseSshUrl(url: string): RemoteRepoRef | null {\n const match = url.match(/^git@([^:]+):(.+?)(?:\\.git)?$/);\n if (!match) return null;\n const host = match[1];\n const pathPart = match[2];\n const segments = pathPart.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1];\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git+ssh://git@host/owner/repo.git 格式 */\nfunction parseGitSshUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url.replace(\"git+ssh://\", \"ssh://\"));\n } catch {\n return null;\n }\n const host = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 判断是否为 GitHub 域名 */\nfunction isGithubHost(hostname: string): boolean {\n return GITHUB_HOSTS.has(hostname) || hostname.endsWith(\".github.com\");\n}\n\n/** 判断是否为 GitLab 域名 */\nfunction isGitlabHost(hostname: string): boolean {\n return GITLAB_HOSTS.has(hostname) || hostname.endsWith(\".gitlab.com\");\n}\n\n/** 根据服务器 URL 检测 provider 类型(非 GitHub/GitLab 默认为 Gitea) */\nfunction detectProviderForHost(serverUrl: string): GitProviderType {\n const detected = detectProvider({ GIT_PROVIDER_URL: serverUrl });\n return detected.provider;\n}\n","import type { GitDiffFile } from \"./git-sdk.types\";\n\nconst GIT_STATUS_MAP: Record<string, string> = {\n A: \"added\",\n M: \"modified\",\n D: \"deleted\",\n R: \"renamed\",\n C: \"copied\",\n};\n\nexport function mapGitStatus(status: string): string {\n return GIT_STATUS_MAP[status] || \"modified\";\n}\n\nexport function parseChangedLinesFromPatch(patch?: string): Set<number> {\n const changedLines = new Set<number>();\n if (!patch) return changedLines;\n\n const lines = patch.split(\"\\n\");\n let currentLine = 0;\n\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n changedLines.add(currentLine);\n currentLine++;\n } else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n // 删除行,不增加 currentLine\n } else if (!line.startsWith(\"\\\\\")) {\n currentLine++;\n }\n }\n\n return changedLines;\n}\n\n/**\n * 表示一个 diff hunk 的行号变更信息\n */\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n}\n\n/**\n * 从 patch 中解析所有 hunk 信息\n */\nexport function parseHunksFromPatch(patch?: string): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n if (!patch) return hunks;\n\n const lines = patch.split(\"\\n\");\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (hunkMatch) {\n hunks.push({\n oldStart: parseInt(hunkMatch[1], 10),\n oldCount: parseInt(hunkMatch[2] ?? \"1\", 10),\n newStart: parseInt(hunkMatch[3], 10),\n newCount: parseInt(hunkMatch[4] ?? \"1\", 10),\n });\n }\n }\n return hunks;\n}\n\n/**\n * 根据 diff hunks 计算旧行号对应的新行号\n * @param oldLine 旧文件中的行号\n * @param hunks diff hunk 列表\n * @returns 新行号,如果该行被删除则返回 null\n */\nexport function calculateNewLineNumber(oldLine: number, hunks: DiffHunk[]): number | null {\n let offset = 0;\n\n for (const hunk of hunks) {\n const oldEnd = hunk.oldStart + hunk.oldCount - 1;\n\n if (oldLine < hunk.oldStart) {\n // 行号在这个 hunk 之前,应用之前累积的偏移\n break;\n }\n\n if (oldLine >= hunk.oldStart && oldLine <= oldEnd) {\n // 行号在这个 hunk 的删除范围内\n // 需要检查这一行是否被删除\n // 简化处理:如果 hunk 有删除(oldCount > 0),且行在范围内,认为可能被修改\n // 返回对应的新位置(基于 hunk 的起始位置)\n const lineOffsetInHunk = oldLine - hunk.oldStart;\n if (lineOffsetInHunk < hunk.newCount) {\n // 行仍然存在(可能被修改)\n return hunk.newStart + lineOffsetInHunk + offset;\n } else {\n // 行被删除\n return null;\n }\n }\n\n // 计算这个 hunk 带来的偏移\n offset += hunk.newCount - hunk.oldCount;\n }\n\n // 行号在所有 hunk 之后,应用总偏移\n return oldLine + offset;\n}\n\n/**\n * 批量计算文件中多个旧行号对应的新行号\n * @param oldLines 旧行号数组\n * @param patch diff patch 文本\n * @returns Map<旧行号, 新行号>,被删除的行不在结果中\n */\nexport function calculateLineOffsets(\n oldLines: number[],\n patch?: string,\n): Map<number, number | null> {\n const result = new Map<number, number | null>();\n const hunks = parseHunksFromPatch(patch);\n\n for (const oldLine of oldLines) {\n result.set(oldLine, calculateNewLineNumber(oldLine, hunks));\n }\n\n return result;\n}\n\nexport function parseDiffText(diffText: string): GitDiffFile[] {\n const files: GitDiffFile[] = [];\n const fileDiffs = diffText.split(/^diff --git /m).filter(Boolean);\n\n for (const fileDiff of fileDiffs) {\n const headerMatch = fileDiff.match(/^a\\/(.+?) b\\/(.+?)[\\r\\n]/);\n if (!headerMatch) continue;\n\n const filename = headerMatch[2];\n const patchStart = fileDiff.indexOf(\"@@\");\n if (patchStart === -1) continue;\n\n const patch = fileDiff.slice(patchStart);\n files.push({ filename, patch });\n }\n\n return files;\n}\n","import { execSync } from \"child_process\";\nimport { parseDiffText } from \"../../git-sdk/git-sdk-diff.utils\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * Gitea 平台适配器\n */\nexport class GiteaAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v1${path}`;\n const headers: Record<string, string> = {\n Authorization: `token ${this.token}`,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.request<Repository>(\"GET\", `/repos/${owner}/${repo}`);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.request<Branch>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.request<BranchProtection[]>(\"GET\", `/repos/${owner}/${repo}/branch_protections`);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"GET\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"POST\",\n `/repos/${owner}/${repo}/branch_protections`,\n options,\n );\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"PATCH\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n options,\n );\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const protectionOptions = hasWhitelist\n ? {\n enable_push: true,\n enable_push_whitelist: true,\n push_whitelist_usernames: pushWhitelistUsernames,\n }\n : { enable_push: false };\n if (existing) {\n return this.editBranchProtection(\n owner,\n repo,\n existing.rule_name || branch,\n protectionOptions,\n );\n } else {\n return this.createBranchProtection(owner, repo, {\n rule_name: branch,\n branch_name: branch,\n ...protectionOptions,\n });\n }\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n await this.deleteBranchProtection(owner, repo, existing.rule_name || branch);\n return existing;\n }\n return null;\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n const listResult = execSync(\n `curl -s -X GET \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n const protections = JSON.parse(listResult) as Array<{\n rule_name?: string;\n branch_name?: string;\n }>;\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n const ruleName = existing.rule_name || branch;\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections/${ruleName}\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${ruleName}`);\n } else {\n console.log(`✅ 分支本身没有保护规则,无需解锁`);\n }\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.request<PullRequest>(\"GET\", `/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.request<PullRequest>(\"PATCH\", `/repos/${owner}/${repo}/pulls/${index}`, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n return this.request<PullRequest[]>(\"GET\", `/repos/${owner}/${repo}/pulls${query}`);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"limit\", String(limit));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", options.sort);\n if (options?.milestone) params.set(\"milestone\", String(options.milestone));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const prs = await this.request<PullRequest[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!prs || prs.length === 0) break;\n allPRs.push(...prs);\n if (prs.length < limit) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const commits = await this.request<PullRequestCommit[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&limit=${limit}`,\n );\n if (!commits || commits.length === 0) break;\n allCommits.push(...commits);\n if (commits.length < limit) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const files = await this.request<ChangedFile[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files`,\n );\n const needsPatch = files.some((f) => !f.patch && f.status !== \"deleted\");\n if (!needsPatch) {\n return files;\n }\n try {\n const diffText = await this.getPullRequestDiff(owner, repo, index);\n const diffFiles = parseDiffText(diffText);\n const patchMap = new Map(diffFiles.map((f) => [f.filename, f.patch]));\n for (const file of files) {\n if (!file.patch && file.filename) {\n file.patch = patchMap.get(file.filename);\n }\n }\n } catch (error) {\n console.warn(`警告: 无法获取 PR diff 来填充 patch 字段:`, error);\n }\n return files;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/pulls/${index}.diff`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.request<CommitInfo>(\"GET\", `/repos/${owner}/${repo}/git/commits/${sha}`);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(\n `${this.baseUrl}/api/v1/repos/${owner}/${repo}/compare/${baseSha}...${headSha}.diff`,\n );\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/git/commits/${sha}.diff`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const url = `${this.baseUrl}/api/v1/repos/${owner}/${repo}/raw/${encodeURIComponent(filepath)}${query}`;\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${encodeURIComponent(path)}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<\n Array<{ name: string; path: string; type: string; size: number; download_url?: string }>\n >(\"GET\", `/repos/${owner}/${repo}/contents${encodedPath}${query}`);\n return result.map((item) => ({\n name: item.name,\n path: item.path,\n type: item.type === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size,\n download_url: item.download_url,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const body: Record<string, unknown> = {\n title: options.title,\n body: options.body,\n assignees: options.assignees,\n milestone: options.milestone,\n due_date: options.due_date,\n };\n if (options.labels?.length) {\n body.labels = await this.resolveLabelIds(owner, repo, options.labels);\n }\n return this.request<Issue>(\"POST\", `/repos/${owner}/${repo}/issues`, body);\n }\n\n /**\n * 将标签名称列表转换为 Gitea label ID 列表\n */\n protected async resolveLabelIds(owner: string, repo: string, names: string[]): Promise<number[]> {\n const allLabels = await this.request<Array<{ id: number; name: string }>>(\n \"GET\",\n `/repos/${owner}/${repo}/labels`,\n );\n const nameToId = new Map(allLabels.map((l) => [l.name.toLowerCase(), l.id]));\n const ids: number[] = [];\n for (const name of names) {\n const id = nameToId.get(name.toLowerCase());\n if (id !== undefined) {\n ids.push(id);\n }\n }\n return ids;\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.request<IssueComment[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/comments`);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n options,\n );\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.request<PullReview>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n options,\n );\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const allReviews: PullReview[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const reviews = await this.request<PullReview[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews?page=${page}&limit=${limit}`,\n );\n if (!reviews || reviews.length === 0) break;\n allReviews.push(...reviews);\n if (reviews.length < limit) break;\n page++;\n }\n return allReviews;\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // Gitea 不支持更新 review,使用删除+创建的方式模拟\n await this.deletePullReview(owner, repo, index, reviewId);\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.request<PullReviewComment[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n const result: ResolvedThread[] = [];\n try {\n const reviews = await this.listPullReviews(owner, repo, index);\n for (const review of reviews) {\n if (!review.id) continue;\n const comments = await this.listPullReviewComments(owner, repo, index, review.id);\n for (const comment of comments) {\n if (!comment.resolver) continue;\n result.push({\n path: comment.path,\n line: comment.position,\n resolvedBy: {\n id: comment.resolver.id,\n login: comment.resolver.login,\n },\n body: comment.body,\n });\n }\n }\n } catch {\n // 获取失败时返回空数组,不影响主流程\n }\n return result;\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n // Gitea: PR review comment reactions 使用与 issue comment 相同的路径\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.request<Reaction[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/reactions`);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"limit\", String(limit));\n const result = await this.request<{ data: User[] }>(\n \"GET\",\n `/users/search?${params.toString()}`,\n );\n return result.data || [];\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.request<User[]>(\"GET\", `/teams/${teamId}/members`);\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n DIFF_SIDE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/** GraphQL review thread 节点类型 */\ninterface GraphQLReviewThread {\n isResolved: boolean;\n resolvedBy?: { login: string; databaseId: number } | null;\n path?: string | null;\n line?: number | null;\n comments: { nodes: Array<{ databaseId: number; body?: string }> };\n}\n\n/**\n * GitHub 平台适配器\n */\nexport class GithubAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github+json\",\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async requestGraphQL<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const graphqlUrl =\n this.baseUrl.replace(/\\/v3\\/?$/, \"\").replace(/\\/api\\/v3\\/?$/, \"\") + \"/graphql\";\n const response = await fetch(graphqlUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ query, variables }),\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub GraphQL error: ${response.status} - ${errorText}`);\n }\n const json = (await response.json()) as { data: T; errors?: unknown[] };\n if (json.errors) {\n throw new Error(`GitHub GraphQL errors: ${JSON.stringify(json.errors)}`);\n }\n return json.data;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github.v3.diff\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const result = await this.request<Record<string, unknown>>(\"GET\", `/repos/${owner}/${repo}`);\n return this.mapRepository(result);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n return this.mapBranch(result);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n try {\n const rules = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/rules/rulesets`,\n );\n return rules.map((rule) => this.mapRulesetToProtection(rule));\n } catch {\n return [];\n }\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const branchName = options.branch_name || options.rule_name || \"\";\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branchName)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branchName);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const body: Record<string, unknown> = {\n required_status_checks: null,\n enforce_admins: true,\n required_pull_request_reviews: null,\n restrictions: hasWhitelist\n ? { users: pushWhitelistUsernames, teams: [] }\n : { users: [], teams: [] },\n };\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branch);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/repos/${owner}/${repo}/branches/${branch}/protection\" -H \"Authorization: Bearer ${this.token}\" -H \"Accept: application/vnd.github+json\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n );\n return this.mapPullRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n options,\n );\n return this.mapPullRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls${query}`,\n );\n return results.map((pr) => this.mapPullRequest(pr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", this.mapSortParam(options.sort));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allPRs.push(...results.map((pr) => this.mapPullRequest(pr)));\n if (results.length < perPage) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((f) => this.mapChangedFile(f)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/commits/${sha}`,\n );\n const commit = this.mapCommit(result);\n const files = ((result.files as Array<Record<string, unknown>>) || []).map((f) =>\n this.mapChangedFile(f),\n );\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/compare/${baseSha}...${headSha}`);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/commits/${sha}`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const result = await this.request<{ content?: string; encoding?: string }>(\n \"GET\",\n `/repos/${owner}/${repo}/contents/${filepath}${query}`,\n );\n if (result.content && result.encoding === \"base64\") {\n return Buffer.from(result.content, \"base64\").toString(\"utf-8\");\n }\n return result.content || \"\";\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${path}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/contents${encodedPath}${query}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size as number,\n download_url: item.download_url as string,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const body: Record<string, unknown> = {\n title: options.title,\n body: options.body,\n assignees: options.assignees,\n labels: options.labels,\n milestone: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n );\n return results.map((c) => this.mapIssueComment(c));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n { body: options.body },\n );\n return this.mapIssueComment(result);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n return this.mapIssueComment(result);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const body: Record<string, unknown> = {\n event: this.mapReviewEvent(options.event),\n body: options.body,\n commit_id: options.commit_id,\n };\n if (options.comments?.length) {\n body.comments = options.comments.map((c) => ({\n path: c.path,\n body: c.body,\n line: c.new_position,\n side: DIFF_SIDE.RIGHT,\n }));\n }\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n body,\n );\n return this.mapPullReview(result);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n );\n return results.map((r) => this.mapPullReview(r));\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // GitHub 的 updatePullReview 只能更新 PENDING 状态的 review\n // 已提交的 review 无法更新,所以使用删除+创建的方式\n try {\n await this.deletePullReview(owner, repo, index, reviewId);\n } catch {\n // 已提交的 review 无法删除,忽略错误\n }\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n const comments = results.map((c) => this.mapPullReviewComment(c));\n // 通过 GraphQL 补充 resolved 状态\n try {\n const resolvedMap = await this.fetchResolvedThreads(owner, repo, index);\n for (const comment of comments) {\n if (comment.id && resolvedMap.has(comment.id)) {\n comment.resolver = resolvedMap.get(comment.id) ?? null;\n }\n }\n } catch {\n // GraphQL 查询失败不影响主流程\n }\n return comments;\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"per_page\", String(limit));\n const result = await this.request<{ items: Array<Record<string, unknown>> }>(\n \"GET\",\n `/search/users?${params.toString()}`,\n );\n return (result.items || []).map((u) => this.mapUser(u));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/teams/${teamId}/members`,\n );\n return results.map((u) => this.mapUser(u));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapRepository(data: Record<string, unknown>): Repository {\n const owner = data.owner as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n owner: owner\n ? {\n id: owner.id as number,\n login: owner.login as string,\n full_name: owner.full_name as string,\n }\n : undefined,\n name: data.name as string,\n full_name: data.full_name as string,\n default_branch: data.default_branch as string,\n };\n }\n\n protected mapBranch(data: Record<string, unknown>): Branch {\n const commit = data.commit as Record<string, unknown> | undefined;\n const commitObj = commit?.commit as Record<string, unknown> | undefined;\n return {\n name: data.name as string,\n protected: data.protected as boolean,\n commit: commit\n ? {\n id: commit.sha as string,\n message: commitObj?.message as string,\n }\n : undefined,\n };\n }\n\n protected mapPullRequest(data: Record<string, unknown>): PullRequest {\n const head = data.head as Record<string, unknown> | undefined;\n const base = data.base as Record<string, unknown> | undefined;\n const user = data.user as Record<string, unknown> | undefined;\n const reviewers = data.requested_reviewers as Array<Record<string, unknown>> | undefined;\n const teams = data.requested_teams as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n head: head\n ? {\n ref: head.ref as string,\n sha: head.sha as string,\n repo: head.repo ? this.mapRepository(head.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n base: base\n ? {\n ref: base.ref as string,\n sha: base.sha as string,\n repo: base.repo ? this.mapRepository(base.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.login as string,\n })),\n requested_reviewers_teams: teams?.map((t) => ({\n id: t.id as number,\n name: t.name as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapCommit(data: Record<string, unknown>): PullRequestCommit {\n const commit = data.commit as Record<string, unknown> | undefined;\n const author = commit?.author as Record<string, unknown> | undefined;\n const ghAuthor = data.author as Record<string, unknown> | undefined;\n const ghCommitter = data.committer as Record<string, unknown> | undefined;\n return {\n sha: data.sha as string,\n commit: commit\n ? {\n message: commit.message as string,\n author: author\n ? {\n name: author.name as string,\n email: author.email as string,\n date: author.date as string,\n }\n : undefined,\n }\n : undefined,\n author: ghAuthor ? { id: ghAuthor.id as number, login: ghAuthor.login as string } : undefined,\n committer: ghCommitter\n ? { id: ghCommitter.id as number, login: ghCommitter.login as string }\n : undefined,\n };\n }\n\n protected mapChangedFile(data: Record<string, unknown>): ChangedFile {\n return {\n filename: data.filename as string,\n status: data.status as string,\n additions: data.additions as number,\n deletions: data.deletions as number,\n changes: data.changes as number,\n patch: data.patch as string,\n raw_url: data.raw_url as string,\n contents_url: data.contents_url as string,\n };\n }\n\n protected mapIssueComment(data: Record<string, unknown>): IssueComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const user = data.user as Record<string, unknown> | undefined;\n const labels = data.labels as Array<Record<string, unknown>> | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n labels: labels?.map((l) => ({\n id: l.id as number,\n name: l.name as string,\n color: l.color as string,\n })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.login as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapPullReview(data: Record<string, unknown>): PullReview {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.submitted_at as string,\n updated_at: data.submitted_at as string,\n commit_id: data.commit_id as string,\n };\n }\n\n /**\n * 通过 GraphQL 查询 PR 的 review threads resolved 状态\n * 返回 Map<commentId, resolver>(用于 listPullReviewComments 内部补充 resolver)\n */\n protected async fetchResolvedThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<Map<number, { id?: number; login?: string } | null>> {\n const threads = await this.queryReviewThreads(owner, repo, prNumber);\n const resolvedMap = new Map<number, { id?: number; login?: string } | null>();\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n const firstComment = thread.comments.nodes[0];\n if (!firstComment?.databaseId) continue;\n resolvedMap.set(\n firstComment.databaseId,\n thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n );\n }\n return resolvedMap;\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n const threads = await this.queryReviewThreads(owner, repo, index);\n const result: ResolvedThread[] = [];\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n const firstComment = thread.comments.nodes[0];\n result.push({\n path: thread.path ?? undefined,\n line: thread.line ?? undefined,\n resolvedBy: thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n body: firstComment?.body,\n });\n }\n return result;\n }\n\n /**\n * GraphQL 查询 PR 的所有 review threads\n */\n protected async queryReviewThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<GraphQLReviewThread[]> {\n const QUERY = `\n query($owner: String!, $repo: String!, $prNumber: Int!) {\n repository(owner: $owner, name: $repo) {\n pullRequest(number: $prNumber) {\n reviewThreads(first: 100) {\n nodes {\n isResolved\n resolvedBy { login databaseId }\n path\n line\n comments(first: 1) {\n nodes { databaseId body }\n }\n }\n }\n }\n }\n }\n `;\n interface GraphQLResult {\n repository: {\n pullRequest: {\n reviewThreads: {\n nodes: GraphQLReviewThread[];\n };\n };\n };\n }\n const data = await this.requestGraphQL<GraphQLResult>(QUERY, {\n owner,\n repo,\n prNumber,\n });\n return data.repository.pullRequest.reviewThreads.nodes;\n }\n\n protected mapPullReviewComment(data: Record<string, unknown>): PullReviewComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n path: data.path as string,\n position: data.position as number,\n original_position: data.original_position as number,\n commit_id: data.commit_id as string,\n original_commit_id: data.original_commit_id as string,\n diff_hunk: data.diff_hunk as string,\n pull_request_review_id: data.pull_request_review_id as number,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapReaction(data: Record<string, unknown>): Reaction {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n content: data.content as string,\n created_at: data.created_at as string,\n };\n }\n\n protected mapUser(data: Record<string, unknown>): User {\n return {\n id: data.id as number,\n login: data.login as string,\n full_name: data.name as string,\n email: data.email as string,\n avatar_url: data.avatar_url as string,\n };\n }\n\n protected mapGithubProtection(\n data: Record<string, unknown>,\n branchName: string,\n ): BranchProtection {\n const requiredReviews = data.required_pull_request_reviews as\n | Record<string, unknown>\n | undefined;\n return {\n branch_name: branchName,\n rule_name: branchName,\n required_approvals: requiredReviews?.required_approving_review_count as number,\n dismiss_stale_approvals: requiredReviews?.dismiss_stale_reviews as boolean,\n enable_push: true,\n };\n }\n\n protected mapRulesetToProtection(data: Record<string, unknown>): BranchProtection {\n return {\n rule_name: data.name as string,\n branch_name: data.name as string,\n };\n }\n\n protected buildGithubProtectionBody(\n options: CreateBranchProtectionOption | EditBranchProtectionOption,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n required_status_checks: options.enable_status_check\n ? { strict: true, contexts: options.status_check_contexts || [] }\n : null,\n enforce_admins: options.block_admin_merge_override ?? false,\n required_pull_request_reviews: options.required_approvals\n ? {\n required_approving_review_count: options.required_approvals,\n dismiss_stale_reviews: options.dismiss_stale_approvals ?? false,\n }\n : null,\n restrictions: options.enable_push_whitelist\n ? {\n users: options.push_whitelist_usernames || [],\n teams: options.push_whitelist_teams || [],\n }\n : null,\n };\n return body;\n }\n\n protected mapReviewEvent(event?: string): string {\n const eventMap: Record<string, string> = {\n [REVIEW_STATE.APPROVE]: REVIEW_STATE.APPROVE,\n [REVIEW_STATE.REQUEST_CHANGES]: REVIEW_STATE.REQUEST_CHANGES,\n [REVIEW_STATE.COMMENT]: REVIEW_STATE.COMMENT,\n [REVIEW_STATE.PENDING]: REVIEW_STATE.PENDING,\n };\n return event ? eventMap[event] || event : REVIEW_STATE.COMMENT;\n }\n\n protected mapSortParam(sort: string): string {\n const sortMap: Record<string, string> = {\n oldest: \"created\",\n recentupdate: \"updated\",\n leastupdate: \"updated\",\n mostcomment: \"comments\",\n leastcomment: \"comments\",\n };\n return sortMap[sort] || \"created\";\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * GitLab 平台适配器\n *\n * GitLab API 特点:\n * - 使用 PRIVATE-TOKEN 认证\n * - 项目通过 URL-encoded path(owner/repo)标识\n * - Merge Request(MR)对应 Pull Request\n * - Notes 对应 Comments/Reviews\n * - API 前缀 /api/v4\n */\nexport class GitlabAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n /** 将 owner/repo 编码为 GitLab 项目路径 */\n protected encodeProject(owner: string, repo: string): string {\n return encodeURIComponent(`${owner}/${repo}`);\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const headers: Record<string, string> = {\n \"PRIVATE-TOKEN\": this.token,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(path: string): Promise<string> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\"GET\", `/projects/${project}`);\n const namespace = result.namespace as Record<string, unknown> | undefined;\n return {\n id: result.id as number,\n name: result.name as string,\n full_name: result.path_with_namespace as string,\n default_branch: result.default_branch as string,\n owner: namespace\n ? {\n id: namespace.id as number,\n login: namespace.path as string,\n full_name: namespace.name as string,\n }\n : undefined,\n };\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/branches/${encodeURIComponent(branch)}`,\n );\n const commit = result.commit as Record<string, unknown> | undefined;\n return {\n name: result.name as string,\n protected: result.protected as boolean,\n commit: commit ? { id: commit.id as string, message: commit.message as string } : undefined,\n };\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/protected_branches`,\n );\n return results.map((p) => this.mapProtection(p));\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n return this.mapProtection(result);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const branchName = options.branch_name || options.rule_name || \"\";\n const body: Record<string, unknown> = {\n name: branchName,\n push_access_level: options.enable_push ? 30 : 0, // 30=Developer, 0=No one\n merge_access_level: 30,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/protected_branches`,\n body,\n );\n return this.mapProtection(result);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n // GitLab 不支持直接编辑,需要先删除再创建\n await this.deleteBranchProtection(owner, repo, name);\n return this.createBranchProtection(owner, repo, {\n branch_name: name,\n rule_name: name,\n ...options,\n });\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n // 先尝试删除已有保护\n try {\n await this.deleteBranchProtection(owner, repo, branch);\n } catch {\n // 不存在时忽略\n }\n const pushLevel = options?.pushWhitelistUsernames?.length ? 30 : 0;\n return this.createBranchProtection(owner, repo, {\n branch_name: branch,\n rule_name: branch,\n enable_push: pushLevel > 0,\n });\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n const project = this.encodeProject(owner, repo);\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v4/projects/${project}/protected_branches/${encodeURIComponent(branch)}\" -H \"PRIVATE-TOKEN: ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Merge Request(对应 Pull Request) ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}`,\n );\n return this.mapMergeRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {};\n if (options.title) body.title = options.title;\n if (options.body !== undefined) body.description = options.body;\n if (options.state) body.state_event = options.state === \"closed\" ? \"close\" : \"reopen\";\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}`,\n body,\n );\n return this.mapMergeRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const glState = this.mapStateParam(state);\n const query = glState ? `?state=${glState}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests${query}`,\n );\n return results.map((mr) => this.mapMergeRequest(mr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const allMRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", this.mapStateParam(options.state) || \"all\");\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allMRs.push(...results.map((mr) => this.mapMergeRequest(mr)));\n if (results.length < perPage) break;\n page++;\n }\n return allMRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const project = this.encodeProject(owner, repo);\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapGitlabCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const project = this.encodeProject(owner, repo);\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/diffs?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((d) => this.mapDiffToChangedFile(d)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n const project = this.encodeProject(owner, repo);\n return this.fetchText(`/projects/${project}/merge_requests/${index}/raw_diffs`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}`,\n );\n // 获取 commit 的 diff 来填充 files\n let files: ChangedFile[] = [];\n try {\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n files = diffs.map((d) => this.mapDiffToChangedFile(d));\n } catch {\n // diff 获取失败时忽略\n }\n const commit = this.mapGitlabCommit(result);\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<{ diffs: Array<Record<string, unknown>> }>(\n \"GET\",\n `/projects/${project}/repository/compare?from=${encodeURIComponent(baseSha)}&to=${encodeURIComponent(headSha)}`,\n );\n // 将 diffs 拼接为 unified diff 文本\n return (result.diffs || [])\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n return diffs\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const encodedPath = encodeURIComponent(filepath);\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const url = `${this.baseUrl}/api/v4/projects/${project}/repository/files/${encodedPath}/raw${query}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(\n `GitLab API error: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n return response.text();\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const project = this.encodeProject(owner, repo);\n const params = new URLSearchParams();\n if (path) params.set(\"path\", path);\n if (ref) params.set(\"ref\", ref);\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/tree?${params.toString()}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"tree\" ? (\"dir\" as const) : (\"file\" as const),\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {\n title: options.title,\n description: options.body,\n assignee_ids: options.assignees,\n labels: options.labels?.join(\",\"),\n milestone_id: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab: MR notes 作为 issue comments\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results.filter((n) => !(n.system as boolean)).map((n) => this.mapNote(n));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n return this.mapNote(result);\n }\n\n async updateIssueComment(\n _owner: string,\n _repo: string,\n _commentId: number,\n _body: string,\n ): Promise<IssueComment> {\n // GitLab 更新 note 需要 noteable_iid,接口签名不含此信息\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 更新评论,请使用 createIssueComment 替代\");\n }\n\n async deleteIssueComment(_owner: string, _repo: string, _commentId: number): Promise<void> {\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 删除评论\");\n }\n\n // ============ MR Review(对应 PR Review) ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 note 模拟\n // 如果有 body,创建一个总体评论\n if (options.body) {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n const note = this.mapNote(result);\n return {\n id: note.id,\n body: note.body,\n state: options.event || REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n }\n // 如果有行级评论,逐个创建\n if (options.comments?.length) {\n for (const comment of options.comments) {\n await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: `**${comment.path}** (line ${comment.new_position})\\n\\n${comment.body}` },\n );\n }\n }\n // 如果是 APPROVE 事件,调用 approve API\n if (options.event === REVIEW_STATE.APPROVE) {\n await this.request<void>(\"POST\", `/projects/${project}/merge_requests/${index}/approve`);\n }\n return {\n id: 0,\n body: options.body || \"\",\n state: options.event || REVIEW_STATE.COMMENT,\n };\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 notes 模拟\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !(n.system as boolean))\n .map((n) => {\n const note = this.mapNote(n);\n return {\n id: note.id,\n body: note.body,\n state: REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n });\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n { body },\n );\n return {\n id: result.id as number,\n body: result.body as string,\n state: REVIEW_STATE.COMMENT,\n user: result.author\n ? {\n id: (result.author as Record<string, unknown>).id as number,\n login: (result.author as Record<string, unknown>).username as string,\n }\n : undefined,\n };\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n _reviewId: number,\n ): Promise<PullReviewComment[]> {\n // GitLab 没有 review 下的 comments 概念,返回所有 diff notes\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !!(n.position as Record<string, unknown> | undefined))\n .map((n) => {\n const user = (n.author as Record<string, unknown>) || {};\n const position = (n.position as Record<string, unknown>) || {};\n return {\n id: n.id as number,\n body: n.body as string,\n path: (position.new_path || position.old_path) as string,\n position: position.new_line as number,\n original_position: position.old_line as number,\n user: { id: user.id as number, login: user.username as string },\n created_at: n.created_at as string,\n updated_at: n.updated_at as string,\n };\n });\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n // GitLab: 删除 MR note\n const project = this.encodeProject(owner, repo);\n // GitLab 删除 note 需要 merge_request_iid,但此处只有 commentId(note_id)\n // 使用全局 note 删除不可行,需要通过其他方式获取 MR iid\n // 暂时忽略,GitLab 场景下行级评论删除不常用\n console.warn(\n `⚠️ GitLab 暂不支持删除单条 review comment (id: ${commentId}, project: ${project})`,\n );\n }\n\n async listResolvedThreads(): Promise<ResolvedThread[]> {\n return [];\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getPullReviewCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const project = this.encodeProject(owner, repo);\n try {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/award_emoji`,\n );\n return results.map((r) => {\n const user = r.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.username as string } : undefined,\n content: r.name as string,\n created_at: r.created_at as string,\n };\n });\n } catch {\n return [];\n }\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"search\", query);\n params.set(\"per_page\", String(limit));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/users?${params.toString()}`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n email: u.email as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n // GitLab: group members\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/groups/${teamId}/members`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapProtection(data: Record<string, unknown>): BranchProtection {\n const pushAccess = data.push_access_levels as Array<Record<string, unknown>> | undefined;\n return {\n branch_name: data.name as string,\n rule_name: data.name as string,\n enable_push: pushAccess ? pushAccess.some((l) => (l.access_level as number) > 0) : false,\n };\n }\n\n protected mapMergeRequest(data: Record<string, unknown>): PullRequest {\n const author = data.author as Record<string, unknown> | undefined;\n const reviewers = data.reviewers as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n head: {\n ref: data.source_branch as string,\n sha: data.sha as string,\n },\n base: {\n ref: data.target_branch as string,\n sha: data.diff_refs\n ? ((data.diff_refs as Record<string, unknown>).base_sha as string)\n : undefined,\n },\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.username as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapGitlabCommit(data: Record<string, unknown>): PullRequestCommit {\n return {\n sha: (data.id || data.sha) as string,\n commit: {\n message: (data.message || data.title) as string,\n author: {\n name: data.author_name as string,\n email: data.author_email as string,\n date: (data.authored_date || data.created_at) as string,\n },\n },\n author: data.author_name ? { login: data.author_name as string } : undefined,\n committer: data.committer_name ? { login: data.committer_name as string } : undefined,\n };\n }\n\n protected mapDiffToChangedFile(data: Record<string, unknown>): ChangedFile {\n let status = \"modified\";\n if (data.new_file) status = \"added\";\n else if (data.deleted_file) status = \"deleted\";\n else if (data.renamed_file) status = \"renamed\";\n const diff = data.diff as string | undefined;\n // 从 diff 中计算 additions/deletions\n let additions = 0;\n let deletions = 0;\n if (diff) {\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) additions++;\n if (line.startsWith(\"-\") && !line.startsWith(\"---\")) deletions++;\n }\n }\n return {\n filename: (data.new_path || data.old_path) as string,\n status,\n additions,\n deletions,\n changes: additions + deletions,\n patch: diff,\n };\n }\n\n protected mapNote(data: Record<string, unknown>): IssueComment {\n const author = data.author as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const author = data.author as Record<string, unknown> | undefined;\n const labels = data.labels as string[] | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n labels: labels?.map((l) => ({ name: l })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.username as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.web_url as string,\n };\n }\n\n protected mapStateParam(state?: \"open\" | \"closed\" | \"all\"): string | undefined {\n if (!state) return undefined;\n const stateMap: Record<string, string> = {\n open: \"opened\",\n closed: \"closed\",\n all: \"all\",\n };\n return stateMap[state] || state;\n }\n}\n","import type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"./git-provider.interface\";\nimport {\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"./types\";\nimport { GiteaAdapter } from \"./adapters/gitea.adapter\";\nimport { GithubAdapter } from \"./adapters/github.adapter\";\nimport { GitlabAdapter } from \"./adapters/gitlab.adapter\";\n\n/**\n * Git Provider 统一服务\n * 根据配置的 provider 类型代理到对应的适配器实现\n */\nexport class GitProviderService implements GitProvider {\n protected readonly adapter: GitProvider;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.adapter = this.createAdapter(options);\n }\n\n /**\n * 根据 provider 类型创建对应的适配器\n */\n protected createAdapter(options: GitProviderModuleOptions): GitProvider {\n switch (options.provider) {\n case \"gitea\":\n return new GiteaAdapter(options);\n case \"github\":\n return new GithubAdapter(options);\n case \"gitlab\":\n return new GitlabAdapter(options);\n default:\n throw new Error(`不支持的 Git Provider 类型: ${options.provider}`);\n }\n }\n\n // ============ 配置验证 ============\n\n validateConfig(): void {\n this.adapter.validateConfig();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.adapter.getRepository(owner, repo);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.adapter.getBranch(owner, repo, branch);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.adapter.listBranchProtections(owner, repo);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.adapter.getBranchProtection(owner, repo, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.createBranchProtection(owner, repo, options);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.editBranchProtection(owner, repo, name, options);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n return this.adapter.deleteBranchProtection(owner, repo, name);\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n return this.adapter.lockBranch(owner, repo, branch, options);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n return this.adapter.unlockBranch(owner, repo, branch);\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n this.adapter.unlockBranchSync(owner, repo, branch);\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.adapter.getPullRequest(owner, repo, index);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.adapter.editPullRequest(owner, repo, index, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n return this.adapter.listPullRequests(owner, repo, state);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n return this.adapter.listAllPullRequests(owner, repo, options);\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n return this.adapter.getPullRequestCommits(owner, repo, index);\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n return this.adapter.getPullRequestFiles(owner, repo, index);\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.adapter.getPullRequestDiff(owner, repo, index);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.adapter.getCommit(owner, repo, sha);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.adapter.getCompareDiff(owner, repo, baseSha, headSha);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.adapter.getCommitDiff(owner, repo, sha);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n return this.adapter.getFileContent(owner, repo, filepath, ref);\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path?: string,\n ref?: string,\n ): Promise<RepositoryContent[]> {\n return this.adapter.listRepositoryContents(owner, repo, path, ref);\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n return this.adapter.createIssue(owner, repo, options);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.adapter.listIssueComments(owner, repo, index);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.adapter.createIssueComment(owner, repo, index, options);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.adapter.updateIssueComment(owner, repo, commentId, body);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deleteIssueComment(owner, repo, commentId);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.adapter.createPullReview(owner, repo, index, options);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n return this.adapter.listPullReviews(owner, repo, index);\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n return this.adapter.updatePullReview(owner, repo, index, reviewId, body);\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n return this.adapter.deletePullReview(owner, repo, index, reviewId);\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.adapter.listPullReviewComments(owner, repo, index, reviewId);\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deletePullReviewComment(owner, repo, commentId);\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n return this.adapter.listResolvedThreads(owner, repo, index);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getIssueCommentReactions(owner, repo, commentId);\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getPullReviewCommentReactions(owner, repo, commentId);\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.adapter.getIssueReactions(owner, repo, index);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit?: number): Promise<User[]> {\n return this.adapter.searchUsers(query, limit);\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.adapter.getTeamMembers(teamId);\n }\n}\n","export * from \"./gitea.adapter\";\nexport * from \"./github.adapter\";\nexport * from \"./gitlab.adapter\";\n","export * from \"./types\";\nexport * from \"./detect-provider\";\nexport * from \"./parse-repo-url\";\nexport * from \"./git-provider.interface\";\nexport * from \"./git-provider.service\";\nexport * from \"./adapters\";\n","import { spawn, execSync } from \"child_process\";\nimport type { GitCommit, GitChangedFile, GitDiffFile, GitRunOptions } from \"./git-sdk.types\";\nimport { mapGitStatus, parseDiffText } from \"./git-sdk-diff.utils\";\n\nexport class GitSdkService {\n protected readonly defaultOptions: GitRunOptions = {\n cwd: process.cwd(),\n maxBuffer: 10 * 1024 * 1024, // 10MB\n };\n\n runCommand(args: string[], options?: GitRunOptions): Promise<string> {\n const opts = { ...this.defaultOptions, ...options };\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd: opts.cwd,\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(`Git 命令失败 (${code}): ${stderr}`));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n runCommandSync(args: string[], options?: GitRunOptions): string {\n const opts = { ...this.defaultOptions, ...options };\n return execSync(`git ${args.join(\" \")}`, {\n cwd: opts.cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n maxBuffer: opts.maxBuffer,\n });\n }\n\n getRemoteUrl(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"remote\", \"get-url\", \"origin\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getCurrentBranch(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getDefaultBranch(options?: GitRunOptions): string {\n try {\n const result = this.runCommandSync(\n [\"symbolic-ref\", \"refs/remotes/origin/HEAD\"],\n options,\n ).trim();\n return result.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // 回退到常见默认分支\n for (const branch of [\"main\", \"master\"]) {\n try {\n this.runCommandSync([\"rev-parse\", \"--verify\", `origin/${branch}`], options);\n return branch;\n } catch {\n continue;\n }\n }\n return \"main\";\n }\n }\n\n parseRepositoryFromRemoteUrl(remoteUrl: string): { owner: string; repo: string } | null {\n const match = remoteUrl.match(/[/:]([\\w.-]+)\\/([\\w.-]+?)(?:\\.git)?$/);\n if (match) {\n return { owner: match[1], repo: match[2] };\n }\n return null;\n }\n\n async getChangedFilesBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitChangedFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"diff\", \"--name-status\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const files: GitChangedFile[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [status, filename] = line.split(\"\\t\");\n files.push({\n filename,\n status: mapGitStatus(status),\n });\n }\n\n return files;\n }\n\n /**\n * 获取两个 ref 之间的 diff(包含 patch 信息)\n * @param baseRef 基准 ref\n * @param headRef 目标 ref\n * @param options 运行选项\n * @returns 包含 filename 和 patch 的文件列表\n */\n async getDiffBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitDiffFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand([\"diff\", `${resolvedBase}..${resolvedHead}`], options);\n\n return parseDiffText(result);\n }\n\n async getCommitsBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitCommit[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"log\", \"--format=%H|%s|%an|%ae|%aI\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const commits: GitCommit[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [sha, message, authorName, authorEmail, date] = line.split(\"|\");\n commits.push({\n sha,\n message,\n author: {\n name: authorName,\n email: authorEmail,\n date,\n },\n });\n }\n\n return commits;\n }\n\n async getFilesForCommit(sha: string, options?: GitRunOptions): Promise<string[]> {\n const result = await this.runCommand([\"show\", \"--name-only\", \"--format=\", sha], options);\n return result.trim().split(\"\\n\").filter(Boolean);\n }\n\n async getFileContent(ref: string, filename: string, options?: GitRunOptions): Promise<string> {\n return this.runCommand([\"show\", `${ref}:${filename}`], options);\n }\n\n getCommitDiff(sha: string, options?: GitRunOptions): GitDiffFile[] {\n try {\n const output = this.runCommandSync([\"show\", \"--format=\", \"--patch\", sha], options);\n return parseDiffText(output);\n } catch (error) {\n console.warn(`⚠️ git show 失败: ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n }\n\n /**\n * 解析 ref,支持本地分支、远程分支、commit SHA\n * 优先级:commit SHA > 本地分支 > origin/分支 > fetch后重试 > 原始值\n */\n async resolveRef(ref: string, options?: GitRunOptions): Promise<string> {\n if (!ref) {\n throw new Error(`resolveRef: ref 参数不能为空。调用栈: ${new Error().stack}`);\n }\n if (/^[0-9a-f]{7,40}$/i.test(ref)) {\n return ref;\n }\n if (ref.startsWith(\"origin/\")) {\n return ref;\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", ref], options);\n return ref;\n } catch {\n // 本地分支不存在\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", `origin/${ref}`], options);\n return `origin/${ref}`;\n } catch {\n // origin/分支也不存在\n }\n try {\n await this.runCommand(\n [\"fetch\", \"origin\", `${ref}:refs/remotes/origin/${ref}`, \"--depth=1\"],\n options,\n );\n return `origin/${ref}`;\n } catch {\n // fetch 失败\n }\n return ref;\n }\n}\n","export * from \"./git-sdk.types\";\nexport * from \"./git-sdk-diff.utils\";\nexport { GitSdkService } from \"./git-sdk.service\";\n","export interface ClaudeAdapterConfig {\n model?: string;\n baseUrl?: string;\n authToken?: string;\n hasCompletedOnboarding?: boolean;\n}\n\nexport interface OpenAIAdapterConfig {\n model: string;\n baseUrl?: string;\n apiKey: string;\n}\n\nexport interface OpenCodeAdapterConfig {\n model?: string;\n /** OpenCode 服务地址,默认 http://localhost:4096 */\n serverUrl?: string;\n /** 云厂商 API 地址(会动态写入 opencode.json 配置) */\n baseUrl?: string;\n apiKey?: string;\n providerID?: string;\n}\n\nexport type LLMMode = \"claude-code\" | \"openai\" | \"gemini\" | \"open-code\";\n\nexport interface GeminiAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n}\n\nexport interface LlmProxyConfig {\n defaultAdapter?: LLMMode;\n claudeCode?: ClaudeAdapterConfig;\n openai?: OpenAIAdapterConfig;\n openCode?: OpenCodeAdapterConfig;\n gemini?: GeminiAdapterConfig;\n}\n\nexport const LLM_PROXY_CONFIG = Symbol(\"LLM_PROXY_CONFIG\");\n","export * from \"./message.interface\";\nexport * from \"./session.interface\";\nexport * from \"./config.interface\";\nexport type { VerboseLevel } from \"../../verbose\";\n","import type { LlmMessage, LlmRequestOptions, LlmResponse, LlmStreamEvent } from \"../interfaces\";\nimport type { VerboseLevel } from \"../../verbose\";\n\nexport interface LlmAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n verbose?: VerboseLevel;\n}\n\nexport interface LlmAdapter {\n readonly name: string;\n\n chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse>;\n\n chatStream(messages: LlmMessage[], options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent>;\n\n isConfigured(): boolean;\n\n isSupportJsonSchema(): boolean;\n}\n\nexport const LLM_ADAPTER = Symbol(\"LLM_ADAPTER\");\n","/**\n * 从 @spaceflow/shared 重导出 verbose 工具\n */\nexport type { LogLevel, VerboseLevel } from \"@spaceflow/shared\";\nexport {\n LOG_LEVEL_PRIORITY,\n toLogLevel,\n normalizeVerbose,\n shouldLog,\n parseVerbose,\n} from \"@spaceflow/shared\";\n","import { readFile, writeFile, mkdir, copyFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { LlmProxyConfig } from \"../llm-proxy/interfaces\";\nimport { shouldLog, type VerboseLevel } from \"../verbose\";\n\nexport class ClaudeSetupService {\n constructor(protected readonly llmConfig?: LlmProxyConfig) {}\n\n private getPaths() {\n const claudeDir = join(homedir(), \".claude\");\n return {\n claudeDir,\n settingsPath: join(claudeDir, \"settings.json\"),\n settingsBackupPath: join(claudeDir, \"settings.json.bak\"),\n claudeJsonPath: join(homedir(), \".claude.json\"),\n claudeJsonBackupPath: join(homedir(), \".claude.json.bak\"),\n };\n }\n\n async backup(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsPath, paths.settingsBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonPath, paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n }\n\n async restore(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsBackupPath, paths.settingsPath);\n await unlink(paths.settingsBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonBackupPath, paths.claudeJsonPath);\n await unlink(paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n }\n\n /**\n * 使用临时配置执行操作\n * 自动备份现有配置,执行完成后恢复\n */\n async withTemporaryConfig<T>(fn: () => Promise<T>, verbose?: VerboseLevel): Promise<T> {\n await this.backup();\n try {\n await this.configure(verbose);\n return await fn();\n } finally {\n await this.restore();\n }\n }\n\n async configure(verbose?: VerboseLevel): Promise<void> {\n const { claudeDir, settingsPath, claudeJsonPath } = this.getPaths();\n\n const claudeCode = this.llmConfig?.claudeCode;\n\n if (!claudeCode) {\n if (shouldLog(verbose, 1)) {\n console.log(\"未配置 claude 设置,跳过\");\n }\n return;\n }\n\n try {\n await mkdir(claudeDir, { recursive: true });\n } catch {\n // ignore if exists\n }\n\n let existingSettings = {};\n try {\n const content = await readFile(settingsPath, \"utf-8\");\n existingSettings = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n\n const existing = existingSettings as Record<string, Record<string, unknown>>;\n const env: Record<string, string> = { ...(existing.env as Record<string, string>) };\n if (claudeCode.baseUrl) env.ANTHROPIC_BASE_URL = claudeCode.baseUrl;\n if (claudeCode.authToken) {\n env.ANTHROPIC_AUTH_TOKEN = claudeCode.authToken;\n } else {\n throw new Error(\"未配置 claudeCode.authToken 设置\");\n }\n if (claudeCode.model) env.ANTHROPIC_MODEL = claudeCode.model;\n\n const mergedSettings = {\n ...existingSettings,\n env,\n };\n\n await writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${settingsPath}`);\n }\n\n if (claudeCode.hasCompletedOnboarding !== undefined) {\n let claudeJson: Record<string, unknown> = {};\n try {\n const content = await readFile(claudeJsonPath, \"utf-8\");\n claudeJson = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n claudeJson.hasCompletedOnboarding = claudeCode.hasCompletedOnboarding;\n await writeFile(claudeJsonPath, JSON.stringify(claudeJson, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${claudeJsonPath}`);\n }\n }\n }\n}\n","export * from \"./claude-setup.service\";\n","import { query, type SpawnOptions } from \"@anthropic-ai/claude-agent-sdk\";\nimport { spawn } from \"child_process\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { ClaudeSetupService } from \"../../claude-setup\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class ClaudeCodeAdapter implements LlmAdapter {\n readonly name = \"claude-code\";\n private readonly claudeSetupService: ClaudeSetupService;\n\n constructor(private readonly config: LlmProxyConfig) {\n // 创建 ClaudeSetupService 实例,传入 LLM 配置\n this.claudeSetupService = new ClaudeSetupService(config);\n }\n\n isConfigured(): boolean {\n return !!this.config.claudeCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n // 备份原有配置\n await this.claudeSetupService.backup();\n\n try {\n // 应用临时配置\n await this.claudeSetupService.configure(options?.verbose);\n\n const claudeConf = this.config.claudeCode;\n\n if (!claudeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.ClaudeCodeAdapter.chatStream] 未配置 claude 设置\",\n };\n return;\n }\n\n const model = options?.model || claudeConf.model || \"claude-sonnet-4-5\";\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] 配置: Model=${model}, BaseURL=${claudeConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n const handleUncaughtError = (err: Error) => {\n if ((err as any).code === \"EPIPE\") {\n console.error(\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] EPIPE 错误: Claude CLI 子进程意外退出\",\n );\n throw err;\n }\n };\n process.on(\"uncaughtException\", handleUncaughtError);\n\n try {\n const spawnEnv = { ...process.env };\n if (claudeConf.baseUrl) spawnEnv.ANTHROPIC_BASE_URL = claudeConf.baseUrl;\n if (claudeConf.authToken) spawnEnv.ANTHROPIC_AUTH_TOKEN = claudeConf.authToken;\n\n const spawnClaudeCodeProcess = (spawnOptions: SpawnOptions) => {\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] Spawning: ${spawnOptions.command} ${spawnOptions.args?.join(\" \")}`,\n );\n }\n const child = spawn(spawnOptions.command, spawnOptions.args || [], {\n ...spawnOptions,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: spawnEnv,\n });\n\n child.stderr?.on(\"data\", (data) => {\n console.error(`[LLMProxy.ClaudeCodeAdapter.chatStream] CLI stderr: ${data.toString()}`);\n });\n\n return child;\n };\n\n const queryOptions: Parameters<typeof query>[0][\"options\"] = {\n model,\n systemPrompt,\n permissionMode: \"default\",\n spawnClaudeCodeProcess,\n };\n\n if (options?.allowedTools?.length) {\n queryOptions.allowedTools = options.allowedTools as any;\n }\n\n if (options?.jsonSchema) {\n queryOptions.outputFormat = {\n type: \"json_schema\",\n schema: options.jsonSchema.getSchema(),\n };\n }\n\n const response = query({\n prompt: userPrompt,\n options: queryOptions,\n });\n\n let finalContent = \"\";\n let structuredOutput: unknown = undefined;\n\n for await (const message of response) {\n if (message.type === \"assistant\") {\n const content = message.message.content;\n if (typeof content === \"string\") {\n yield { type: \"text\", content };\n finalContent += content;\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (block.type === \"text\") {\n yield { type: \"text\", content: block.text };\n finalContent += block.text;\n } else if (block.type === \"tool_use\") {\n yield { type: \"tool_use\", name: block.name, input: block.input };\n } else if (block.type === (\"thought\" as any)) {\n yield { type: \"thought\", content: (block as any).thought };\n }\n }\n }\n }\n\n if (message.type === \"result\") {\n if (message.subtype === \"success\") {\n if (message.structured_output) {\n structuredOutput = message.structured_output;\n }\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n structuredOutput,\n },\n };\n } else {\n yield {\n type: \"error\",\n message: `[LLMProxy.ClaudeCodeAdapter.chatStream] ${message.errors?.join(\", \") || \"未知错误\"}`,\n };\n }\n }\n }\n } catch (error: any) {\n if (error?.code === \"EPIPE\" || error?.message?.includes(\"EPIPE\")) {\n yield {\n type: \"error\",\n message:\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] 连接中断 (EPIPE)。请检查:\\n\" +\n \"1. ANTHROPIC_AUTH_TOKEN 环境变量是否正确设置\\n\" +\n \"2. ANTHROPIC_BASE_URL 是否与 Claude Agent SDK 兼容\\n\" +\n \"3. Claude CLI 是否已正确安装\",\n };\n } else {\n throw error;\n }\n } finally {\n process.removeListener(\"uncaughtException\", handleUncaughtError);\n }\n } finally {\n // 恢复原有配置\n await this.claudeSetupService.restore();\n }\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return true;\n }\n}\n","import OpenAI from \"openai\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenAIAdapter implements LlmAdapter {\n readonly name = \"openai\";\n\n private client: OpenAI | null = null;\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openai;\n }\n\n private getClient(): OpenAI {\n if (this.client) {\n return this.client;\n }\n\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.getClient] 未配置 openai 设置\");\n }\n\n this.client = new OpenAI({\n apiKey: openaiConf.apiKey,\n baseURL: openaiConf.baseUrl || undefined,\n });\n\n return this.client;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.chat] 未配置 openai 设置\");\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 配置: Model=${model}, BaseURL=${openaiConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n try {\n const response = await client.chat.completions.create({\n model,\n messages: messages,\n });\n\n const content = response.choices[0]?.message?.content || \"\";\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 响应: Model=${response.model}, Usage=${response.usage?.total_tokens} tokens`,\n );\n }\n\n return {\n content,\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n throw new Error(\n `[LLMProxy.OpenAIAdapter.chat] API 错误 (${error.status}): ${error.message}\\n` +\n `请检查:\\n` +\n `1. API Key 是否正确\\n` +\n `2. Base URL 是否正确\\n` +\n `3. 模型名称是否有效`,\n );\n }\n throw error;\n }\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n yield { type: \"error\", message: \"[LLMProxy.OpenAIAdapter.chatStream] 未配置 openai 设置\" };\n return;\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chatStream] 配置: Model=${model}, BaseURL=${openaiConf.baseUrl || \"默认\"}`,\n );\n }\n try {\n const stream = await client.chat.completions.create({\n model,\n messages: messages,\n stream: true,\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) {\n yield { type: \"text\", content: delta };\n fullContent += delta;\n }\n }\n\n yield {\n type: \"result\",\n response: {\n content: fullContent,\n },\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n yield {\n type: \"error\",\n message: `[LLMProxy.OpenAIAdapter.chatStream] API 错误 (${error.status}): ${error.message}`,\n };\n } else {\n throw error;\n }\n }\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","import { createOpencode } from \"@opencode-ai/sdk\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n OpenCodeAdapterConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenCodeAdapter implements LlmAdapter {\n readonly name = \"open-code\";\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openCodeConf = this.config.openCode;\n\n if (!openCodeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 未配置 openCode 设置\",\n };\n return;\n }\n\n const providerID = openCodeConf.providerID || \"openai\";\n const configModel = options?.model || openCodeConf.model || \"gpt-4o\";\n const model = configModel.includes(\"/\") ? configModel : `${providerID}/${configModel}`;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 配置: Model=${model}, ProviderID=${providerID}, BaseURL=${openCodeConf.baseUrl || \"默认\"}`,\n );\n }\n\n // 创建 OpenCode 实例(自动启动服务器,使用动态端口避免冲突)\n let opencode: Awaited<ReturnType<typeof createOpencode>> | null = null;\n const port = 4096 + Math.floor(Math.random() * 1000);\n\n // 确保进程退出时关闭服务器\n const cleanup = () => {\n if (opencode?.server) {\n opencode.server.close();\n opencode = null;\n }\n };\n process.once(\"exit\", cleanup);\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n try {\n opencode = await createOpencode({\n port,\n config: this.buildOpenCodeConfig(openCodeConf, model),\n });\n\n const { client } = opencode;\n\n // 设置 provider 认证(使用自定义 provider ID)\n const customProviderID = \"custom-openai\";\n if (openCodeConf.apiKey) {\n await client.auth.set({\n path: { id: customProviderID },\n body: { type: \"api\", key: openCodeConf.apiKey },\n });\n }\n\n const session = await client.session.create({\n body: { title: `spaceflow-${Date.now()}` },\n });\n\n if (!session.data?.id) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 创建 session 失败\",\n };\n return;\n }\n\n const sessionId = session.data.id;\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (systemPrompt) {\n await client.session.prompt({\n path: { id: sessionId },\n body: {\n noReply: true,\n parts: [{ type: \"text\", text: systemPrompt }],\n },\n });\n }\n\n // 从原始 model 中提取 modelID,但使用自定义 provider ID\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 发送 prompt: model=${customProviderID}/${modelID}, userPrompt长度=${userPrompt.length}`,\n );\n }\n\n const result = await client.session.prompt({\n path: { id: sessionId },\n body: {\n model: { providerID: customProviderID, modelID },\n parts: [{ type: \"text\", text: userPrompt }],\n },\n });\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 完整响应对象:\\n${JSON.stringify(result, null, 2)}`,\n );\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] result.data:\\n${JSON.stringify(result.data, null, 2)}`,\n );\n }\n\n let finalContent = \"\";\n\n if (result.data?.parts) {\n for (const part of result.data.parts) {\n const partType = part.type;\n\n switch (partType) {\n case \"text\": {\n const text = (part as any).text || \"\";\n yield { type: \"text\", content: text };\n finalContent += text;\n break;\n }\n\n case \"tool\": {\n // 工具调用(ToolPart)\n const toolPart = part as any;\n const state = toolPart.state || {};\n yield {\n type: \"tool_use\",\n name: toolPart.tool || \"unknown\",\n input: state.input || {},\n status: state.status,\n output: state.output,\n title: state.title,\n };\n break;\n }\n\n case \"agent\": {\n // 子代理调用(AgentPart)\n const agentPart = part as any;\n yield {\n type: \"agent\",\n name: agentPart.name || \"unknown\",\n source: agentPart.source?.value,\n };\n break;\n }\n\n case \"subtask\": {\n // 子任务\n const subtaskPart = part as any;\n yield {\n type: \"subtask\",\n agent: subtaskPart.agent,\n prompt: subtaskPart.prompt,\n description: subtaskPart.description,\n };\n break;\n }\n\n case \"step-start\": {\n yield {\n type: \"step_start\",\n snapshot: (part as any).snapshot,\n };\n break;\n }\n\n case \"step-finish\": {\n const stepPart = part as any;\n yield {\n type: \"step_finish\",\n reason: stepPart.reason,\n tokens: stepPart.tokens,\n cost: stepPart.cost,\n };\n break;\n }\n\n case \"reasoning\": {\n const reasoningPart = part as any;\n yield {\n type: \"reasoning\",\n content: reasoningPart.text || \"\",\n };\n break;\n }\n\n default:\n // 其他类型(file, snapshot, patch, retry, compaction 等)暂不处理\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 未处理的 part 类型: ${partType}`,\n );\n }\n break;\n }\n }\n }\n\n if (shouldLog(options?.verbose, 1) && !finalContent) {\n console.warn(\n `[LLMProxy.OpenCodeAdapter.chatStream] 警告: 响应内容为空,parts=${JSON.stringify(result.data?.parts)}`,\n );\n }\n\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n },\n };\n\n try {\n await client.session.delete({ path: { id: sessionId } });\n } catch {\n // ignore cleanup errors\n }\n } catch (error: any) {\n yield {\n type: \"error\",\n message:\n `[LLMProxy.OpenCodeAdapter.chatStream] 错误: ${error.message}\\n` +\n `请检查:\\n` +\n `1. baseUrl 配置是否正确\\n` +\n `2. apiKey 是否有效\\n` +\n `3. 模型配置是否有效`,\n };\n } finally {\n // 移除事件监听器\n process.removeListener(\"exit\", cleanup);\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n // 关闭服务器\n cleanup();\n }\n }\n\n /**\n * 构建 OpenCode 配置\n */\n private buildOpenCodeConfig(\n openCodeConf: OpenCodeAdapterConfig,\n model: string,\n ): Record<string, any> {\n // 使用自定义 provider ID(如 custom-openai)而不是 openai\n // 因为 OpenCode 会根据 providerID 决定使用哪个 SDK 方法\n // openai provider 会调用 sdk.responses(),而自定义 provider 使用 @ai-sdk/openai-compatible\n const customProviderID = \"custom-openai\";\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n // 使用 @ai-sdk/openai-compatible,使用 Chat Completions API (/chat/completions)\n const config: Record<string, any> = {\n model: `${customProviderID}/${modelID}`,\n provider: {\n [customProviderID]: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Custom OpenAI Compatible\",\n },\n },\n };\n\n // 配置 provider baseURL\n if (openCodeConf.baseUrl) {\n config.provider[customProviderID].options = {\n baseURL: openCodeConf.baseUrl,\n };\n }\n\n // 注册自定义模型\n config.provider[customProviderID].models = {\n [modelID]: {\n name: modelID,\n attachment: true,\n reasoning: false,\n temperature: true,\n tool_call: true,\n cost: {\n input: 0,\n output: 0,\n },\n limit: {\n context: 128000,\n output: 16000,\n },\n },\n };\n\n return config;\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","export * from \"./llm-adapter.interface\";\nexport * from \"./claude-code.adapter\";\nexport * from \"./openai.adapter\";\nexport * from \"./open-code.adapter\";\n","import { randomUUID } from \"crypto\";\nimport type { LlmAdapter } from \"./adapters\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmSession,\n SessionOptions,\n} from \"./interfaces\";\nimport { type VerboseLevel, normalizeVerbose } from \"../verbose\";\n\nexport class LlmSessionImpl implements LlmSession {\n readonly id: string;\n readonly adapterName: string;\n\n private history: LlmMessage[] = [];\n private systemPrompt: string = \"\";\n private defaultModel?: string;\n private verbose: VerboseLevel = 0;\n\n constructor(\n private readonly adapter: LlmAdapter,\n options?: SessionOptions,\n ) {\n this.id = randomUUID();\n this.adapterName = adapter.name;\n\n if (options?.systemPrompt) {\n this.systemPrompt = options.systemPrompt;\n }\n if (options?.model) {\n this.defaultModel = options.model;\n }\n if (options?.verbose !== undefined) {\n this.verbose = normalizeVerbose(options.verbose);\n }\n }\n\n async send(content: string, options?: LlmRequestOptions): Promise<LlmResponse> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n const response = await this.adapter.chat(messages, mergedOptions);\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: response.content };\n this.history.push(assistantMessage);\n\n return response;\n }\n\n async *sendStream(content: string, options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n let fullContent = \"\";\n\n for await (const event of this.adapter.chatStream(messages, mergedOptions)) {\n yield event;\n\n if (event.type === \"text\") {\n fullContent += event.content;\n } else if (event.type === \"result\") {\n fullContent = event.response.content;\n }\n }\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: fullContent };\n this.history.push(assistantMessage);\n }\n\n getHistory(): LlmMessage[] {\n return [...this.history];\n }\n\n clearHistory(): void {\n this.history = [];\n }\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n private buildMessages(): LlmMessage[] {\n const messages: LlmMessage[] = [];\n\n if (this.systemPrompt) {\n messages.push({ role: \"system\", content: this.systemPrompt });\n }\n\n messages.push(...this.history);\n\n return messages;\n }\n\n private mergeOptions(options?: LlmRequestOptions): LlmRequestOptions {\n return {\n model: options?.model || this.defaultModel,\n verbose: options?.verbose ?? this.verbose,\n ...options,\n };\n }\n}\n","import type { LlmAdapter } from \"./adapters\";\nimport { ClaudeCodeAdapter } from \"./adapters/claude-code.adapter\";\nimport { OpenAIAdapter } from \"./adapters/openai.adapter\";\nimport { OpenCodeAdapter } from \"./adapters/open-code.adapter\";\nimport { LlmSessionImpl } from \"./llm-session\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmSession,\n SessionOptions,\n LlmProxyConfig,\n LLMMode,\n} from \"./interfaces\";\nimport type { LlmJsonPut } from \"../llm-jsonput\";\n\nexport interface ChatOptions extends LlmRequestOptions {\n adapter?: LLMMode;\n}\n\nexport class LlmProxyService {\n private adapters: Map<LLMMode, LlmAdapter> = new Map();\n\n constructor(private readonly config: LlmProxyConfig) {\n // 适配器接收完整配置,内部自行读取所需部分\n const claudeCodeAdapter = new ClaudeCodeAdapter(config);\n const openaiAdapter = new OpenAIAdapter(config);\n const openCodeAdapter = new OpenCodeAdapter(config);\n this.adapters.set(\"claude-code\", claudeCodeAdapter);\n this.adapters.set(\"openai\", openaiAdapter);\n this.adapters.set(\"open-code\", openCodeAdapter);\n }\n\n createSession(adapterType?: LLMMode, options?: SessionOptions): LlmSession {\n const type = adapterType || this.getDefaultAdapterType();\n const adapter = this.getAdapter(type);\n\n return new LlmSessionImpl(adapter, options);\n }\n\n async chat(messages: LlmMessage[], options?: ChatOptions): Promise<LlmResponse> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n const response = await adapter.chat(messages, options);\n\n if (options?.jsonSchema && response.content && !response.structuredOutput) {\n response.structuredOutput = await options.jsonSchema.parse(response.content);\n }\n\n return response;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: ChatOptions,\n ): AsyncIterable<import(\"./interfaces\").LlmStreamEvent> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n for await (const event of adapter.chatStream(messages, options)) {\n if (\n event.type === \"result\" &&\n options?.jsonSchema &&\n event.response.content &&\n !event.response.structuredOutput\n ) {\n try {\n event.response.structuredOutput = await options.jsonSchema.parse(event.response.content);\n } catch (error: any) {\n // JSON 解析失败,保持 structuredOutput 为 undefined\n console.error(\"[LLMProxyService.chatStream] JSON 解析失败:\", error);\n }\n }\n yield event;\n }\n }\n\n appendJsonSchemaSystemPrompt(messages: LlmMessage[], jsonSchema: LlmJsonPut): LlmMessage[] {\n const systemMsg = messages.find((msg) => msg.role === \"system\");\n if (jsonSchema.isMatched(systemMsg?.content || \"\")) {\n return messages;\n }\n if (systemMsg) {\n systemMsg.content += `\\n\\n${jsonSchema.jsonFormatInstruction}`;\n } else {\n messages.unshift({ role: \"system\", content: jsonSchema.jsonFormatInstruction });\n }\n return messages;\n }\n\n getAvailableAdapters(): LLMMode[] {\n const available: LLMMode[] = [];\n\n for (const [type, adapter] of this.adapters) {\n if (adapter.isConfigured()) {\n available.push(type);\n }\n }\n\n return available;\n }\n\n private getDefaultAdapterType(): LLMMode {\n return this.config.defaultAdapter || \"openai\";\n }\n\n private getAdapter(type: LLMMode): LlmAdapter {\n const adapter = this.adapters.get(type);\n\n if (!adapter) {\n throw new Error(`[LLMProxy.getAdapter] 不支持的 LLM 类型: ${type}`);\n }\n\n if (!adapter.isConfigured()) {\n throw new Error(`[LLMProxy.getAdapter] 适配器 \"${type}\" 未配置`);\n }\n\n return adapter;\n }\n}\n","import type { LlmStreamEvent } from \"./interfaces\";\n\nexport interface StreamLoggerState {\n isFirstText: boolean;\n}\n\n/**\n * 创建一个新的 StreamLogger 状态\n */\nexport function createStreamLoggerState(): StreamLoggerState {\n return { isFirstText: true };\n}\n\n/**\n * 记录 LLM 流式事件到终端\n * @param event LLM 流式事件\n * @param state 日志状态(用于跟踪是否是第一个文本块)\n */\nexport function logStreamEvent(event: LlmStreamEvent, state: StreamLoggerState): void {\n switch (event.type) {\n case \"text\":\n if (state.isFirstText) {\n process.stdout.write(\"\\n🤖 AI: \");\n state.isFirstText = false;\n }\n process.stdout.write(event.content);\n break;\n case \"tool_use\":\n console.log(`\\n🛠️ 工具调用: ${event.name}`);\n if (event.title) {\n console.log(` 标题: ${event.title}`);\n }\n console.log(` 输入: ${JSON.stringify(event.input)}`);\n if (event.status) {\n console.log(` 状态: ${event.status}`);\n }\n if (event.output) {\n console.log(\n ` 输出: ${event.output.substring(0, 200)}${event.output.length > 200 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"thought\":\n console.log(`\\n💭 思考: ${event.content}`);\n state.isFirstText = true;\n break;\n case \"result\":\n console.log(`\\n✅ 结果已返回`);\n state.isFirstText = true;\n break;\n case \"error\":\n console.error(`\\n❌ 错误: ${event.message}`);\n state.isFirstText = true;\n break;\n case \"agent\":\n console.log(`\\n🤖 子代理: ${event.name}`);\n if (event.source) {\n console.log(\n ` 来源: ${event.source.substring(0, 100)}${event.source.length > 100 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"subtask\":\n console.log(`\\n📋 子任务: ${event.description}`);\n console.log(` 代理: ${event.agent}`);\n console.log(\n ` 提示: ${event.prompt.substring(0, 100)}${event.prompt.length > 100 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n case \"step_start\":\n console.log(`\\n▶️ 步骤开始`);\n state.isFirstText = true;\n break;\n case \"step_finish\":\n console.log(`\\n⏹️ 步骤结束: ${event.reason}`);\n if (event.tokens) {\n const tokens = event.tokens as any;\n console.log(\n ` Token: 输入=${tokens.input || 0}, 输出=${tokens.output || 0}, 推理=${tokens.reasoning || 0}`,\n );\n }\n if (event.cost !== undefined) {\n console.log(` 成本: $${event.cost.toFixed(6)}`);\n }\n state.isFirstText = true;\n break;\n case \"reasoning\":\n console.log(\n `\\n🧠 推理: ${event.content.substring(0, 200)}${event.content.length > 200 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n }\n}\n","export * from \"./interfaces\";\nexport * from \"./adapters\";\nexport * from \"./llm-session\";\nexport * from \"./llm-proxy.service\";\nexport * from \"./stream-logger\";\n","/**\n * 飞书 SDK 卡片交互回调相关类型\n */\n\nimport type { I18nLocale } from \"./common\";\nimport type { CardData } from \"./card\";\n\n/** 卡片交互事件名称常量 */\nexport const FEISHU_CARD_ACTION_TRIGGER = \"card.action.trigger\" as const;\n\n/** 回调基本信息 (header) */\nexport interface CardActionHeader {\n /** 回调的唯一标识 */\n event_id: string;\n /** 应用的 Verification Token */\n token: string;\n /** 回调发送的时间,微秒级时间戳 */\n create_time: string;\n /** 回调类型,固定为 \"card.action.trigger\" */\n event_type: typeof FEISHU_CARD_ACTION_TRIGGER;\n /** 应用归属的 tenant key */\n tenant_key: string;\n /** 应用的 App ID */\n app_id: string;\n}\n\n/** 操作者信息 */\nexport interface CardActionOperator {\n /** 回调触发者的 tenant key */\n tenant_key: string;\n /** 回调触发者的 user_id (需开启权限) */\n user_id?: string;\n /** 回调触发者的 open_id */\n open_id: string;\n /** 回调触发者的 union_id */\n union_id?: string;\n}\n\n/** 交互信息 */\nexport interface CardActionInfo {\n /** 交互组件绑定的开发者自定义回传数据 */\n value?: Record<string, unknown> | string;\n /** 交互组件的标签 */\n tag: string;\n /** 用户当前所在地区的时区 */\n timezone?: string;\n /** 组件的自定义唯一标识 */\n name?: string;\n /** 表单容器内用户提交的数据 */\n form_value?: Record<string, unknown>;\n /** 输入框组件提交的数据 (未内嵌在表单中时) */\n input_value?: string;\n /** 单选组件的选项回调值 */\n option?: string;\n /** 多选组件的选项回调值 */\n options?: string[];\n /** 勾选器组件的回调数据 */\n checked?: boolean;\n}\n\n/** 展示场景上下文 */\nexport interface CardActionContext {\n /** 链接地址 (适用于链接预览场景) */\n url?: string;\n /** 链接预览的 token */\n preview_token?: string;\n /** 消息 ID */\n open_message_id: string;\n /** 会话 ID */\n open_chat_id: string;\n}\n\n/** 回调详细信息 (event) */\nexport interface CardActionEventData {\n /** 回调触发者信息 */\n operator: CardActionOperator;\n /** 更新卡片用的凭证,有效期 30 分钟,最多可更新 2 次 */\n token: string;\n /** 交互信息 */\n action: CardActionInfo;\n /** 卡片展示场景 */\n host?: string;\n /** 卡片分发类型,链接预览卡片时为 url_preview */\n delivery_type?: \"url_preview\";\n /** 展示场景上下文 */\n context: CardActionContext;\n}\n\n/** 回调结构体 (schema 2.0) */\nexport interface CardActionTriggerCallback {\n /** 回调版本,固定为 \"2.0\" */\n schema: \"2.0\";\n /** 回调基本信息 */\n header: CardActionHeader;\n /** 回调详细信息 */\n event: CardActionEventData;\n}\n\n/** Toast 提示配置 */\nexport interface CardActionToast {\n /** 弹窗提示的类型 */\n type?: \"info\" | \"success\" | \"error\" | \"warning\";\n /** 单语言提示文案 */\n content?: string;\n /** 多语言提示文案 */\n i18n?: Partial<Record<I18nLocale, string>>;\n}\n\n/** 响应回调的结构体 */\nexport interface CardActionTriggerResponse {\n /** Toast 弹窗提示 */\n toast?: CardActionToast;\n /** 卡片数据 (用于更新卡片) */\n card?: CardData;\n}\n\n/** 交互事件回调接口 */\nexport interface CardActionTriggerEventCallback {\n /** 完成回调,返回响应结果 */\n done: (result: CardActionTriggerResponse) => void;\n}\n\n/** 交互事件 (用于事件监听器),包含回调数据和 done 方法 */\nexport interface CardActionTriggerEvent\n extends CardActionTriggerEventCallback, CardActionTriggerCallback {}\n\n/** 事件注册类型 */\nexport interface CardEvents {\n [FEISHU_CARD_ACTION_TRIGGER]: (\n data: CardActionTriggerCallback,\n ) => Promise<CardActionTriggerResponse>;\n}\n","import { EventEmitter } from \"events\";\nimport * as lark from \"@larksuiteoapi/node-sdk\";\nimport {\n FeishuModuleOptions,\n FeishuUser,\n GetUserParams,\n FEISHU_CARD_ACTION_TRIGGER,\n type CardEvents,\n type CardActionTriggerResponse,\n type CardActionTriggerEvent,\n} from \"./types\";\n\n/**\n * 飞书 API 服务\n */\nexport class FeishuSdkService {\n protected readonly client: lark.Client;\n protected readonly eventEmitter: EventEmitter;\n private eventDispatcher: lark.EventDispatcher | null = null;\n\n constructor(protected readonly options: FeishuModuleOptions) {\n this.eventEmitter = new EventEmitter();\n this.client = new lark.Client({\n appId: options.appId,\n appSecret: options.appSecret,\n appType: options.appType === \"store\" ? lark.AppType.ISV : lark.AppType.SelfBuild,\n domain: options.domain === \"lark\" ? lark.Domain.Lark : lark.Domain.Feishu,\n });\n\n this.initEventDispatcher();\n }\n\n /**\n * 注册事件监听器\n */\n on(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n /**\n * 移除事件监听器\n */\n off(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.off(eventName, listener);\n }\n\n private initEventDispatcher(): void {\n this.eventDispatcher = new lark.EventDispatcher({\n encryptKey: \"encrypt key\",\n }).register<CardEvents>({\n [FEISHU_CARD_ACTION_TRIGGER]: async (data) => {\n let done: (result: CardActionTriggerResponse) => void = () => null;\n const p = new Promise<CardActionTriggerResponse>((resolve) => {\n done = resolve;\n });\n\n // 转换为事件监听器友好的格式\n const event: CardActionTriggerEvent = {\n ...data,\n done,\n };\n\n this.eventEmitter.emit(FEISHU_CARD_ACTION_TRIGGER, event);\n return await p;\n },\n });\n }\n\n destroy(): void {\n this.eventEmitter.removeAllListeners();\n }\n\n /**\n * 验证飞书配置\n */\n validateConfig(): void {\n if (!this.options?.appId) {\n throw new Error(\"缺少配置 feishu.appId (环境变量 FEISHU_APP_ID)\");\n }\n\n if (!this.options?.appSecret) {\n throw new Error(\"缺少配置 feishu.appSecret (环境变量 FEISHU_APP_SECRET)\");\n }\n }\n\n /**\n * 获取原始 Lark Client 实例\n * 用于调用 SDK 中未封装的 API\n */\n getClient(): lark.Client {\n return this.client;\n }\n\n /**\n * 获取用户信息\n * @param params 获取用户信息的参数\n * @returns 用户信息\n */\n async getUser(params: GetUserParams): Promise<FeishuUser | null> {\n const { userId, userIdType = \"open_id\", departmentIdType } = params;\n\n const response = await this.client.contact.user.get({\n path: {\n user_id: userId,\n },\n params: {\n user_id_type: userIdType,\n department_id_type: departmentIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return response.data?.user as FeishuUser | null;\n }\n\n /**\n * 批量获取用户信息\n * @param userIds 用户 ID 列表\n * @param userIdType 用户 ID 类型\n * @returns 用户信息列表\n */\n async batchGetUsers(\n userIds: string[],\n userIdType: \"open_id\" | \"union_id\" | \"user_id\" = \"open_id\",\n ): Promise<FeishuUser[]> {\n const response = await this.client.contact.user.batch({\n params: {\n user_ids: userIds,\n user_id_type: userIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return (response.data?.items || []) as FeishuUser[];\n }\n}\n","import { FeishuSdkService } from \"./feishu-sdk.service\";\nimport {\n SendCardParams,\n ReplyCardParams,\n UpdateCardParams,\n SendMessageResponse,\n CardContent,\n type CardActionTriggerCallback,\n} from \"./types\";\nimport { FEISHU_CARD_ACTION_TRIGGER } from \"./types\";\n\n/**\n * 飞书卡片消息服务\n * 提供卡片消息的发送、回复、更新功能\n */\nexport class FeishuCardService {\n constructor(protected readonly feishuSdkService: FeishuSdkService) {\n // 监听卡片动作触发事件\n feishuSdkService.on(FEISHU_CARD_ACTION_TRIGGER, (event) => {\n this.handleCardActionTrigger(event);\n });\n }\n\n async handleCardActionTrigger(event: CardActionTriggerCallback): Promise<void> {\n const _eventHook = event.header.event_type ?? event.event.action.tag;\n\n // console.log(_eventHook);\n }\n\n /**\n * 将卡片内容转换为字符串\n */\n protected serializeCard(card: CardContent): string {\n return typeof card === \"string\" ? card : JSON.stringify(card);\n }\n\n /**\n * 转换 API 响应为统一格式\n */\n protected transformMessageResponse(data: any): SendMessageResponse {\n return {\n messageId: data.message_id,\n rootId: data.root_id,\n parentId: data.parent_id,\n msgType: data.msg_type,\n createTime: data.create_time,\n updateTime: data.update_time,\n deleted: data.deleted,\n updated: data.updated,\n chatId: data.chat_id,\n sender: {\n id: data.sender?.id,\n idType: data.sender?.id_type,\n senderType: data.sender?.sender_type,\n tenantKey: data.sender?.tenant_key,\n },\n };\n }\n\n /**\n * 发送卡片消息\n * @param params 发送卡片消息的参数\n * @returns 发送结果\n */\n async sendCard(params: SendCardParams): Promise<SendMessageResponse> {\n const { receiveId, receiveIdType, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.create({\n params: {\n receive_id_type: receiveIdType,\n },\n data: {\n receive_id: receiveId,\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书发送卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 回复卡片消息\n * @param params 回复卡片消息的参数\n * @returns 回复结果\n */\n async replyCard(params: ReplyCardParams): Promise<SendMessageResponse> {\n const { messageId, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.reply({\n path: {\n message_id: messageId,\n },\n data: {\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书回复卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 更新卡片消息\n * @param params 更新卡片消息的参数\n * @returns 更新是否成功\n */\n async updateCard(params: UpdateCardParams): Promise<void> {\n const { messageId, card } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.patch({\n path: {\n message_id: messageId,\n },\n data: {\n content: this.serializeCard(card),\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书更新卡片失败: ${response.code} - ${response.msg}`);\n }\n }\n}\n","/**\n * 飞书 SDK 模块配置类型\n */\n\nexport const FEISHU_MODULE_OPTIONS = \"FEISHU_MODULE_OPTIONS\";\n\nexport interface FeishuModuleOptions {\n /** 应用 ID */\n appId: string;\n /** 应用密钥 */\n appSecret: string;\n /** 应用类型:自建应用或商店应用 */\n appType?: \"self_build\" | \"store\";\n /** 域名:飞书或 Lark */\n domain?: \"feishu\" | \"lark\";\n}\n\nexport interface FeishuModuleAsyncOptions {\n useFactory: (...args: any[]) => Promise<FeishuModuleOptions> | FeishuModuleOptions;\n inject?: any[];\n}\n","/**\n * 飞书 SDK 类型定义\n */\n\n// Module - 模块配置\nexport {\n FEISHU_MODULE_OPTIONS,\n type FeishuModuleOptions,\n type FeishuModuleAsyncOptions,\n} from \"./module\";\n\n// Common - 通用类型\nexport { type I18nLocale } from \"./common\";\n\n// User - 用户相关\nexport { type UserIdType, type FeishuUser, type GetUserParams } from \"./user\";\n\n// Message - 消息相关\nexport { type ReceiveIdType, type SendMessageResponse } from \"./message\";\n\n// Card - 卡片消息\nexport {\n type CardContent,\n type SendCardParams,\n type ReplyCardParams,\n type UpdateCardParams,\n type CardDataRaw,\n type CardDataTemplate,\n type CardData,\n} from \"./card\";\n\n// CardAction - 卡片交互回调\nexport {\n FEISHU_CARD_ACTION_TRIGGER,\n type CardActionHeader,\n type CardActionOperator,\n type CardActionInfo,\n type CardActionContext,\n type CardActionEventData,\n type CardActionTriggerCallback,\n type CardActionToast,\n type CardActionTriggerResponse,\n type CardActionTriggerEventCallback,\n type CardActionTriggerEvent,\n type CardEvents,\n} from \"./card-action\";\n","export * from \"./feishu-sdk.service\";\nexport * from \"./fieshu-card.service\";\nexport * from \"./types/index\";\n","import { type StorageAdapter } from \"./adapters/storage-adapter.interface\";\nimport type { IStorageService } from \"../../extension-system/types\";\n\n/**\n * Storage 服务配置选项\n */\nexport interface StorageServiceOptions {\n /** 默认过期时间(毫秒),0 表示永不过期 */\n defaultTtl?: number;\n /** 最大 key 数量,超过时会淘汰最早过期的 key,0 或 undefined 表示不限制 */\n maxKeys?: number;\n}\n\n/**\n * Storage 服务\n * 提供统一的键值存储接口,支持过期时间和层级 key\n *\n * Key 使用 : 作为层级分隔符,例如:\n * - user:123:profile\n * - cache:api:users\n */\nexport class StorageService implements IStorageService {\n protected cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n protected readonly adapter: StorageAdapter,\n protected readonly options: StorageServiceOptions = {},\n ) {\n // 启动定期清理过期项的定时器\n this.startCleanupTimer();\n }\n\n destroy(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * 启动定期清理过期项的定时器\n */\n protected startCleanupTimer(): void {\n // 每分钟清理一次过期项\n this.cleanupTimer = setInterval(() => {\n this.cleanup().catch(console.error);\n }, 60 * 1000);\n // 使用 unref() 让定时器不阻止进程退出\n this.cleanupTimer.unref();\n }\n\n /**\n * 清理所有过期项\n */\n async cleanup(): Promise<number> {\n const now = Date.now();\n const allKeys = await this.adapter.keys();\n let cleaned = 0;\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && item.expireAt && item.expireAt <= now) {\n await this.adapter.delete(key);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n\n /**\n * 获取值\n * @param key 键名,支持 : 分隔的层级结构\n * @returns 值,如果不存在或已过期返回 undefined\n */\n async get<T = any>(key: string): Promise<T | undefined> {\n const item = await this.adapter.get<T>(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n /**\n * 设置值\n * @param key 键名,支持 : 分隔的层级结构\n * @param value 值\n * @param ttl 过期时间(毫秒),0 或 undefined 表示使用默认值\n */\n async set<T = any>(key: string, value: T, ttl?: number): Promise<void> {\n const effectiveTtl = ttl ?? this.options.defaultTtl ?? 0;\n\n // 检查是否需要淘汰\n if (this.options.maxKeys && this.options.maxKeys > 0) {\n const exists = await this.adapter.has(key);\n if (!exists) {\n await this.evictIfNeeded();\n }\n }\n\n await this.adapter.set(key, {\n value,\n expireAt: effectiveTtl > 0 ? Date.now() + effectiveTtl : undefined,\n });\n }\n\n /**\n * 如果超过最大 key 数量,淘汰最早过期的 key\n */\n protected async evictIfNeeded(): Promise<void> {\n const maxKeys = this.options.maxKeys;\n if (!maxKeys || maxKeys <= 0) return;\n\n const currentSize = await this.adapter.size();\n if (currentSize < maxKeys) return;\n\n // 先清理过期的 key\n await this.cleanup();\n\n // 再次检查\n const sizeAfterCleanup = await this.adapter.size();\n if (sizeAfterCleanup < maxKeys) return;\n\n // 仍然超过限制,淘汰最早过期的 key\n const allKeys = await this.adapter.keys();\n const keyWithExpire: { key: string; expireAt: number }[] = [];\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item) {\n keyWithExpire.push({\n key,\n expireAt: item.expireAt ?? Infinity, // 永不过期的放最后\n });\n }\n }\n\n // 按过期时间排序,最早过期的在前面\n keyWithExpire.sort((a, b) => a.expireAt - b.expireAt);\n\n // 淘汰超出的 key\n const toEvict = sizeAfterCleanup - maxKeys + 1; // +1 为新 key 腾出空间\n for (let i = 0; i < toEvict && i < keyWithExpire.length; i++) {\n await this.adapter.delete(keyWithExpire[i].key);\n }\n }\n\n /**\n * 删除值\n * @param key 键名\n * @returns 是否删除成功\n */\n async del(key: string): Promise<boolean> {\n return this.adapter.delete(key);\n }\n\n /**\n * 检查键是否存在(且未过期)\n * @param key 键名\n */\n async has(key: string): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * 获取匹配的键名列表\n * @param pattern 匹配模式,支持 * 通配符\n *\n * 示例:\n * - keys('user:*') 获取所有以 user: 开头的键\n * - keys('*:profile') 获取所有以 :profile 结尾的键\n * - keys('user:*:settings') 获取匹配模式的键\n */\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = await this.adapter.keys(pattern);\n const now = Date.now();\n const validKeys: string[] = [];\n\n // 过滤掉已过期的键\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && (!item.expireAt || item.expireAt > now)) {\n validKeys.push(key);\n }\n }\n\n return validKeys;\n }\n\n /**\n * 获取指定前缀下的所有键\n * @param prefix 前缀,例如 'user:123'\n */\n async keysWithPrefix(prefix: string): Promise<string[]> {\n return this.keys(`${prefix}:*`);\n }\n\n /**\n * 删除指定前缀下的所有键\n * @param prefix 前缀\n * @returns 删除的键数量\n */\n async delByPrefix(prefix: string): Promise<number> {\n const keysToDelete = await this.keysWithPrefix(prefix);\n let deleted = 0;\n\n for (const key of keysToDelete) {\n if (await this.adapter.delete(key)) {\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * 设置过期时间\n * @param key 键名\n * @param ttl 过期时间(毫秒)\n * @returns 是否设置成功\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n await this.adapter.set(key, {\n ...item,\n expireAt: ttl > 0 ? Date.now() + ttl : undefined,\n });\n\n return true;\n }\n\n /**\n * 获取剩余过期时间\n * @param key 键名\n * @returns 剩余时间(毫秒),-1 表示永不过期,undefined 表示键不存在\n */\n async ttl(key: string): Promise<number | undefined> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n if (!item.expireAt) {\n return -1; // 永不过期\n }\n\n return item.expireAt - Date.now();\n }\n\n /**\n * 清空所有存储\n */\n async clear(): Promise<void> {\n await this.adapter.clear();\n }\n\n /**\n * 获取当前存储的 key 数量\n */\n async size(): Promise<number> {\n return this.adapter.size();\n }\n}\n","import { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 内存存储适配器\n * 数据存储在内存中,进程重启后数据丢失\n */\nexport class MemoryAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 文件存储适配器\n * 数据持久化到 JSON 文件,支持进程重启后恢复\n */\nexport class FileAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n protected filePath: string;\n protected saveTimer: ReturnType<typeof setTimeout> | null = null;\n protected readonly debounceMs = 100; // 防抖延迟\n\n constructor(filePath: string) {\n this.filePath = filePath;\n this.load();\n }\n\n /**\n * 从文件加载数据\n */\n protected load(): void {\n try {\n if (fs.existsSync(this.filePath)) {\n const data = fs.readFileSync(this.filePath, \"utf-8\");\n const parsed = JSON.parse(data) as Record<string, StorageItem>;\n this.store = new Map(Object.entries(parsed));\n }\n } catch {\n // 文件不存在或解析失败,使用空存储\n this.store = new Map();\n }\n }\n\n /**\n * 保存数据到文件(防抖)\n */\n protected save(): void {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = setTimeout(() => {\n this.saveSync();\n this.saveTimer = null;\n }, this.debounceMs);\n }\n\n /**\n * 同步保存数据到文件\n */\n protected saveSync(): void {\n try {\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const data = Object.fromEntries(this.store);\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf-8\");\n } catch (error) {\n console.error(\"Failed to save storage file:\", error);\n }\n }\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n this.save();\n }\n\n async delete(key: string): Promise<boolean> {\n const result = this.store.delete(key);\n if (result) {\n this.save();\n }\n return result;\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n this.save();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","export * from \"./storage-adapter.interface\";\nexport * from \"./memory.adapter\";\nexport * from \"./file.adapter\";\n","export * from \"./storage.service\";\nexport * from \"./types\";\nexport * from \"./adapters\";\n","export interface ParallelTask<T, R> {\n id: string;\n data: T;\n execute: (data: T) => Promise<R>;\n}\n\nexport interface ParallelResult<R> {\n id: string;\n success: boolean;\n result?: R;\n error?: Error;\n}\n\nexport interface ParallelExecutorOptions {\n concurrency?: number;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n onProgress?: (completed: number, total: number, taskId: string) => void;\n onTaskStart?: (taskId: string) => void;\n onTaskComplete?: (taskId: string, success: boolean) => void;\n onRetry?: (taskId: string, attempt: number, error: Error) => void;\n stopOnError?: boolean;\n}\n\nexport class ParallelExecutor {\n private readonly concurrency: number;\n private readonly timeout?: number;\n private readonly retries: number;\n private readonly retryDelay: number;\n private readonly onProgress?: (completed: number, total: number, taskId: string) => void;\n private readonly onTaskStart?: (taskId: string) => void;\n private readonly onTaskComplete?: (taskId: string, success: boolean) => void;\n private readonly onRetry?: (taskId: string, attempt: number, error: Error) => void;\n private readonly stopOnError: boolean;\n\n constructor(options: ParallelExecutorOptions = {}) {\n this.concurrency = options.concurrency ?? 5;\n this.timeout = options.timeout;\n this.retries = options.retries ?? 0;\n this.retryDelay = options.retryDelay ?? 1000;\n this.onProgress = options.onProgress;\n this.onTaskStart = options.onTaskStart;\n this.onTaskComplete = options.onTaskComplete;\n this.onRetry = options.onRetry;\n this.stopOnError = options.stopOnError ?? false;\n }\n\n async execute<T, R>(tasks: ParallelTask<T, R>[]): Promise<ParallelResult<R>[]> {\n if (tasks.length === 0) {\n return [];\n }\n\n const results: ParallelResult<R>[] = [];\n const total = tasks.length;\n let completed = 0;\n let shouldStop = false;\n\n const executeTask = async (task: ParallelTask<T, R>): Promise<ParallelResult<R>> => {\n if (shouldStop) {\n return { id: task.id, success: false, error: new Error(\"Execution stopped\") };\n }\n\n this.onTaskStart?.(task.id);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (attempt > 0) {\n this.onRetry?.(task.id, attempt, lastError!);\n await this.delay(this.retryDelay);\n }\n\n try {\n const result = await this.executeWithTimeout(task, task.data);\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, true);\n return { id: task.id, success: true, result };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, false);\n\n if (this.stopOnError) {\n shouldStop = true;\n }\n\n return {\n id: task.id,\n success: false,\n error: lastError,\n };\n };\n\n // 使用滑动窗口并发控制\n const pending: Promise<void>[] = [];\n const taskQueue = [...tasks];\n\n while (taskQueue.length > 0 || pending.length > 0) {\n // 填充到并发上限\n while (pending.length < this.concurrency && taskQueue.length > 0 && !shouldStop) {\n const task = taskQueue.shift()!;\n const promise = executeTask(task).then((result) => {\n results.push(result);\n // 从 pending 中移除\n const index = pending.indexOf(promise);\n if (index > -1) {\n pending.splice(index, 1);\n }\n });\n pending.push(promise);\n }\n\n // 等待任意一个完成\n if (pending.length > 0) {\n await Promise.race(pending);\n }\n }\n\n // 按原始顺序排序结果\n const taskIdOrder = new Map(tasks.map((t, i) => [t.id, i]));\n results.sort((a, b) => (taskIdOrder.get(a.id) ?? 0) - (taskIdOrder.get(b.id) ?? 0));\n\n return results;\n }\n\n async map<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n getId?: (item: T, index: number) => string,\n ): Promise<ParallelResult<R>[]> {\n const tasks: ParallelTask<{ item: T; index: number }, R>[] = items.map((item, index) => ({\n id: getId ? getId(item, index) : String(index),\n data: { item, index },\n execute: async ({ item, index }) => fn(item, index),\n }));\n\n return this.execute(tasks);\n }\n\n private async executeWithTimeout<T, R>(task: ParallelTask<T, R>, data: T): Promise<R> {\n if (!this.timeout) {\n return task.execute(data);\n }\n\n return Promise.race([\n task.execute(data),\n new Promise<R>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Task ${task.id} timed out after ${this.timeout}ms`)),\n this.timeout,\n ),\n ),\n ]);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport function parallel(options?: ParallelExecutorOptions): ParallelExecutor {\n return new ParallelExecutor(options);\n}\n","export * from \"./parallel-executor\";\n","import { randomUUID } from \"crypto\";\nimport type { IOutputService } from \"../../extension-system/types\";\n\nconst OUTPUT_MARKER_START = \"::spaceflow-output::\";\nconst OUTPUT_MARKER_END = \"::end::\";\n\n/**\n * OutputService - 用于标准化命令输出\n *\n * 命令可以通过此服务设置输出值,这些值会在命令执行完成后\n * 以特定格式输出到 stdout,供 CI 流程中的其他步骤使用。\n *\n * 输出格式: ::spaceflow-output::{\"key\":\"value\",\"_cacheId\":\"uuid\"}::end::\n *\n * _cacheId 用于 actions/cache 在不同 job 之间传递数据\n *\n * 使用示例:\n * ```typescript\n * const output = new OutputService();\n * output.set(\"version\", \"1.0.0\");\n * output.set(\"tag\", \"v1.0.0\");\n * output.flush();\n * ```\n */\nexport class OutputService implements IOutputService {\n protected outputs: Record<string, string> = {};\n protected cacheId: string = randomUUID();\n\n /**\n * 设置单个输出值\n */\n set(key: string, value: string | number | boolean): void {\n this.outputs[key] = String(value);\n }\n\n /**\n * 批量设置输出值\n */\n setAll(values: Record<string, string | number | boolean>): void {\n for (const [key, value] of Object.entries(values)) {\n this.set(key, value);\n }\n }\n\n /**\n * 获取所有输出值\n */\n getAll(): Record<string, string> {\n return { ...this.outputs };\n }\n\n /**\n * 清空所有输出值\n */\n clear(): void {\n this.outputs = {};\n }\n\n /**\n * 输出所有值到 stdout(带标记格式)\n * 通常在命令执行完成后调用\n * _cacheId 会被 actions 捕获并用于 actions/cache\n */\n flush(): void {\n if (Object.keys(this.outputs).length === 0) {\n return;\n }\n\n // 输出到 stdout,包含 cacheId 供 actions/cache 使用\n const outputWithCache = { ...this.outputs, _cacheId: this.cacheId };\n const json = JSON.stringify(outputWithCache);\n console.log(`${OUTPUT_MARKER_START}${json}${OUTPUT_MARKER_END}`);\n }\n\n /**\n * 检查是否有输出值\n */\n hasOutputs(): boolean {\n return Object.keys(this.outputs).length > 0;\n }\n\n /**\n * 获取当前 cacheId\n */\n getCacheId(): string {\n return this.cacheId;\n }\n\n /**\n * 输出信息\n */\n info(message: string): void {\n console.log(message);\n }\n\n /**\n * 输出成功信息\n */\n success(message: string): void {\n console.log(`✅ ${message}`);\n }\n\n /**\n * 输出警告\n */\n warn(message: string): void {\n console.warn(`⚠️ ${message}`);\n }\n\n /**\n * 输出错误\n */\n error(message: string): void {\n console.error(`❌ ${message}`);\n }\n\n /**\n * 输出调试信息\n */\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.debug(`🔍 ${message}`);\n }\n }\n}\n\nexport { OUTPUT_MARKER_START, OUTPUT_MARKER_END };\n","export * from \"./output.service\";\n","/**\n * 从 @spaceflow/shared 重导出 editor-config\n */\nexport { EDITOR_DIR_MAPPING, DEFAULT_EDITOR, getEditorDirName } from \"@spaceflow/shared\";\n","import { jsonrepair } from \"jsonrepair\";\nimport type { LlmJsonPutSchema, LlmJsonSchema } from \"./types\";\n\nexport type { LlmJsonPutSchema, LlmJsonSchema, LlmJsonSchemaType } from \"./types\";\n\nexport interface ParseOptions {\n disableRequestRetry?: boolean;\n}\n\nexport interface LlmJsonPutOptions {\n llmRequest?: (prompt: { systemPrompt: string; userPrompt: string }) => Promise<string>;\n systemPrompt?: string;\n}\n\nconst JSON_FORMAT_INSTRUCTION = `请严格以 JSON 格式输出结果,不要输出任何其他内容,格式如下:`;\n\nexport class LlmJsonPut<T = any> {\n public readonly jsonFormatInstruction: string;\n constructor(\n protected schema: LlmJsonPutSchema,\n protected opts?: LlmJsonPutOptions,\n ) {\n this.jsonFormatInstruction = this.getJsonFormatInstruction(schema);\n }\n\n isMatched(prompt: string): boolean {\n return prompt.includes(JSON_FORMAT_INSTRUCTION);\n }\n\n getSchema(): Record<string, unknown> {\n return this.schema as unknown as Record<string, unknown>;\n }\n\n getJsonFormatInstruction(schema: LlmJsonPutSchema): string {\n const generateExample = (s: LlmJsonSchema): any => {\n if (s.type === \"object\") {\n const obj: any = {};\n for (const [key, value] of Object.entries(s.properties || {})) {\n obj[key] = generateExample(value);\n }\n return obj;\n } else if (s.type === \"array\") {\n return [generateExample(s.items!)];\n }\n return s.description || `<${s.type}>`;\n };\n\n const example = JSON.stringify(generateExample(schema), null, 2);\n\n return `${JSON_FORMAT_INSTRUCTION}\\n\\`\\`\\`json\\n${example}\\`\\`\\`\\n注意:只输出 JSON,不要包含 markdown 代码块或其他文字。`;\n }\n\n async parse(input: string, opts?: ParseOptions): Promise<T> {\n let content = input.trim();\n\n // 尝试移除 markdown 代码块\n if (content.startsWith(\"```\")) {\n content = content.replace(/^```(?:json)?\\n?/, \"\").replace(/\\n?```$/, \"\");\n }\n\n try {\n try {\n return JSON.parse(content);\n } catch {\n // 如果原生解析失败,尝试修复\n const repaired = jsonrepair(content);\n return JSON.parse(repaired);\n }\n } catch (err) {\n // 如果以上都不行就都丢给大模型,然后在重新走parse,但是要记录重新执行的次数,最多5次\n let retryCount = 0;\n while (retryCount < 5 && !opts?.disableRequestRetry) {\n const response = await this.request(input);\n return response;\n }\n throw new Error(\n `无法解析或修复 LLM 返回的 JSON: ${err instanceof Error ? err.message : String(err)}\\n原始内容: ${input}`,\n );\n }\n }\n\n async request(userPrompt: string): Promise<T> {\n if (!this.opts?.llmRequest) {\n throw new Error(\"未配置 llmRequest 方法,无法发起请求\");\n }\n\n const systemPrompt = `${this.opts.systemPrompt ? this.opts.systemPrompt + \"\\n\" : \"\"}${this.jsonFormatInstruction}`;\n const response = await this.opts.llmRequest({\n systemPrompt,\n userPrompt,\n });\n return this.parse(response, { disableRequestRetry: true });\n }\n}\n","/**\n * 从 @spaceflow/shared 重导出 source-utils\n */\nexport type { SourceType } from \"@spaceflow/shared\";\nexport {\n isGitUrl,\n isLocalPath,\n getSourceType,\n normalizeSource,\n extractNpmPackageName,\n extractName,\n buildGitPackageSpec,\n} from \"@spaceflow/shared\";\n","/**\n * 从 @spaceflow/shared 重导出 package-manager 工具函数\n */\nexport { getPackageManager, detectPackageManager, isPnpmWorkspace } from \"@spaceflow/shared\";\n\n// addSpaceflowToDevDependencies 是 core 独有的,保留在这里\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\n\n/**\n * 将 .spaceflow 添加到根项目的 devDependencies 中\n * 使用 file: 协议,兼容 npm 和 pnpm\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否成功添加(如果已存在则返回 false)\n */\nexport function addSpaceflowToDevDependencies(cwd?: string): boolean {\n const workDir = cwd || process.cwd();\n const packageJsonPath = join(workDir, \"package.json\");\n\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n // 检查是否已存在\n if (pkg.devDependencies?.[\"spaceflow\"]) {\n return false;\n }\n\n // 添加到 devDependencies\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n pkg.devDependencies[\"spaceflow\"] = \"file:.spaceflow\";\n\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * 从 @spaceflow/shared 重导出 spaceflow-dir 工具函数\n */\nexport {\n getSpaceflowDir,\n ensureSpaceflowDir,\n getSpaceflowCoreVersion,\n ensureSpaceflowPackageJson,\n ensureDependencies,\n loadExtensionsFromDir,\n ensureEditorGitignore,\n SPACEFLOW_DIR,\n PACKAGE_JSON,\n} from \"@spaceflow/shared\";\n","import { resolve } from \"path\";\nimport type { Configuration, RuleSetRule } from \"@rspack/core\";\n\n/**\n * 插件构建配置选项\n */\nexport interface PluginBuildOptions {\n /** 插件名称 */\n name: string;\n /** 插件根目录路径 */\n path: string;\n /** 入口文件路径,默认 ./src/index.ts */\n entry?: string;\n /** 输出目录,默认 dist */\n outDir?: string;\n /** 是否压缩,默认 false */\n minimize?: boolean;\n /** 额外的外部依赖 */\n externals?: Configuration[\"externals\"];\n /** 额外的 resolve alias */\n alias?: Record<string, string>;\n /** 自定义 module rules */\n rules?: RuleSetRule[];\n}\n\n/**\n * 核心框架路径配置\n */\nexport interface CorePathOptions {\n /** core 包根目录 */\n coreRoot: string;\n}\n\n/**\n * 默认的外部依赖列表\n */\nexport const DEFAULT_EXTERNALS: Configuration[\"externals\"] = [\n // Spaceflow 核心 - 运行时从 core 加载\n { \"@spaceflow/core\": \"module @spaceflow/core\" },\n // 排除所有 node_modules(除了相对路径和 src/ 别名)\n /^(?!\\.\\/|\\.\\.\\/|src\\/)[^./]/,\n];\n\n/**\n * 默认的 TypeScript 编译规则\n */\nexport const DEFAULT_TS_RULE: RuleSetRule = {\n test: /\\.ts$/,\n exclude: /node_modules/,\n loader: \"builtin:swc-loader\",\n options: {\n jsc: {\n parser: {\n syntax: \"typescript\",\n decorators: true,\n },\n transform: {\n legacyDecorator: true,\n decoratorMetadata: true,\n },\n target: \"es2022\",\n },\n },\n};\n\n/**\n * 创建插件构建的 rspack 配置\n */\nexport function createPluginConfig(\n options: PluginBuildOptions,\n coreOptions: CorePathOptions,\n): Configuration {\n const {\n name,\n path: pluginPath,\n entry = \"./src/index.ts\",\n outDir = \"dist\",\n minimize = false,\n externals: customExternals = [],\n alias: customAlias = {},\n rules: customRules = [],\n } = options;\n\n const { coreRoot } = coreOptions;\n\n // 合并外部依赖\n const mergedExternals = Array.isArray(customExternals)\n ? [...(DEFAULT_EXTERNALS as any[]), ...customExternals]\n : [...(DEFAULT_EXTERNALS as any[]), customExternals];\n\n // 合并 alias\n const alias = {\n \"@spaceflow/core\": resolve(coreRoot, \"src\", \"index.ts\"),\n ...customAlias,\n };\n\n // 合并 rules\n const rules = [DEFAULT_TS_RULE, ...customRules];\n\n return {\n name,\n context: pluginPath,\n optimization: {\n minimize,\n },\n entry: {\n index: entry,\n },\n target: \"node\",\n mode: process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n output: {\n filename: \"[name].js\",\n path: resolve(pluginPath, outDir),\n library: { type: \"module\" },\n chunkFormat: \"module\",\n clean: true,\n },\n experiments: {\n outputModule: true,\n },\n externalsType: \"module-import\",\n externals: mergedExternals,\n resolve: {\n extensions: [\".ts\", \".js\"],\n extensionAlias: {\n \".js\": [\".ts\", \".js\"],\n },\n alias,\n },\n module: {\n rules,\n },\n };\n}\n\n/**\n * 创建多入口插件配置\n */\nexport function createMultiEntryPluginConfig(\n options: Omit<PluginBuildOptions, \"entry\"> & {\n entries: Record<string, string>;\n },\n coreOptions: CorePathOptions,\n): Configuration {\n const config = createPluginConfig({ ...options, entry: \"./src/index.ts\" }, coreOptions);\n\n return {\n ...config,\n entry: options.entries,\n };\n}\n","export * from \"./rspack-config\";\n","/**\n * MCP (Model Context Protocol) 支持模块\n *\n * 提供装饰器和基础设施,用于在服务中定义 MCP 工具\n *\n * 使用方式:\n * ```typescript\n * class ListRulesInput {\n * @ApiPropertyOptional({ description: \"项目目录\" })\n * @IsString()\n * @IsOptional()\n * cwd?: string;\n * }\n *\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({\n * name: \"list_rules\",\n * description: \"获取所有审查规则\",\n * dto: ListRulesInput,\n * })\n * async listRules(input: ListRulesInput) {\n * return { rules: [...] };\n * }\n * }\n * ```\n */\n\nimport \"reflect-metadata\";\n\n/** MCP 服务元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_SERVER_METADATA = Symbol.for(\"spaceflow:mcp:server\");\n\n/** MCP 工具元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_TOOL_METADATA = Symbol.for(\"spaceflow:mcp:tool\");\n\n/** JSON Schema 类型 */\nexport interface JsonSchema {\n type: string;\n properties?: Record<string, JsonSchema & { description?: string }>;\n required?: string[];\n items?: JsonSchema;\n description?: string;\n}\n\n/** MCP 服务定义 */\nexport interface McpServerDefinition {\n /** 服务名称 */\n name: string;\n /** 服务版本 */\n version?: string;\n /** 服务描述 */\n description?: string;\n}\n\n/** Swagger 元数据常量 */\nconst SWAGGER_API_MODEL_PROPERTIES = \"swagger/apiModelProperties\";\nconst SWAGGER_API_MODEL_PROPERTIES_ARRAY = \"swagger/apiModelPropertiesArray\";\n\n/**\n * 从 @nestjs/swagger 的 @ApiProperty / @ApiPropertyOptional 元数据生成 JSON Schema\n * 直接读取 swagger 装饰器存储的 reflect-metadata,无需自定义装饰器\n */\nexport function dtoToJsonSchema(dtoClass: new (...args: any[]) => any): JsonSchema {\n const prototype = dtoClass.prototype;\n\n // 读取属性名列表(swagger 存储格式为 \":propertyName\")\n const propertyKeys: string[] = (\n Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES_ARRAY, prototype) || []\n ).map((key: string) => key.replace(/^:/, \"\"));\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const key of propertyKeys) {\n const meta = Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES, prototype, key) || {};\n\n // 推断 JSON Schema type\n const typeMap: Record<string, string> = {\n String: \"string\",\n Number: \"number\",\n Boolean: \"boolean\",\n Array: \"array\",\n Object: \"object\",\n };\n\n let schemaType = meta.type;\n // meta.type 可能是构造函数(如 Boolean)或字符串(如 \"boolean\")\n if (typeof schemaType === \"function\") {\n schemaType = typeMap[schemaType.name] || \"string\";\n }\n // 从 reflect-metadata 的 design:type 推断\n if (!schemaType) {\n const reflectedType = Reflect.getMetadata(\"design:type\", prototype, key);\n if (reflectedType) {\n schemaType = typeMap[reflectedType.name] || \"string\";\n }\n }\n\n const prop: Record<string, any> = {};\n if (schemaType) prop.type = schemaType;\n if (meta.description) prop.description = meta.description;\n if (meta.default !== undefined) prop.default = meta.default;\n if (meta.enum) prop.enum = meta.enum;\n if (meta.example !== undefined) prop.example = meta.example;\n\n properties[key] = prop;\n\n // required 判断:swagger 的 @ApiProperty 默认 required=true,@ApiPropertyOptional 为 false\n if (meta.required !== false) {\n required.push(key);\n }\n }\n\n const schema: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) schema.required = required;\n return schema;\n}\n\n/** MCP 工具定义 */\nexport interface McpToolDefinition {\n /** 工具名称 */\n name: string;\n /** 工具描述 */\n description: string;\n /** 输入参数 schema (JSON Schema 格式,与 dto 二选一) */\n inputSchema?: JsonSchema;\n /** 输入参数 DTO 类(与 inputSchema 二选一,优先级高于 inputSchema) */\n dto?: new (...args: any[]) => any;\n}\n\n/** 存储的工具元数据 */\nexport interface McpToolMetadata extends McpToolDefinition {\n /** 方法名 */\n methodName: string;\n}\n\n/**\n * MCP 服务装饰器\n * 标记一个类为 MCP 服务,内部自动应用 @Injectable()\n *\n * @example\n * ```typescript\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({ name: \"list_rules\", description: \"获取规则\" })\n * async listRules() { ... }\n * }\n * ```\n */\nexport function McpServer(definition: McpServerDefinition): ClassDecorator {\n return (target: Function) => {\n // 使用静态属性存储元数据(跨模块可访问)\n (target as any).__mcp_server__ = definition;\n };\n}\n\n/**\n * MCP 工具装饰器\n * 标记一个方法为 MCP 工具\n */\nexport function McpTool(definition: McpToolDefinition): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor as any;\n // 使用静态属性存储工具列表(跨模块可访问)\n if (!constructor.__mcp_tools__) {\n constructor.__mcp_tools__ = [];\n }\n\n // 如果提供了 dto,自动从 swagger 元数据生成 inputSchema\n const resolvedDefinition = { ...definition };\n if (resolvedDefinition.dto) {\n resolvedDefinition.inputSchema = dtoToJsonSchema(resolvedDefinition.dto);\n }\n\n constructor.__mcp_tools__.push({\n ...resolvedDefinition,\n methodName: String(propertyKey),\n });\n };\n}\n\n/**\n * 检查一个类是否是 MCP 服务\n */\nexport function isMcpServer(target: any): boolean {\n const constructor = target?.constructor || target;\n return !!constructor?.__mcp_server__;\n}\n\n/**\n * 获取 MCP 服务元数据\n */\nexport function getMcpServerMetadata(target: any): McpServerDefinition | undefined {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_server__;\n}\n\n/**\n * 从服务类获取所有 MCP 工具定义\n */\nexport function getMcpTools(target: any): McpToolMetadata[] {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_tools__ || [];\n}\n\n/**\n * MCP Server 运行器\n * 收集服务中的 MCP 工具并启动 stdio 服务\n */\nexport async function runMcpServer(\n service: any,\n serverInfo: { name: string; version: string },\n): Promise<void> {\n const tools = getMcpTools(service);\n\n if (tools.length === 0) {\n console.error(\"没有找到 MCP 工具定义\");\n process.exit(1);\n }\n\n // 动态导入 MCP SDK(避免在不需要时加载)\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const server = new McpServer(serverInfo);\n\n // 注册所有工具(使用 v1 API: server.tool)\n for (const tool of tools) {\n // v1 API: server.tool(name, description, schema, callback)\n // 使用工具定义中的 inputSchema 转为 zod,如果没有则传空对象\n const schema = tool.inputSchema ? jsonSchemaToZod(tool.inputSchema) : {};\n server.tool(tool.name, tool.description, schema, async (args: any) => {\n try {\n const result = await service[tool.methodName](args || {});\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n });\n }\n\n /**\n * 将 JSON Schema 转换为简单的 zod 对象(MCP SDK 需要 zod)\n * 仅处理顶层 properties,满足 MCP 工具注册需求\n */\n function jsonSchemaToZod(jsonSchema: JsonSchema): Record<string, any> {\n const { z } = require(\"zod\") as typeof import(\"zod\");\n if (!jsonSchema.properties) return {};\n\n const shape: Record<string, any> = {};\n const requiredFields = jsonSchema.required || [];\n\n for (const [key, prop] of Object.entries(jsonSchema.properties)) {\n let field: any;\n switch (prop.type) {\n case \"number\":\n field = z.number();\n break;\n case \"boolean\":\n field = z.boolean();\n break;\n case \"array\":\n field = z.array(z.any());\n break;\n case \"object\":\n field = z.object({});\n break;\n default:\n field = z.string();\n }\n if (prop.description) field = field.describe(prop.description);\n if (!requiredFields.includes(key)) field = field.optional();\n shape[key] = field;\n }\n\n return shape;\n }\n\n // 启动 stdio 传输\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(`MCP Server \"${serverInfo.name}\" started with ${tools.length} tools`);\n}\n","/** globalThis 上的 key */\nconst GLOBAL_T_KEY = \"__spaceflow_t__\";\nconst GLOBAL_ADD_LOCALE_KEY = \"__spaceflow_add_locale__\";\n\n/** 翻译函数类型 */\nexport type TranslateFn = (key: string, options?: Record<string, unknown>) => string;\n\n/** 注册翻译资源函数类型 */\nexport type AddLocaleResourcesFn = (\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n) => void;\n\n/**\n * 设置全局翻译函数\n * 由 CLI 在启动时调用,将 i18next 的 t 函数挂载到 globalThis\n */\nexport function setGlobalT(fn: TranslateFn): void {\n (globalThis as Record<string, unknown>)[GLOBAL_T_KEY] = fn;\n}\n\n/**\n * 设置全局翻译资源注册函数\n * 由 CLI 在启动时调用\n */\nexport function setGlobalAddLocaleResources(fn: AddLocaleResourcesFn): void {\n (globalThis as Record<string, unknown>)[GLOBAL_ADD_LOCALE_KEY] = fn;\n}\n\n/**\n * 获取全局翻译函数\n */\nfunction getGlobalT(): TranslateFn | undefined {\n return (globalThis as Record<string, unknown>)[GLOBAL_T_KEY] as TranslateFn | undefined;\n}\n\n/**\n * 简单的模板插值(fallback 用)\n * 支持 {{key}} 格式\n */\nfunction interpolate(template: string, options?: Record<string, unknown>): string {\n if (!options) return template;\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, k: string) => {\n const val = options[k];\n return val !== undefined ? String(val) : `{{${k}}}`;\n });\n}\n\n/**\n * 翻译函数\n * 优先使用 CLI 通过 setGlobalT 挂载的翻译函数\n * 未挂载时回退到返回 key(带插值)\n * @param key 翻译 key\n * @param options 插值参数\n */\nexport function t(key: string, options?: Record<string, unknown>): string {\n const globalT = getGlobalT();\n if (globalT) {\n return globalT(key, options);\n }\n // fallback: 直接返回 key(带插值)\n return interpolate(key, options);\n}\n\n/**\n * 为外部 Extension 注册语言资源\n * 委托给 CLI 通过 setGlobalAddLocaleResources 挂载的实际实现\n * @param ns 命名空间(通常为 Extension name)\n * @param resources 语言资源,key 为语言代码,值为翻译对象\n */\nexport function addLocaleResources(\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n): void {\n const fn = (globalThis as Record<string, unknown>)[GLOBAL_ADD_LOCALE_KEY] as\n | AddLocaleResourcesFn\n | undefined;\n if (fn) {\n fn(ns, resources);\n }\n}\n\n/**\n * 重置全局翻译函数(仅用于测试)\n */\nexport function resetI18n(): void {\n (globalThis as Record<string, unknown>)[GLOBAL_T_KEY] = undefined;\n (globalThis as Record<string, unknown>)[GLOBAL_ADD_LOCALE_KEY] = undefined;\n}\n","import { readFileSync, existsSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { join } from \"path\";\nimport { homedir, platform } from \"os\";\n\n/** 默认语言 */\nconst DEFAULT_LOCALE = \"zh-CN\";\n\n/** 配置文件名 */\nconst CONFIG_FILE_NAME = \"spaceflow.json\";\n\n/** .spaceflow 目录名 */\nconst SPACEFLOW_DIR = \".spaceflow\";\n\n/**\n * 标准化 locale 字符串为 BCP 47 格式\n * @example \"zh_CN\" → \"zh-CN\", \"zh-Hans\" → \"zh-CN\", \"en_US.UTF-8\" → \"en-US\"\n */\nfunction normalizeLocale(raw: string): string | undefined {\n const cleaned = raw.replace(/\\..*$/, \"\").trim();\n // 处理 Apple 格式:zh-Hans → zh-CN, zh-Hant → zh-TW\n if (/^zh[-_]?Hans/i.test(cleaned)) return \"zh-CN\";\n if (/^zh[-_]?Hant/i.test(cleaned)) return \"zh-TW\";\n // 处理标准格式:zh_CN / zh-CN / en_US / en-US\n const match = cleaned.match(/^([a-z]{2})[-_]([A-Z]{2})/i);\n if (match) return `${match[1].toLowerCase()}-${match[2].toUpperCase()}`;\n // 处理纯语言代码:zh → zh-CN, en → en\n const langOnly = cleaned.match(/^([a-z]{2})$/i);\n if (langOnly) {\n const lang = langOnly[1].toLowerCase();\n return lang === \"zh\" ? \"zh-CN\" : lang;\n }\n return undefined;\n}\n\n/**\n * 从 spaceflow.json 读取 lang 字段\n * 按优先级从高到低查找:项目 > 全局\n */\nfunction readLangFromConfig(): string | undefined {\n const paths = [\n join(process.cwd(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n join(homedir(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n ];\n for (const configPath of paths) {\n if (!existsSync(configPath)) continue;\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(content) as Record<string, unknown>;\n if (typeof config.lang === \"string\" && config.lang.length > 0) {\n return normalizeLocale(config.lang) ?? config.lang;\n }\n } catch {\n // 忽略解析错误\n }\n }\n return undefined;\n}\n\n/**\n * 从系统环境变量推断 locale\n * 解析 LANG 格式如 \"zh_CN.UTF-8\" → \"zh-CN\"\n */\nfunction readEnvLocale(): string | undefined {\n const raw = process.env.LC_ALL || process.env.LANG;\n if (!raw) return undefined;\n return normalizeLocale(raw);\n}\n\n/**\n * macOS:通过 defaults read 获取系统首选语言\n * AppleLanguages 比 LANG 环境变量更准确地反映用户实际语言偏好\n */\nfunction readMacOSLocale(): string | undefined {\n try {\n const output = execSync(\"defaults read -g AppleLanguages\", {\n encoding: \"utf-8\",\n timeout: 500,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n // 输出格式: (\\n \"zh-Hans-CN\",\\n \"en-CN\"\\n)\n const match = output.match(/\"([^\"]+)\"/);\n if (!match) return undefined;\n return normalizeLocale(match[1]);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Windows:通过 PowerShell 获取系统 UI 语言\n */\nfunction readWindowsLocale(): string | undefined {\n try {\n const output = execSync('powershell -NoProfile -Command \"(Get-Culture).Name\"', {\n encoding: \"utf-8\",\n timeout: 1000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const trimmed = output.trim();\n if (!trimmed) return undefined;\n return normalizeLocale(trimmed);\n } catch {\n return undefined;\n }\n}\n\n/**\n * 读取操作系统级别的语言偏好\n * macOS: defaults read -g AppleLanguages\n * Windows: PowerShell Get-Culture\n */\nfunction readOSLocale(): string | undefined {\n const os = platform();\n if (os === \"darwin\") return readMacOSLocale();\n if (os === \"win32\") return readWindowsLocale();\n return undefined;\n}\n\n/**\n * 检测当前语言\n *\n * 优先级:\n * 1. 环境变量 SPACEFLOW_LANG\n * 2. spaceflow.json 中的 lang 字段(项目 > 全局)\n * 3. 操作系统语言偏好(macOS AppleLanguages / Windows Get-Culture)\n * 4. 系统环境变量 LC_ALL / LANG\n * 5. 回退到 zh-CN\n */\nexport function detectLocale(): string {\n const envLang = process.env.SPACEFLOW_LANG;\n if (envLang) return normalizeLocale(envLang) ?? envLang;\n return readLangFromConfig() || readOSLocale() || readEnvLocale() || DEFAULT_LOCALE;\n}\n","import * as i18nextModule from \"i18next\";\nimport type { i18n } from \"i18next\";\nimport { setGlobalT, setGlobalAddLocaleResources } from \"./i18n\";\nimport { detectLocale } from \"./locale-detect\";\n\n// core 基础翻译资源\nimport coreZhCN from \"../../locales/zh-cn/translation.json\";\nimport coreEn from \"../../locales/en/translation.json\";\n\n// 兼容 CJS/ESM 混合环境\nconst i18next: i18n =\n (i18nextModule as unknown as { default: i18n }).default || (i18nextModule as unknown as i18n);\n\n// ---- CLI 命令翻译 ----\nimport buildZhCN from \"../../locales/zh-cn/build.json\";\nimport buildEn from \"../../locales/en/build.json\";\nimport clearZhCN from \"../../locales/zh-cn/clear.json\";\nimport clearEn from \"../../locales/en/clear.json\";\nimport commitZhCN from \"../../locales/zh-cn/commit.json\";\nimport commitEn from \"../../locales/en/commit.json\";\nimport createZhCN from \"../../locales/zh-cn/create.json\";\nimport createEn from \"../../locales/en/create.json\";\nimport devZhCN from \"../../locales/zh-cn/dev.json\";\nimport devEn from \"../../locales/en/dev.json\";\nimport installZhCN from \"../../locales/zh-cn/install.json\";\nimport installEn from \"../../locales/en/install.json\";\nimport listZhCN from \"../../locales/zh-cn/list.json\";\nimport listEn from \"../../locales/en/list.json\";\nimport mcpZhCN from \"../../locales/zh-cn/mcp.json\";\nimport mcpEn from \"../../locales/en/mcp.json\";\nimport runxZhCN from \"../../locales/zh-cn/runx.json\";\nimport runxEn from \"../../locales/en/runx.json\";\nimport schemaZhCN from \"../../locales/zh-cn/schema.json\";\nimport schemaEn from \"../../locales/en/schema.json\";\nimport setupZhCN from \"../../locales/zh-cn/setup.json\";\nimport setupEn from \"../../locales/en/setup.json\";\nimport uninstallZhCN from \"../../locales/zh-cn/uninstall.json\";\nimport uninstallEn from \"../../locales/en/uninstall.json\";\nimport updateZhCN from \"../../locales/zh-cn/update.json\";\nimport updateEn from \"../../locales/en/update.json\";\n\ntype LocaleResource = Record<string, Record<string, string>>;\n\n/** 所有内部命令 i18n 资源映射(命名空间 → 语言 → 翻译) */\nconst allLocales: Record<string, LocaleResource> = {\n build: { \"zh-CN\": buildZhCN, en: buildEn },\n clear: { \"zh-CN\": clearZhCN, en: clearEn },\n commit: { \"zh-CN\": commitZhCN, en: commitEn },\n create: { \"zh-CN\": createZhCN, en: createEn },\n dev: { \"zh-CN\": devZhCN, en: devEn },\n install: { \"zh-CN\": installZhCN, en: installEn },\n list: { \"zh-CN\": listZhCN, en: listEn },\n mcp: { \"zh-CN\": mcpZhCN, en: mcpEn },\n runx: { \"zh-CN\": runxZhCN, en: runxEn },\n schema: { \"zh-CN\": schemaZhCN, en: schemaEn },\n setup: { \"zh-CN\": setupZhCN, en: setupEn },\n uninstall: { \"zh-CN\": uninstallZhCN, en: uninstallEn },\n update: { \"zh-CN\": updateZhCN, en: updateEn },\n};\n\n/** 默认命名空间 */\nconst DEFAULT_NS = \"translation\";\n\n/**\n * 初始化 CLI 的 i18n 系统\n * 1. 初始化 i18next(core 基础翻译 + CLI 命令翻译)\n * 2. 通过 setGlobalT 挂载翻译函数到 globalThis\n */\nexport function initCliI18n(lang?: string): void {\n const lng = lang || detectLocale();\n\n void i18next.init({\n lng,\n fallbackLng: \"zh-CN\",\n defaultNS: DEFAULT_NS,\n ns: [DEFAULT_NS, ...Object.keys(allLocales)],\n resources: {\n \"zh-CN\": { [DEFAULT_NS]: coreZhCN },\n en: { [DEFAULT_NS]: coreEn },\n },\n interpolation: { escapeValue: false },\n returnNull: false,\n returnEmptyString: false,\n initImmediate: false,\n showSupportNotice: false,\n });\n\n // 注册 CLI 命令翻译到各自命名空间\n for (const [ns, resources] of Object.entries(allLocales)) {\n for (const [lngKey, translations] of Object.entries(resources)) {\n i18next.addResourceBundle(lngKey, ns, translations, true, true);\n }\n }\n\n // 挂载到 globalThis,让 core 和扩展的 t() / addLocaleResources() 调用都能生效\n setGlobalT((key, options) => i18next.t(key, options) as string);\n setGlobalAddLocaleResources(addI18nextResources);\n}\n\n/**\n * 为外部 Extension 注册语言资源(i18next 实现)\n * @param ns 命名空间(通常为 Extension name)\n * @param resources 语言资源,key 为语言代码,值为翻译对象\n */\nexport function addI18nextResources(\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n): void {\n for (const [lng, translations] of Object.entries(resources)) {\n i18next.addResourceBundle(lng, ns, translations, true, true);\n }\n if (!i18next.options.ns) {\n i18next.options.ns = [DEFAULT_NS, ns];\n } else if (Array.isArray(i18next.options.ns) && !i18next.options.ns.includes(ns)) {\n i18next.options.ns.push(ns);\n }\n}\n","// ---- 基础 i18n 设施(globalThis 桥接) ----\nexport {\n t,\n setGlobalT,\n setGlobalAddLocaleResources,\n addLocaleResources,\n resetI18n,\n type TranslateFn,\n type AddLocaleResourcesFn,\n} from \"./i18n\";\n\n// ---- 语言检测 ----\nexport { detectLocale } from \"./locale-detect\";\n\n// ---- CLI i18n 初始化(i18next) ----\nexport { initCliI18n, addI18nextResources } from \"./init\";\n\n// ---- core 基础翻译资源 ----\nexport { default as coreZhCN } from \"../../locales/zh-cn/translation.json\";\nexport { default as coreEn } from \"../../locales/en/translation.json\";\n","import type { LogLevel } from \"../verbose\";\nimport { LOG_LEVEL_PRIORITY } from \"../verbose\";\n\nexport type { LogLevel };\nexport { LOG_LEVEL_PRIORITY };\n\n/** 渲染模式 */\nexport type RenderMode = \"plain\" | \"tui\" | \"auto\";\n\n/** Logger 配置 */\nexport interface LoggerOptions {\n /** 日志所属命名空间(通常为命令名) */\n readonly name: string;\n /** 输出模式,默认 \"auto\"(TTY=tui,CI/管道=plain) */\n readonly mode?: RenderMode;\n /** 日志级别,默认 \"info\" */\n readonly level?: LogLevel;\n}\n\n/** Spinner 控制接口 */\nexport interface Spinner {\n /** 更新 spinner 文本 */\n update(message: string): void;\n /** 成功结束 */\n succeed(message?: string): void;\n /** 失败结束 */\n fail(message?: string): void;\n /** 静默停止 */\n stop(): void;\n}\n\n/** 进度条控制接口 */\nexport interface ProgressBar {\n /** 更新进度 */\n update(current: number, message?: string): void;\n /** 完成 */\n finish(message?: string): void;\n}\n\n/** 进度条配置 */\nexport interface ProgressBarOptions {\n /** 总数 */\n readonly total: number;\n /** 标签 */\n readonly label?: string;\n /** 进度条宽度(字符数),默认 30 */\n readonly width?: number;\n}\n\n/** 任务控制接口 */\nexport interface TaskControl {\n /** 更新任务状态文本 */\n update(message: string): void;\n /** 跳过任务 */\n skip(reason?: string): void;\n}\n\n/** 任务项定义 */\nexport interface TaskItem<T = void> {\n /** 任务标题 */\n readonly title: string;\n /** 任务执行函数 */\n readonly task: (ctx: T, control: TaskControl) => Promise<T>;\n /** 是否启用,默认 true */\n readonly enabled?: boolean;\n}\n\n/** 任务执行结果 */\nexport type TaskStatus = \"pending\" | \"running\" | \"success\" | \"failed\" | \"skipped\";\n\n/** 渲染器接口(策略模式) */\nexport interface LogRenderer {\n /** 输出 info 级别日志 */\n info(prefix: string, message: string): void;\n /** 输出 success 级别日志 */\n success(prefix: string, message: string): void;\n /** 输出 warn 级别日志 */\n warn(prefix: string, message: string): void;\n /** 输出 error 级别日志 */\n error(prefix: string, message: string): void;\n /** 输出 debug 级别日志 */\n debug(prefix: string, message: string): void;\n /** 输出 verbose 级别日志 */\n verbose(prefix: string, message: string): void;\n /** 创建 Spinner */\n createSpinner(prefix: string, message: string): Spinner;\n /** 创建进度条 */\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar;\n /** 执行任务列表 */\n runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]>;\n /** 输出表格 */\n table(prefix: string, data: Record<string, unknown>[]): void;\n}\n","import type {\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"../logger.interface\";\n\n/** 时间戳格式化 */\nconst timestamp = (): string => {\n const now = new Date();\n return `${now.toLocaleTimeString()}`;\n};\n\n/** plain 模式渲染器:纯文本输出,适合 CI / 管道 */\nexport class PlainRenderer implements LogRenderer {\n info(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n success(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ✅ ${message}`);\n }\n\n warn(prefix: string, message: string): void {\n console.warn(`${timestamp()} ${prefix} ⚠️ ${message}`);\n }\n\n error(prefix: string, message: string): void {\n console.error(`${timestamp()} ${prefix} ❌ ${message}`);\n }\n\n debug(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} [DEBUG] ${message}`);\n }\n\n verbose(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n createSpinner(prefix: string, message: string): Spinner {\n console.log(`${timestamp()} ${prefix} ⏳ ${message}`);\n return {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ⏳ ${msg}`);\n },\n succeed: (msg?: string) => {\n console.log(`${timestamp()} ${prefix} ✅ ${msg ?? message}`);\n },\n fail: (msg?: string) => {\n console.error(`${timestamp()} ${prefix} ❌ ${msg ?? message}`);\n },\n stop: () => {},\n };\n }\n\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar {\n const { total, label = \"\" } = options;\n const tag = label ? `${label} ` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}0/${total}`);\n return {\n update: (current: number, msg?: string) => {\n const pct = Math.round((current / total) * 100);\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}${current}/${total} (${pct}%)${suffix}`);\n },\n finish: (msg?: string) => {\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ✅ ${tag}${total}/${total} (100%)${suffix}`);\n },\n };\n }\n\n async runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]> {\n const results: T[] = [];\n for (const item of items) {\n if (item.enabled === false) {\n console.log(`${timestamp()} ${prefix} ⏭️ [跳过] ${item.title}`);\n continue;\n }\n console.log(`${timestamp()} ${prefix} ▶ ${item.title}`);\n let skipped = false;\n let skipReason = \"\";\n const control: TaskControl = {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ${msg}`);\n },\n skip: (reason?: string) => {\n skipped = true;\n skipReason = reason ?? \"\";\n },\n };\n try {\n const ctx = (results.length > 0 ? results[results.length - 1] : undefined) as T;\n const result = await item.task(ctx, control);\n if (skipped) {\n const suffix = skipReason ? `: ${skipReason}` : \"\";\n console.log(`${timestamp()} ${prefix} ⏭️ ${item.title}${suffix}`);\n } else {\n console.log(`${timestamp()} ${prefix} ✅ ${item.title}`);\n }\n results.push(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`${timestamp()} ${prefix} ❌ ${item.title}: ${errMsg}`);\n throw err;\n }\n }\n return results;\n }\n\n table(_prefix: string, data: Record<string, unknown>[]): void {\n console.table(data);\n }\n}\n","import type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n} from \"./logger.interface\";\nimport { LOG_LEVEL_PRIORITY } from \"./logger.interface\";\nimport { PlainRenderer } from \"./renderers/plain.renderer\";\n\n/** 检测是否为 TUI 环境 */\nconst detectMode = (): RenderMode => {\n if (process.env.CI || !process.stdout.isTTY) return \"plain\";\n return \"tui\";\n};\n\n/** TUI 渲染器缓存(延迟加载,避免 ESM 兼容问题) */\nlet tuiRendererCache: LogRenderer | null = null;\n\n/** 延迟加载 TUI 渲染器(chalk/ora/log-update 均为纯 ESM 包) */\nconst loadTuiRenderer = async (): Promise<LogRenderer> => {\n if (tuiRendererCache) return tuiRendererCache;\n const { TuiRenderer } = await import(\"./renderers/tui.renderer\");\n tuiRendererCache = new TuiRenderer();\n return tuiRendererCache;\n};\n\n/** 解析渲染模式,返回实际模式标识 */\nconst resolveMode = (mode: RenderMode): \"plain\" | \"tui\" => {\n if (mode === \"auto\") return detectMode() === \"tui\" ? \"tui\" : \"plain\";\n return mode;\n};\n\n/**\n * 全局日志工具类\n *\n * 每个子命令创建独立实例,支持 plain / tui 两种输出模式。\n * TUI 模式提供 Spinner、进度条、任务列表等富交互能力,\n * plain 模式下自动降级为普通文本输出。\n *\n * @example\n * ```typescript\n * const logger = new Logger(\"build\");\n * logger.info(\"开始构建\");\n * const s = logger.spin(\"编译中...\");\n * s.succeed(\"编译完成\");\n * ```\n */\nexport class Logger {\n private readonly name: string;\n private readonly level: LogLevel;\n private readonly resolvedMode: \"plain\" | \"tui\";\n private readonly plainRenderer: PlainRenderer;\n private tuiRenderer: LogRenderer | null = null;\n\n constructor(options: LoggerOptions | string) {\n const opts = typeof options === \"string\" ? { name: options } : options;\n this.name = opts.name;\n this.level = opts.level ?? \"info\";\n this.resolvedMode = resolveMode(opts.mode ?? \"auto\");\n this.plainRenderer = new PlainRenderer();\n }\n\n /** 格式化前缀 */\n private get prefix(): string {\n return `[${this.name}]`;\n }\n\n /** 获取当前渲染器(TUI 未加载时降级为 plain) */\n private get renderer(): LogRenderer {\n if (this.resolvedMode === \"tui\" && this.tuiRenderer) return this.tuiRenderer;\n return this.plainRenderer;\n }\n\n /**\n * 初始化 TUI 渲染器(异步)\n * 在使用 TUI 特有功能前调用,确保渲染器已加载\n */\n async init(): Promise<void> {\n if (this.resolvedMode === \"tui\" && !this.tuiRenderer) {\n this.tuiRenderer = await loadTuiRenderer();\n }\n }\n\n /** 判断是否应输出指定级别的日志 */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.level];\n }\n\n /** 输出 info 级别日志 */\n info(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.info(this.prefix, message);\n }\n }\n\n /** 输出 success 级别日志 */\n success(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.success(this.prefix, message);\n }\n }\n\n /** 输出 warn 级别日志 */\n warn(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.warn(this.prefix, message);\n }\n }\n\n /** 输出 error 级别日志 */\n error(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.error(this.prefix, message);\n }\n }\n\n /** 输出 verbose 级别日志(level >= verbose 才输出) */\n verbose(message: string): void {\n if (this.shouldLog(\"verbose\")) {\n this.renderer.verbose(this.prefix, message);\n }\n }\n\n /** 输出 debug 级别日志(level >= debug 才输出) */\n debug(message: string): void {\n if (this.shouldLog(\"debug\")) {\n this.renderer.debug(this.prefix, message);\n }\n }\n\n /**\n * 创建 Spinner\n * TUI 模式下显示动画 spinner,plain 模式下降级为普通日志\n */\n spin(message: string): Spinner {\n return this.renderer.createSpinner(this.prefix, message);\n }\n\n /**\n * 创建进度条\n * TUI 模式下显示实时进度条,plain 模式下降级为百分比日志\n */\n progress(options: ProgressBarOptions): ProgressBar {\n return this.renderer.createProgressBar(this.prefix, options);\n }\n\n /**\n * 执行任务列表\n * TUI 模式下多行实时更新,plain 模式下顺序输出\n */\n async tasks<T>(items: TaskItem<T>[]): Promise<T[]> {\n return this.renderer.runTasks<T>(this.prefix, items);\n }\n\n /** 输出表格 */\n table(data: Record<string, unknown>[]): void {\n this.renderer.table(this.prefix, data);\n }\n\n /**\n * 创建子 Logger\n * 命名空间自动拼接,如 \"build\" → \"build:compile\"\n */\n child(name: string): Logger {\n return new Logger({\n name: `${this.name}:${name}`,\n level: this.level,\n mode: this.resolvedMode,\n });\n }\n}\n","export { Logger } from \"./logger\";\nexport type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"./logger.interface\";\n","import { z } from \"zod\";\nimport type { LLMMode } from \"../shared/llm-proxy\";\nimport { detectProvider } from \"../shared/git-provider/detect-provider\";\n\n// 从 @spaceflow/shared 重导出配置工具函数\nexport {\n DEFAULT_SUPPORT_EDITOR,\n CONFIG_FILE_NAME,\n RC_FILE_NAME,\n deepMerge,\n getConfigPath,\n getConfigPaths,\n getEnvFilePaths,\n readConfigSync,\n writeConfigSync,\n getSupportedEditors,\n getDependencies,\n findConfigFileWithField,\n updateDependency,\n removeDependency,\n} from \"@spaceflow/shared\";\n\nimport { DEFAULT_SUPPORT_EDITOR, readConfigSync } from \"@spaceflow/shared\";\n\n// ============ 子模块配置 Schema ============\n\n/** 从环境自动检测的默认值 */\nconst detected = detectProvider();\n\n/** Git Provider 配置 Schema */\nconst GitProviderConfigSchema = z.object({\n provider: z\n .enum([\"gitea\", \"github\", \"gitlab\"])\n .default(detected.provider)\n .describe(\"Git Provider 类型 (github | gitea | gitlab),未指定时自动检测\"),\n serverUrl: z.string().default(detected.serverUrl).describe(\"Git Provider 服务器 URL\"),\n token: z.string().default(detected.token).describe(\"Git Provider API Token\"),\n});\n\n/** CI 配置 Schema */\nconst CiConfigSchema = z.object({\n repository: z\n .string()\n .default(process.env.GITHUB_REPOSITORY || process.env.GITEA_REPOSITORY || \"\")\n .describe(\"仓库名称 (owner/repo 格式)\"),\n refName: z\n .string()\n .default(process.env.GITHUB_REF_NAME || process.env.GITEA_REF_NAME || \"\")\n .describe(\"当前分支名称\"),\n actor: z\n .string()\n .default(process.env.GITHUB_ACTOR || process.env.GITEA_ACTOR || \"\")\n .describe(\"当前操作者\"),\n});\n\n/** Claude Code 适配器配置 Schema */\nconst ClaudeCodeConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.CLAUDE_CODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n authToken: z\n .string()\n .default(process.env.CLAUDE_CODE_AUTH_TOKEN || \"\")\n .describe(\"认证令牌\"),\n model: z\n .string()\n .default(process.env.CLAUDE_CODE_MODEL || \"claude-sonnet-4-5\")\n .describe(\"模型名称\"),\n hasCompletedOnboarding: z.boolean().optional().describe(\"是否已完成 Claude Code 引导流程\"),\n});\n\n/** OpenAI 适配器配置 Schema */\nconst OpenAIConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.OPENAI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENAI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.OPENAI_MODEL || \"gpt-4o\")\n .describe(\"模型名称\"),\n});\n\n/** OpenCode 适配器配置 Schema */\nconst OpenCodeConfigSchema = z.object({\n serverUrl: z\n .string()\n .default(process.env.OPENCODE_SERVER_URL || \"http://localhost:4096\")\n .describe(\"服务器 URL\"),\n baseUrl: z\n .string()\n .default(process.env.OPENCODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENCODE_API_KEY || \"\")\n .describe(\"API Key\"),\n providerID: z\n .string()\n .default(process.env.OPENCODE_PROVIDER_ID || \"openai\")\n .describe(\"Provider ID\"),\n model: z\n .string()\n .default(process.env.OPENCODE_MODEL || \"\")\n .describe(\"模型名称\"),\n});\n\n/** Gemini 适配器配置 Schema */\nconst GeminiConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.GEMINI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.GEMINI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.GEMINI_MODEL || \"\")\n .describe(\"模型名称\"),\n});\n\n/** LLM 配置 Schema */\nconst LlmConfigSchema = z.object({\n claudeCode: z\n .preprocess((v) => v ?? {}, ClaudeCodeConfigSchema)\n .describe(\"Claude Code 适配器配置\"),\n openai: z.preprocess((v) => v ?? {}, OpenAIConfigSchema).describe(\"OpenAI 适配器配置\"),\n openCode: z.preprocess((v) => v ?? {}, OpenCodeConfigSchema).describe(\"OpenCode 适配器配置\"),\n gemini: z.preprocess((v) => v ?? {}, GeminiConfigSchema).describe(\"Gemini 适配器配置\"),\n});\n\n/** 飞书配置 Schema */\nconst FeishuConfigSchema = z.object({\n appId: z\n .string()\n .default(process.env.FEISHU_APP_ID || \"\")\n .describe(\"飞书应用 ID\"),\n appSecret: z\n .string()\n .default(process.env.FEISHU_APP_SECRET || \"\")\n .describe(\"飞书应用密钥\"),\n appType: z\n .enum([\"self_build\", \"store\"])\n .default((process.env.FEISHU_APP_TYPE as \"self_build\" | \"store\") || \"self_build\")\n .describe(\"应用类型\"),\n domain: z\n .enum([\"feishu\", \"lark\"])\n .default((process.env.FEISHU_DOMAIN as \"feishu\" | \"lark\") || \"feishu\")\n .describe(\"域名\"),\n});\n\n/** Storage 配置 Schema */\nconst StorageConfigSchema = z.object({\n adapter: z\n .enum([\"memory\", \"file\"])\n .default((process.env.STORAGE_ADAPTER as \"memory\" | \"file\") || \"memory\")\n .describe(\"适配器类型\"),\n filePath: z.string().optional().describe(\"文件存储路径\"),\n defaultTtl: z\n .number()\n .default(process.env.STORAGE_DEFAULT_TTL ? parseInt(process.env.STORAGE_DEFAULT_TTL, 10) : 0)\n .describe(\"默认过期时间(毫秒)\"),\n maxKeys: z\n .number()\n .default(process.env.STORAGE_MAX_KEYS ? parseInt(process.env.STORAGE_MAX_KEYS, 10) : 0)\n .describe(\"最大 key 数量\"),\n});\n\n// ============ 统一配置 Schema ============\n\n/** Spaceflow 完整配置 Schema */\nexport const SpaceflowConfigSchema = z.object({\n /** 界面语言,如 zh-CN、en */\n lang: z.string().optional().describe(\"界面语言,如 zh-CN、en\"),\n /** 已安装的技能包注册表 */\n dependencies: z.record(z.string(), z.string()).optional().describe(\"已安装的技能包注册表\"),\n /** 支持的编辑器列表 */\n support: z.array(z.string()).default([DEFAULT_SUPPORT_EDITOR]).describe(\"支持的编辑器列表\"),\n /** Git Provider 配置 */\n gitProvider: z\n .preprocess((v) => v ?? {}, GitProviderConfigSchema)\n .describe(\"Git Provider 服务配置\"),\n /** CI 配置 */\n ci: z.preprocess((v) => v ?? {}, CiConfigSchema).describe(\"CI 环境配置\"),\n /** LLM 配置 */\n llm: z.preprocess((v) => v ?? {}, LlmConfigSchema).describe(\"LLM 服务配置\"),\n /** 飞书配置 */\n feishu: z.preprocess((v) => v ?? {}, FeishuConfigSchema).describe(\"飞书 SDK 配置\"),\n /** Storage 配置 */\n storage: z.preprocess((v) => v ?? {}, StorageConfigSchema).describe(\"存储服务配置\"),\n});\n\n// ============ 类型导出 ============\n\n/** Spaceflow 完整配置类型 */\nexport type SpaceflowConfig = z.infer<typeof SpaceflowConfigSchema> & {\n /** 扩展插件配置,由各插件自行定义类型 */\n [key: string]: unknown;\n};\n\n/** Git Provider 配置类型 */\nexport type GitProviderConfig = z.infer<typeof GitProviderConfigSchema>;\n\n/** CI 配置类型 */\nexport type CiConfig = z.infer<typeof CiConfigSchema>;\n\n/** LLM 系统配置类型 */\nexport type LlmConfig = z.infer<typeof LlmConfigSchema>;\n\n/** Claude Code 适配器配置类型 */\nexport type ClaudeCodeConfig = z.infer<typeof ClaudeCodeConfigSchema>;\n\n/** OpenAI 适配器配置类型 */\nexport type OpenAIConfig = z.infer<typeof OpenAIConfigSchema>;\n\n/** OpenCode 适配器配置类型 */\nexport type OpenCodeConfig = z.infer<typeof OpenCodeConfigSchema>;\n\n/** Gemini 适配器配置类型 */\nexport type GeminiConfig = z.infer<typeof GeminiConfigSchema>;\n\n/** 飞书配置类型 */\nexport type FeishuConfig = z.infer<typeof FeishuConfigSchema>;\n\n/** Storage 配置类型 */\nexport type StorageConfig = z.infer<typeof StorageConfigSchema>;\n\n// ============ 配置加载 ============\n\n/**\n * 加载 spaceflow.json 配置\n * 从多级配置文件读取并合并,使用 zod 验证和填充默认值\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function loadSpaceflowConfig(cwd?: string): SpaceflowConfig {\n const fileConfig = readConfigSync(cwd);\n\n const result = SpaceflowConfigSchema.safeParse(fileConfig);\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Spaceflow 配置验证失败:\\n${errors}`);\n }\n\n return {\n ...fileConfig,\n ...result.data,\n } as SpaceflowConfig;\n}\n\n/**\n * 获取 spaceflow 配置(兼容旧 API)\n * @deprecated 请使用 loadSpaceflowConfig()\n */\nexport function spaceflowConfig(): SpaceflowConfig {\n return loadSpaceflowConfig();\n}\n\nexport type { LLMMode };\n","import { z } from \"zod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { SpaceflowConfigSchema } from \"./spaceflow.config\";\n\n/** Schema 注册信息 */\nexport interface SchemaRegistry {\n /** 配置 key */\n configKey: string;\n /** zod schema 工厂函数 */\n schemaFactory: () => z.ZodType;\n /** 描述 */\n description?: string;\n}\n\n/** 全局 schema 注册表 */\nconst schemaRegistry = new Map<string, SchemaRegistry>();\n\n/**\n * 注册插件配置 schema(由插件加载器调用)\n */\nexport function registerPluginSchema(registry: SchemaRegistry): void {\n schemaRegistry.set(registry.configKey, registry);\n}\n\n/**\n * 获取所有已注册的 schema\n */\nexport function getRegisteredSchemas(): Map<string, SchemaRegistry> {\n return schemaRegistry;\n}\n\n/**\n * Schema 生成服务\n * 用于生成 JSON Schema 文件\n */\nexport class SchemaGeneratorService {\n /**\n * 生成完整的 spaceflow.json 的 JSON Schema\n * @param outputPath 输出路径\n */\n generateJsonSchema(outputPath: string): void {\n // 从 SpaceflowConfigSchema 生成基础 JSON Schema\n const baseSchema = z.toJSONSchema(SpaceflowConfigSchema, {\n target: \"draft-07\",\n }) as { properties?: Record<string, unknown>; [key: string]: unknown };\n\n const properties: Record<string, unknown> = { ...(baseSchema.properties || {}) };\n\n // 添加所有插件的 schema(扩展插件配置)\n for (const [configKey, registry] of schemaRegistry) {\n try {\n const schema = registry.schemaFactory();\n const jsonSchema = z.toJSONSchema(schema, {\n target: \"draft-07\",\n });\n properties[configKey] = {\n ...jsonSchema,\n description: registry.description || `${configKey} 插件配置`,\n };\n } catch (error) {\n console.warn(`⚠️ 无法转换 ${configKey} 的 schema:`, error);\n }\n }\n\n const fullSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: \"Spaceflow Configuration\",\n description: \"Spaceflow 配置文件 schema\",\n type: \"object\",\n properties,\n additionalProperties: true,\n };\n\n // 确保目录存在\n const dir = path.dirname(outputPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // 写入文件\n fs.writeFileSync(outputPath, JSON.stringify(fullSchema, null, 2), \"utf-8\");\n\n // 自动添加到 .gitignore\n this.addToGitignore(dir, path.basename(outputPath));\n }\n\n /**\n * 生成 JSON Schema 到默认路径 (.spaceflow/config-schema.json)\n */\n generate(): void {\n const outputPath = path.join(process.cwd(), \".spaceflow\", \"config-schema.json\");\n this.generateJsonSchema(outputPath);\n }\n\n /**\n * 将文件添加到 .gitignore(如果不存在)\n */\n private addToGitignore(dir: string, filename: string): void {\n const gitignorePath = path.join(dir, \".gitignore\");\n let content = \"\";\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, \"utf-8\");\n // 检查是否已存在\n const lines = content.split(\"\\n\").map((line) => line.trim());\n if (lines.includes(filename)) {\n return;\n }\n } else {\n content = \"# 自动生成的 .gitignore\\n\";\n }\n\n // 追加文件名\n const newContent = content.endsWith(\"\\n\")\n ? `${content}${filename}\\n`\n : `${content}\\n${filename}\\n`;\n\n fs.writeFileSync(gitignorePath, newContent, \"utf-8\");\n }\n}\n","export * from \"./spaceflow.config\";\nexport * from \"./schema-generator.service\";\nexport { loadEnvFiles, getEnvFilePaths } from \"@spaceflow/shared\";\n","import type {\n SpaceflowContext,\n IConfigReader,\n IOutputService,\n IStorageService,\n} from \"@spaceflow/core\";\n\n/**\n * 服务工厂函数类型\n */\nexport type ServiceFactory<T = unknown> = (container: ServiceContainer) => T;\n\n/**\n * 服务注册信息\n */\ninterface ServiceRegistration<T = unknown> {\n factory: ServiceFactory<T>;\n instance?: T;\n initialized: boolean;\n}\n\n/**\n * 服务容器\n * 提供懒加载的依赖注入功能\n */\nexport class ServiceContainer implements SpaceflowContext {\n private registrations = new Map<string, ServiceRegistration>();\n private _cwd!: string;\n private _config!: IConfigReader;\n private _output!: IOutputService;\n private _storage!: IStorageService;\n\n /**\n * 设置核心服务(config, output, storage)\n */\n setCoreServices(\n config: IConfigReader,\n output: IOutputService,\n storage: IStorageService,\n cwd: string,\n ): void {\n this._cwd = cwd;\n this._config = config;\n this._output = output;\n this._storage = storage;\n }\n\n /**\n * 注册服务工厂(懒加载)\n */\n registerFactory<T>(key: string, factory: ServiceFactory<T>): void {\n this.registrations.set(key, {\n factory: factory as ServiceFactory,\n initialized: false,\n });\n }\n\n /**\n * 注册服务实例(立即可用)\n */\n registerService(key: string, service: unknown): void {\n this.registrations.set(key, {\n factory: () => service,\n instance: service,\n initialized: true,\n });\n }\n\n /**\n * 获取服务(懒加载)\n */\n getService<T = unknown>(key: string): T {\n const registration = this.registrations.get(key);\n if (!registration) {\n throw new Error(`服务 \"${key}\" 未注册`);\n }\n if (!registration.initialized) {\n registration.instance = registration.factory(this);\n registration.initialized = true;\n }\n return registration.instance as T;\n }\n\n /**\n * 检查服务是否已注册\n */\n hasService(key: string): boolean {\n return this.registrations.has(key);\n }\n\n /**\n * 尝试获取服务(不抛错)\n */\n tryGetService<T = unknown>(key: string): T | undefined {\n if (!this.hasService(key)) {\n return undefined;\n }\n try {\n return this.getService<T>(key);\n } catch {\n return undefined;\n }\n }\n\n get cwd(): string {\n return this._cwd;\n }\n\n get config(): IConfigReader {\n return this._config;\n }\n\n get output(): IOutputService {\n return this._output;\n }\n\n get storage(): IStorageService {\n return this._storage;\n }\n\n /**\n * 销毁容器\n */\n async destroy(): Promise<void> {\n // 销毁 storage 服务(清理定时器)\n if (this._storage && typeof (this._storage as any).destroy === \"function\") {\n (this._storage as any).destroy();\n }\n this.registrations.clear();\n }\n}\n","import { type IConfigReader, loadSpaceflowConfig } from \"@spaceflow/core\";\nimport type { ZodSchema } from \"zod\";\n\n/**\n * 环境变量映射配置\n * key: 配置路径(如 \"gitProvider.token\")\n * value: 环境变量名或环境变量名数组(按优先级)\n */\nconst ENV_MAPPINGS: Record<string, string | string[]> = {\n // Git Provider\n \"gitProvider.token\": [\"GIT_PROVIDER_TOKEN\", \"GITHUB_TOKEN\", \"GITLAB_TOKEN\", \"GITEA_TOKEN\"],\n \"gitProvider.serverUrl\": [\"GIT_PROVIDER_SERVER_URL\", \"GITHUB_API_URL\"],\n // OpenAI\n \"llm.openai.apiKey\": \"OPENAI_API_KEY\",\n \"llm.openai.baseUrl\": \"OPENAI_BASE_URL\",\n \"llm.openai.model\": \"OPENAI_MODEL\",\n // Gemini\n \"llm.gemini.apiKey\": \"GEMINI_API_KEY\",\n \"llm.gemini.model\": \"GEMINI_MODEL\",\n // Claude\n \"llm.claudeCode.authToken\": \"ANTHROPIC_API_KEY\",\n};\n\n/**\n * 从环境变量获取值\n */\nfunction getEnvValue(envNames: string | string[]): string | undefined {\n const names = Array.isArray(envNames) ? envNames : [envNames];\n for (const name of names) {\n const value = process.env[name];\n if (value) return value;\n }\n return undefined;\n}\n\n/**\n * 设置嵌套对象的值\n */\nfunction setNestedValue(obj: Record<string, any>, path: string, value: any): void {\n const parts = path.split(\".\");\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current)) {\n current[part] = {};\n }\n current = current[part];\n }\n current[parts[parts.length - 1]] = value;\n}\n\n/**\n * 获取嵌套对象的值\n */\nfunction getNestedValue(obj: Record<string, any>, path: string): any {\n const parts = path.split(\".\");\n let current = obj;\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = current[part];\n }\n return current;\n}\n\n/**\n * 统一配置服务\n * 负责从配置文件和环境变量读取配置\n */\nexport class UnifiedConfigReader implements IConfigReader {\n private mergedConfig: Record<string, unknown>;\n private schemas = new Map<string, ZodSchema>();\n\n constructor(cwd?: string) {\n const config = loadSpaceflowConfig(cwd) as Record<string, unknown>;\n this.mergedConfig = this.mergeEnvConfig(config);\n }\n\n /**\n * 合并环境变量到配置\n */\n private mergeEnvConfig(config: Record<string, unknown>): Record<string, unknown> {\n const merged = JSON.parse(JSON.stringify(config));\n for (const [path, envNames] of Object.entries(ENV_MAPPINGS)) {\n const envValue = getEnvValue(envNames);\n if (envValue && !getNestedValue(merged, path)) {\n setNestedValue(merged, path, envValue);\n }\n }\n // 特殊处理:如果有 OPENAI_API_KEY 但没有 llm.openai,创建默认配置\n if (process.env.OPENAI_API_KEY && !merged.llm) {\n merged.llm = {\n openai: {\n apiKey: process.env.OPENAI_API_KEY,\n baseUrl: process.env.OPENAI_BASE_URL || \"https://api.openai.com/v1\",\n model: process.env.OPENAI_MODEL,\n },\n };\n }\n return merged;\n }\n\n /**\n * 获取配置值\n */\n get<T>(key: string): T | undefined {\n const parts = key.split(\".\");\n let current: unknown = this.mergedConfig;\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current as T | undefined;\n }\n\n /**\n * 获取插件配置(带 schema 验证)\n */\n getPluginConfig<T>(key: string): T | undefined {\n const rawConfig = this.mergedConfig[key] ?? {};\n const schema = this.schemas.get(key);\n if (!schema) {\n return rawConfig as T;\n }\n try {\n return schema.parse(rawConfig) as T;\n } catch (error) {\n console.warn(`⚠️ 配置 \"${key}\" 验证失败:`, error);\n return rawConfig as T;\n }\n }\n\n /**\n * 注册配置 schema\n */\n registerSchema(key: string, schema: ZodSchema): void {\n this.schemas.set(key, schema);\n }\n\n /**\n * 重新加载配置\n */\n reload(cwd?: string): void {\n const config = loadSpaceflowConfig(cwd) as Record<string, unknown>;\n this.mergedConfig = this.mergeEnvConfig(config);\n }\n\n /**\n * 获取原始配置对象\n */\n getRawConfig(): Record<string, unknown> {\n return this.mergedConfig;\n }\n}\n","import {\n OutputService,\n StorageService,\n GitSdkService,\n GitProviderService,\n LlmProxyService,\n FileAdapter,\n} from \"@spaceflow/core\";\nimport { findProjectRoot } from \"@spaceflow/shared\";\nimport { join } from \"path\";\nimport type { ServiceContainer } from \"./container\";\nimport { UnifiedConfigReader } from \"./config\";\n\n/**\n * 初始化服务容器\n */\nexport function initializeContainer(container: ServiceContainer, cwd?: string): void {\n const workDir = cwd || process.env.SPACEFLOW_CWD || findProjectRoot();\n // 初始化核心服务(.env 已在 CLI 壳子阶段加载)\n const config = new UnifiedConfigReader(workDir);\n const output = new OutputService();\n const storageDir = join(workDir, \".spaceflow\", \"cache\");\n const storage = new StorageService(new FileAdapter(storageDir));\n container.setCoreServices(config, output, storage, workDir);\n // 注册服务工厂\n registerServiceFactories(container);\n}\n\n/**\n * 注册所有服务工厂\n */\nfunction registerServiceFactories(container: ServiceContainer): void {\n // Config - 返回已初始化的 config\n container.registerFactory(\"config\", (c) => c.config);\n // GitSdk - 无依赖\n container.registerFactory(\"gitSdk\", () => new GitSdkService());\n // GitProvider - 依赖配置(环境变量已在 UnifiedConfigReader 中合并)\n container.registerFactory(\"gitProvider\", (c) => {\n const config = c.config.get<any>(\"gitProvider\");\n if (!config?.provider) {\n throw new Error(\"缺少 gitProvider 配置\");\n }\n const baseUrl = config.serverUrl || config.baseUrl;\n return new GitProviderService({ ...config, baseUrl });\n });\n // LlmProxy - 依赖配置(环境变量已在 UnifiedConfigReader 中合并)\n container.registerFactory(\"llmProxy\", (c) => {\n const config = c.config.get<any>(\"llm\");\n if (!config || (!config.openai && !config.gemini && !config.claudeCode && !config.openCode)) {\n throw new Error(\"缺少 llm 配置,请在 spaceflow.json 中配置或设置 OPENAI_API_KEY 环境变量\");\n }\n return new LlmProxyService(config);\n });\n}\n","export { ServiceContainer, type ServiceFactory } from \"./container\";\nexport { initializeContainer } from \"./services\";\nexport { UnifiedConfigReader } from \"./config\";\n","import type { ExtensionDefinition, CommandDefinition } from \"@spaceflow/core\";\nimport type { SpaceflowContext } from \"@spaceflow/core\";\n\n/**\n * 扩展加载器\n * 加载新格式的扩展(使用 defineExtension)\n */\nexport class ExtensionLoader {\n private extensions = new Map<string, ExtensionDefinition>();\n private commands = new Map<string, CommandDefinition>();\n\n constructor(private readonly ctx: SpaceflowContext) {}\n\n /** 当前工作目录(项目根) */\n get cwd(): string {\n return this.ctx.cwd;\n }\n\n /** 获取上下文(供内部命令使用) */\n getContext(): SpaceflowContext {\n return this.ctx;\n }\n\n /**\n * 注册扩展\n */\n registerExtension(extension: ExtensionDefinition): void {\n this.extensions.set(extension.name, extension);\n\n // 注册配置 schema\n if (extension.configSchema && extension.configKey) {\n this.ctx.config.registerSchema(extension.configKey, extension.configSchema());\n }\n\n // 注册命令\n for (const cmd of extension.commands) {\n this.commands.set(cmd.name, cmd);\n }\n\n // 注册服务\n if (extension.services) {\n for (const svc of extension.services) {\n const instance = svc.factory(this.ctx);\n this.ctx.registerService(svc.key, instance);\n }\n }\n\n // 调用初始化钩子\n if (extension.onInit) {\n extension.onInit(this.ctx);\n }\n }\n\n /**\n * 获取所有命令\n */\n getCommands(): CommandDefinition[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * 获取所有扩展\n */\n getExtensions(): ExtensionDefinition[] {\n return Array.from(this.extensions.values());\n }\n\n /**\n * 获取所有 MCP 工具\n * 返回扩展中定义的 tools 字段\n */\n getTools(): Array<{ extensionName: string; tools: NonNullable<ExtensionDefinition[\"tools\"]> }> {\n const result: Array<{\n extensionName: string;\n tools: NonNullable<ExtensionDefinition[\"tools\"]>;\n }> = [];\n for (const ext of this.extensions.values()) {\n if (ext.tools && ext.tools.length > 0) {\n result.push({ extensionName: ext.name, tools: ext.tools });\n }\n }\n return result;\n }\n\n /**\n * 获取所有 MCP 资源\n * 返回扩展中定义的 resources 字段\n */\n getResources(): Array<{\n extensionName: string;\n resources: NonNullable<ExtensionDefinition[\"resources\"]>;\n }> {\n const result: Array<{\n extensionName: string;\n resources: NonNullable<ExtensionDefinition[\"resources\"]>;\n }> = [];\n for (const ext of this.extensions.values()) {\n if (ext.resources && ext.resources.length > 0) {\n result.push({ extensionName: ext.name, resources: ext.resources });\n }\n }\n return result;\n }\n}\n","import { rspack, type Compiler, type Configuration, type Stats } from \"@rspack/core\";\nimport { readdir, stat } from \"fs/promises\";\nimport { join, dirname, resolve } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { createRequire } from \"module\";\nimport { createPluginConfig, getDependencies } from \"@spaceflow/core\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\n\nexport interface ExtensionInfo {\n name: string;\n path: string;\n hasPackageJson: boolean;\n}\n\nexport interface BuildResult {\n extension: string;\n success: boolean;\n duration?: number;\n errors?: string[];\n warnings?: string[];\n}\n\nexport class BuildService {\n private readonly projectRoot = this.findProjectRoot();\n private readonly extensionDirs = this.discoverExtensionDirs();\n private readonly coreRoot = this.resolveCoreRoot();\n private watchers: Map<string, Compiler> = new Map();\n\n /**\n * 查找项目根目录(包含 spaceflow.json 或 .spaceflow/spaceflow.json 的目录)\n */\n private findProjectRoot(): string {\n let dir = process.cwd();\n while (dir !== dirname(dir)) {\n // 检查根目录下的 spaceflow.json\n if (existsSync(join(dir, \"spaceflow.json\"))) {\n return dir;\n }\n // 检查 .spaceflow/spaceflow.json\n if (existsSync(join(dir, \".spaceflow\", \"spaceflow.json\"))) {\n return dir;\n }\n dir = dirname(dir);\n }\n // 如果找不到,回退到 cwd\n return process.cwd();\n }\n\n /**\n * 构建插件\n */\n async build(extensionName?: string, verbose: VerboseLevel = 1): Promise<BuildResult[]> {\n const extensions = await this.getExtensionsToBuild(extensionName);\n\n if (extensions.length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"build:noPlugins\"));\n return [];\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"build:startBuilding\", { count: extensions.length }) + \"\\n\");\n\n const results: BuildResult[] = [];\n for (const ext of extensions) {\n const result = await this.buildExtension(ext, verbose);\n results.push(result);\n }\n\n const successCount = results.filter((r) => r.success).length;\n const failCount = results.filter((r) => !r.success).length;\n\n if (shouldLog(verbose, 1))\n console.log(\"\\n\" + t(\"build:buildComplete\", { success: successCount, fail: failCount }));\n return results;\n }\n\n /**\n * 监听模式构建\n */\n async watch(extensionName?: string, verbose: VerboseLevel = 1): Promise<void> {\n const extensions = await this.getExtensionsToBuild(extensionName);\n\n if (extensions.length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"build:noPlugins\"));\n return;\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"build:startWatching\", { count: extensions.length }) + \"\\n\");\n\n // 并行启动所有 watcher\n await Promise.all(extensions.map((ext) => this.watchExtension(ext, verbose)));\n\n // 保持进程运行\n await new Promise(() => {});\n }\n\n /**\n * 停止所有 watcher\n */\n async stopWatch(verbose: VerboseLevel = 1): Promise<void> {\n for (const [name, compiler] of this.watchers) {\n await new Promise<void>((resolve) => {\n compiler.close(() => {\n if (shouldLog(verbose, 1)) console.log(t(\"build:stopWatching\", { name }));\n resolve();\n });\n });\n }\n this.watchers.clear();\n }\n\n /**\n * 从 spaceflow.json 的 dependencies 中发现本地 extension 所在的目录\n * 解析所有 link: 路径,收集去重后的父目录\n */\n private discoverExtensionDirs(): string[] {\n const dependencies = getDependencies(this.projectRoot);\n const parentDirs = new Set<string>();\n for (const source of Object.values(dependencies) as string[]) {\n if (!source.startsWith(\"link:\")) continue;\n const linkPath = source.slice(5);\n const absolutePath = resolve(this.projectRoot, linkPath);\n parentDirs.add(dirname(absolutePath));\n }\n return Array.from(parentDirs);\n }\n\n /**\n * 动态解析 @spaceflow/core 的根目录\n * 优先通过 require.resolve 定位,回退到 node_modules\n */\n private resolveCoreRoot(): string {\n try {\n const req = createRequire(join(this.projectRoot, \"package.json\"));\n const corePkgPath = req.resolve(\"@spaceflow/core/package.json\");\n return dirname(corePkgPath);\n } catch {\n return join(this.projectRoot, \"node_modules\", \"@spaceflow\", \"core\");\n }\n }\n\n /**\n * 获取需要构建的 Extension 列表\n */\n private async getExtensionsToBuild(extensionName?: string): Promise<ExtensionInfo[]> {\n // 如果没有指定名称,检查是否在 Extension 目录中运行\n if (!extensionName) {\n const current = this.detectCurrentExtension();\n if (current) {\n return [current];\n }\n }\n // 从所有 extension 目录中扫描\n const result: ExtensionInfo[] = [];\n for (const extDir of this.extensionDirs) {\n if (!existsSync(extDir)) continue;\n const entries = await readdir(extDir);\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue;\n const extPath = join(extDir, entry);\n const stats = await stat(extPath);\n if (!stats.isDirectory()) continue;\n if (extensionName && entry !== extensionName) continue;\n const packageJsonPath = join(extPath, \"package.json\");\n if (existsSync(packageJsonPath)) {\n result.push({ name: entry, path: extPath, hasPackageJson: true });\n }\n }\n }\n return result;\n }\n\n /**\n * 检测当前目录是否为 spaceflow Extension\n * 通过检查 package.json 中的 spaceflow 配置判断,不依赖固定目录名\n */\n private detectCurrentExtension(): ExtensionInfo | null {\n const cwd = process.cwd();\n const packageJsonPath = join(cwd, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (!pkg.spaceflow) {\n return null;\n }\n const name = cwd.split(\"/\").pop() || \"\";\n return { name, path: cwd, hasPackageJson: true };\n } catch {\n return null;\n }\n }\n\n /**\n * 构建单个 Extension\n */\n private async buildExtension(\n ext: ExtensionInfo,\n verbose: VerboseLevel = 1,\n ): Promise<BuildResult> {\n const startTime = Date.now();\n if (shouldLog(verbose, 1)) console.log(t(\"build:building\", { name: ext.name }));\n\n try {\n const config = await this.getConfig(ext);\n const compiler = rspack(config);\n\n const stats = await new Promise<Stats>((resolve, reject) => {\n compiler.run((err, stats) => {\n compiler.close((closeErr) => {\n if (err) return reject(err);\n if (closeErr) return reject(closeErr);\n if (!stats) return reject(new Error(\"No stats returned\"));\n resolve(stats);\n });\n });\n });\n\n const duration = Date.now() - startTime;\n const info = stats.toJson({ errors: true, warnings: true });\n\n if (stats.hasErrors()) {\n const errors = info.errors?.map((e) => e.message) || [];\n console.log(t(\"build:buildFailedWithDuration\", { duration }));\n errors.forEach((e) => console.log(` ${e}`));\n return { extension: ext.name, success: false, duration, errors };\n }\n\n if (stats.hasWarnings()) {\n const warnings = info.warnings?.map((w) => w.message) || [];\n if (shouldLog(verbose, 1))\n console.log(t(\"build:buildWarnings\", { duration, count: warnings.length }));\n return { extension: ext.name, success: true, duration, warnings };\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"build:buildSuccess\", { duration }));\n return { extension: ext.name, success: true, duration };\n } catch (error) {\n const duration = Date.now() - startTime;\n const message = error instanceof Error ? error.message : String(error);\n console.log(t(\"build:buildFailedWithMessage\", { duration, message }));\n return { extension: ext.name, success: false, duration, errors: [message] };\n }\n }\n\n /**\n * 监听单个 Extension\n */\n private async watchExtension(ext: ExtensionInfo, verbose: VerboseLevel = 1): Promise<void> {\n if (shouldLog(verbose, 1)) console.log(t(\"build:watching\", { name: ext.name }));\n\n try {\n const config = await this.getConfig(ext);\n const compiler = rspack(config);\n\n this.watchers.set(ext.name, compiler);\n\n compiler.watch({}, (err, stats) => {\n if (err) {\n console.log(t(\"build:watchError\", { name: ext.name, message: err.message }));\n return;\n }\n\n if (!stats) return;\n\n const info = stats.toJson({ errors: true, warnings: true });\n\n if (stats.hasErrors()) {\n console.log(t(\"build:watchBuildFailed\", { name: ext.name }));\n info.errors?.forEach((e) => console.log(` ${e.message}`));\n } else if (stats.hasWarnings()) {\n if (shouldLog(verbose, 1))\n console.log(\n t(\"build:watchBuildWarnings\", { name: ext.name, count: info.warnings?.length }),\n );\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"build:watchBuildSuccess\", { name: ext.name }));\n }\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(t(\"build:watchInitFailed\", { name: ext.name, message }));\n }\n }\n\n /**\n * 获取 Extension 的 rspack 配置\n */\n private async getConfig(ext: ExtensionInfo): Promise<Configuration> {\n const customConfigPath = join(ext.path, \"rspack.config.mjs\");\n const customConfigPathJs = join(ext.path, \"rspack.config.js\");\n\n if (existsSync(customConfigPath)) {\n const module = await import(customConfigPath);\n return module.default || module;\n }\n\n if (existsSync(customConfigPathJs)) {\n const module = await import(customConfigPathJs);\n return module.default || module;\n }\n\n return this.getDefaultConfig(ext);\n }\n\n /**\n * 生成默认的 rspack 配置\n */\n private getDefaultConfig(ext: ExtensionInfo): Configuration {\n return createPluginConfig(\n {\n name: ext.name,\n path: ext.path,\n },\n {\n coreRoot: this.coreRoot,\n },\n );\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { BuildService } from \"./build.service\";\n\n/**\n * Build 命令扩展\n */\nexport const buildExtension = defineExtension({\n name: \"build\",\n version: \"1.0.0\",\n description: \"构建 Extension 插件包\",\n commands: [\n {\n name: \"build\",\n description: \"构建指定或所有 Extension\",\n arguments: \"[extension]\",\n options: [\n {\n flags: \"-w, --watch\",\n description: \"监听模式\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const extensionName = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const buildService = new BuildService();\n try {\n if (options?.watch) {\n await buildService.watch(extensionName, verbose);\n } else {\n const results = await buildService.build(extensionName, verbose);\n const hasErrors = results.some((r) => !r.success);\n if (hasErrors) {\n process.exit(1);\n }\n }\n } catch (error) {\n ctx.output.error(`构建失败: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n },\n },\n ],\n});\n\nexport * from \"./build.service\";\n","import { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync, readdirSync, lstatSync } from \"fs\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\nimport { getEditorDirName, DEFAULT_EDITOR } from \"@spaceflow/core\";\n\nexport class ClearService {\n /**\n * 获取支持的编辑器列表\n */\n protected async getSupportedEditors(configPath: string): Promise<string[]> {\n try {\n if (!existsSync(configPath)) return [DEFAULT_EDITOR];\n const content = await readFile(configPath, \"utf-8\");\n const config = JSON.parse(content);\n return config.support || [DEFAULT_EDITOR];\n } catch {\n return [DEFAULT_EDITOR];\n }\n }\n\n /**\n * 执行清理\n */\n async execute(isGlobal = false, verbose: VerboseLevel = 1): Promise<void> {\n if (shouldLog(verbose, 1)) {\n if (isGlobal) {\n console.log(t(\"clear:clearingGlobal\"));\n } else {\n console.log(t(\"clear:clearing\"));\n }\n }\n\n const cwd = process.cwd();\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const configPath = join(cwd, \"spaceflow.json\");\n\n // 1. 清理 .spaceflow/deps 目录\n await this.clearSpaceflowDeps(isGlobal, verbose);\n\n // 2. 清理各编辑器的 skills 和 commands 目录\n const editors = await this.getSupportedEditors(configPath);\n\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n const editorRoot = isGlobal ? join(home, editorDirName) : join(cwd, editorDirName);\n await this.clearEditorDir(editorRoot, editor, verbose);\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"clear:clearDone\"));\n }\n\n /**\n * 清理 .spaceflow 目录内部文件(保留 spaceflow.json)\n */\n private async clearSpaceflowDeps(isGlobal: boolean, verbose: VerboseLevel = 1): Promise<void> {\n const cwd = process.cwd();\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const spaceflowRoot = isGlobal ? join(home, \".spaceflow\") : join(cwd, \".spaceflow\");\n\n if (!existsSync(spaceflowRoot)) {\n if (shouldLog(verbose, 1)) console.log(t(\"clear:spaceflowNotExist\"));\n return;\n }\n\n // 需要保留的文件\n const preserveFiles = [\"spaceflow.json\", \"package.json\"];\n\n const entries = readdirSync(spaceflowRoot);\n const toDelete = entries.filter((entry) => !preserveFiles.includes(entry));\n\n if (toDelete.length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"clear:spaceflowNoClean\"));\n return;\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"clear:clearingSpaceflow\", { count: toDelete.length }));\n\n for (const entry of toDelete) {\n const entryPath = join(spaceflowRoot, entry);\n try {\n await rm(entryPath, { recursive: true, force: true });\n if (shouldLog(verbose, 2)) console.log(t(\"clear:deleted\", { entry }));\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.warn(\n t(\"clear:deleteFailed\", { entry }),\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n }\n\n /**\n * 清理编辑器目录下的 skills 和 commands\n */\n private async clearEditorDir(\n editorRoot: string,\n editorName: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n if (!existsSync(editorRoot)) {\n return;\n }\n\n // 清理 skills 目录\n const skillsDir = join(editorRoot, \"skills\");\n if (existsSync(skillsDir)) {\n const entries = readdirSync(skillsDir);\n if (entries.length > 0) {\n if (shouldLog(verbose, 1))\n console.log(t(\"clear:clearingSkills\", { editor: editorName, count: entries.length }));\n for (const entry of entries) {\n const entryPath = join(skillsDir, entry);\n try {\n await rm(entryPath, { recursive: true, force: true });\n if (shouldLog(verbose, 2)) console.log(t(\"clear:deleted\", { entry }));\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.warn(\n t(\"clear:deleteFailed\", { entry }),\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n }\n }\n\n // 清理 commands 目录中的 .md 文件\n const commandsDir = join(editorRoot, \"commands\");\n if (existsSync(commandsDir)) {\n const entries = readdirSync(commandsDir).filter((f) => f.endsWith(\".md\"));\n if (entries.length > 0) {\n if (shouldLog(verbose, 1))\n console.log(t(\"clear:clearingCommands\", { editor: editorName, count: entries.length }));\n for (const entry of entries) {\n const entryPath = join(commandsDir, entry);\n try {\n const stats = lstatSync(entryPath);\n if (stats.isFile()) {\n await rm(entryPath);\n if (shouldLog(verbose, 2)) console.log(t(\"clear:deleted\", { entry }));\n }\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.warn(\n t(\"clear:deleteFailed\", { entry }),\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n }\n }\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { ClearService } from \"./clear.service\";\n\n/**\n * Clear 命令扩展\n */\nexport const clearExtension = defineExtension({\n name: \"clear\",\n version: \"1.0.0\",\n description: \"清除缓存\",\n commands: [\n {\n name: \"clear\",\n description: \"清除缓存\",\n options: [\n {\n flags: \"-g, --global\",\n description: \"清除全局缓存\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const isGlobal = !!options?.global;\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const clearService = new ClearService();\n await clearService.execute(isGlobal, verbose);\n },\n },\n ],\n});\n\nexport * from \"./clear.service\";\n","import { z } from \"zod\";\nimport type { VerboseLevel } from \"@spaceflow/core\";\n\n/**\n * Commit 类型定义\n */\nexport interface CommitType {\n type: string;\n section: string;\n}\n\n/**\n * Changelog 配置\n */\nexport interface CommitConfig {\n changelog?: {\n preset?: {\n type?: CommitType[];\n };\n };\n}\n\n/**\n * Scope 匹配规则 schema\n */\nexport const ScopeRuleSchema = z.object({\n /** glob 模式,如 \"src/components/**\", \"docs/**\" */\n pattern: z.string().describe(\"glob 模式,用于匹配文件路径\"),\n /** 匹配后使用的 scope 名称 */\n scope: z.string().describe(\"匹配后使用的 scope 名称\"),\n});\n\nexport type ScopeRule = z.infer<typeof ScopeRuleSchema>;\n\n/**\n * Commit scope 配置 schema\n */\nexport const CommitScopeConfigSchema = z.object({\n /**\n * 分组策略\n * - \"package\": 按最近的 package.json 目录分组(默认)\n * - \"rules\": 仅使用自定义规则\n * - \"rules-first\": 优先使用自定义规则,未匹配则回退到 package 策略\n */\n strategy: z.enum([\"package\", \"rules\", \"rules-first\"]).default(\"package\").describe(\"文件分组策略\"),\n /** 自定义匹配规则列表 */\n rules: z.array(ScopeRuleSchema).default([]).describe(\"自定义 scope 匹配规则\"),\n});\n\nexport type CommitScopeConfig = z.infer<typeof CommitScopeConfigSchema>;\n\n/**\n * Commit 命令选项\n */\nexport interface CommitOptions {\n verbose?: VerboseLevel;\n dryRun?: boolean;\n noVerify?: boolean;\n split?: boolean;\n}\n\n/**\n * Commit 执行结果\n */\nexport interface CommitResult {\n success: boolean;\n message?: string;\n error?: string;\n commitCount?: number;\n}\n\n/**\n * Commit 分组\n */\nexport interface CommitGroup {\n files: string[];\n reason: string;\n packageInfo?: { name: string; description?: string };\n}\n\n/**\n * 拆分分析结果\n */\nexport interface SplitAnalysis {\n groups: CommitGroup[];\n}\n\n/**\n * 包信息\n */\nexport interface PackageInfo {\n /** 包名(package.json 中的 name) */\n name: string;\n /** 包描述 */\n description?: string;\n /** package.json 所在目录的绝对路径 */\n path: string;\n}\n\n/**\n * 结构化 Commit Message schema(仅 AI 生成的部分)\n */\nexport const CommitMessageContentSchema = z.object({\n /** commit 类型,如 feat, fix, refactor 等 */\n type: z.string().describe(\"commit 类型\"),\n /** 影响范围,可选 */\n scope: z.string().optional().describe(\"影响范围(包名、模块名)\"),\n /** 简短描述,不超过 50 个字符 */\n subject: z.string().describe(\"简短描述\"),\n /** 详细描述,可选 */\n body: z.string().optional().describe(\"详细描述\"),\n});\n\nexport type CommitMessageContent = z.infer<typeof CommitMessageContentSchema>;\n\n/**\n * 完整的 Commit Message,包含文件和包上下文\n */\nexport interface CommitMessage extends CommitMessageContent {\n /** 涉及的文件列表(相对路径) */\n files?: string[];\n /** 所属包信息 */\n packageInfo?: PackageInfo;\n}\n\n/**\n * 解析 commit message 字符串为结构化对象\n */\nexport function parseCommitMessage(message: string): CommitMessage {\n const lines = message.trim().split(\"\\n\");\n const firstLine = lines[0] || \"\";\n\n // 匹配 type(scope): subject 或 type: subject\n const headerRegex = /^(\\w+)(?:\\(([^)]+)\\))?:\\s*(.+)$/;\n const match = firstLine.match(headerRegex);\n\n if (!match) {\n // 无法解析,将整个内容作为 subject\n return {\n type: \"chore\",\n subject: firstLine || message.trim(),\n body: lines.slice(1).join(\"\\n\").trim() || undefined,\n };\n }\n\n const [, type, scope, subject] = match;\n const body = lines.slice(1).join(\"\\n\").trim() || undefined;\n\n return {\n type,\n scope: scope || undefined,\n subject,\n body,\n };\n}\n\n/**\n * 格式化结构化 commit message 为字符串\n */\nexport function formatCommitMessage(commit: CommitMessage): string {\n const { type, scope, subject, body } = commit;\n const header = scope ? `${type}(${scope}): ${subject}` : `${type}: ${subject}`;\n\n if (body) {\n return `${header}\\n\\n${body}`;\n }\n return header;\n}\n","import type { IConfigReader } from \"@spaceflow/core\";\nimport { execSync, spawnSync } from \"child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport micromatch from \"micromatch\";\nimport { dirname, join } from \"path\";\nimport {\n LlmProxyService,\n type LlmMessage,\n LlmJsonPut,\n parallel,\n shouldLog,\n t,\n} from \"@spaceflow/core\";\nimport {\n CommitScopeConfigSchema,\n formatCommitMessage,\n parseCommitMessage,\n type CommitConfig,\n type CommitGroup,\n type CommitMessage,\n type CommitOptions,\n type CommitResult,\n type CommitScopeConfig,\n type CommitType,\n type PackageInfo,\n type ScopeRule,\n type SplitAnalysis,\n} from \"./commit.config\";\n\n// 重新导出类型,保持向后兼容\nexport type {\n CommitConfig,\n CommitGroup,\n CommitMessage,\n CommitOptions,\n CommitResult,\n CommitScopeConfig,\n CommitType,\n PackageInfo,\n ScopeRule,\n SplitAnalysis,\n};\nexport { formatCommitMessage, parseCommitMessage };\n\n/**\n * Commit 上下文,包含生成 commit message 所需的所有信息\n */\ninterface CommitContext {\n files: string[];\n diff: string;\n scope: string;\n packageInfo?: PackageInfo;\n}\n\nexport class CommitService {\n constructor(\n private readonly configReader: IConfigReader,\n private readonly llmProxyService: LlmProxyService,\n ) {}\n\n // ============================================================\n // Git 基础操作\n // ============================================================\n\n /**\n * 执行 git 命令并返回输出\n */\n private execGit(command: string, options?: { maxBuffer?: number }): string {\n return execSync(command, {\n encoding: \"utf-8\",\n maxBuffer: options?.maxBuffer ?? 1024 * 1024 * 10,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n }\n\n /**\n * 安全执行 git 命令,失败返回空字符串\n */\n private execGitSafe(command: string, options?: { maxBuffer?: number }): string {\n try {\n return this.execGit(command, options);\n } catch {\n return \"\";\n }\n }\n\n /**\n * 获取文件列表(从 git 命令输出解析)\n */\n private parseFileList(output: string): string[] {\n return output\n .split(\"\\n\")\n .map((f) => f.trim())\n .filter((f) => f.length > 0);\n }\n\n // ============================================================\n // 暂存区操作\n // ============================================================\n\n getStagedFiles(): string[] {\n return this.parseFileList(this.execGitSafe(\"git diff --cached --name-only\"));\n }\n\n getStagedDiff(): string {\n try {\n return this.execGit(\"git diff --cached --no-color\");\n } catch {\n throw new Error(t(\"commit:getDiffFailed\"));\n }\n }\n\n hasStagedFiles(): boolean {\n return this.getStagedFiles().length > 0;\n }\n\n getFileDiff(files: string[]): string {\n if (files.length === 0) return \"\";\n const fileArgs = files.map((f) => `\"${f}\"`).join(\" \");\n return this.execGitSafe(`git diff --cached --no-color -- ${fileArgs}`);\n }\n\n // ============================================================\n // 工作区操作\n // ============================================================\n\n getUnstagedFiles(): string[] {\n return this.parseFileList(this.execGitSafe(\"git diff --name-only\"));\n }\n\n getUntrackedFiles(): string[] {\n return this.parseFileList(this.execGitSafe(\"git ls-files --others --exclude-standard\"));\n }\n\n getAllWorkingFiles(): string[] {\n return [...new Set([...this.getUnstagedFiles(), ...this.getUntrackedFiles()])];\n }\n\n hasWorkingFiles(): boolean {\n return this.getAllWorkingFiles().length > 0;\n }\n\n getUnstagedFileDiff(files: string[]): string {\n if (files.length === 0) return \"\";\n const fileArgs = files.map((f) => `\"${f}\"`).join(\" \");\n return this.execGitSafe(`git diff --no-color -- ${fileArgs}`);\n }\n\n // ============================================================\n // 历史记录\n // ============================================================\n\n getRecentCommits(count: number = 10): string {\n return this.execGitSafe(`git log --oneline -n ${count} --no-color`);\n }\n\n // ============================================================\n // 配置获取\n // ============================================================\n\n getCommitTypes(): CommitType[] {\n const publishConfig = this.configReader.getPluginConfig<CommitConfig>(\"publish\");\n\n const defaultTypes: CommitType[] = [\n { type: \"feat\", section: \"新特性\" },\n { type: \"fix\", section: \"修复BUG\" },\n { type: \"perf\", section: \"性能优化\" },\n { type: \"refactor\", section: \"代码重构\" },\n { type: \"docs\", section: \"文档更新\" },\n { type: \"style\", section: \"代码格式\" },\n { type: \"test\", section: \"测试用例\" },\n { type: \"chore\", section: \"其他修改\" },\n ];\n\n return publishConfig?.changelog?.preset?.type || defaultTypes;\n }\n\n getScopeConfig(): CommitScopeConfig {\n const commitConfig = this.configReader.getPluginConfig<Record<string, unknown>>(\"commit\");\n return CommitScopeConfigSchema.parse(commitConfig ?? {});\n }\n\n // ============================================================\n // Package.json 和 Scope 处理\n // ============================================================\n\n /**\n * 从路径提取 scope(目录名)\n * 根目录返回空字符串\n */\n extractScopeFromPath(packagePath: string): string {\n if (!packagePath || packagePath === process.cwd()) return \"\";\n const parts = packagePath.split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"\";\n }\n\n /**\n * 查找文件所属的 package.json\n */\n findPackageForFile(file: string): PackageInfo {\n const cwd = process.cwd();\n let dir = dirname(join(cwd, file));\n\n while (dir !== dirname(dir)) {\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return {\n name: pkg.name || \"root\",\n description: pkg.description,\n path: dir,\n };\n } catch {\n // 解析失败,继续向上\n }\n }\n dir = dirname(dir);\n }\n\n // 回退到根目录\n return this.getRootPackageInfo();\n }\n\n /**\n * 获取根目录的 package.json 信息\n */\n private getRootPackageInfo(): PackageInfo {\n const cwd = process.cwd();\n const pkgPath = join(cwd, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return { name: pkg.name || \"root\", description: pkg.description, path: cwd };\n } catch {\n // ignore\n }\n }\n return { name: \"root\", path: cwd };\n }\n\n /**\n * 按 package.json 对文件分组\n */\n groupFilesByPackage(files: string[]): Map<string, { files: string[]; packageInfo: PackageInfo }> {\n const groups = new Map<string, { files: string[]; packageInfo: PackageInfo }>();\n\n for (const file of files) {\n const pkgInfo = this.findPackageForFile(file);\n const key = pkgInfo.path;\n\n if (!groups.has(key)) {\n groups.set(key, { files: [], packageInfo: pkgInfo });\n }\n groups.get(key)!.files.push(file);\n }\n\n return groups;\n }\n\n /**\n * 根据自定义规则匹配文件的 scope\n */\n matchFileToScope(file: string, rules: ScopeRule[]): string | null {\n for (const rule of rules) {\n if (micromatch.isMatch(file, rule.pattern)) {\n return rule.scope;\n }\n }\n return null;\n }\n\n /**\n * 根据配置策略对文件分组\n */\n groupFiles(\n files: string[],\n ): Map<string, { files: string[]; scope: string; packageInfo?: PackageInfo }> {\n const config = this.getScopeConfig();\n const groups = new Map<string, { files: string[]; scope: string; packageInfo?: PackageInfo }>();\n\n for (const file of files) {\n let scope: string | null = null;\n let packageInfo: PackageInfo | undefined;\n\n // 规则匹配\n if (config.strategy === \"rules\" || config.strategy === \"rules-first\") {\n scope = this.matchFileToScope(file, config.rules || []);\n }\n\n // 包目录匹配\n if (scope === null && (config.strategy === \"package\" || config.strategy === \"rules-first\")) {\n packageInfo = this.findPackageForFile(file);\n scope = this.extractScopeFromPath(packageInfo.path);\n }\n\n const finalScope = scope || \"\";\n if (!groups.has(finalScope)) {\n groups.set(finalScope, { files: [], scope: finalScope, packageInfo });\n }\n groups.get(finalScope)!.files.push(file);\n }\n\n return groups;\n }\n\n // ============================================================\n // Commit 上下文获取\n // ============================================================\n\n /**\n * 获取 commit 上下文(统一获取 files, diff, scope, packageInfo)\n */\n getCommitContext(files: string[], useUnstaged = false): CommitContext {\n const diff = useUnstaged ? this.getUnstagedFileDiff(files) : this.getFileDiff(files);\n const packageGroups = this.groupFilesByPackage(files);\n const firstGroup = [...packageGroups.values()][0];\n const packageInfo = firstGroup?.packageInfo;\n const scope = packageInfo ? this.extractScopeFromPath(packageInfo.path) : \"\";\n\n return { files, diff, scope, packageInfo };\n }\n\n // ============================================================\n // Prompt 构建\n // ============================================================\n\n /**\n * 构建 commit message 生成的 prompt\n */\n private buildCommitPrompt(ctx: CommitContext): { system: string; user: string } {\n const commitTypes = this.getCommitTypes();\n const typesList = commitTypes.map((t) => `- ${t.type}: ${t.section}`).join(\"\\n\");\n const recentCommits = this.getRecentCommits();\n\n const packageContext = ctx.packageInfo\n ? `\\n## 包信息\\n- 包名: ${ctx.packageInfo.name}\\n- scope: ${ctx.scope || \"无(根目录)\"}${ctx.packageInfo.description ? `\\n- 描述: ${ctx.packageInfo.description}` : \"\"}`\n : \"\";\n\n const system = `你是一个专业的 Git commit message 生成器。请根据提供的代码变更生成符合 Conventional Commits 规范的 commit message。\n\n## Commit 类型规范\n${typesList}\n\n## 输出格式\n请严格按照以下 JSON 格式输出,不要包含任何其他内容:\n{\n \"type\": \"feat\",\n \"scope\": \"${ctx.scope}\",\n \"subject\": \"简短描述(不超过50字符,中文)\",\n \"body\": \"详细描述(可选,中文)\"\n}\n\n## 规则\n1. type 必须是上述类型之一\n2. scope ${ctx.scope ? `必须使用 \"${ctx.scope}\"` : \"必须为空字符串(根目录不需要 scope)\"}\n3. subject 是简短描述,不超过 50 个字符,使用中文\n4. body 是详细描述,可选,使用中文,如果没有则设为空字符串\n5. 如果变更涉及多个方面,选择最主要的类型`;\n\n const truncatedDiff =\n ctx.diff.length > 8000 ? ctx.diff.substring(0, 8000) + \"\\n... (diff 过长,已截断)\" : ctx.diff;\n\n const user = `请根据以下信息生成 commit message:\n${packageContext}\n## 暂存的文件\n${ctx.files.join(\"\\n\")}\n\n## 最近的 commit 历史(参考风格)\n${recentCommits || \"无历史记录\"}\n\n## 代码变更 (diff)\n\\`\\`\\`diff\n${truncatedDiff}\n\\`\\`\\`\n\n请直接输出 JSON 格式的 commit message。`;\n\n return { system, user };\n }\n\n // ============================================================\n // AI 响应解析\n // ============================================================\n\n /**\n * 解析 AI 响应为结构化 CommitMessage\n */\n private async parseAIResponse(content: string, expectedScope: string): Promise<CommitMessage> {\n const jsonPut = new LlmJsonPut<{\n type: string;\n scope?: string;\n subject: string;\n body?: string;\n }>({\n type: \"object\",\n properties: {\n type: { type: \"string\", description: \"commit 类型\" },\n scope: { type: \"string\", description: \"影响范围\" },\n subject: { type: \"string\", description: \"简短描述\" },\n body: { type: \"string\", description: \"详细描述\" },\n },\n required: [\"type\", \"subject\"],\n });\n\n try {\n const parsed = await jsonPut.parse(content, { disableRequestRetry: true });\n return this.normalizeScope(\n {\n type: parsed.type || \"chore\",\n subject: parsed.subject || \"\",\n scope: parsed.scope || undefined,\n body: parsed.body || undefined,\n },\n expectedScope,\n );\n } catch {\n return this.normalizeScope(parseCommitMessage(content), expectedScope);\n }\n }\n\n /**\n * 规范化 scope(强制使用预期值或移除)\n */\n private normalizeScope(commit: CommitMessage, expectedScope: string): CommitMessage {\n return expectedScope ? { ...commit, scope: expectedScope } : { ...commit, scope: undefined };\n }\n\n // ============================================================\n // Commit Message 生成\n // ============================================================\n\n /**\n * 生成 commit message(核心方法)\n */\n async generateCommitMessage(\n options?: CommitOptions & { files?: string[]; useUnstaged?: boolean },\n ): Promise<CommitMessage> {\n // 获取文件列表\n const files = options?.files ?? this.getStagedFiles();\n if (files.length === 0) {\n throw new Error(t(\"commit:noFilesToCommit\"));\n }\n\n // 获取上下文\n const ctx = this.getCommitContext(files, options?.useUnstaged);\n if (!ctx.diff) {\n throw new Error(t(\"commit:noChanges\"));\n }\n\n // 构建 prompt\n const prompt = this.buildCommitPrompt(ctx);\n const messages: LlmMessage[] = [\n { role: \"system\", content: prompt.system },\n { role: \"user\", content: prompt.user },\n ];\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:generatingMessage\"));\n }\n\n // 调用 AI\n const response = await this.llmProxyService.chat(messages, {\n verbose: options?.verbose,\n });\n\n // 解析响应并填充上下文\n const commit = await this.parseAIResponse(response.content, ctx.scope);\n return {\n ...commit,\n files: ctx.files,\n packageInfo: ctx.packageInfo,\n };\n }\n\n /**\n * 为指定文件生成 commit message(兼容旧 API)\n */\n async generateCommitMessageForFiles(\n files: string[],\n options?: CommitOptions,\n useUnstaged = false,\n _packageInfo?: { name: string; description?: string },\n ): Promise<CommitMessage> {\n return this.generateCommitMessage({ ...options, files, useUnstaged });\n }\n\n // ============================================================\n // 拆分分析\n // ============================================================\n\n /**\n * 分析如何拆分 commit\n */\n async analyzeSplitStrategy(options?: CommitOptions, useUnstaged = false): Promise<SplitAnalysis> {\n const files = useUnstaged ? this.getUnstagedFiles() : this.getStagedFiles();\n const config = this.getScopeConfig();\n\n if (shouldLog(options?.verbose, 1)) {\n const strategyName =\n config.strategy === \"rules\"\n ? t(\"commit:strategyRules\")\n : config.strategy === \"rules-first\"\n ? t(\"commit:strategyRulesFirst\")\n : t(\"commit:strategyPackage\");\n console.log(t(\"commit:groupingByStrategy\", { strategy: strategyName }));\n }\n\n const scopeGroups = this.groupFiles(files);\n\n // 单个组:让 AI 进一步分析\n if (scopeGroups.size === 1) {\n const [, groupData] = [...scopeGroups.entries()][0];\n const packageInfo = groupData.packageInfo || {\n name: groupData.scope || \"root\",\n path: process.cwd(),\n };\n return this.analyzeWithinPackage(groupData.files, packageInfo, options, useUnstaged);\n }\n\n // 多个组:每个组作为独立 commit\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:detectedGroups\", { count: scopeGroups.size }));\n }\n\n const groups: CommitGroup[] = [];\n for (const [, groupData] of scopeGroups) {\n groups.push({\n files: groupData.files,\n reason: groupData.scope\n ? t(\"commit:scopeChanges\", { scope: groupData.scope })\n : t(\"commit:rootChanges\"),\n packageInfo: groupData.packageInfo\n ? { name: groupData.packageInfo.name, description: groupData.packageInfo.description }\n : undefined,\n });\n }\n\n return { groups };\n }\n\n /**\n * 在单个包内分析拆分策略\n */\n private async analyzeWithinPackage(\n files: string[],\n packageInfo: PackageInfo,\n options?: CommitOptions,\n useUnstaged = false,\n ): Promise<SplitAnalysis> {\n const diff = useUnstaged ? this.getUnstagedFileDiff(files) : this.getFileDiff(files);\n const scope = this.extractScopeFromPath(packageInfo.path);\n const commitTypes = this.getCommitTypes();\n const typesList = commitTypes.map((t) => `- ${t.type}: ${t.section}`).join(\"\\n\");\n\n const systemPrompt = `你是一个专业的 Git commit 拆分分析器。请根据暂存的文件和代码变更,分析如何将这些变更拆分为多个独立的 commit。\n\n## 当前包信息\n- 包名: ${packageInfo.name}\n- scope: ${scope || \"无\"}\n${packageInfo.description ? `- 描述: ${packageInfo.description}` : \"\"}\n\n## Commit 类型规范\n${typesList}\n\n## 拆分原则\n1. **按逻辑拆分**:相关的功能变更放在一起\n2. **按业务拆分**:不同业务模块的变更分开\n3. **保持原子性**:每个 commit 是完整的、可独立理解的变更\n4. **最小化拆分**:如果变更本身是整体,不要强行拆分\n\n## 输出格式\n请严格按照以下 JSON 格式输出:\n{\n \"groups\": [\n { \"files\": [\"file1.ts\", \"file2.ts\"], \"reason\": \"简短描述\" }\n ]\n}`;\n\n const truncatedDiff =\n diff.length > 12000 ? diff.substring(0, 12000) + \"\\n... (diff 过长,已截断)\" : diff;\n\n const userPrompt = `请分析以下改动文件,决定如何拆分 commit:\n\n## 改动的文件\n${files.join(\"\\n\")}\n\n## 代码变更 (diff)\n\\`\\`\\`diff\n${truncatedDiff}\n\\`\\`\\`\n\n请输出 JSON 格式的拆分策略。`;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:analyzingSplit\"));\n }\n\n const response = await this.llmProxyService.chat(\n [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n { verbose: options?.verbose },\n );\n\n return this.parseSplitAnalysis(response.content, files, packageInfo);\n }\n\n /**\n * 解析拆分分析结果\n */\n private parseSplitAnalysis(\n content: string,\n files: string[],\n packageInfo: PackageInfo,\n ): SplitAnalysis {\n let text = content\n .trim()\n .replace(/^```[\\w]*\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim();\n\n try {\n const analysis = JSON.parse(text) as SplitAnalysis;\n\n if (!analysis.groups || !Array.isArray(analysis.groups)) {\n throw new Error(\"Invalid response\");\n }\n\n const validFiles = new Set(files);\n\n // 过滤无效文件,移除空组\n for (const group of analysis.groups) {\n group.files = (group.files || []).filter((f) => validFiles.has(f));\n }\n analysis.groups = analysis.groups.filter((g) => g.files.length > 0);\n\n // 补充未分配的文件\n const assignedFiles = new Set(analysis.groups.flatMap((g) => g.files));\n const missingFiles = files.filter((f) => !assignedFiles.has(f));\n if (missingFiles.length > 0) {\n if (analysis.groups.length > 0) {\n analysis.groups[analysis.groups.length - 1].files.push(...missingFiles);\n } else {\n analysis.groups.push({ files: missingFiles, reason: t(\"commit:otherChanges\") });\n }\n }\n\n // 添加 packageInfo\n for (const group of analysis.groups) {\n group.packageInfo = { name: packageInfo.name, description: packageInfo.description };\n }\n\n return analysis;\n } catch {\n return {\n groups: [\n {\n files,\n reason: t(\"commit:allChanges\"),\n packageInfo: { name: packageInfo.name, description: packageInfo.description },\n },\n ],\n };\n }\n }\n\n // ============================================================\n // Commit 执行\n // ============================================================\n\n /**\n * 执行 git commit\n */\n async commit(message: string, options?: CommitOptions): Promise<CommitResult> {\n if (options?.dryRun) {\n return { success: true, message: t(\"commit:dryRunMessage\", { message }) };\n }\n\n try {\n const args = [\"commit\", \"-m\", message];\n if (options?.noVerify) args.push(\"--no-verify\");\n\n const result = spawnSync(\"git\", args, { encoding: \"utf-8\", stdio: \"pipe\" });\n\n if (result.status !== 0) {\n return { success: false, error: result.stderr || result.stdout || t(\"commit:commitFail\") };\n }\n return { success: true, message: result.stdout };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n /**\n * 暂存文件\n */\n private stageFiles(files: string[]): { success: boolean; error?: string } {\n const result = spawnSync(\"git\", [\"add\", ...files], { encoding: \"utf-8\", stdio: \"pipe\" });\n if (result.status !== 0) {\n return { success: false, error: t(\"commit:stageFilesFailed\", { error: result.stderr }) };\n }\n return { success: true };\n }\n\n /**\n * 重置暂存区\n */\n private resetStaging(): boolean {\n try {\n execSync(\"git reset HEAD\", { encoding: \"utf-8\", stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n }\n\n // ============================================================\n // 批量提交\n // ============================================================\n\n /**\n * 排序 groups:子包优先,根目录最后\n */\n private sortGroupsForCommit(groups: CommitGroup[]): CommitGroup[] {\n return [...groups].sort((a, b) => {\n const aScope = this.getGroupScope(a);\n const bScope = this.getGroupScope(b);\n if (!aScope && bScope) return 1;\n if (aScope && !bScope) return -1;\n return 0;\n });\n }\n\n private getGroupScope(group: CommitGroup): string {\n if (!group.packageInfo) return \"\";\n const pkgGroups = this.groupFilesByPackage(group.files);\n const first = [...pkgGroups.values()][0];\n return first ? this.extractScopeFromPath(first.packageInfo.path) : \"\";\n }\n\n /**\n * 分批提交\n */\n async commitInBatches(options?: CommitOptions, useWorking = false): Promise<CommitResult> {\n const files = useWorking ? this.getAllWorkingFiles() : this.getStagedFiles();\n\n if (files.length === 0) {\n return {\n success: false,\n error: useWorking ? t(\"commit:noWorkingChanges\") : t(\"commit:noStagedFiles\"),\n };\n }\n\n const analysis = await this.analyzeSplitStrategy(options, useWorking);\n const sortedGroups = this.sortGroupsForCommit(analysis.groups);\n\n // 单个组:简化处理\n if (sortedGroups.length <= 1) {\n const group = sortedGroups[0];\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:singleCommit\"));\n }\n\n if (useWorking) {\n const stageResult = this.stageFiles(files);\n if (!stageResult.success) return { success: false, error: stageResult.error };\n }\n\n const commitObj = await this.generateCommitMessage({ ...options, files });\n const message = formatCommitMessage(commitObj);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:generatedMessage\"));\n console.log(\"─\".repeat(50));\n console.log(message);\n console.log(\"─\".repeat(50));\n }\n\n return this.commit(message, options);\n }\n\n // 多个组:并行生成 message,顺序提交\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:splitIntoCommits\", { count: sortedGroups.length }));\n sortedGroups.forEach((g, i) => {\n const pkgStr = g.packageInfo ? ` [${g.packageInfo.name}]` : \"\";\n console.log(\n t(\"commit:groupItem\", {\n index: i + 1,\n reason: g.reason,\n pkg: pkgStr,\n count: g.files.length,\n }),\n );\n });\n console.log(t(\"commit:parallelGenerating\", { count: sortedGroups.length }));\n }\n\n // 并行生成 messages\n const executor = parallel({ concurrency: 5 });\n const messageResults = await executor.map(\n sortedGroups,\n async (group: CommitGroup) =>\n this.generateCommitMessage({ ...options, files: group.files, useUnstaged: useWorking }),\n (group: CommitGroup) => group.files[0] || \"unknown\",\n );\n\n const failedResults = messageResults.filter((r) => !r.success);\n if (failedResults.length > 0) {\n return {\n success: false,\n error: t(\"commit:generateMessageFailed\", {\n errors: failedResults.map((r) => r.error?.message).join(\", \"),\n }),\n };\n }\n\n const generatedMessages = messageResults.map((r) => r.result!);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:allMessagesGenerated\"));\n }\n\n // Dry run 模式\n if (options?.dryRun) {\n const preview = sortedGroups\n .map((g, i) => {\n const pkgStr = g.packageInfo ? `\\n包: ${g.packageInfo.name}` : \"\";\n return `[Commit ${i + 1}/${sortedGroups.length}] ${g.reason}${pkgStr}\\n文件: ${g.files.join(\", \")}\\n\\n${formatCommitMessage(generatedMessages[i])}`;\n })\n .join(\"\\n\\n\" + \"═\".repeat(50) + \"\\n\\n\");\n return { success: true, message: preview, commitCount: sortedGroups.length };\n }\n\n // 实际提交\n if (this.hasStagedFiles() && !this.resetStaging()) {\n return { success: false, error: t(\"commit:resetStagingFailed\") };\n }\n\n const committedMessages: string[] = [];\n let successCount = 0;\n\n for (let i = 0; i < sortedGroups.length; i++) {\n const group = sortedGroups[i];\n const commitObj = generatedMessages[i];\n const messageStr = formatCommitMessage(commitObj);\n\n if (shouldLog(options?.verbose, 1)) {\n const pkgStr = group.packageInfo ? ` [${group.packageInfo.name}]` : \"\";\n console.log(\n t(\"commit:committingGroup\", {\n current: i + 1,\n total: sortedGroups.length,\n reason: group.reason,\n pkg: pkgStr,\n }),\n );\n }\n\n try {\n const stageResult = this.stageFiles(group.files);\n if (!stageResult.success) throw new Error(stageResult.error);\n\n const diff = this.getFileDiff(group.files);\n if (!diff) {\n if (shouldLog(options?.verbose, 1)) console.log(t(\"commit:skippingNoChanges\"));\n continue;\n }\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:commitMessage\"));\n console.log(\"─\".repeat(50));\n console.log(messageStr);\n console.log(\"─\".repeat(50));\n }\n\n const commitResult = await this.commit(messageStr, options);\n if (!commitResult.success) throw new Error(commitResult.error);\n\n successCount++;\n const shortMsg = formatCommitMessage({ ...commitObj, body: undefined });\n committedMessages.push(`✅ Commit ${i + 1}: ${shortMsg}`);\n console.log(committedMessages[committedMessages.length - 1]);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n committedMessages.push(t(\"commit:commitItemFailed\", { index: i + 1, error: errorMsg }));\n\n // 恢复剩余文件\n const remaining = sortedGroups.slice(i).flatMap((g) => g.files);\n if (remaining.length > 0) this.stageFiles(remaining);\n\n return {\n success: false,\n error: t(\"commit:commitItemFailedDetail\", {\n index: i + 1,\n error: errorMsg,\n committed: committedMessages.join(\"\\n\"),\n }),\n commitCount: successCount,\n };\n }\n }\n\n return { success: true, message: committedMessages.join(\"\\n\"), commitCount: successCount };\n }\n\n // ============================================================\n // 主入口\n // ============================================================\n\n /**\n * 生成并提交(主入口)\n */\n async generateAndCommit(options?: CommitOptions): Promise<CommitResult> {\n // Split 模式\n if (options?.split) {\n const hasWorking = this.hasWorkingFiles();\n const hasStaged = this.hasStagedFiles();\n\n if (!hasWorking && !hasStaged) {\n return { success: false, error: t(\"commit:noChangesAll\") };\n }\n\n return this.commitInBatches(options, hasWorking);\n }\n\n // 普通模式\n if (!this.hasStagedFiles()) {\n return { success: false, error: t(\"commit:noStagedFilesHint\") };\n }\n\n try {\n const commitObj = await this.generateCommitMessage(options);\n const message = formatCommitMessage(commitObj);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"commit:generatedMessage\"));\n console.log(\"─\".repeat(50));\n console.log(message);\n console.log(\"─\".repeat(50));\n }\n\n return this.commit(message, options);\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n}\n","import { defineExtension, type LlmProxyService } from \"@spaceflow/core\";\nimport { CommitService } from \"./commit.service\";\nimport { CommitScopeConfigSchema } from \"./commit.config\";\n\n/**\n * Commit 命令扩展\n */\nexport const commitExtension = defineExtension({\n name: \"commit\",\n version: \"1.0.0\",\n description: \"提交代码\",\n configKey: \"commit\",\n configSchema: () => CommitScopeConfigSchema,\n commands: [\n {\n name: \"commit\",\n description: \"AI 辅助生成 commit message\",\n options: [\n {\n flags: \"-m, --message <message>\",\n description: \"直接使用指定的提交信息\",\n },\n {\n flags: \"-s, --split\",\n description: \"自动拆分提交\",\n },\n {\n flags: \"--dry-run\",\n description: \"仅生成 message,不执行提交\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (_args, options, ctx) => {\n const configReader = ctx.config;\n const llmProxy = ctx.getService<LlmProxyService>(\"llmProxy\");\n if (!llmProxy) {\n ctx.output.error(\"commit 命令需要配置 LLM 服务,请在 spaceflow.json 中配置 llm 字段\");\n process.exit(1);\n }\n const commitService = new CommitService(configReader, llmProxy);\n const verbose = options?.verbose ? 2 : 1;\n if (options?.message) {\n await commitService.commit(options.message as string, { verbose });\n } else if (options?.split) {\n await commitService.commitInBatches({ verbose, dryRun: !!options?.dryRun });\n } else {\n await commitService.generateAndCommit({ verbose, dryRun: !!options?.dryRun });\n }\n },\n },\n ],\n});\n\nexport * from \"./commit.config\";\nexport * from \"./commit.service\";\n","import { mkdir, writeFile, readFile, readdir, stat } from \"fs/promises\";\nimport { join, resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport { homedir } from \"os\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\n\nexport interface CreateOptions {\n directory?: string;\n from?: string;\n ref?: string;\n}\n\ninterface TemplateContext {\n name: string;\n pascalName: string;\n camelName: string;\n kebabName: string;\n}\n\n/**\n * 创建插件服务\n */\nexport class CreateService {\n // 缓存当前使用的远程模板目录\n private remoteTemplatesDir: string | null = null;\n\n /**\n * 获取缓存目录路径\n */\n protected getCacheDir(): string {\n return join(homedir(), \".cache\", \"spaceflow\", \"templates\");\n }\n\n /**\n * 计算仓库 URL 的哈希值(用于缓存目录名)\n */\n protected getRepoHash(repoUrl: string): string {\n return createHash(\"md5\").update(repoUrl).digest(\"hex\").slice(0, 12);\n }\n\n /**\n * 从仓库 URL 提取名称\n */\n protected getRepoName(repoUrl: string): string {\n // 处理 git@host:org/repo.git 或 https://host/org/repo.git\n const match = repoUrl.match(/[/:]([^/]+\\/[^/]+?)(?:\\.git)?$/);\n if (match) {\n return match[1].replace(\"/\", \"-\");\n }\n return this.getRepoHash(repoUrl);\n }\n\n /**\n * 确保远程模板仓库已克隆/更新\n */\n async ensureRemoteTemplates(\n repoUrl: string,\n ref?: string,\n verbose: VerboseLevel = 1,\n ): Promise<string> {\n const cacheDir = this.getCacheDir();\n const repoName = this.getRepoName(repoUrl);\n const repoHash = this.getRepoHash(repoUrl);\n const targetDir = join(cacheDir, `${repoName}-${repoHash}`);\n\n // 确保缓存目录存在\n await mkdir(cacheDir, { recursive: true });\n\n if (existsSync(targetDir)) {\n // 已存在,更新仓库\n if (shouldLog(verbose, 1)) console.log(t(\"create:updatingRepo\", { url: repoUrl }));\n try {\n execSync(\"git fetch --all\", { cwd: targetDir, stdio: \"pipe\" });\n if (ref) {\n execSync(`git checkout ${ref}`, { cwd: targetDir, stdio: \"pipe\" });\n // 如果是分支,尝试 pull\n try {\n execSync(`git pull origin ${ref}`, { cwd: targetDir, stdio: \"pipe\" });\n } catch {\n // 可能是 tag,忽略 pull 错误\n }\n } else {\n execSync(\"git pull\", { cwd: targetDir, stdio: \"pipe\" });\n }\n } catch (error) {\n if (shouldLog(verbose, 1)) console.warn(t(\"create:updateFailed\"));\n }\n } else {\n // 不存在,克隆仓库\n if (shouldLog(verbose, 1)) console.log(t(\"create:cloningRepo\", { url: repoUrl }));\n try {\n execSync(`git clone ${repoUrl} ${targetDir}`, { stdio: \"pipe\" });\n if (ref) {\n execSync(`git checkout ${ref}`, { cwd: targetDir, stdio: \"pipe\" });\n }\n } catch (error) {\n throw new Error(\n t(\"create:cloneFailed\", { error: error instanceof Error ? error.message : error }),\n );\n }\n }\n\n // 设置当前使用的远程模板目录\n this.remoteTemplatesDir = targetDir;\n if (shouldLog(verbose, 1)) console.log(t(\"create:repoReady\", { dir: targetDir }));\n return targetDir;\n }\n\n /**\n * 获取模板目录路径\n */\n protected getTemplatesDir(options?: CreateOptions): string {\n // 如果有远程模板目录,优先使用\n if (options?.from && this.remoteTemplatesDir) {\n return this.remoteTemplatesDir;\n }\n // 尝试从项目根目录查找 templates\n const cwd = process.cwd();\n const templatesInCwd = join(cwd, \"templates\");\n if (existsSync(templatesInCwd)) {\n return templatesInCwd;\n }\n\n // 尝试从父目录查找(在 core 子目录运行时)\n const templatesInParent = join(cwd, \"..\", \"templates\");\n if (existsSync(templatesInParent)) {\n return resolve(templatesInParent);\n }\n\n // 尝试从 spaceflow 包目录查找\n const spaceflowRoot = join(cwd, \"node_modules\", \"spaceflow\", \"templates\");\n if (existsSync(spaceflowRoot)) {\n return spaceflowRoot;\n }\n\n // 回退到相对于当前文件的路径(开发模式)\n // 从 core/dist/commands/create 回溯到项目根目录\n const devPath = resolve(__dirname, \"..\", \"..\", \"..\", \"..\", \"templates\");\n if (existsSync(devPath)) {\n return devPath;\n }\n\n throw new Error(t(\"create:templatesDirNotFound\"));\n }\n\n /**\n * 获取可用的模板列表\n */\n async getAvailableTemplates(options?: CreateOptions): Promise<string[]> {\n try {\n const templatesDir = this.getTemplatesDir(options);\n const entries = await readdir(templatesDir);\n const templates: string[] = [];\n\n for (const entry of entries) {\n // 跳过隐藏目录\n if (entry.startsWith(\".\")) {\n continue;\n }\n const entryPath = join(templatesDir, entry);\n const entryStat = await stat(entryPath);\n if (entryStat.isDirectory()) {\n templates.push(entry);\n }\n }\n\n return templates;\n } catch {\n return [];\n }\n }\n\n /**\n * 基于模板创建插件\n */\n async createFromTemplate(\n template: string,\n name: string,\n options: CreateOptions,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const cwd = process.cwd();\n // 默认目录为 <template>/<name>\n const targetDir = options.directory || join(template, name);\n const fullPath = join(cwd, targetDir);\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"create:creatingPlugin\", { template, name }));\n console.log(t(\"create:targetDir\", { dir: targetDir }));\n }\n\n // 检查目录是否已存在\n if (existsSync(fullPath)) {\n throw new Error(t(\"create:dirExists\", { dir: targetDir }));\n }\n\n // 从模板生成文件\n const templatesDir = this.getTemplatesDir(options);\n const templateDir = join(templatesDir, template);\n\n if (!existsSync(templateDir)) {\n const available = await this.getAvailableTemplates(options);\n throw new Error(\n t(\"create:templateNotFound\", {\n template,\n available: available.join(\", \") || t(\"create:noTemplatesAvailable\"),\n }),\n );\n }\n\n const context = this.createContext(name);\n await this.copyTemplateDir(templateDir, fullPath, context, verbose);\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"create:pluginCreated\", { template, name }));\n console.log(\"\");\n console.log(t(\"create:nextSteps\"));\n console.log(` cd ${targetDir}`);\n }\n }\n\n /**\n * 创建模板上下文\n */\n protected createContext(name: string): TemplateContext {\n return {\n name,\n pascalName: this.toPascalCase(name),\n camelName: this.toCamelCase(name),\n kebabName: this.toKebabCase(name),\n };\n }\n\n /**\n * 递归复制模板目录\n */\n protected async copyTemplateDir(\n templateDir: string,\n targetDir: string,\n context: TemplateContext,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n // 确保目标目录存在\n await mkdir(targetDir, { recursive: true });\n\n const entries = await readdir(templateDir);\n\n for (const entry of entries) {\n const templatePath = join(templateDir, entry);\n const entryStat = await stat(templatePath);\n\n if (entryStat.isDirectory()) {\n // 递归处理子目录\n const targetSubDir = join(targetDir, entry);\n await this.copyTemplateDir(templatePath, targetSubDir, context, verbose);\n } else if (entry.endsWith(\".hbs\")) {\n // 处理模板文件\n const content = await readFile(templatePath, \"utf-8\");\n const rendered = this.renderTemplate(content, context);\n\n // 计算目标文件名(移除 .hbs 后缀,替换 __name__ 占位符)\n let targetFileName = entry.slice(0, -4); // 移除 .hbs\n targetFileName = targetFileName.replace(/__name__/g, context.kebabName);\n\n const targetPath = join(targetDir, targetFileName);\n await writeFile(targetPath, rendered);\n if (shouldLog(verbose, 1)) console.log(t(\"create:fileCreated\", { file: targetFileName }));\n } else {\n // 直接复制非模板文件\n const content = await readFile(templatePath);\n const targetPath = join(targetDir, entry);\n await writeFile(targetPath, content);\n if (shouldLog(verbose, 1)) console.log(t(\"create:fileCopied\", { file: entry }));\n }\n }\n }\n\n /**\n * 渲染模板(简单的 Handlebars 风格替换)\n */\n protected renderTemplate(template: string, context: TemplateContext): string {\n return template\n .replace(/\\{\\{name\\}\\}/g, context.name)\n .replace(/\\{\\{pascalName\\}\\}/g, context.pascalName)\n .replace(/\\{\\{camelName\\}\\}/g, context.camelName)\n .replace(/\\{\\{kebabName\\}\\}/g, context.kebabName);\n }\n\n /**\n * 转换为 PascalCase\n */\n protected toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\"\");\n }\n\n /**\n * 转换为 camelCase\n */\n protected toCamelCase(str: string): string {\n const pascal = this.toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n\n /**\n * 转换为 kebab-case\n */\n protected toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[_\\s]+/g, \"-\")\n .toLowerCase();\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { CreateService } from \"./create.service\";\n\n/**\n * Create 命令扩展\n */\nexport const createExtension = defineExtension({\n name: \"create\",\n version: \"1.0.0\",\n description: \"创建 Extension\",\n commands: [\n {\n name: \"create\",\n description: \"创建 Extension\",\n arguments: \"<name>\",\n options: [\n {\n flags: \"-t, --template <template>\",\n description: \"模板类型 (command, mcp, skills)\",\n default: \"command\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const name = args[0];\n if (!name) {\n ctx.output.error(\"请指定扩展名称\");\n process.exit(1);\n }\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const createService = new CreateService();\n const template = (options?.template as string) || \"command\";\n await createService.createFromTemplate(template, name, {}, verbose);\n },\n },\n ],\n});\n\nexport * from \"./create.service\";\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { BuildService } from \"../build/build.service\";\n\n/**\n * Dev 命令扩展\n */\nexport const devExtension = defineExtension({\n name: \"dev\",\n version: \"1.0.0\",\n description: \"开发模式运行 Extension\",\n commands: [\n {\n name: \"dev\",\n description: \"开发模式(监听构建)\",\n arguments: \"[extension]\",\n options: [\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const extensionName = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const buildService = new BuildService();\n await buildService.watch(extensionName, verbose);\n },\n },\n ],\n});\n","import { execSync } from \"child_process\";\nimport { readFile, writeFile, access, mkdir, symlink, unlink, readlink, stat } from \"fs/promises\";\nimport { join, resolve, relative } from \"path\";\nimport { existsSync } from \"fs\";\nimport {\n shouldLog,\n type VerboseLevel,\n t,\n getEditorDirName,\n type SourceType,\n getSourceType,\n normalizeSource,\n extractNpmPackageName,\n extractName,\n buildGitPackageSpec,\n getPackageManager,\n detectPackageManager,\n getSpaceflowDir,\n ensureSpaceflowPackageJson,\n ensureEditorGitignore,\n SchemaGeneratorService,\n findConfigFileWithField,\n getSupportedEditors,\n getDependencies,\n updateDependency,\n SPACEFLOW_DIR,\n} from \"@spaceflow/core\";\n\nexport type { SourceType } from \"@spaceflow/core\";\n\n/**\n * 扩展配置项,支持字符串或对象格式\n * 字符串: \"git@xxx.git\" 或 \"@scope/package@version\" 或 \"./path\"\n * 对象: { source: \"git@xxx.git\", ref: \"v1.0.0\" }\n */\nexport type ExtensionConfig =\n | string\n | {\n source: string;\n ref?: string; // git: branch/tag/commit, npm: version\n };\n\nexport interface InstallOptions {\n source: string;\n name?: string;\n ref?: string; // 版本号/分支/tag/commit\n}\n\nexport interface InstallContext extends InstallOptions {\n type: SourceType;\n depsDir: string;\n depPath: string;\n configPath: string;\n}\n\n/**\n * MCP 导出项配置\n */\nexport interface McpExportItem {\n name: string;\n entry: string;\n mcp?: { command: string; args?: string[]; env?: string[] };\n}\n\n/**\n * 插件配置类型\n */\nexport type PluginConfig = Record<\n \"flows\" | \"commands\" | \"extensions\",\n Array<{ name: string; entry: string }>\n> & {\n mcps: McpExportItem[];\n};\n\nexport class InstallService {\n constructor(private readonly schemaGenerator: SchemaGeneratorService) {}\n\n getContext(options: InstallOptions): InstallContext {\n const cwd = process.cwd();\n const type = getSourceType(options.source);\n const name = options.name || extractName(options.source);\n const spaceflowDir = join(cwd, SPACEFLOW_DIR);\n // Extension 安装到 .spaceflow/node_modules/ 中\n // 对 npm 包使用完整包名(含 @scope/ 前缀)作为 node_modules 路径\n const depName = type === \"npm\" ? extractNpmPackageName(options.source) : name;\n const depPath = join(spaceflowDir, \"node_modules\", depName);\n const configPath = findConfigFileWithField(\"dependencies\", cwd);\n\n return {\n ...options,\n type,\n depsDir: spaceflowDir,\n depPath,\n configPath,\n };\n }\n\n /**\n * 将插件关联到各个编辑器的目录\n * pluginConfig 包含 flows/commands/extensions/mcps 四种类型\n * - flows: CLI 子命令,不需要复制到编辑器目录\n * - commands: 编辑器命令,复制到 .claude/commands/ 等目录\n * - extensions: 扩展包,复制到 .claude/skills/ 等目录\n * - mcps: MCP Server,注册到编辑器的 mcp.json 配置\n */\n protected async linkPluginToEditors(options: {\n name: string;\n depPath: string;\n pluginConfig: PluginConfig;\n cwd?: string;\n isGlobal?: boolean;\n verbose?: VerboseLevel;\n }): Promise<void> {\n const { name, depPath, pluginConfig, cwd, isGlobal = false, verbose = 1 } = options;\n const editors = getSupportedEditors(cwd);\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const workingDir = cwd || process.cwd();\n\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n const editorRoot = isGlobal ? join(home, editorDirName) : join(workingDir, editorDirName);\n\n // 处理 extensions\n if (pluginConfig.extensions.length > 0) {\n const editorExtensionsDir = join(editorRoot, \"skills\");\n await this.ensureDir(editorExtensionsDir, verbose);\n\n for (const ext of pluginConfig.extensions) {\n const extPath = ext.entry === \".\" ? depPath : join(depPath, ext.entry);\n const installName = ext.name || name;\n const targetPath = join(editorExtensionsDir, installName);\n\n await this.copyExtensionToTarget(extPath, targetPath, installName);\n\n // 将生成的扩展加入编辑器目录的 .gitignore\n await ensureEditorGitignore(editorRoot, \"skills\", installName);\n }\n }\n\n // 处理 commands(编辑器命令)\n if (pluginConfig.commands.length > 0) {\n const editorCommandsDir = join(editorRoot, \"commands\");\n await this.ensureDir(editorCommandsDir);\n\n for (const cmd of pluginConfig.commands) {\n const commandPath = cmd.entry === \".\" ? depPath : join(depPath, cmd.entry);\n const installName = cmd.name || name;\n await this.generateCommandMd(commandPath, editorCommandsDir, installName, verbose);\n\n // 将生成的 command 加入编辑器目录的 .gitignore\n await ensureEditorGitignore(editorRoot, \"commands\", installName);\n }\n }\n\n // 处理 mcps(MCP Server)\n if (pluginConfig.mcps.length > 0) {\n for (const mcpItem of pluginConfig.mcps) {\n const mcpPath = mcpItem.entry === \".\" ? depPath : join(depPath, mcpItem.entry);\n const installName = mcpItem.name || name;\n await this.registerMcpServer(editorRoot, installName, mcpPath, mcpItem.mcp, verbose);\n }\n }\n\n // flows 类型不需要复制到编辑器目录,它们是 CLI 子命令\n }\n }\n\n /**\n * 注册 MCP Server 到编辑器的 mcp.json 配置\n */\n protected async registerMcpServer(\n editorRoot: string,\n name: string,\n mcpPath: string,\n mcpConfig?: { command: string; args?: string[]; env?: string[] },\n verbose?: VerboseLevel,\n ): Promise<void> {\n const mcpJsonPath = join(editorRoot, \"mcp.json\");\n\n // 读取现有配置或创建新配置\n let config: { mcpServers?: Record<string, any> } = { mcpServers: {} };\n try {\n if (existsSync(mcpJsonPath)) {\n const content = await readFile(mcpJsonPath, \"utf-8\");\n config = JSON.parse(content);\n if (!config.mcpServers) {\n config.mcpServers = {};\n }\n }\n } catch {\n config = { mcpServers: {} };\n }\n\n // 构建 MCP Server 配置\n const command = mcpConfig?.command || \"node\";\n const args = mcpConfig?.args || [\"dist/index.js\"];\n\n // 将相对路径转换为绝对路径\n const resolvedArgs = args.map((arg) => {\n if (arg.startsWith(\"./\") || arg.startsWith(\"../\") || !arg.includes(\"/\")) {\n // 可能是相对路径,转换为绝对路径\n if (arg.endsWith(\".js\") || arg.endsWith(\".mjs\") || arg.endsWith(\".cjs\")) {\n return join(mcpPath, arg);\n }\n }\n return arg;\n });\n\n const serverConfig: Record<string, any> = {\n command,\n args: resolvedArgs,\n };\n\n // 如果有环境变量需求,添加空的 env 对象供用户填写\n if (mcpConfig?.env && mcpConfig.env.length > 0) {\n serverConfig.env = {};\n for (const envKey of mcpConfig.env) {\n serverConfig.env[envKey] = t(\"install:envPlaceholder\", { key: envKey });\n }\n }\n\n config.mcpServers![name] = serverConfig;\n\n // 确保目录存在\n await this.ensureDir(editorRoot);\n\n // 写入配置\n await writeFile(mcpJsonPath, JSON.stringify(config, null, 2), \"utf-8\");\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:registerMcp\", { name }));\n if (mcpConfig?.env && mcpConfig.env.length > 0) {\n console.log(t(\"install:mcpEnvHint\", { path: mcpJsonPath, vars: mcpConfig.env.join(\", \") }));\n }\n }\n }\n\n async execute(context: InstallContext, verbose: VerboseLevel = 1): Promise<void> {\n const { source, type, depPath } = context;\n const name = context.name || extractName(source);\n const cwd = process.cwd();\n const isGlobal = false;\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:installingExtension\", { source }));\n\n // 所有类型都通过 pnpm add 安装到 .spaceflow/node_modules/\n await this.installExtension(source, type, context.ref, isGlobal, verbose);\n\n // 读取插件配置并关联到编辑器\n const pluginConfig = await this.getPluginConfigFromPackageJson(depPath);\n await this.linkPluginToEditors({\n name,\n depPath,\n pluginConfig,\n cwd,\n isGlobal,\n verbose,\n });\n\n // 安装依赖和构建(对于本地路径的 Extension)\n if (type === \"local\") {\n const sourcePath = resolve(cwd, source);\n await this.ensureDependenciesAndBuild(sourcePath, name, verbose);\n }\n\n // 更新配置文件\n await this.updateConfigFile(context, verbose);\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:installDone\", { name }));\n\n // 自动生成 schema\n this.generateSchema();\n }\n\n /**\n * 安装 Extension 到 .spaceflow/node_modules/\n * 支持 npm 包、本地路径(link:)、git 仓库(git+)\n * @param source 源(npm 包名、本地路径、git URL)\n * @param type 源类型\n * @param ref 版本/分支/tag(可选)\n * @param isGlobal 是否安装到全局 ~/.spaceflow/\n * @param verbose 日志级别\n */\n protected async installExtension(\n source: string,\n type: SourceType,\n ref?: string,\n isGlobal: boolean = false,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const spaceflowDir = getSpaceflowDir(isGlobal);\n\n // 确保 .spaceflow 目录和 package.json 存在\n ensureSpaceflowPackageJson(spaceflowDir);\n\n // 根据类型构建 pnpm add 的参数\n let packageSpec: string;\n if (type === \"local\") {\n // 本地路径使用 link: 协议,相对于 .spaceflow 目录\n const normalizedSource = normalizeSource(source);\n // 计算相对于 .spaceflow 目录的路径\n const relativePath = join(\"..\", normalizedSource);\n packageSpec = `link:${relativePath}`;\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:typeLocal\"));\n console.log(t(\"install:sourcePath\", { path: relativePath }));\n }\n } else if (type === \"git\") {\n // git 仓库:如果已经是 git+ 格式则直接使用,否则转换\n packageSpec = source.startsWith(\"git+\") ? source : buildGitPackageSpec(source, ref);\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:typeGit\"));\n console.log(t(\"install:sourceUrl\", { url: packageSpec }));\n }\n } else {\n // npm 包直接使用包名\n packageSpec = source;\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:typeNpm\"));\n }\n }\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"install:targetDir\", { dir: spaceflowDir }));\n }\n\n const pm = detectPackageManager(spaceflowDir);\n let cmd: string;\n if (pm === \"pnpm\") {\n cmd = `pnpm add --prefix \"${spaceflowDir}\" \"${packageSpec}\"`;\n } else {\n cmd = `npm install --prefix \"${spaceflowDir}\" \"${packageSpec}\"`;\n }\n\n try {\n execSync(cmd, {\n cwd: process.cwd(),\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch (error) {\n throw new Error(t(\"install:extensionInstallFailed\", { source }));\n }\n }\n\n /**\n * 从源获取实际的包名(用于确定 node_modules 中的路径)\n * 本地路径:读取 package.json 的 name 字段\n * npm 包:直接使用包名\n * git 仓库:安装后从 node_modules 查找\n */\n protected async getPackageNameFromSource(\n source: string,\n type: SourceType,\n spaceflowDir: string,\n ): Promise<string> {\n if (type === \"local\") {\n // 本地路径:读取 package.json 的 name 字段(先规范化)\n const normalizedSource = normalizeSource(source);\n const sourcePath = resolve(process.cwd(), normalizedSource);\n const pkgJsonPath = join(sourcePath, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n try {\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.name) {\n return pkg.name;\n }\n } catch {\n // 解析失败,使用目录名\n }\n }\n // 回退到目录名\n return extractName(source);\n } else if (type === \"npm\") {\n // npm 包:直接使用包名(去除版本号)\n return extractNpmPackageName(source);\n } else {\n // git 仓库:pnpm 会将 git URL 安装为 xxx.git 格式\n // 例如: git+ssh://git@host/org/repo.git -> repo.git\n const baseName = extractName(source);\n // pnpm 安装 git 仓库时会保留 .git 后缀\n const gitName = baseName.endsWith(\".git\") ? baseName : `${baseName}.git`;\n\n // 尝试在 node_modules 中查找\n const nodeModulesPath = join(spaceflowDir, \"node_modules\");\n if (existsSync(nodeModulesPath)) {\n // 优先检查 xxx.git 格式\n if (existsSync(join(nodeModulesPath, gitName))) {\n return gitName;\n }\n // 回退检查不带 .git 的格式\n if (existsSync(join(nodeModulesPath, baseName))) {\n return baseName;\n }\n }\n return gitName;\n }\n }\n\n protected async ensureDir(dirPath: string, verbose: VerboseLevel = 1): Promise<void> {\n try {\n await access(dirPath);\n } catch {\n if (shouldLog(verbose, 1)) console.log(t(\"install:creatingDir\", { dir: dirPath }));\n await mkdir(dirPath, { recursive: true });\n }\n }\n\n /**\n * 克隆 git 仓库并移除 .git 目录\n */\n protected async cloneAndRemoveGit(\n repoUrl: string,\n targetPath: string,\n ref?: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const { rm } = await import(\"fs/promises\");\n\n // 检查目标目录是否已存在\n if (existsSync(targetPath)) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:dirExistsSkip\"));\n return;\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:cloningRepo\"));\n try {\n const cloneCmd = ref\n ? `git clone --depth 1 --branch ${ref} ${repoUrl} ${targetPath}`\n : `git clone --depth 1 ${repoUrl} ${targetPath}`;\n execSync(cloneCmd, { stdio: verbose ? \"inherit\" : \"pipe\" });\n } catch {\n // 如果 --branch 失败(可能是 commit hash),先 clone 再 checkout\n try {\n execSync(`git clone --depth 1 ${repoUrl} ${targetPath}`, {\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n if (ref) {\n execSync(`git fetch --depth 1 origin ${ref}`, {\n cwd: targetPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n execSync(`git checkout ${ref}`, { cwd: targetPath, stdio: verbose ? \"inherit\" : \"pipe\" });\n }\n } catch (error) {\n throw new Error(\n t(\"install:cloneFailed\", { error: error instanceof Error ? error.message : error }),\n );\n }\n }\n\n // 移除 .git 目录\n const gitDir = join(targetPath, \".git\");\n if (existsSync(gitDir)) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:removingGit\"));\n await rm(gitDir, { recursive: true, force: true });\n }\n }\n\n /**\n * 创建 deps 目录下的符号链接(本地路径依赖)\n */\n protected async createDepsSymlink(\n sourcePath: string,\n depPath: string,\n name: string,\n ): Promise<void> {\n // 检查目标是否已存在\n if (existsSync(depPath)) {\n try {\n const linkTarget = await readlink(depPath);\n const resolvedTarget = resolve(join(depPath, \"..\"), linkTarget);\n if (resolvedTarget === sourcePath) {\n console.log(t(\"install:depsLinkExists\"));\n return;\n }\n await unlink(depPath);\n } catch {\n console.log(t(\"install:depsExists\", { name }));\n return;\n }\n }\n\n // 计算相对路径\n const cwd = process.cwd();\n const depsDir = join(depPath, \"..\");\n const relativeSource = relative(depsDir, sourcePath);\n\n // 显示相对于 cwd 的路径\n const displayDepPath = relative(cwd, depPath);\n const displaySourcePath = relative(cwd, sourcePath);\n console.log(t(\"install:createDepsLink\", { dep: displayDepPath, source: displaySourcePath }));\n await symlink(relativeSource, depPath);\n }\n\n /**\n * 将扩展链接到 .claude/skills 目录\n */\n protected async linkExtensionToTarget(\n sourcePath: string,\n targetPath: string,\n name: string,\n ): Promise<void> {\n const { rm } = await import(\"fs/promises\");\n\n // 检查目标是否已存在\n if (existsSync(targetPath)) {\n try {\n const linkTarget = await readlink(targetPath);\n const resolvedTarget = resolve(join(targetPath, \"..\"), linkTarget);\n if (resolvedTarget === sourcePath) {\n console.log(t(\"install:extensionLinkExists\", { name }));\n return;\n }\n // 链接指向不同目标,删除后重建\n await rm(targetPath, { recursive: true, force: true });\n } catch {\n // 不是符号链接,删除后重建\n await rm(targetPath, { recursive: true, force: true });\n }\n }\n\n // 计算相对路径\n const targetDir = join(targetPath, \"..\");\n const relativeSource = relative(targetDir, sourcePath);\n\n console.log(t(\"install:createExtensionLink\", { name, target: relativeSource }));\n await symlink(relativeSource, targetPath);\n }\n\n /**\n * 将扩展复制到 .claude/skills 目录\n */\n protected async copyExtensionToTarget(\n sourcePath: string,\n targetPath: string,\n name: string,\n ): Promise<void> {\n const { rm, cp } = await import(\"fs/promises\");\n\n // 如果目标已存在,先删除\n if (existsSync(targetPath)) {\n await rm(targetPath, { recursive: true, force: true });\n }\n\n console.log(t(\"install:copyExtension\", { name }));\n await cp(sourcePath, targetPath, { recursive: true });\n }\n\n /**\n * 解析扩展配置,支持字符串和对象格式\n */\n parseExtensionConfig(config: ExtensionConfig): { source: string; ref?: string } {\n if (typeof config === \"string\") {\n return { source: config };\n }\n return { source: config.source, ref: config.ref };\n }\n\n /**\n * 获取安装根目录\n * @param isGlobal 是否全局安装\n */\n protected getInstallRoot(isGlobal: boolean): string {\n if (isGlobal) {\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n return join(home, \".spaceflow\");\n }\n return join(process.cwd(), \".spaceflow\");\n }\n\n /**\n * 全局安装单个依赖\n * 安装到 ~/.spaceflow/node_modules/\n */\n async installGlobal(options: InstallOptions, verbose: VerboseLevel = 1): Promise<void> {\n const { source, name, ref } = options;\n const spaceflowDir = getSpaceflowDir(true);\n const depName = name || extractName(source);\n\n if (shouldLog(verbose, 1))\n console.log(t(\"install:globalInstalling\", { name: depName, dir: spaceflowDir }));\n\n const sourceType = getSourceType(source);\n\n // 通过 pnpm add 安装到 ~/.spaceflow/node_modules/\n await this.installExtension(source, sourceType, ref, true, verbose);\n\n // Extension 安装后的路径\n // 对 npm 包使用完整包名(含 @scope/ 前缀)作为 node_modules 路径\n const depModuleName = sourceType === \"npm\" ? name || extractNpmPackageName(source) : depName;\n const depPath = join(spaceflowDir, \"node_modules\", depModuleName);\n\n // 读取插件配置\n const pluginConfig = await this.getPluginConfigFromPackageJson(depPath);\n\n const activeTypes = Object.entries(pluginConfig)\n .filter(([, items]) => items.length > 0)\n .map(([type]) => type);\n if (activeTypes.length > 0 && shouldLog(verbose, 1)) {\n console.log(t(\"install:pluginTypes\", { types: activeTypes.join(\", \") }));\n }\n\n // 将插件关联到各个编辑器的目录\n await this.linkPluginToEditors({\n name: depName,\n depPath,\n pluginConfig,\n cwd: process.cwd(),\n isGlobal: true,\n verbose,\n });\n\n // 对于本地路径的 Extension,需要安装依赖和构建\n if (sourceType === \"local\") {\n const sourcePath = resolve(process.cwd(), source);\n await this.ensureDependenciesAndBuild(sourcePath, depName, verbose);\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:globalInstallDone\"));\n\n // 自动生成 schema\n this.generateSchema();\n }\n\n /**\n * 检查 .spaceflowrc 中声明的依赖是否有未安装的\n */\n hasMissingExtensions(): boolean {\n const cwd = process.cwd();\n const dependencies = this.parseExtensionsFromConfig(cwd);\n const spaceflowDir = getSpaceflowDir(false);\n const globalDir = getSpaceflowDir(true);\n\n for (const name of Object.keys(dependencies)) {\n const localInstalled = existsSync(join(spaceflowDir, \"node_modules\", name, \"package.json\"));\n const globalInstalled = existsSync(join(globalDir, \"node_modules\", name, \"package.json\"));\n if (!localInstalled && !globalInstalled) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * 更新配置文件中的所有依赖\n * 先更新 .spaceflow/package.json,然后一次性安装所有依赖\n */\n async updateAllExtensions(options?: { verbose?: VerboseLevel }): Promise<void> {\n const cwd = process.cwd();\n const spaceflowDir = getSpaceflowDir(false);\n const verbose = options?.verbose ?? true;\n\n if (shouldLog(verbose, 1)) console.log(t(\"install:updatingAll\"));\n\n // 读取配置文件中的 dependencies\n const dependencies = this.parseExtensionsFromConfig(cwd);\n\n if (Object.keys(dependencies).length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:noDeps\"));\n return;\n }\n\n if (shouldLog(verbose, 1))\n console.log(t(\"install:foundDeps\", { count: Object.keys(dependencies).length }));\n\n // 1. 先更新 .spaceflow/package.json 中的所有依赖\n await this.updateSpaceflowPackageJson(dependencies, spaceflowDir, verbose);\n\n // 2. 一次性安装所有依赖\n if (shouldLog(verbose, 1)) console.log(t(\"install:installingDeps\"));\n const pm = detectPackageManager(spaceflowDir);\n try {\n execSync(`${pm} install`, { cwd: spaceflowDir, stdio: verbose ? \"inherit\" : \"pipe\" });\n } catch {\n console.warn(t(\"install:pmInstallFailed\", { pm }));\n }\n\n // 3. 处理每个依赖的 extensions/commands 关联\n for (const [name, config] of Object.entries(dependencies)) {\n const { source } = this.parseExtensionConfig(config);\n const sourceType = getSourceType(source);\n\n // 获取安装后的路径\n // workspace: 和 npm 类型时,name(.spaceflowrc 的 key)就是包名\n const packageName =\n source.startsWith(\"workspace:\") || sourceType === \"npm\"\n ? name\n : await this.getPackageNameFromSource(source, sourceType, spaceflowDir);\n const depPath = join(spaceflowDir, \"node_modules\", packageName);\n\n if (!existsSync(depPath)) {\n console.warn(t(\"install:depNotInstalled\", { name }));\n continue;\n }\n\n // 读取插件配置并关联到编辑器\n const pluginConfig = await this.getPluginConfigFromPackageJson(depPath);\n const activeTypes = Object.entries(pluginConfig)\n .filter(([, items]) => items.length > 0)\n .map(([type]) => type);\n\n if (activeTypes.length > 0) {\n if (shouldLog(verbose, 1)) console.log(`\\n📦 ${name}: ${activeTypes.join(\", \")}`);\n await this.linkPluginToEditors({\n name,\n depPath,\n pluginConfig,\n cwd,\n isGlobal: false,\n verbose,\n });\n }\n\n // 对于本地路径的 Extension,需要构建(workspace: 类型不需要,已在 workspace 中构建)\n if (sourceType === \"local\" && !source.startsWith(\"workspace:\")) {\n const normalizedSource = normalizeSource(source);\n const sourcePath = resolve(cwd, normalizedSource);\n await this.ensureDependenciesAndBuild(sourcePath, name, verbose);\n }\n }\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(t(\"install:allExtensionsDone\"));\n }\n\n // 自动生成 schema\n this.generateSchema();\n }\n\n /**\n * 更新 .spaceflow/package.json 中的依赖\n */\n protected async updateSpaceflowPackageJson(\n dependencies: Record<string, ExtensionConfig>,\n spaceflowDir: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n // 确保目录和 package.json 存在\n ensureSpaceflowPackageJson(spaceflowDir);\n\n const packageJsonPath = join(spaceflowDir, \"package.json\");\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n if (!pkg.dependencies) {\n pkg.dependencies = {};\n }\n\n let updated = false;\n for (const [name, config] of Object.entries(dependencies)) {\n const { source, ref } = this.parseExtensionConfig(config);\n const sourceType = getSourceType(source);\n\n let packageSpec: string;\n let packageName: string;\n\n if (source.startsWith(\"workspace:\")) {\n // workspace 协议:直接透传\n packageName = name;\n packageSpec = source;\n } else if (sourceType === \"local\") {\n const normalizedSource = normalizeSource(source);\n const relativePath = join(\"..\", normalizedSource);\n packageSpec = `link:${relativePath}`;\n packageName = await this.getPackageNameFromSource(source, sourceType, spaceflowDir);\n } else if (sourceType === \"git\") {\n packageSpec = source.startsWith(\"git+\") ? source : buildGitPackageSpec(source, ref);\n packageName = await this.getPackageNameFromSource(source, sourceType, spaceflowDir);\n } else {\n // npm 类型:.spaceflowrc 中 key 是包名,value 是版本范围(如 \"^0.37.0\")\n packageName = name;\n packageSpec = source;\n }\n\n if (pkg.dependencies[packageName] !== packageSpec) {\n pkg.dependencies[packageName] = packageSpec;\n updated = true;\n if (shouldLog(verbose, 2)) console.log(` + ${packageName}: ${packageSpec}`);\n }\n }\n\n if (updated) {\n await writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n if (shouldLog(verbose, 1)) console.log(t(\"install:updatedPackageJson\"));\n }\n }\n\n /**\n * 从配置文件解析扩展\n */\n protected parseExtensionsFromConfig(cwd?: string): Record<string, ExtensionConfig> {\n return getDependencies(cwd);\n }\n\n /**\n * 获取 git 仓库当前的 ref (commit hash 或 tag)\n */\n protected async getCurrentGitRef(extPath: string): Promise<string | null> {\n if (!existsSync(extPath)) {\n return null;\n }\n try {\n const result = execSync(\"git rev-parse HEAD\", {\n cwd: extPath,\n encoding: \"utf-8\",\n }).trim();\n return result.substring(0, 7); // 短 hash\n } catch {\n return null;\n }\n }\n\n /**\n * 检查 ref 是否匹配(支持 tag、branch、commit)\n */\n protected async isRefMatch(\n extPath: string,\n targetRef: string,\n currentCommit: string | null,\n ): Promise<boolean> {\n if (!currentCommit) return false;\n\n try {\n // 检查 targetRef 是否是 tag 或 branch,获取其对应的 commit\n const targetCommit = execSync(`git rev-parse ${targetRef}`, {\n cwd: extPath,\n encoding: \"utf-8\",\n }).trim();\n\n // 比较 commit hash(前7位)\n return (\n targetCommit.startsWith(currentCommit) ||\n currentCommit.startsWith(targetCommit.substring(0, 7))\n );\n } catch {\n return false;\n }\n }\n\n /**\n * 创建符号链接(使用绝对路径,用于全局安装)\n */\n protected async createSymlinkAbsolute(\n source: string,\n target: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n try {\n const existingTarget = await readlink(target);\n if (existingTarget === source) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:symlinkExists\"));\n return;\n }\n await unlink(target);\n } catch {\n // 链接不存在,继续创建\n }\n\n try {\n await symlink(source, target);\n if (shouldLog(verbose, 1)) console.log(t(\"install:createSymlink\", { target, source }));\n } catch (error) {\n throw new Error(\n t(\"install:createSymlinkFailed\", { error: error instanceof Error ? error.message : error }),\n );\n }\n }\n\n /**\n * 检查 ref 是否是分支\n */\n protected async isBranchRef(extPath: string, ref: string): Promise<boolean> {\n if (!existsSync(extPath)) {\n return false;\n }\n try {\n // 检查是否是远程分支\n const result = execSync(`git branch -r --list \"origin/${ref}\"`, {\n cwd: extPath,\n encoding: \"utf-8\",\n }).trim();\n return result.length > 0;\n } catch {\n return false;\n }\n }\n\n /**\n * 拉取最新代码\n */\n protected async pullLatest(extPath: string, verbose: VerboseLevel = 1): Promise<void> {\n try {\n execSync(\"git pull\", {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:pullFailed\"));\n }\n }\n\n /**\n * 切换到指定的 git ref\n */\n protected async checkoutGitRef(\n extPath: string,\n ref: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n try {\n if (shouldLog(verbose, 1)) console.log(t(\"install:checkoutVersion\", { ref }));\n // 先 fetch 确保有最新的 refs\n execSync(\"git fetch --all --tags\", {\n cwd: extPath,\n stdio: \"pipe\",\n });\n // checkout 到指定 ref\n execSync(`git checkout ${ref}`, {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:checkoutFailed\"));\n }\n }\n\n /**\n * 检查依赖和构建(仅在需要时执行)\n * 用于版本已匹配的情况,只检查 dist 是否存在\n */\n protected async ensureDependenciesAndBuildIfNeeded(\n extPath: string,\n _name: string,\n ): Promise<void> {\n const pkgJsonPath = join(extPath, \"package.json\");\n\n // 检查是否有 package.json(命令型插件)\n if (!existsSync(pkgJsonPath)) {\n return;\n }\n\n const distIndexPath = join(extPath, \"dist\", \"index.js\");\n const nodeModulesPath = join(extPath, \"node_modules\");\n\n // 检查 node_modules 是否存在\n if (!existsSync(nodeModulesPath)) {\n console.log(t(\"install:installingDepsEllipsis\"));\n try {\n execSync(`${this.getPackageManager()} install`, {\n cwd: extPath,\n stdio: \"inherit\",\n });\n } catch {\n console.warn(t(\"install:depsInstallFailed\"));\n return;\n }\n } else {\n console.log(t(\"install:depsInstalled\"));\n }\n\n // 检查 dist 是否存在\n if (!existsSync(distIndexPath)) {\n console.log(t(\"install:buildingPlugin\"));\n try {\n execSync(\"pnpm build\", {\n cwd: extPath,\n stdio: \"inherit\",\n });\n } catch {\n console.warn(t(\"install:buildFailed\"));\n }\n } else {\n console.log(t(\"install:buildExists\"));\n }\n }\n\n /**\n * 克隆或更新 git 仓库(用于全局安装)\n */\n protected async cloneOrUpdateRepo(\n source: string,\n depPath: string,\n ref?: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const gitDir = join(depPath, \".git\");\n\n if (existsSync(gitDir)) {\n // 仓库已存在,更新\n if (shouldLog(verbose, 1)) console.log(t(\"install:repoExists\"));\n try {\n execSync(\"git fetch --all\", { cwd: depPath, stdio: verbose ? \"inherit\" : \"pipe\" });\n if (ref) {\n const isBranch = await this.isBranchRef(depPath, ref);\n if (isBranch) {\n await this.checkoutGitRef(depPath, ref, verbose);\n await this.pullLatest(depPath, verbose);\n } else {\n await this.checkoutGitRef(depPath, ref, verbose);\n }\n } else {\n execSync(\"git pull\", { cwd: depPath, stdio: verbose ? \"inherit\" : \"pipe\" });\n }\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:repoUpdateFailed\"));\n }\n } else {\n // 仓库不存在,克隆\n if (shouldLog(verbose, 1)) console.log(t(\"install:cloningRepo\"));\n try {\n const cloneCmd = ref\n ? `git clone --branch ${ref} ${source} ${depPath}`\n : `git clone ${source} ${depPath}`;\n execSync(cloneCmd, { stdio: verbose ? \"inherit\" : \"pipe\" });\n } catch {\n // 如果 --branch 失败(可能是 commit hash),先 clone 再 checkout\n try {\n execSync(`git clone ${source} ${depPath}`, { stdio: verbose ? \"inherit\" : \"pipe\" });\n if (ref) {\n await this.checkoutGitRef(depPath, ref, verbose);\n }\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:cloneRepoFailed\"));\n }\n }\n }\n }\n\n /**\n * 从 package.json 读取插件配置\n * 返回 { flows: [], commands: [], extensions: [], mcps: [] } 格式的导出映射\n */\n protected async getPluginConfigFromPackageJson(extPath: string): Promise<PluginConfig> {\n const createEmptyConfig = (): PluginConfig => ({\n flows: [],\n commands: [],\n extensions: [],\n mcps: [],\n });\n const createDefaultExtension = (name = \"\"): PluginConfig => ({\n flows: [],\n commands: [],\n extensions: [{ name, entry: \".\" }],\n mcps: [],\n });\n\n const addExport = (\n config: PluginConfig,\n type: string,\n name: string,\n entry: string,\n mcp?: { command: string; args?: string[]; env?: string[] },\n ) => {\n if (type === \"flow\") config.flows.push({ name, entry });\n else if (type === \"command\") config.commands.push({ name, entry });\n else if (type === \"extension\") config.extensions.push({ name, entry });\n else if (type === \"mcp\") config.mcps.push({ name, entry, mcp });\n };\n\n const pkgJsonPath = join(extPath, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n return createDefaultExtension();\n }\n\n try {\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const spaceflowConfig = pkg.spaceflow;\n\n if (!spaceflowConfig) {\n return createDefaultExtension(pkg.name);\n }\n\n const config = createEmptyConfig();\n\n // 完整格式:exports 对象\n if (spaceflowConfig.exports) {\n for (const [name, exp] of Object.entries(spaceflowConfig.exports)) {\n const {\n type = \"flow\",\n entry = \".\",\n mcp,\n } = exp as { type?: string; entry?: string; mcp?: any };\n addExport(config, type, name, entry, mcp);\n }\n return config;\n }\n\n // 简化格式:type/entry\n if (spaceflowConfig.entry) {\n addExport(\n config,\n spaceflowConfig.type || \"flow\",\n pkg.name || \"\",\n spaceflowConfig.entry,\n spaceflowConfig.mcp,\n );\n return config;\n }\n\n return createDefaultExtension(pkg.name);\n } catch {\n return createDefaultExtension();\n }\n }\n\n /**\n * 获取包管理器\n * 必须同时满足:命令可用 AND lock 文件存在\n */\n protected getPackageManager(): string {\n const cwd = process.cwd();\n\n // pnpm: 命令可用 + pnpm-lock.yaml 存在\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n // pnpm 命令不可用,继续检测其他\n }\n }\n\n // yarn: 命令可用 + yarn.lock 存在\n if (existsSync(join(cwd, \"yarn.lock\"))) {\n try {\n execSync(\"yarn --version\", { stdio: \"ignore\" });\n return \"yarn\";\n } catch {\n // yarn 命令不可用,继续检测其他\n }\n }\n\n // npm: 命令可用 + package-lock.json 存在\n if (existsSync(join(cwd, \"package-lock.json\"))) {\n try {\n execSync(\"npm --version\", { stdio: \"ignore\" });\n return \"npm\";\n } catch {\n // npm 命令不可用\n }\n }\n\n // 默认回退到 npm\n return \"npm\";\n }\n\n /**\n * 检测当前目录是否为 pnpm workspace\n */\n protected isPnpmWorkspace(): boolean {\n const cwd = process.cwd();\n return existsSync(join(cwd, \"pnpm-workspace.yaml\"));\n }\n\n /**\n * 生成 EXTENSION.md 文件\n * 解析 README.md 和 package.json,生成标准化的 EXTENSION.md\n */\n protected async generateExtensionMd(extPath: string, name: string): Promise<void> {\n const extensionMdPath = join(extPath, \"EXTENSION.md\");\n\n // 如果已存在 EXTENSION.md,跳过\n if (existsSync(extensionMdPath)) {\n console.log(t(\"install:extensionMdExists\"));\n return;\n }\n\n let content = \"\";\n let pkgName = name;\n let pkgDescription = \"\";\n\n // 读取 package.json\n const pkgJsonPath = join(extPath, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n try {\n const pkgContent = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n pkgName = pkg.name || name;\n pkgDescription = pkg.description || \"\";\n } catch {\n // 解析失败,使用默认值\n }\n }\n\n // 读取 README.md(支持大小写)\n let readmeContent = \"\";\n const readmePaths = [\n join(extPath, \"README.md\"),\n join(extPath, \"readme.md\"),\n join(extPath, \"Readme.md\"),\n ];\n for (const readmePath of readmePaths) {\n if (existsSync(readmePath)) {\n try {\n readmeContent = await readFile(readmePath, \"utf-8\");\n break;\n } catch {\n // 读取失败,继续尝试\n }\n }\n }\n\n // 生成 EXTENSION.md 内容\n content = `# ${pkgName}\\n\\n`;\n\n if (pkgDescription) {\n content += `${pkgDescription}\\n\\n`;\n }\n\n if (readmeContent) {\n // 移除 README 中的标题(如果和 name 相同)\n const lines = readmeContent.split(\"\\n\");\n const firstLine = lines[0]?.trim();\n if (firstLine?.startsWith(\"#\") && firstLine.includes(name)) {\n readmeContent = lines.slice(1).join(\"\\n\").trim();\n }\n\n if (readmeContent) {\n content += `## ${t(\"install:detailSection\")}\\n\\n${readmeContent}\\n`;\n }\n }\n\n // 写入 EXTENSION.md\n try {\n await writeFile(extensionMdPath, content);\n console.log(t(\"install:extensionMdGenerated\"));\n } catch {\n console.warn(t(\"install:extensionMdFailed\"));\n }\n }\n\n /**\n * 生成 command 文档到 .claude/commands/xxx.md\n * 格式遵循 Claude Code 的 slash commands 规范\n */\n protected async generateCommandMd(\n commandPath: string,\n commandsDir: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const commandMdPath = join(commandsDir, `${name}.md`);\n\n let pkgName = name;\n let pkgDescription = \"\";\n\n // 读取 package.json\n const cmdPkgJsonPath = join(commandPath, \"package.json\");\n if (existsSync(cmdPkgJsonPath)) {\n try {\n const pkgContent = await readFile(cmdPkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n pkgName = pkg.name?.replace(/^@[^/]+\\//, \"\") || name;\n pkgDescription = pkg.description || \"\";\n } catch {\n // 解析失败,使用默认值\n }\n }\n\n // 读取 README.md\n let readmeContent = \"\";\n const readmePaths = [\n join(commandPath, \"README.md\"),\n join(commandPath, \"readme.md\"),\n join(commandPath, \"Readme.md\"),\n ];\n for (const readmePath of readmePaths) {\n if (existsSync(readmePath)) {\n try {\n readmeContent = await readFile(readmePath, \"utf-8\");\n break;\n } catch {\n // 读取失败,继续尝试\n }\n }\n }\n\n // 获取命令的 help 内容\n let helpContent = \"\";\n try {\n helpContent = execSync(`pnpm spaceflow ${name} --help 2>/dev/null`, {\n cwd: process.cwd(),\n encoding: \"utf-8\",\n timeout: 10000,\n }).trim();\n // 移除 \"📦 已加载 x 个插件\" 这行\n helpContent = helpContent\n .split(\"\\n\")\n .filter((line) => !line.includes(\"已加载\") && !line.includes(\"插件\"))\n .join(\"\\n\")\n .trim();\n } catch {\n // 获取 help 失败,忽略\n }\n\n // 生成 command md 内容(遵循 Claude Code 规范)\n let content = `---\nname: ${name}\ndescription: ${pkgDescription || t(\"install:commandDefault\", { name })}\n---\n\n# ${pkgName}\n\n`;\n\n if (pkgDescription) {\n content += `${pkgDescription}\\n\\n`;\n }\n\n // 添加 help 内容\n if (helpContent) {\n helpContent = helpContent.replace(/^Usage: cli/, \"Usage: spaceflow\");\n content += `## ${t(\"install:usageSection\")}\\n\\n\\`\\`\\`\\n${helpContent}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (readmeContent) {\n // 移除 README 中的标题(如果和 name 相同)\n const lines = readmeContent.split(\"\\n\");\n const firstLine = lines[0]?.trim();\n if (firstLine?.startsWith(\"#\") && firstLine.includes(name)) {\n readmeContent = lines.slice(1).join(\"\\n\").trim();\n }\n\n if (readmeContent) {\n content += `## ${t(\"install:detailSection\")}\\n\\n${readmeContent}\\n`;\n }\n }\n\n // 写入 command md\n try {\n await writeFile(commandMdPath, content);\n if (shouldLog(verbose, 1)) console.log(t(\"install:commandMdGenerated\", { name }));\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:commandMdFailed\", { name }));\n }\n }\n\n protected async updateConfigFile(\n context: InstallContext,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const { source, type, depPath } = context;\n // dependencies key 使用完整包名(npm 类型保留 @scope/ 前缀)\n const name =\n context.name || (type === \"npm\" ? extractNpmPackageName(source) : extractName(source));\n const cwd = process.cwd();\n\n // 根据类型生成正确的 value(和 package.json 格式一致)\n let depValue: string;\n if (type === \"npm\") {\n // npm 类型:从已安装包的 package.json 读取实际版本号\n const pkgJsonPath = join(depPath, \"package.json\");\n try {\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n depValue = pkg.version ? `^${pkg.version}` : source;\n } catch {\n depValue = source;\n }\n } else if (type === \"local\") {\n // local 类型:写入 link: 格式\n depValue = source.startsWith(\"link:\") ? source : `link:${normalizeSource(source)}`;\n } else {\n // git 类型:写入 git URL\n depValue = source.startsWith(\"git+\") ? source : buildGitPackageSpec(source, context.ref);\n }\n\n const updated = updateDependency(name, depValue, cwd);\n\n if (updated) {\n if (shouldLog(verbose, 1))\n console.log(\n t(\"install:configUpdated\", { path: findConfigFileWithField(\"dependencies\", cwd) }),\n );\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"install:configAlreadyExists\"));\n }\n }\n\n /**\n * 确保依赖已安装且 dist 是最新的\n */\n protected async ensureDependenciesAndBuild(\n extPath: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const pkgJsonPath = join(extPath, \"package.json\");\n\n // 检查是否有 package.json(命令型插件)\n if (!existsSync(pkgJsonPath)) {\n // 资源型插件,无需处理\n return;\n }\n\n // 检查依赖是否已安装\n const nodeModulesPath = join(extPath, \"node_modules\");\n const needInstall = await this.needsInstallDependencies(extPath, nodeModulesPath);\n\n if (needInstall) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:installingDepsEllipsis\"));\n try {\n execSync(`${getPackageManager()} install`, {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:depsInstallFailed\"));\n return;\n }\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"install:depsUpToDate\"));\n }\n\n // 检查是否需要构建\n const needBuild = await this.needsBuild(extPath);\n\n if (needBuild) {\n if (shouldLog(verbose, 1)) console.log(t(\"install:buildingPlugin\"));\n try {\n execSync(\"pnpm build\", {\n cwd: extPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"install:buildFailed\"));\n }\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"install:buildUpToDate\"));\n }\n }\n\n /**\n * 检查是否需要安装依赖\n * 比较 package.json 和 node_modules 的修改时间\n */\n protected async needsInstallDependencies(\n extPath: string,\n nodeModulesPath: string,\n ): Promise<boolean> {\n // 如果 node_modules 不存在,需要安装\n if (!existsSync(nodeModulesPath)) {\n return true;\n }\n\n try {\n const pkgJsonPath = join(extPath, \"package.json\");\n const lockfilePath = join(extPath, \"pnpm-lock.yaml\");\n\n const nodeModulesStat = await stat(nodeModulesPath);\n const pkgJsonStat = await stat(pkgJsonPath);\n\n // 如果 package.json 比 node_modules 新,需要安装\n if (pkgJsonStat.mtime > nodeModulesStat.mtime) {\n return true;\n }\n\n // 如果有 lockfile 且比 node_modules 新,需要安装\n if (existsSync(lockfilePath)) {\n const lockfileStat = await stat(lockfilePath);\n if (lockfileStat.mtime > nodeModulesStat.mtime) {\n return true;\n }\n }\n\n return false;\n } catch {\n return true;\n }\n }\n\n /**\n * 检查是否需要构建\n * 比较 src 目录和 dist 目录的修改时间\n */\n protected async needsBuild(extPath: string): Promise<boolean> {\n const srcPath = join(extPath, \"src\");\n const distPath = join(extPath, \"dist\");\n const distIndexPath = join(distPath, \"index.js\");\n\n // 如果没有 src 目录,不需要构建\n if (!existsSync(srcPath)) {\n return false;\n }\n\n // 如果 dist/index.js 不存在,需要构建\n if (!existsSync(distIndexPath)) {\n return true;\n }\n\n try {\n const distStat = await stat(distIndexPath);\n const srcMtime = await this.getLatestMtime(srcPath);\n\n // 如果 src 中有文件比 dist 新,需要构建\n return srcMtime > distStat.mtime;\n } catch {\n return true;\n }\n }\n\n /**\n * 递归获取目录中最新的修改时间\n */\n protected async getLatestMtime(dirPath: string): Promise<Date> {\n const { readdir } = await import(\"fs/promises\");\n let latestMtime = new Date(0);\n\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n const subMtime = await this.getLatestMtime(entryPath);\n if (subMtime > latestMtime) {\n latestMtime = subMtime;\n }\n } else {\n const entryStat = await stat(entryPath);\n if (entryStat.mtime > latestMtime) {\n latestMtime = entryStat.mtime;\n }\n }\n }\n\n return latestMtime;\n }\n\n /**\n * 生成 JSON Schema\n */\n protected generateSchema(): void {\n this.schemaGenerator.generate();\n }\n}\n","import { defineExtension, SchemaGeneratorService, type VerboseLevel } from \"@spaceflow/core\";\nimport { InstallService } from \"./install.service\";\n\n/**\n * Install 命令扩展\n */\nexport const installExtension = defineExtension({\n name: \"install\",\n version: \"1.0.0\",\n description: \"安装 Extension\",\n commands: [\n {\n name: \"install\",\n description: \"安装 Extension(无参数时安装配置文件中的所有依赖)\",\n aliases: [\"i\"],\n arguments: \"[source]\",\n options: [\n {\n flags: \"-n, --name <name>\",\n description: \"指定安装名称\",\n },\n {\n flags: \"-r, --ref <ref>\",\n description: \"指定版本/分支/tag\",\n },\n {\n flags: \"-g, --global\",\n description: \"全局安装\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const source = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const schemaGenerator = new SchemaGeneratorService();\n const installService = new InstallService(schemaGenerator);\n // 无参数时,安装配置文件中的所有依赖\n if (!source) {\n if (options?.global) {\n ctx.output.error(\"全局安装需要指定 source 参数\");\n process.exit(1);\n }\n await installService.updateAllExtensions({ verbose });\n return;\n }\n const installOptions = {\n source,\n name: options?.name as string,\n ref: options?.ref as string,\n };\n if (options?.global) {\n await installService.installGlobal(installOptions, verbose);\n } else {\n const context = installService.getContext(installOptions);\n await installService.execute(context, verbose);\n }\n },\n },\n ],\n});\n\nexport * from \"./install.service\";\n","import { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\nimport {\n shouldLog,\n type VerboseLevel,\n getEditorDirName,\n getSourceType,\n normalizeSource,\n getDependencies,\n getSupportedEditors,\n t,\n} from \"@spaceflow/core\";\n\ninterface ExtensionListInfo {\n name: string;\n source: string;\n type: \"npm\" | \"git\" | \"local\";\n commands: string[];\n installed: boolean;\n}\n\nexport class ListService {\n constructor(private readonly extensionLoader: ExtensionLoader) {}\n\n /**\n * 执行列表展示\n */\n async execute(verbose: VerboseLevel = 1): Promise<void> {\n const cwd = process.cwd();\n\n // 读取合并后的 dependencies(支持 .spaceflowrc、.spaceflow/spaceflow.json 等所有配置源)\n const dependencies = getDependencies(cwd);\n\n if (Object.keys(dependencies).length === 0) {\n if (shouldLog(verbose, 1)) {\n console.log(t(\"list:noSkills\"));\n console.log(\"\");\n console.log(t(\"list:installHint\"));\n console.log(\" spaceflow install <npm-package>\");\n console.log(\" spaceflow install <git-url> --name <name>\");\n }\n return;\n }\n\n const editors = getSupportedEditors(cwd);\n // 收集所有外部扩展信息\n const extensionInfos: ExtensionListInfo[] = [];\n for (const [name, source] of Object.entries(dependencies) as [string, string][]) {\n const type = getSourceType(source);\n const installed = await this.checkInstalled(name, source, type, editors);\n extensionInfos.push({ name, source, type, installed, commands: [] });\n }\n if (!shouldLog(verbose, 1)) return;\n // 计算最大名称宽度用于对齐\n const maxNameLen = Math.max(...extensionInfos.map((e) => e.name.length), 10);\n const installedCount = extensionInfos.filter((e) => e.installed).length;\n console.log(\n t(\"list:installedExtensions\", { installed: installedCount, total: extensionInfos.length }) +\n \"\\n\",\n );\n for (const ext of extensionInfos) {\n const icon = ext.installed ? \"\\x1b[32m✔\\x1b[0m\" : \"\\x1b[33m○\\x1b[0m\";\n const typeLabel =\n ext.type === \"local\"\n ? \"\\x1b[36mlocal\\x1b[0m\"\n : ext.type === \"npm\"\n ? \"\\x1b[35mnpm\\x1b[0m\"\n : \"\\x1b[33mgit\\x1b[0m\";\n const displaySource = this.getDisplaySource(ext.source, ext.type);\n console.log(` ${icon} ${ext.name.padEnd(maxNameLen + 2)} ${typeLabel} ${displaySource}`);\n // 显示命令列表\n if (ext.commands.length > 0) {\n console.log(\n ` ${\"\".padEnd(maxNameLen)} ${t(\"list:commands\", { commands: ext.commands.join(\", \") })}`,\n );\n }\n }\n console.log(\"\");\n }\n\n /**\n * 获取用于展示的 source 字符串\n */\n private getDisplaySource(source: string, type: \"npm\" | \"git\" | \"local\"): string {\n if (type === \"local\") {\n return normalizeSource(source);\n }\n if (type === \"git\") {\n // 简化 git URL 展示\n const match = source.match(/[/:](\\w+\\/[\\w.-]+?)(?:\\.git)?$/);\n return match ? match[1] : source;\n }\n return source;\n }\n\n /**\n * 检查是否已安装\n */\n private async checkInstalled(\n name: string,\n source: string,\n type: \"npm\" | \"git\" | \"local\",\n editors: string[],\n ): Promise<boolean> {\n const cwd = process.cwd();\n if (type === \"local\") {\n const localPath = join(cwd, normalizeSource(source));\n return existsSync(localPath);\n } else if (type === \"npm\") {\n try {\n require.resolve(source);\n return true;\n } catch {\n return false;\n }\n } else {\n const possiblePaths = [join(cwd, \"skills\", name)];\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n possiblePaths.push(join(cwd, editorDirName, \"skills\", name));\n possiblePaths.push(join(cwd, editorDirName, \"commands\", name));\n }\n return possiblePaths.some((p) => existsSync(p));\n }\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { ListService } from \"./list.service\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\n\n/**\n * List 命令扩展\n */\nexport const listExtension = defineExtension({\n name: \"list\",\n version: \"1.0.0\",\n description: \"列出已安装的 Extension\",\n commands: [\n {\n name: \"list\",\n description: \"列出已安装的 Extension\",\n aliases: [\"ls\"],\n options: [\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const extensionLoader = ctx.getService<ExtensionLoader>(\"extensionLoader\");\n const listService = new ListService(extensionLoader);\n await listService.execute(verbose);\n },\n },\n ],\n});\n\nexport * from \"./list.service\";\n","import { t } from \"@spaceflow/core\";\nimport type { VerboseLevel, McpResourceDefinition, SpaceflowContext } from \"@spaceflow/core\";\nimport { shouldLog, type McpToolMetadata } from \"@spaceflow/core\";\nimport { readConfigSync } from \"@spaceflow/shared\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { spawn } from \"child_process\";\n\n/** 内部 resource 收集结构 */\ninterface CollectedResource {\n resource: McpResourceDefinition;\n ctx: SpaceflowContext;\n}\n\nexport class McpService {\n constructor(private readonly extensionLoader: ExtensionLoader) {}\n\n /**\n * 启动 MCP Server\n * 收集所有扩展的 MCP 工具并启动服务\n */\n async startServer(verbose?: VerboseLevel, inspector?: boolean): Promise<void> {\n // 如果启用 inspector 模式,使用 npx 启动 inspector\n if (inspector) {\n await this.startWithInspector();\n return;\n }\n if (shouldLog(verbose, 1)) {\n const cwd = this.extensionLoader.cwd;\n console.error(t(\"mcp:cwdInfo\", { cwd }));\n console.error(t(\"mcp:scanning\"));\n }\n\n const extensions = this.extensionLoader.getExtensions();\n const extensionTools = this.extensionLoader.getTools();\n\n if (shouldLog(verbose, 2)) {\n console.error(t(\"mcp:foundExtensions\", { count: extensions.length }));\n }\n\n const allTools: Array<{ tool: McpToolMetadata; handler: any; ctx: any }> = [];\n for (const { extensionName, tools } of extensionTools) {\n if (shouldLog(verbose, 2)) {\n console.error(` 扩展 ${extensionName} 提供 ${tools.length} 个 MCP 工具`);\n }\n for (const tool of tools) {\n if (shouldLog(verbose, 3)) {\n console.error(` - ${tool.name}: ${tool.description}`);\n }\n allTools.push({\n tool: {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema\n ? (this.zodToJsonSchema(tool.inputSchema) as any)\n : undefined,\n methodName: \"handler\",\n },\n handler: tool.handler,\n ctx: this.extensionLoader.getContext(),\n });\n }\n }\n\n // 收集扩展 resources + 内置 resources\n const allResources = this.collectResources(verbose);\n\n if (allTools.length === 0 && allResources.length === 0) {\n console.error(t(\"mcp:noToolsFound\"));\n console.error(t(\"mcp:noToolsHint\"));\n process.exit(1);\n }\n\n if (shouldLog(verbose, 1)) {\n if (allTools.length > 0) {\n console.error(t(\"mcp:toolsFound\", { count: allTools.length }));\n for (const { tool } of allTools) {\n console.error(` - ${tool.name}`);\n }\n }\n if (allResources.length > 0) {\n console.error(t(\"mcp:resourcesFound\", { count: allResources.length }));\n for (const { resource } of allResources) {\n console.error(` - ${resource.name} (${resource.uri})`);\n }\n }\n }\n\n // 如果 stdin 是 TTY(用户手动在终端运行),只打印信息不阻塞\n if (process.stdin.isTTY) {\n console.error(\"\");\n console.error(t(\"mcp:ttyHint\"));\n return;\n }\n\n // 被 MCP 客户端通过管道调用,正常启动 stdio server\n await this.runServer(allTools, allResources, verbose);\n }\n\n /**\n * 收集所有 MCP 资源(扩展 + 内置)\n */\n private collectResources(verbose?: VerboseLevel): CollectedResource[] {\n const ctx = this.extensionLoader.getContext();\n const allResources: CollectedResource[] = [];\n\n // 1. 收集扩展声明的 resources\n const extensionResources = this.extensionLoader.getResources();\n for (const { extensionName, resources } of extensionResources) {\n if (shouldLog(verbose, 2)) {\n console.error(` 扩展 ${extensionName} 提供 ${resources.length} 个 MCP 资源`);\n }\n for (const resource of resources) {\n allResources.push({ resource, ctx });\n }\n }\n\n // 2. 内置资源:项目配置(过滤敏感字段)\n allResources.push({\n resource: {\n name: \"spaceflow-config\",\n uri: \"spaceflow://config\",\n title: \"Spaceflow Configuration\",\n description: \"当前项目的 Spaceflow 配置(已过滤敏感字段)\",\n mimeType: \"application/json\",\n handler: async (_uri, ctx) => {\n const config = readConfigSync(ctx.cwd);\n return JSON.stringify(this.sanitizeConfig(config), null, 2);\n },\n },\n ctx,\n });\n\n // 3. 内置资源:扩展列表\n allResources.push({\n resource: {\n name: \"spaceflow-extensions\",\n uri: \"spaceflow://extensions\",\n title: \"Installed Extensions\",\n description: \"当前项目已安装的 Spaceflow 扩展及其工具/资源\",\n mimeType: \"application/json\",\n handler: async () => {\n const extensions = this.extensionLoader.getExtensions();\n const summary = extensions.map((ext) => ({\n name: ext.name,\n version: ext.version,\n description: ext.description,\n commands: ext.commands.map((c) => c.name),\n tools: (ext.tools || []).map((t) => ({ name: t.name, description: t.description })),\n resources: (ext.resources || []).map((r) => ({\n name: r.name,\n uri: r.uri,\n description: r.description,\n })),\n }));\n return JSON.stringify(summary, null, 2);\n },\n },\n ctx,\n });\n\n return allResources;\n }\n\n /**\n * 过滤配置中的敏感字段\n */\n private sanitizeConfig(config: Record<string, any>): Record<string, any> {\n const sensitiveKeys = [\"token\", \"apiKey\", \"appSecret\", \"authToken\", \"apikey\", \"secret\"];\n const sanitize = (obj: any): any => {\n if (obj === null || obj === undefined || typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(sanitize);\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (sensitiveKeys.some((sk) => key.toLowerCase().includes(sk.toLowerCase()))) {\n result[key] = value ? \"***\" : \"\";\n } else {\n result[key] = sanitize(value);\n }\n }\n return result;\n };\n return sanitize(config);\n }\n\n /**\n * 运行 MCP Server\n */\n private async runServer(\n allTools: Array<{ tool: McpToolMetadata; handler: any; ctx: any }>,\n allResources: CollectedResource[],\n verbose?: VerboseLevel,\n ): Promise<void> {\n const server = new McpServer({ name: \"spaceflow\", version: \"1.0.0\" });\n\n // 注册所有工具(使用 v2 API: server.registerTool)\n for (const { tool, handler, ctx } of allTools) {\n // 将 JSON Schema 转换为 Zod schema\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: Object.keys(schema).length > 0 ? z.object(schema) : z.object({}),\n },\n async (args: any) => {\n try {\n const result = await handler(args || {}, ctx);\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n },\n );\n }\n\n // 注册所有资源(使用 v2 API: server.registerResource)\n for (const { resource, ctx } of allResources) {\n server.registerResource(\n resource.name,\n resource.uri,\n {\n title: resource.title,\n description: resource.description,\n mimeType: resource.mimeType || \"application/json\",\n },\n async (uri) => {\n try {\n const text = await resource.handler(uri.href, ctx);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: resource.mimeType || \"application/json\",\n text,\n },\n ],\n };\n } catch (error) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"text/plain\",\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n };\n }\n },\n );\n }\n\n // 启动 stdio 传输\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n if (shouldLog(verbose, 1)) {\n console.error(t(\"mcp:serverStarted\", { count: allTools.length }));\n }\n\n // 保持进程运行\n await new Promise<void>((resolve) => {\n process.stdin.on(\"close\", resolve);\n process.on(\"SIGINT\", resolve);\n process.on(\"SIGTERM\", resolve);\n });\n }\n\n /**\n * 使用 MCP Inspector 启动\n */\n private async startWithInspector(): Promise<void> {\n const args = process.argv.slice(2).filter((arg) => arg !== \"--inspector\");\n const child = spawn(\n \"npx\",\n [\"-y\", \"@modelcontextprotocol/inspector\", \"node\", process.argv[1], ...args],\n {\n stdio: \"inherit\",\n env: { ...process.env, FORCE_COLOR: \"1\" },\n },\n );\n child.on(\"exit\", (code) => {\n process.exit(code || 0);\n });\n }\n\n /**\n * 将 Zod schema 转换为 JSON Schema\n */\n private zodToJsonSchema(zodSchema: any): Record<string, any> {\n if (!zodSchema || typeof zodSchema.shape !== \"object\") {\n return {};\n }\n const properties: Record<string, any> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(zodSchema.shape)) {\n const zodType = value as any;\n let type = \"string\";\n let description = zodType._def?.description;\n // 检查是否可选\n const isOptional = zodType._def?.typeName === \"ZodOptional\";\n const innerType = isOptional ? zodType._def?.innerType : zodType;\n // 获取类型\n switch (innerType?._def?.typeName) {\n case \"ZodString\":\n type = \"string\";\n break;\n case \"ZodNumber\":\n type = \"number\";\n break;\n case \"ZodBoolean\":\n type = \"boolean\";\n break;\n case \"ZodArray\":\n type = \"array\";\n break;\n default:\n type = \"string\";\n }\n properties[key] = { type };\n if (description) {\n properties[key].description = description;\n }\n if (!isOptional) {\n required.push(key);\n }\n }\n return { properties, required };\n }\n\n /**\n * 将 JSON Schema 转换为 Zod schema\n */\n private jsonSchemaToZod(jsonSchema?: Record<string, any>): Record<string, any> {\n if (!jsonSchema || !jsonSchema.properties) {\n return {};\n }\n\n const zodShape: Record<string, any> = {};\n for (const [key, prop] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n const isRequired = jsonSchema.required?.includes(key);\n let zodType: any;\n\n switch (prop.type) {\n case \"string\":\n zodType = z.string();\n break;\n case \"number\":\n zodType = z.number();\n break;\n case \"boolean\":\n zodType = z.boolean();\n break;\n case \"array\":\n zodType = z.array(z.any());\n break;\n default:\n zodType = z.any();\n }\n\n if (prop.description) {\n zodType = zodType.describe(prop.description);\n }\n\n zodShape[key] = isRequired ? zodType : zodType.optional();\n }\n\n return zodShape;\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { McpService } from \"./mcp.service\";\nimport type { ExtensionLoader } from \"../../cli-runtime/extension-loader\";\n\n/**\n * MCP 命令扩展\n */\nexport const mcpExtension = defineExtension({\n name: \"mcp\",\n version: \"1.0.0\",\n description: \"MCP 工具\",\n commands: [\n {\n name: \"mcp\",\n description: \"启动 MCP Server\",\n options: [\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n {\n flags: \"--inspector\",\n description: \"启动 MCP Inspector\",\n },\n ],\n run: async (_args, options, ctx) => {\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const extensionLoader = ctx.getService<ExtensionLoader>(\"extensionLoader\");\n const mcpService = new McpService(extensionLoader);\n const inspector = options?.inspector as boolean | undefined;\n await mcpService.startServer(verbose, inspector);\n },\n },\n ],\n});\n\nexport * from \"./mcp.service\";\n","import { join } from \"path\";\nimport { existsSync, realpathSync } from \"fs\";\nimport { spawn } from \"child_process\";\nimport { InstallService } from \"../install/install.service\";\nimport type { VerboseLevel } from \"@spaceflow/core\";\nimport { extractName, getSourceType, t } from \"@spaceflow/core\";\n\nexport interface RunxOptions {\n source: string;\n name?: string;\n args: string[];\n verbose?: VerboseLevel;\n}\n\n/**\n * Runx 服务\n * 全局安装依赖后运行命令\n */\nexport class RunxService {\n constructor(private readonly installService: InstallService) {}\n\n /**\n * 执行 runx:全局安装 + 运行命令\n */\n async execute(options: RunxOptions): Promise<void> {\n const { source, args } = options;\n const verbose = options.verbose ?? true;\n const name = options.name || extractName(source);\n const sourceType = getSourceType(source);\n\n // npm 包直接使用 npx 执行\n if (sourceType === \"npm\") {\n if (verbose)\n console.log(t(\"runx:runningCommand\", { command: `npx ${source} ${args.join(\" \")}` }));\n await this.runWithNpx(source, args);\n return;\n }\n\n // 第一步:全局安装(静默模式)\n await this.installService.installGlobal(\n {\n source,\n name: options.name,\n },\n false,\n );\n // 第二步:运行命令\n if (verbose) console.log(t(\"runx:runningCommand\", { command: `${name} ${args.join(\" \")}` }));\n await this.runCommand(name, args);\n }\n\n /**\n * 使用 npx 运行 npm 包\n */\n private runWithNpx(packageName: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"npx\", [packageName, ...args], {\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(t(\"runx:npxExitCode\", { package: packageName, code })));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n /**\n * 运行已安装的命令\n * TODO: 迁移到新架构后实现\n */\n protected async runCommand(name: string, args: string[]): Promise<void> {\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n const depPath = join(home, \".spaceflow\", \"node_modules\", name);\n // 检查命令是否存在\n if (!existsSync(depPath)) {\n throw new Error(t(\"runx:commandNotInstalled\", { name }));\n }\n // 解析符号链接获取真实路径\n const realDepPath = realpathSync(depPath);\n // 检查是否有 dist/index.js\n const distPath = join(realDepPath, \"dist\", \"index.js\");\n if (!existsSync(distPath)) {\n throw new Error(t(\"runx:commandNotBuilt\", { name }));\n }\n // 动态加载插件(使用 Function 构造器绕过 rspack 转换)\n const importUrl = `file://${distPath}`;\n const dynamicImport = new Function(\"url\", \"return import(url)\");\n const pluginModule = await dynamicImport(importUrl);\n const extensionDef = pluginModule.default;\n if (!extensionDef) {\n throw new Error(t(\"runx:pluginNoExport\", { name }));\n }\n // 新架构:extensionDef 是 ExtensionDefinition 对象\n // 查找匹配的命令并执行\n const commands = extensionDef.commands || [];\n const finalArgs = this.autoCompleteCommand(\n args,\n commands.map((c: { name: string }) => c.name),\n );\n // 查找要执行的命令\n const cmdName = finalArgs[0];\n const cmdDef = commands.find((c: { name: string }) => c.name === cmdName);\n if (!cmdDef) {\n throw new Error(t(\"runx:commandNotFound\", { name: cmdName }));\n }\n // TODO: 需要创建 SpaceflowContext 来执行命令\n // 暂时抛出未实现错误\n throw new Error(`runx 命令正在迁移到新架构,暂不可用。请直接使用 space ${cmdName} 命令。`);\n }\n\n /**\n * 自动补充命令名\n * 如果插件只有一个命令,且用户没有指定子命令,自动在参数前补充命令名\n */\n private autoCompleteCommand(args: string[], commands?: string[]): string[] {\n // 没有命令列表或为空,直接返回\n if (!commands || commands.length === 0) {\n return args;\n }\n // 如果只有一个命令\n if (commands.length === 1) {\n const cmdName = commands[0];\n // 检查用户是否已经指定了该命令\n if (args.length === 0 || args[0] !== cmdName) {\n // 如果第一个参数是选项(以 - 开头),说明用户没有指定子命令\n if (args.length === 0 || args[0].startsWith(\"-\")) {\n return [cmdName, ...args];\n }\n }\n }\n return args;\n }\n}\n","import { defineExtension, SchemaGeneratorService, type VerboseLevel } from \"@spaceflow/core\";\nimport { RunxService } from \"./runx.service\";\nimport { InstallService } from \"../install/install.service\";\n\n/**\n * Runx 命令扩展\n */\nexport const runxExtension = defineExtension({\n name: \"runx\",\n version: \"1.0.0\",\n description: \"运行 x 命令\",\n commands: [\n {\n name: \"runx\",\n description: \"全局安装并运行扩展命令\",\n aliases: [\"x\"],\n arguments: \"<source> [args...]\",\n options: [\n {\n flags: \"-n, --name <name>\",\n description: \"指定安装名称\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const source = args[0];\n const cmdArgs = args.slice(1);\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const schemaGenerator = new SchemaGeneratorService();\n const installService = new InstallService(schemaGenerator);\n const runxService = new RunxService(installService);\n await runxService.execute({\n source,\n name: options?.name as string,\n args: cmdArgs,\n verbose,\n });\n },\n },\n ],\n});\n\nexport * from \"./runx.service\";\nexport * from \"./runx.utils\";\n","import { defineExtension, SchemaGeneratorService } from \"@spaceflow/core\";\n\n/**\n * Schema 命令扩展\n */\nexport const schemaExtension = defineExtension({\n name: \"schema\",\n version: \"1.0.0\",\n description: \"生成 schema\",\n commands: [\n {\n name: \"schema\",\n description: \"生成 JSON Schema 配置文件\",\n options: [\n {\n flags: \"-o, --output <path>\",\n description: \"输出路径\",\n },\n ],\n run: async (_args, options, _ctx) => {\n const schemaGenerator = new SchemaGeneratorService();\n if (options?.output) {\n schemaGenerator.generateJsonSchema(options.output as string);\n } else {\n schemaGenerator.generate();\n }\n },\n },\n ],\n});\n","import { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { t } from \"@spaceflow/core\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport stringify from \"json-stringify-pretty-compact\";\nimport {\n CONFIG_FILE_NAME,\n RC_FILE_NAME,\n getConfigPath,\n readConfigSync,\n type SpaceflowConfig,\n SchemaGeneratorService,\n SPACEFLOW_DIR,\n ensureSpaceflowPackageJson,\n} from \"@spaceflow/core\";\n\nexport class SetupService {\n constructor(private readonly schemaGenerator: SchemaGeneratorService) {}\n /**\n * 本地初始化:创建 .spaceflow/ 目录和 package.json\n */\n async setupLocal(): Promise<void> {\n const cwd = process.cwd();\n\n // 1. 创建 .spaceflow/ 目录和 package.json\n const spaceflowDir = join(cwd, SPACEFLOW_DIR);\n ensureSpaceflowPackageJson(spaceflowDir);\n console.log(t(\"setup:dirCreated\", { dir: spaceflowDir }));\n\n // 2. 创建 spaceflow.json 配置文件(运行时配置)\n const configPath = getConfigPath(cwd);\n const rcPath = join(cwd, RC_FILE_NAME);\n if (!existsSync(configPath) && !existsSync(rcPath)) {\n this.schemaGenerator.generate();\n const defaultConfig: Partial<SpaceflowConfig> = {\n $schema: \"./config-schema.json\",\n support: [\"claudeCode\"],\n };\n writeFileSync(configPath, stringify(defaultConfig, { indent: 2 }) + \"\\n\");\n console.log(t(\"setup:configGenerated\", { path: configPath }));\n } else {\n const existingPath = existsSync(rcPath) ? rcPath : configPath;\n console.log(t(\"setup:configExists\", { path: existingPath }));\n }\n }\n\n /**\n * 全局初始化:创建 ~/.spaceflow/ 目录和 package.json,并合并配置\n */\n async setupGlobal(): Promise<void> {\n const cwd = process.cwd();\n const globalDir = join(homedir(), SPACEFLOW_DIR);\n const globalConfigPath = join(globalDir, CONFIG_FILE_NAME);\n\n // 1. 创建 ~/.spaceflow/ 目录和 package.json\n ensureSpaceflowPackageJson(globalDir);\n console.log(t(\"setup:dirCreated\", { dir: globalDir }));\n\n // 读取本地配置(支持 .spaceflow/spaceflow.json 和 .spaceflowrc)\n const localConfig = readConfigSync(cwd);\n if (Object.keys(localConfig).length > 0) {\n console.log(t(\"setup:localConfigRead\"));\n }\n\n // 读取本地 .env 文件并解析为配置\n const envPath = join(cwd, \".env\");\n const envConfig = this.parseEnvToConfig(envPath);\n\n const instanceConfig = (global as any).spaceflowConfig ?? {};\n\n // 合并配置:本地配置(已含全局) < 实例配置 < 环境变量配置\n const mergedConfig = this.deepMerge(localConfig, instanceConfig, envConfig);\n\n // 写入全局配置\n writeFileSync(globalConfigPath, stringify(mergedConfig, { indent: 2 }) + \"\\n\");\n console.log(t(\"setup:globalConfigGenerated\", { path: globalConfigPath }));\n\n // 显示合并的环境变量\n if (Object.keys(envConfig).length > 0) {\n console.log(t(\"setup:envConfigMerged\"));\n this.printConfigTree(envConfig, \" \");\n }\n }\n\n /**\n * 解析 .env 文件为配置对象\n * 支持嵌套格式:SPACEFLOW_GIT_PROVIDER_SERVER_URL -> { gitProvider: { serverUrl: \"...\" } }\n */\n private parseEnvToConfig(envPath: string): Record<string, unknown> {\n if (!existsSync(envPath)) {\n return {};\n }\n\n const config: Record<string, unknown> = {};\n\n try {\n const content = readFileSync(envPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n // 跳过空行和注释\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // 移除引号\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n // 只处理 SPACEFLOW_ 前缀的环境变量\n if (!key.startsWith(\"SPACEFLOW_\")) continue;\n\n // 转换为嵌套配置\n // SPACEFLOW_GIT_PROVIDER_SERVER_URL -> gitProvider.serverUrl\n const parts = key\n .slice(\"SPACEFLOW_\".length)\n .toLowerCase()\n .split(\"_\")\n .map((part, index) => {\n // 第一个部分保持小写,后续部分转为 camelCase\n if (index === 0) return part;\n return part.charAt(0).toUpperCase() + part.slice(1);\n });\n\n // 重新组织为嵌套结构\n // 例如: [\"git\", \"Provider\", \"Server\", \"Url\"] -> { gitProviderServerUrl: value }\n // 简化处理:按照常见模式分组\n this.setNestedValue(config, parts, value);\n }\n\n console.log(t(\"setup:envRead\", { path: envPath }));\n } catch {\n console.warn(t(\"setup:envReadFailed\", { path: envPath }));\n }\n\n return config;\n }\n\n /**\n * 设置嵌套值\n * 例如: [\"review\", \"Gitea\", \"Server\", \"Url\"] 和 value\n * 结果: { review: { giteaServerUrl: value } }\n */\n private setNestedValue(obj: Record<string, unknown>, parts: string[], value: string): void {\n if (parts.length === 0) return;\n\n // 第一个部分作为顶级 key(如 review, commit 等)\n const topKey = parts[0];\n\n if (parts.length === 1) {\n obj[topKey] = value;\n return;\n }\n\n // 剩余部分合并为 camelCase 作为嵌套 key\n // 例如: [\"Gitea\", \"Server\", \"Url\"] -> giteaServerUrl\n const restParts = parts.slice(1);\n const nestedKey = restParts\n .map((part, index) => (index === 0 ? part.toLowerCase() : part))\n .join(\"\");\n\n if (!obj[topKey] || typeof obj[topKey] !== \"object\") {\n obj[topKey] = {};\n }\n\n (obj[topKey] as Record<string, unknown>)[nestedKey] = value;\n }\n\n /**\n * 深度合并对象\n */\n private deepMerge<T extends Record<string, unknown>>(...objects: Partial<T>[]): Partial<T> {\n const result: Record<string, unknown> = {};\n\n for (const obj of objects) {\n for (const key in obj) {\n const value = obj[key];\n const existing = result[key];\n\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing)\n ) {\n result[key] = this.deepMerge(\n existing as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n\n return result as Partial<T>;\n }\n\n /**\n * 打印配置树\n */\n private printConfigTree(config: Record<string, unknown>, prefix: string): void {\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n console.log(`${prefix}${key}:`);\n this.printConfigTree(value as Record<string, unknown>, prefix + \" \");\n } else {\n // 隐藏敏感值\n const displayValue = this.isSensitiveKey(key) ? \"***\" : String(value);\n console.log(`${prefix}${key}: ${displayValue}`);\n }\n }\n }\n\n /**\n * 判断是否为敏感 key\n */\n private isSensitiveKey(key: string): boolean {\n const sensitivePatterns = [\"token\", \"secret\", \"password\", \"key\", \"apikey\"];\n const lowerKey = key.toLowerCase();\n return sensitivePatterns.some((pattern) => lowerKey.includes(pattern));\n }\n}\n","import { defineExtension, SchemaGeneratorService } from \"@spaceflow/core\";\nimport { SetupService } from \"./setup.service\";\n\n/**\n * Setup 命令扩展\n */\nexport const setupExtension = defineExtension({\n name: \"setup\",\n version: \"1.0.0\",\n description: \"设置配置\",\n commands: [\n {\n name: \"setup\",\n description: \"设置配置\",\n options: [\n {\n flags: \"-g, --global\",\n description: \"全局设置\",\n },\n ],\n run: async (_args, options, _ctx) => {\n const schemaGenerator = new SchemaGeneratorService();\n const setupService = new SetupService(schemaGenerator);\n if (options?.global) {\n await setupService.setupGlobal();\n } else {\n await setupService.setupLocal();\n }\n },\n },\n ],\n});\n\nexport * from \"./setup.service\";\n","import { execSync } from \"child_process\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync, readdirSync } from \"fs\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\nimport { getEditorDirName } from \"@spaceflow/core\";\nimport { detectPackageManager } from \"@spaceflow/core\";\nimport { getSpaceflowDir } from \"@spaceflow/core\";\nimport { getConfigPath, getSupportedEditors, removeDependency } from \"@spaceflow/core\";\n\nexport class UninstallService {\n /**\n * 从 .spaceflow/node_modules/ 目录卸载 Extension\n * 所有类型的 Extension 都通过 pnpm remove 卸载\n */\n private async uninstallExtension(\n name: string,\n isGlobal: boolean = false,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n const spaceflowDir = getSpaceflowDir(isGlobal);\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"uninstall:uninstallingExtension\", { name }));\n console.log(t(\"uninstall:targetDir\", { dir: spaceflowDir }));\n }\n\n const pm = detectPackageManager(spaceflowDir);\n let cmd: string;\n if (pm === \"pnpm\") {\n cmd = `pnpm remove --prefix \"${spaceflowDir}\" ${name}`;\n } else {\n cmd = `npm uninstall --prefix \"${spaceflowDir}\" ${name}`;\n }\n\n try {\n execSync(cmd, {\n cwd: process.cwd(),\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n } catch {\n if (shouldLog(verbose, 1)) console.warn(t(\"uninstall:extensionUninstallFailed\", { name }));\n }\n }\n\n /**\n * 执行卸载\n */\n async execute(name: string, isGlobal = false, verbose: VerboseLevel = 1): Promise<void> {\n if (shouldLog(verbose, 1)) {\n if (isGlobal) {\n console.log(t(\"uninstall:uninstallingGlobal\", { name }));\n } else {\n console.log(t(\"uninstall:uninstalling\", { name }));\n }\n }\n\n const cwd = process.cwd();\n const configPath = getConfigPath(cwd);\n\n // 1. 读取配置获取 source\n const dependencies = await this.parseSkillsFromConfig(configPath);\n let actualName = name;\n let config = dependencies[name];\n\n // 如果通过 name 找不到,尝试通过 source 值查找(支持 @spaceflow/review 这样的 npm 包名)\n if (!config) {\n for (const [key, value] of Object.entries(dependencies)) {\n if (value === name) {\n actualName = key;\n config = value;\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:foundDependency\", { key, value }));\n break;\n }\n }\n }\n\n if (!config && !isGlobal) {\n throw new Error(t(\"uninstall:notRegistered\", { name }));\n }\n\n // 使用实际的 name 进行后续操作\n name = actualName;\n\n // 2. 从 .spaceflow/node_modules/ 卸载 Extension\n await this.uninstallExtension(name, isGlobal, verbose);\n\n // 3. 删除各个编辑器 commands/skills 中的复制文件\n const editors = getSupportedEditors(cwd);\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n\n for (const editor of editors) {\n const editorDirName = getEditorDirName(editor);\n const installRoot = isGlobal ? join(home, editorDirName) : join(cwd, editorDirName);\n await this.removeEditorFiles(installRoot, name, verbose);\n }\n\n // 4. 从配置文件中移除(仅本地安装)\n if (!isGlobal && config) {\n this.removeFromConfig(name, cwd, verbose);\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:uninstallDone\"));\n }\n\n /**\n * 删除编辑器目录中的 commands/skills 文件\n * install 现在是复制文件到编辑器目录,所以卸载时需要删除这些复制的文件/目录\n */\n private async removeEditorFiles(\n installRoot: string,\n name: string,\n verbose: VerboseLevel = 1,\n ): Promise<void> {\n // 删除 skills 目录中的文件\n const skillsDir = join(installRoot, \"skills\");\n if (existsSync(skillsDir)) {\n const entries = readdirSync(skillsDir);\n for (const entry of entries) {\n // 匹配 name 或 name-xxx 格式\n if (entry === name || entry.startsWith(`${name}-`)) {\n const targetPath = join(skillsDir, entry);\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:deletingSkill\", { entry }));\n await rm(targetPath, { recursive: true, force: true });\n }\n }\n }\n\n // 删除 commands 目录中的 .md 文件\n const commandsDir = join(installRoot, \"commands\");\n if (existsSync(commandsDir)) {\n const entries = readdirSync(commandsDir);\n for (const entry of entries) {\n // 匹配 name.md 或 name-xxx.md 格式\n if (entry === `${name}.md` || entry.startsWith(`${name}-`)) {\n const targetPath = join(commandsDir, entry);\n if (shouldLog(verbose, 1)) console.log(t(\"uninstall:deletingCommand\", { entry }));\n await rm(targetPath, { force: true });\n }\n }\n }\n }\n\n /**\n * 从配置文件解析 dependencies\n */\n private async parseSkillsFromConfig(configPath: string): Promise<Record<string, unknown>> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const config = JSON.parse(content);\n return config.dependencies || {};\n } catch {\n return {};\n }\n }\n\n /**\n * 从配置文件中移除依赖\n */\n private removeFromConfig(name: string, cwd: string, verbose: VerboseLevel = 1): void {\n const removed = removeDependency(name, cwd);\n if (removed && shouldLog(verbose, 1)) {\n console.log(t(\"uninstall:configUpdated\", { path: getConfigPath(cwd) }));\n }\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { UninstallService } from \"./uninstall.service\";\n\n/**\n * Uninstall 命令扩展\n */\nexport const uninstallExtension = defineExtension({\n name: \"uninstall\",\n version: \"1.0.0\",\n description: \"卸载 Extension\",\n commands: [\n {\n name: \"uninstall\",\n description: \"卸载 Extension\",\n aliases: [\"un\"],\n arguments: \"<name>\",\n options: [\n {\n flags: \"-g, --global\",\n description: \"全局卸载\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, ctx) => {\n const name = args[0];\n if (!name) {\n ctx.output.error(\"请指定要卸载的扩展名称\");\n process.exit(1);\n }\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const isGlobal = !!options?.global;\n const uninstallService = new UninstallService();\n await uninstallService.execute(name, isGlobal, verbose);\n },\n },\n ],\n});\n\nexport * from \"./uninstall.service\";\n","import { execSync } from \"child_process\";\nimport { readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport { shouldLog, type VerboseLevel, t } from \"@spaceflow/core\";\nimport { getDependencies } from \"@spaceflow/core\";\nimport type { ExtensionConfig } from \"../install/install.service\";\n\nexport interface UpdateOptions {\n name?: string;\n self?: boolean;\n verbose?: VerboseLevel;\n}\n\nexport class UpdateService {\n protected getPackageManager(): string {\n const cwd = process.cwd();\n\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n // pnpm 不可用\n }\n }\n\n if (existsSync(join(cwd, \"yarn.lock\"))) {\n try {\n execSync(\"yarn --version\", { stdio: \"ignore\" });\n return \"yarn\";\n } catch {\n // yarn 不可用\n }\n }\n\n return \"npm\";\n }\n\n protected isPnpmWorkspace(): boolean {\n return existsSync(join(process.cwd(), \"pnpm-workspace.yaml\"));\n }\n\n isGitUrl(source: string): boolean {\n return (\n source.startsWith(\"git@\") ||\n (source.startsWith(\"https://\") && source.endsWith(\".git\")) ||\n source.endsWith(\".git\")\n );\n }\n\n isLocalPath(source: string): boolean {\n return (\n source.startsWith(\"./\") ||\n source.startsWith(\"../\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"skills/\")\n );\n }\n\n getSourceType(source: string): \"npm\" | \"git\" | \"local\" {\n if (this.isLocalPath(source)) return \"local\";\n if (this.isGitUrl(source)) return \"git\";\n return \"npm\";\n }\n\n parseExtensionConfig(config: ExtensionConfig): { source: string; ref?: string } {\n if (typeof config === \"string\") {\n return { source: config };\n }\n return { source: config.source, ref: config.ref };\n }\n\n async getLatestNpmVersion(packageName: string): Promise<string | null> {\n try {\n const result = execSync(`npm view ${packageName} version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return result;\n } catch {\n return null;\n }\n }\n\n async getCurrentNpmVersion(packageName: string): Promise<string | null> {\n const packageJsonPath = join(process.cwd(), \"package.json\");\n\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const version = pkg.dependencies?.[packageName] || pkg.devDependencies?.[packageName];\n if (version) {\n return version.replace(/^[\\^~>=<]+/, \"\");\n }\n return null;\n } catch {\n return null;\n }\n }\n\n async updateNpmPackage(packageName: string, verbose: VerboseLevel = 1): Promise<boolean> {\n const pm = this.getPackageManager();\n const latestVersion = await this.getLatestNpmVersion(packageName);\n const currentVersion = await this.getCurrentNpmVersion(packageName);\n\n if (!latestVersion) {\n if (shouldLog(verbose, 1)) console.log(t(\"update:cannotGetLatest\", { package: packageName }));\n return false;\n }\n\n if (currentVersion === latestVersion) {\n if (shouldLog(verbose, 1))\n console.log(t(\"update:alreadyLatest\", { package: packageName, version: currentVersion }));\n return true;\n }\n\n if (shouldLog(verbose, 1)) {\n console.log(\n t(\"update:versionChange\", {\n package: packageName,\n current: currentVersion || t(\"update:unknown\"),\n latest: latestVersion,\n }),\n );\n }\n\n let cmd: string;\n if (pm === \"pnpm\") {\n cmd = this.isPnpmWorkspace()\n ? `pnpm add -wD ${packageName}@latest`\n : `pnpm add -D ${packageName}@latest`;\n } else if (pm === \"yarn\") {\n cmd = `yarn add -D ${packageName}@latest`;\n } else {\n cmd = `npm install -D ${packageName}@latest`;\n }\n\n try {\n execSync(cmd, {\n cwd: process.cwd(),\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n return true;\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.error(\n t(\"update:npmUpdateFailed\", { package: packageName }),\n error instanceof Error ? error.message : error,\n );\n }\n return false;\n }\n }\n\n async updateGitRepo(depPath: string, name: string, verbose: VerboseLevel = 1): Promise<boolean> {\n const gitDir = join(depPath, \".git\");\n\n if (!existsSync(gitDir)) {\n if (shouldLog(verbose, 1)) {\n console.log(t(\"update:notGitRepo\", { name }));\n console.log(t(\"update:reinstallHint\"));\n }\n return false;\n }\n\n try {\n if (shouldLog(verbose, 1)) console.log(t(\"update:pullingLatest\"));\n execSync(\"git pull\", {\n cwd: depPath,\n stdio: verbose ? \"inherit\" : \"pipe\",\n });\n return true;\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.error(\n t(\"update:gitUpdateFailed\", { name }),\n error instanceof Error ? error.message : error,\n );\n }\n return false;\n }\n }\n\n /**\n * 检测 CLI 的安装方式\n * 返回: { isGlobal: boolean, pm: 'pnpm' | 'npm' | 'yarn', cwd?: string }\n */\n protected detectCliInstallation(): { isGlobal: boolean; pm: string; cwd?: string } {\n try {\n // 获取当前执行的 CLI 路径\n const cliPath = process.argv[1];\n\n // 检查是否在 node_modules 中(本地安装)\n if (cliPath.includes(\"node_modules\")) {\n // 提取项目根目录(node_modules 的父目录)\n const nodeModulesIndex = cliPath.indexOf(\"node_modules\");\n const projectRoot = cliPath.substring(0, nodeModulesIndex - 1);\n\n // 检测项目使用的包管理器\n let pm = \"npm\";\n if (existsSync(join(projectRoot, \"pnpm-lock.yaml\"))) {\n pm = \"pnpm\";\n } else if (existsSync(join(projectRoot, \"yarn.lock\"))) {\n pm = \"yarn\";\n }\n\n return { isGlobal: false, pm, cwd: projectRoot };\n }\n\n // 检查是否是全局安装\n // 尝试检测 pnpm 全局\n try {\n const pnpmGlobalDir = execSync(\"pnpm root -g\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (cliPath.startsWith(pnpmGlobalDir) || cliPath.includes(\".pnpm\")) {\n return { isGlobal: true, pm: \"pnpm\" };\n }\n } catch {\n // pnpm 不可用\n }\n\n // 尝试检测 npm 全局\n try {\n const npmGlobalDir = execSync(\"npm root -g\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (cliPath.startsWith(npmGlobalDir)) {\n return { isGlobal: true, pm: \"npm\" };\n }\n } catch {\n // npm 不可用\n }\n\n // 默认认为是全局安装\n return { isGlobal: true, pm: \"npm\" };\n } catch {\n return { isGlobal: true, pm: \"npm\" };\n }\n }\n\n async updateSelf(verbose: VerboseLevel = 1): Promise<boolean> {\n if (shouldLog(verbose, 1)) console.log(t(\"update:updatingCli\"));\n\n const cliPackageName = \"@spaceflow/cli\";\n const installation = this.detectCliInstallation();\n\n if (shouldLog(verbose, 1)) {\n console.log(\n t(\"update:installMethod\", {\n method: installation.isGlobal ? t(\"update:installGlobal\") : t(\"update:installLocal\"),\n pm: installation.pm,\n }),\n );\n }\n\n try {\n if (installation.isGlobal) {\n // 全局安装:使用对应包管理器的全局更新命令\n const cmd =\n installation.pm === \"pnpm\"\n ? `pnpm update -g ${cliPackageName}`\n : installation.pm === \"yarn\"\n ? `yarn global upgrade ${cliPackageName}`\n : `npm update -g ${cliPackageName}`;\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:executing\", { cmd }));\n execSync(cmd, { stdio: verbose ? \"inherit\" : \"pipe\" });\n } else {\n // 本地安装:在项目目录中更新\n const cwd = installation.cwd || process.cwd();\n let cmd: string;\n\n if (installation.pm === \"pnpm\") {\n const isPnpmWorkspace = existsSync(join(cwd, \"pnpm-workspace.yaml\"));\n cmd = isPnpmWorkspace\n ? `pnpm add -wD ${cliPackageName}@latest`\n : `pnpm add -D ${cliPackageName}@latest`;\n } else if (installation.pm === \"yarn\") {\n cmd = `yarn add -D ${cliPackageName}@latest`;\n } else {\n cmd = `npm install -D ${cliPackageName}@latest`;\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:executing\", { cmd }));\n execSync(cmd, { cwd, stdio: verbose ? \"inherit\" : \"pipe\" });\n }\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:cliUpdateDone\"));\n return true;\n } catch (error) {\n if (shouldLog(verbose, 1)) {\n console.error(t(\"update:cliUpdateFailed\"), error instanceof Error ? error.message : error);\n }\n return false;\n }\n }\n\n async updateDependency(name: string, verbose: VerboseLevel = 1): Promise<boolean> {\n const cwd = process.cwd();\n const dependencies = getDependencies(cwd);\n\n if (!dependencies[name]) {\n if (shouldLog(verbose, 1)) console.log(t(\"update:depNotFound\", { name }));\n return false;\n }\n\n const { source } = this.parseExtensionConfig(dependencies[name] as ExtensionConfig);\n const sourceType = this.getSourceType(source);\n\n if (shouldLog(verbose, 1)) console.log(t(\"update:updating\", { name }));\n\n if (sourceType === \"npm\") {\n return this.updateNpmPackage(source, verbose);\n } else if (sourceType === \"git\") {\n const depPath = join(cwd, \".spaceflow\", \"deps\", name);\n return this.updateGitRepo(depPath, name, verbose);\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"update:localNoUpdate\"));\n return true;\n }\n }\n\n async updateAll(verbose: VerboseLevel = 1): Promise<void> {\n const cwd = process.cwd();\n const dependencies = getDependencies(cwd);\n\n if (Object.keys(dependencies).length === 0) {\n if (shouldLog(verbose, 1)) console.log(t(\"update:noDeps\"));\n return;\n }\n\n if (shouldLog(verbose, 1)) {\n console.log(t(\"update:updatingAll\", { count: Object.keys(dependencies).length }));\n }\n\n let successCount = 0;\n let failCount = 0;\n\n for (const [name, config] of Object.entries(dependencies) as [string, ExtensionConfig][]) {\n const { source } = this.parseExtensionConfig(config);\n const sourceType = this.getSourceType(source);\n\n console.log(`\\n📦 ${name}`);\n\n let success = false;\n if (sourceType === \"npm\") {\n success = await this.updateNpmPackage(source, verbose);\n } else if (sourceType === \"git\") {\n const depPath = join(cwd, \".spaceflow\", \"deps\", name);\n success = await this.updateGitRepo(depPath, name, verbose);\n } else {\n if (shouldLog(verbose, 1)) console.log(t(\"update:localNoUpdate\"));\n success = true;\n }\n\n if (success) {\n successCount++;\n } else {\n failCount++;\n }\n }\n\n console.log(\"\\n\" + t(\"update:updateComplete\", { success: successCount, fail: failCount }));\n }\n}\n","import { defineExtension, type VerboseLevel } from \"@spaceflow/core\";\nimport { UpdateService } from \"./update.service\";\n\n/**\n * Update 命令扩展\n */\nexport const updateExtension = defineExtension({\n name: \"update\",\n version: \"1.0.0\",\n description: \"更新 Extension\",\n commands: [\n {\n name: \"update\",\n description: \"更新 Extension\",\n arguments: \"[name]\",\n options: [\n {\n flags: \"-a, --all\",\n description: \"更新所有扩展\",\n },\n {\n flags: \"-v, --verbose\",\n description: \"详细输出\",\n },\n ],\n run: async (args, options, _ctx) => {\n const name = args[0];\n const verbose = (options?.verbose ? 2 : 1) as VerboseLevel;\n const updateService = new UpdateService();\n if (options?.all) {\n await updateService.updateAll(verbose);\n } else if (name) {\n await updateService.updateDependency(name, verbose);\n } else {\n await updateService.updateSelf(verbose);\n }\n },\n },\n ],\n});\n\nexport * from \"./update.service\";\n","import { buildExtension } from \"../commands/build\";\nimport { clearExtension } from \"../commands/clear\";\nimport { commitExtension } from \"../commands/commit\";\nimport { createExtension } from \"../commands/create\";\nimport { devExtension } from \"../commands/dev\";\nimport { installExtension } from \"../commands/install\";\nimport { listExtension } from \"../commands/list\";\nimport { mcpExtension } from \"../commands/mcp\";\nimport { runxExtension } from \"../commands/runx\";\nimport { schemaExtension } from \"../commands/schema\";\nimport { setupExtension } from \"../commands/setup\";\nimport { uninstallExtension } from \"../commands/uninstall\";\nimport { updateExtension } from \"../commands/update\";\n\n/**\n * 内部扩展列表\n * 从各命令目录导入 defineExtension 定义\n */\nexport const internalExtensions = [\n buildExtension,\n clearExtension,\n commitExtension,\n createExtension,\n devExtension,\n installExtension,\n listExtension,\n mcpExtension,\n runxExtension,\n schemaExtension,\n setupExtension,\n uninstallExtension,\n updateExtension,\n];\n","declare const __CORE_VERSION__: string;\n\nimport { Command } from \"commander\";\nimport type { ExtensionDefinition } from \"@spaceflow/core\";\nimport { ServiceContainer, initializeContainer } from \"./di\";\nimport { ExtensionLoader } from \"./extension-loader\";\nimport { internalExtensions } from \"./internal-extensions\";\nimport { initCliI18n } from \"./i18n\";\n\nexport { ServiceContainer } from \"./di\";\nexport { ExtensionLoader } from \"./extension-loader\";\nexport { initCliI18n } from \"./i18n\";\nexport { internalExtensions } from \"./internal-extensions\";\n\n/**\n * Core.exec() — CLI 运行时入口\n * 接收外部扩展列表,结合内部扩展,构建并执行 commander 程序\n *\n * @param extensions 外部扩展定义列表(来自 .spaceflow/bin/index.js 的静态导入)\n */\nexport interface ExecOptions {\n cliVersion?: string;\n}\n\nexport async function exec(\n extensions: ExtensionDefinition[] = [],\n options: ExecOptions = {},\n): Promise<void> {\n // 1. 初始化 i18n(如果尚未初始化,由生成的 bin/index.js 提前调用)\n initCliI18n();\n\n // 2. 创建并初始化服务容器\n const container = new ServiceContainer();\n initializeContainer(container);\n\n // 3. 创建扩展加载器\n const extensionLoader = new ExtensionLoader(container);\n container.registerService(\"extensionLoader\", extensionLoader);\n\n // 4. 注册内部扩展\n for (const ext of internalExtensions) {\n extensionLoader.registerExtension(ext);\n }\n\n // 5. 注册外部扩展(由 CLI 壳子加载并传入)\n for (const ext of extensions) {\n extensionLoader.registerExtension(ext);\n }\n\n // 6. 创建 CLI 程序\n const program = new Command();\n const cliVersion = options.cliVersion || \"0.0.0\";\n const coreVersion = typeof __CORE_VERSION__ !== \"undefined\" ? __CORE_VERSION__ : \"0.0.0\";\n const versionOutput = `spaceflow/${cliVersion} core/${coreVersion}`;\n\n program\n .name(\"spaceflow\")\n .description(\"Spaceflow CLI\")\n .version(versionOutput, \"-V, --version\", \"显示版本信息\");\n\n // 定义全局 verbose 选项(支持计数:-v, -vv, -vvv)\n program.option(\n \"-v, --verbose\",\n \"详细输出(可叠加:-v, -vv, -vvv)\",\n (_, prev: number) => prev + 1,\n 0,\n );\n\n // 全局选项列表\n const globalOptions = [\"-h, --help\", \"-V, --version\", \"-v, --verbose\"];\n\n // 8. 注册所有命令\n const commands = extensionLoader.getCommands();\n for (const cmd of commands) {\n const command = new Command(cmd.name).description(cmd.description);\n\n // 添加别名\n if (cmd.aliases) {\n for (const alias of cmd.aliases) {\n command.alias(alias);\n }\n }\n\n // 添加参数\n if (cmd.arguments) {\n command.arguments(cmd.arguments);\n }\n\n // 添加选项(排除已定义的全局选项)\n if (cmd.options) {\n for (const opt of cmd.options) {\n if (!globalOptions.some((go) => opt.flags.startsWith(go.split(\",\")[0].trim()))) {\n if (opt.isCount) {\n command.option(\n opt.flags as string,\n opt.description as string,\n (_, prev: number) => prev + 1,\n 0,\n );\n } else {\n const defaultValue = opt.default as string | boolean | string[] | undefined;\n command.option(opt.flags as string, opt.description as string, defaultValue);\n }\n }\n }\n }\n\n // 添加子命令\n if (cmd.subcommands) {\n for (const sub of cmd.subcommands) {\n const subCmd = new Command(sub.name).description(sub.description);\n if (sub.options) {\n for (const opt of sub.options) {\n if (!globalOptions.some((go) => opt.flags.startsWith(go.split(\",\")[0].trim()))) {\n const defaultValue = opt.default as string | boolean | string[] | undefined;\n subCmd.option(opt.flags as string, opt.description as string, defaultValue);\n }\n }\n }\n subCmd.action(async (args, options) => {\n await sub.run([args], options, container);\n });\n command.addCommand(subCmd);\n }\n }\n\n // 添加执行函数\n command.action(async (...actionArgs) => {\n const opts = actionArgs[actionArgs.length - 2] || {};\n const positionalArgs = actionArgs.slice(0, -2);\n // 合并全局 verbose 选项\n const globalOpts = program.opts();\n if (globalOpts.verbose && !opts.verbose) {\n opts.verbose = globalOpts.verbose;\n }\n await cmd.run(positionalArgs, opts, container);\n });\n\n program.addCommand(command);\n }\n\n // 9. 解析命令行参数\n await program.parseAsync(process.argv);\n\n // 10. 清理\n await container.destroy();\n}\n","// ============ 插件系统 ============\nexport * from \"./extension-system\";\n\n// ============ 基础能力模块 ============\n// Git Provider - 多平台 Git 托管 API 操作(GitHub、Gitea、GitLab)\nexport * from \"./shared/git-provider\";\n\n// Git SDK - Git 命令操作\nexport * from \"./shared/git-sdk\";\n\n// LLM Proxy - 多 LLM 适配器\nexport * from \"./shared/llm-proxy\";\n\n// Feishu SDK - 飞书 API 操作\nexport * from \"./shared/feishu-sdk\";\n\n// Storage - 存储服务\nexport * from \"./shared/storage\";\n\n// Claude Setup - Claude Agent 配置\nexport * from \"./shared/claude-setup\";\n\n// Parallel - 并行执行工具\nexport * from \"./shared/parallel\";\n\n// Output - 输出服务\nexport * from \"./shared/output\";\n\n// Verbose - 日志级别\nexport * from \"./shared/verbose\";\n\n// Editor Config - 编辑器配置\nexport * from \"./shared/editor-config\";\n\n// LLM JsonPut - JSON 结构化输出\nexport * from \"./shared/llm-jsonput\";\n\n// Source Utils - 源类型判断工具\nexport * from \"./shared/source-utils\";\n\n// Package Manager - 包管理器检测\nexport * from \"./shared/package-manager\";\n\n// Spaceflow Dir - .spaceflow 目录管理\nexport * from \"./shared/spaceflow-dir\";\n\n// Rspack Config - Rspack 配置工具\nexport * from \"./shared/rspack-config\";\n\n// MCP - Model Context Protocol 支持\n// 注意:McpToolDefinition 已在 extension-system/types.ts 中定义(用于 defineExtension 的 tools 字段)\n// 这里只导出装饰器和工具函数,避免重复导出\nexport {\n MCP_SERVER_METADATA,\n MCP_TOOL_METADATA,\n type JsonSchema,\n dtoToJsonSchema,\n type McpToolMetadata,\n McpServer,\n McpTool,\n isMcpServer,\n getMcpServerMetadata,\n getMcpTools,\n runMcpServer,\n} from \"./shared/mcp\";\n\n// I18n - 国际化\nexport * from \"./cli-runtime/i18n\";\n\n// Logger - 全局日志工具\nexport * from \"./shared/logger\";\n\n// ============ 配置相关 ============\nexport * from \"./config\";\n\n// ============ CLI Runtime ============\n// exec 入口、DI 容器、扩展加载器、i18n 初始化\nexport {\n exec,\n ServiceContainer,\n ExtensionLoader,\n initCliI18n,\n internalExtensions,\n} from \"./cli-runtime\";\n\n// ============ Zod 重导出 ============\nexport { z } from \"zod\";\n"],"names":["resolveSpaceflowConfig","config","packageName","packagePath","join","require","Object","name","exportConfig","defineExtension","definition","GIT_PROVIDER_MODULE_OPTIONS","REVIEW_STATE","DIFF_SIDE","detectProvider","env","process","explicit","isValidProvider","buildResult","value","provider","source","serverUrl","resolveServerUrl","token","resolveToken","GITHUB_HOSTS","Set","GITLAB_HOSTS","parseRepoUrl","url","trimmed","parseSshUrl","parseGitSshUrl","parseHttpUrl","parsed","URL","hostname","segments","Boolean","owner","repo","isGithub","isGithubHost","isGitlab","isGitlabHost","detectProviderForHost","ref","path","refType","match","host","pathPart","detected","GIT_STATUS_MAP","mapGitStatus","status","parseChangedLinesFromPatch","patch","changedLines","lines","currentLine","line","hunkMatch","parseInt","parseHunksFromPatch","hunks","calculateNewLineNumber","oldLine","offset","hunk","oldEnd","lineOffsetInHunk","calculateLineOffsets","oldLines","result","Map","parseDiffText","diffText","files","fileDiffs","fileDiff","headerMatch","filename","patchStart","execSync","GiteaAdapter","options","Error","method","body","headers","response","fetch","JSON","undefined","errorText","branch","encodeURIComponent","protections","existing","p","pushWhitelistUsernames","hasWhitelist","protectionOptions","listResult","ruleName","console","error","index","state","query","allPRs","page","limit","params","URLSearchParams","String","prs","allCommits","commits","needsPatch","f","diffFiles","patchMap","file","sha","baseSha","headSha","filepath","encodedPath","item","names","allLabels","nameToId","l","ids","id","commentId","allReviews","reviews","reviewId","review","comments","comment","teamId","GithubAdapter","variables","graphqlUrl","json","rules","rule","branchName","results","pr","perPage","c","allFiles","commit","Buffer","r","resolvedMap","u","data","commitObj","head","base","user","reviewers","teams","t","author","ghAuthor","ghCommitter","labels","assignees","milestone","a","prNumber","threads","thread","firstComment","QUERY","requiredReviews","event","eventMap","sort","sortMap","GitlabAdapter","project","namespace","pushLevel","glState","mr","allMRs","d","diffs","oldPath","newPath","diff","n","_owner","_repo","_commentId","_body","note","_reviewId","position","pushAccess","additions","deletions","stateMap","GitProviderService","spawn","GitSdkService","args","opts","Promise","resolve","reject","child","stdout","stderr","code","err","remoteUrl","baseRef","headRef","resolvedBase","resolvedHead","message","authorName","authorEmail","date","output","LLM_PROXY_CONFIG","Symbol","LLM_ADAPTER","LOG_LEVEL_PRIORITY","toLogLevel","normalizeVerbose","shouldLog","parseVerbose","readFile","writeFile","mkdir","copyFile","unlink","homedir","ClaudeSetupService","llmConfig","claudeDir","paths","e","fn","verbose","settingsPath","claudeJsonPath","claudeCode","existingSettings","content","mergedSettings","claudeJson","ClaudeCodeAdapter","messages","claudeConf","model","systemPrompt","userPrompt","handleUncaughtError","spawnEnv","spawnClaudeCodeProcess","spawnOptions","queryOptions","finalContent","structuredOutput","Array","block","systemMessage","m","userMessages","OpenAI","OpenAIAdapter","openaiConf","client","stream","fullContent","chunk","delta","createOpencode","OpenCodeAdapter","openCodeConf","providerID","configModel","opencode","port","Math","cleanup","customProviderID","session","Date","sessionId","modelID","part","partType","text","toolPart","agentPart","subtaskPart","stepPart","reasoningPart","randomUUID","LlmSessionImpl","adapter","userMessage","mergedOptions","assistantMessage","prompt","LlmProxyService","claudeCodeAdapter","openaiAdapter","openCodeAdapter","adapterType","type","jsonSchema","systemMsg","msg","available","createStreamLoggerState","logStreamEvent","tokens","FEISHU_CARD_ACTION_TRIGGER","EventEmitter","lark","FeishuSdkService","eventName","listener","done","userId","userIdType","departmentIdType","userIds","FeishuCardService","feishuSdkService","_eventHook","card","receiveId","receiveIdType","uuid","messageId","FEISHU_MODULE_OPTIONS","StorageService","clearInterval","setInterval","now","allKeys","cleaned","key","ttl","effectiveTtl","exists","maxKeys","currentSize","sizeAfterCleanup","keyWithExpire","Infinity","b","toEvict","i","pattern","validKeys","prefix","keysToDelete","deleted","MemoryAdapter","regexPattern","regex","RegExp","fs","FileAdapter","filePath","clearTimeout","setTimeout","dir","ParallelExecutor","tasks","total","completed","shouldStop","executeTask","task","lastError","attempt","pending","taskQueue","promise","taskIdOrder","items","getId","_","ms","parallel","OUTPUT_MARKER_START","OUTPUT_MARKER_END","OutputService","values","outputWithCache","EDITOR_DIR_MAPPING","DEFAULT_EDITOR","getEditorDirName","jsonrepair","JSON_FORMAT_INSTRUCTION","LlmJsonPut","schema","generateExample","s","obj","example","input","repaired","retryCount","isGitUrl","isLocalPath","getSourceType","normalizeSource","extractNpmPackageName","extractName","buildGitPackageSpec","getPackageManager","detectPackageManager","isPnpmWorkspace","existsSync","readFileSync","writeFileSync","addSpaceflowToDevDependencies","cwd","workDir","packageJsonPath","pkg","getSpaceflowDir","ensureSpaceflowDir","getSpaceflowCoreVersion","ensureSpaceflowPackageJson","ensureDependencies","loadExtensionsFromDir","ensureEditorGitignore","SPACEFLOW_DIR","PACKAGE_JSON","DEFAULT_EXTERNALS","DEFAULT_TS_RULE","createPluginConfig","coreOptions","pluginPath","entry","outDir","minimize","customExternals","customAlias","customRules","coreRoot","mergedExternals","alias","createMultiEntryPluginConfig","MCP_SERVER_METADATA","MCP_TOOL_METADATA","SWAGGER_API_MODEL_PROPERTIES","SWAGGER_API_MODEL_PROPERTIES_ARRAY","dtoToJsonSchema","dtoClass","prototype","propertyKeys","Reflect","properties","required","meta","typeMap","schemaType","reflectedType","prop","McpServer","target","McpTool","propertyKey","_descriptor","constructor","resolvedDefinition","isMcpServer","getMcpServerMetadata","getMcpTools","runMcpServer","service","serverInfo","tools","StdioServerTransport","server","tool","jsonSchemaToZod","z","shape","requiredFields","field","transport","GLOBAL_T_KEY","GLOBAL_ADD_LOCALE_KEY","setGlobalT","globalThis","setGlobalAddLocaleResources","getGlobalT","interpolate","template","k","val","globalT","addLocaleResources","ns","resources","resetI18n","platform","DEFAULT_LOCALE","CONFIG_FILE_NAME","normalizeLocale","raw","langOnly","lang","readLangFromConfig","configPath","readEnvLocale","readMacOSLocale","readWindowsLocale","readOSLocale","os","detectLocale","envLang","i18nextModule","coreZhCN","coreEn","i18next","buildZhCN","buildEn","clearZhCN","clearEn","commitZhCN","commitEn","createZhCN","createEn","devZhCN","devEn","installZhCN","installEn","listZhCN","listEn","mcpZhCN","mcpEn","runxZhCN","runxEn","schemaZhCN","schemaEn","setupZhCN","setupEn","uninstallZhCN","uninstallEn","updateZhCN","updateEn","allLocales","DEFAULT_NS","initCliI18n","lng","lngKey","translations","addI18nextResources","default","timestamp","PlainRenderer","label","tag","current","pct","suffix","skipped","skipReason","control","reason","ctx","errMsg","_prefix","detectMode","tuiRendererCache","loadTuiRenderer","TuiRenderer","resolveMode","mode","Logger","level","DEFAULT_SUPPORT_EDITOR","RC_FILE_NAME","deepMerge","getConfigPath","getConfigPaths","getEnvFilePaths","readConfigSync","writeConfigSync","getSupportedEditors","getDependencies","findConfigFileWithField","updateDependency","removeDependency","GitProviderConfigSchema","CiConfigSchema","ClaudeCodeConfigSchema","OpenAIConfigSchema","OpenCodeConfigSchema","GeminiConfigSchema","LlmConfigSchema","v","FeishuConfigSchema","StorageConfigSchema","SpaceflowConfigSchema","loadSpaceflowConfig","fileConfig","errors","spaceflowConfig","schemaRegistry","registerPluginSchema","registry","getRegisteredSchemas","SchemaGeneratorService","outputPath","baseSchema","configKey","fullSchema","gitignorePath","newContent","loadEnvFiles","ServiceContainer","storage","factory","registration","ENV_MAPPINGS","getEnvValue","envNames","setNestedValue","parts","getNestedValue","UnifiedConfigReader","merged","envValue","rawConfig","findProjectRoot","initializeContainer","container","storageDir","registerServiceFactories","baseUrl","ExtensionLoader","extension","cmd","svc","instance","ext","rspack","readdir","stat","dirname","createRequire","BuildService","extensionName","extensions","successCount","failCount","compiler","dependencies","parentDirs","linkPath","absolutePath","req","corePkgPath","extDir","entries","extPath","stats","startTime","closeErr","duration","info","warnings","w","customConfigPath","customConfigPathJs","module","buildExtension","buildService","hasErrors","rm","readdirSync","lstatSync","ClearService","isGlobal","home","editors","editor","editorDirName","editorRoot","spaceflowRoot","preserveFiles","toDelete","entryPath","editorName","skillsDir","commandsDir","clearExtension","_ctx","clearService","ScopeRuleSchema","CommitScopeConfigSchema","CommitMessageContentSchema","parseCommitMessage","firstLine","headerRegex","scope","subject","formatCommitMessage","header","spawnSync","micromatch","CommitService","configReader","llmProxyService","command","fileArgs","count","publishConfig","defaultTypes","commitConfig","pkgPath","groups","pkgInfo","packageInfo","finalScope","useUnstaged","packageGroups","firstGroup","commitTypes","typesList","recentCommits","packageContext","system","truncatedDiff","expectedScope","jsonPut","_packageInfo","strategyName","scopeGroups","groupData","analysis","validFiles","group","g","assignedFiles","missingFiles","aScope","bScope","pkgGroups","first","useWorking","sortedGroups","stageResult","pkgStr","executor","messageResults","failedResults","generatedMessages","preview","committedMessages","messageStr","commitResult","shortMsg","errorMsg","remaining","hasWorking","hasStaged","commitExtension","_args","llmProxy","commitService","createHash","CreateService","repoUrl","cacheDir","repoName","repoHash","targetDir","templatesInCwd","templatesInParent","devPath","__dirname","templatesDir","templates","entryStat","fullPath","templateDir","context","templatePath","targetSubDir","rendered","targetFileName","targetPath","str","word","pascal","createExtension","createService","devExtension","access","symlink","readlink","relative","InstallService","schemaGenerator","spaceflowDir","depName","depPath","pluginConfig","workingDir","editorExtensionsDir","installName","editorCommandsDir","commandPath","mcpItem","mcpPath","mcpConfig","mcpJsonPath","resolvedArgs","arg","serverConfig","envKey","sourcePath","packageSpec","normalizedSource","relativePath","pm","pkgJsonPath","baseName","gitName","nodeModulesPath","dirPath","cloneCmd","gitDir","linkTarget","resolvedTarget","depsDir","relativeSource","displayDepPath","displaySourcePath","cp","sourceType","depModuleName","activeTypes","globalDir","localInstalled","globalInstalled","updated","targetRef","currentCommit","targetCommit","existingTarget","_name","distIndexPath","isBranch","createEmptyConfig","createDefaultExtension","addExport","mcp","exp","extensionMdPath","pkgName","pkgDescription","pkgContent","readmeContent","readmePaths","readmePath","commandMdPath","cmdPkgJsonPath","helpContent","depValue","needInstall","needBuild","lockfilePath","nodeModulesStat","pkgJsonStat","lockfileStat","srcPath","distPath","distStat","srcMtime","latestMtime","subMtime","installExtension","installService","installOptions","ListService","extensionLoader","extensionInfos","installed","maxNameLen","installedCount","icon","typeLabel","displaySource","localPath","possiblePaths","listExtension","listService","McpService","inspector","extensionTools","allTools","allResources","resource","extensionResources","_uri","summary","sensitiveKeys","sanitize","sk","handler","uri","zodSchema","zodType","description","isOptional","innerType","zodShape","isRequired","mcpExtension","mcpService","realpathSync","RunxService","realDepPath","importUrl","dynamicImport","Function","pluginModule","extensionDef","commands","finalArgs","cmdName","cmdDef","runxExtension","cmdArgs","runxService","schemaExtension","stringify","SetupService","rcPath","defaultConfig","existingPath","globalConfigPath","localConfig","envPath","envConfig","instanceConfig","global","mergedConfig","eqIndex","topKey","restParts","nestedKey","objects","displayValue","sensitivePatterns","lowerKey","setupExtension","setupService","UninstallService","actualName","installRoot","removed","uninstallExtension","uninstallService","UpdateService","version","latestVersion","currentVersion","cliPath","nodeModulesIndex","projectRoot","pnpmGlobalDir","npmGlobalDir","cliPackageName","installation","success","updateExtension","updateService","internalExtensions","Command","exec","program","cliVersion","coreVersion","__CORE_VERSION__","versionOutput","prev","globalOptions","opt","go","defaultValue","sub","subCmd","actionArgs","positionalArgs","globalOpts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA,iCAAiC,WAAW;AAC5C;AACA;;;;;ACPA;AACA;AACA;AACA,kDAAkD,wCAAwC;AAC1F;AACA;AACA,E;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,E;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA,C;;;;ACNA,wF;;;;ACAA,2B;;;;ACAA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6BAA6B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrDA;;CAEC,GA8GD;;CAEC,GACM,SAASA,uBACdC,MAA0C,EAC1CC,WAAmB,EACnBC,WAAmB;IAEnB,MAAM,EAAEC,IAAI,EAAE,GAAGC,mBAAOA,CAAC,GAAM;IAE/B,IAAI,CAACJ,QAAQ;QACX,OAAO,EAAE;IACX;IAEA,oBAAoB;IACpB,IAAIA,OAAO,OAAO,EAAE;QAClB,OAAOK,OAAO,OAAO,CAACL,OAAO,OAAO,EAAE,GAAG,CAAC,CAAC,CAACM,MAAMC,aAAa,GAAM;gBACnED;gBACA,MAAMC,aAAa,IAAI,IAAI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"}
|