ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

@tm/bridge 迁移桥接层源码解析:从 legacy 脚本平滑过渡到 tm-core 的架构实践

@tm/bridge 迁移桥接层源码解析:从 legacy 脚本平滑过渡到 tm-core 的架构实践 tm/bridge 迁移桥接层源码解析从 legacy 脚本平滑过渡到 tm-core 的架构实践【免费下载链接】claude-task-masterAn AI-powered task-management system you can drop into Cursor, Lovable, Windsurf, Roo, and others.项目地址: https://gitcode.com/GitHub_Trending/cl/claude-task-master本文以 packages/tm-bridge/README.md 为主体结合该包全部源码与调用方实现系统讲解 Task Master 项目在从旧版脚本legacy scripts迁移到新架构 tm-core 期间如何通过一个临时桥接包统一封装API 存储探测、远端 AI 服务委派、CLI 与 MCP 行为一致性三大核心逻辑。读完你将掌握这套桥接模式的设计动机、五个桥接函数的参数与返回值契约、调用链走向以及判定该包何时可以整体删除的四个标准。一、为什么需要 tm/bridge迁移期的单一事实来源Task Master 正在经历一次架构升级旧版 CLI 与 MCP 直接函数仍依赖scripts/modules/task-manager/下的 legacy 脚本而新架构 tm-corepackages/tm-core将逐步接管全部领域能力。在两者并存期间必须保证同一份业务逻辑在 CLI 和 MCP 两个入口下表现一致于是诞生了tm/bridge。从 packages/tm-bridge/package.json 的描述可以确认它的定位TEMPORARY: Bridge layer for legacy code migration. DELETE when legacy scripts are removed.且private: true、版本号为空说明它不面向外部发布仅供仓库内部消费。该包需要解决的三类问题在 packages/tm-bridge/README.md 中明确列出API vs 文件存储探测判断当前项目是否使用远端 API 存储Hamster还是本地文件存储远端 AI 服务委派在 API 存储模式下把更新、展开、标签等操作委托给远端 AI 服务执行一致的行为无论从 CLI 命令还是 MCP 工具进入同样的操作得到同样的结果与输出格式。所有桥接逻辑统一收敛在这里形成迁移期间的单一事实来源single source of truth避免 CLI 与 MCP 各自实现一套导致行为分叉。二、迁移路径调用链的现在与未来README 用一张调用链图清晰标出了目标态这是理解整个包价值的关键Current: CLI → legacy scripts → tm/bridge → tm/core MCP → direct functions → legacy scripts → tm/bridge → tm/core Future: CLI → tm/core (TasksDomain) MCP → tm/core (TasksDomain) DELETE: legacy scripts, direct functions, tm/bridge现状CLI 与 MCP 的调用都要穿过 legacy 层再由桥接包决定走哪条路文件存储本地处理还是 API 存储远端处理最终落到 tm-core未来CLI 与 MCP 直接通过 tm-core 的 TasksDomain 访问能力legacy 脚本、direct functions 与桥接包三层全部删除。仓库中的真实调用方印证了这条链路的落点例如 scripts/modules/task-manager/expand-task.js 导入tryExpandViaRemotescripts/modules/task-manager/update-task-by-id.js 与 scripts/modules/task-manager/update-subtask-by-id.js 导入tryUpdateViaRemotescripts/modules/task-manager/tag-management.js 导入标签相关桥接函数而 CLI 侧 apps/cli/src/commands/briefs.command.ts 则从tm/bridge导入tryAddTagViaRemote与TagInfo类型。也就是说legacy 脚本与 CLI 命令共享同一份桥接实现正是单一事实来源的代码级证据。三、桥接包的统一入口与共享类型3.1 对外导出面packages/tm-bridge/src/index.ts 是包的唯一导出入口全量导出如下分类导出内容来源文件共享类型LogLevel、ReportFunction、OutputFormat、BaseBridgeParams、StorageCheckResultbridge-types.ts共享工具checkStorageTypebridge-utils.ts更新桥接tryUpdateViaRemote、UpdateBridgeParams、RemoteUpdateResultupdate-bridge.ts展开桥接tryExpandViaRemote、ExpandBridgeParams、RemoteExpandResultexpand-bridge.ts标签列表桥接tryListTagsViaRemote、TagsBridgeParams、RemoteTagsResult、TagInfotags-bridge.ts切换标签桥接tryUseTagViaRemote、UseTagBridgeParams、RemoteUseTagResultuse-tag-bridge.ts新增标签桥接tryAddTagViaRemote、AddTagBridgeParams、RemoteAddTagResultadd-tag-bridge.ts五个桥接函数遵循完全一致的设计约定返回值是结果对象或 null——null表示非 API 存储调用方应回退到本地文件逻辑非null表示 API 存储已接管该操作调用方直接使用结果即可。3.2 共享类型契约bridge-types.ts 定义了所有桥接函数共用的基础契约LogLevel info | warn | error | debug | success日志级别ReportFunction (level, ...args) void统一日志函数签名所有桥接函数用它上报运行信息而不是各自直接打日志OutputFormat text | json输出格式MCP 场景通常用jsonCLI 交互场景用textBaseBridgeParams所有桥接函数共用的参数基类字段如下字段类型必填默认值说明projectRootstring是—项目根目录桥接逻辑定位存储配置的基准isMCPboolean否false是否来自 MCP 上下文影响 UI 展示如 spinneroutputFormatOutputFormat否text输出格式reportReportFunction是—日志函数tagstring否—任务组织标签可选StorageCheckResultcheckStorageType的返回结构包含isApiStorage: boolean、可选的成功态tmCore?: TmCore实例、失败态error?: string。3.3 核心共享工具checkStorageTypepackages/tm-bridge/src/bridge-utils.ts 是所有桥接函数的公共前置步骤封装了三个固定动作调用createTmCore({ projectPath: projectRoot || process.cwd() })创建 tm-core 实例初始化失败则report(warn, ...)并返回{ isApiStorage: false, error }让调用方优雅回退通过tmCore.tasks.getStorageType()获取解析后的实际存储类型注释特意强调use resolved storage type, not config即最终生效值而非原始配置只有storageType api才返回isApiStorage: true否则返回false并附带可用的tmCore。getStorageType(): file | api的契约定义在 packages/tm-core/src/common/interfaces/storage.interface.ts 与第 426 行的抽象声明中桥接包正是通过该接口判断当前项目是走本地文件还是远端 API。四、五个桥接函数逐一拆解4.1 tryUpdateViaRemote任务/子任务更新update-bridge.ts 服务于update-task与update-subtask两个命令。其参数UpdateBridgeParams在BaseBridgeParams基础上增加taskId: string | number支持三种 ID 形态——纯数字1、字母数字TAS-49、点号层级1.2或TAS-49.1prompt: string交给 AI 的更新提示词appendMode?: boolean默认falsetrue时走 append 追加模式否则走 update 全量更新模式useResearch?: boolean默认false是否启用研究模式metadata?: Recordstring, unknown合并进任务的元数据支持纯元数据更新或与 prompt 并行。执行流程先checkStorageType探测非 API 存储直接return nullAPI 存储路径下用ora显示 spinner仅 CLI 文本模式然后调用tmCore.tasks.updateWithPrompt(String(taskId), prompt, tag, { mode, useResearch, ...(metadata { metadata }) })完成远端更新出错时只负责把 spinner 置为失败态错误直接重新抛出——因为注释明确说明 tm-core 已格式化好错误信息桥接层不再重复加工。一个值得注意的语义差异注释指出在 API 存储中任务与子任务没有父子层级被等同对待因此update-task与update-subtask可以互换使用这也是桥接层把两者收敛到同一函数的原因。4.2 tryExpandViaRemote任务展开expand-bridge.ts 服务于expand-task命令。参数在基类上增加numSubtasks?: number生成子任务数量缺省为 auto、useResearch?: boolean、additionalContext?: string附加生成上下文、force?: boolean即使已有子任务也强制重新生成。它比更新桥接多了两层 CLI 体验细节进入 API 路径前先用boxen chalk渲染一个Expanding Task via Hamster信息卡片展示 Task ID、Subtasks、Use Research、Force、Context 五项摘要其中additionalContext默认只显示[provided]/[none]仅当环境变量TM_DEBUG 1时才截断展示前 60 字符成功后在绿色卡片中输出task-master show taskId的 CLI 替代命令提示方便用户直接在终端查看结果并尽可能附加远端任务链接result.taskLink。调用的是tmCore.tasks.expand(String(taskId), tag, { numSubtasks, useResearch, additionalContext, force })并如实传达展开已在 Hamster 后台排队、子任务异步生成的语义。4.3 tryListTagsViaRemote标签列表tags-bridge.ts 服务于list-tags命令。在 API 存储中标签被称为 briefs任务计数从远端数据库获取。参数增加showMetadata?: boolean与skipTableDisplay?: boolean后续要进行交互选择时跳过表格渲染。流程要点调用tmCore.tasks.getTagsWithStats()获取带统计信息的标签列表远端服务已按 status 与 updatedAt 排序本地再稳定排序一次当前标签恒置顶其余保持服务端顺序文本模式下用cli-table3渲染表格列依次为 Tag Name / Status / Updated / Tasks / Completed列宽按终端宽度动态计算取process.stdout.columns与 80 的较大值再乘 0.95权重为 0.35/0.25/0.2/0.1/0.1当前标签以绿色●标记并附 brief ID 后 8 位短码返回RemoteTagsResult包含tags: TagInfo[]、currentTag、totalTags与消息。4.4 tryUseTagViaRemote切换标签use-tag-bridge.ts 服务于use-tag命令参数仅需tagName: string。切换前通过tmCore.auth.getContext()记录旧上下文取briefName作为previousTag调用tmCore.tasks.switchTag(tagName)后再次读取新上下文得到currentTag与briefId短码并通过tmCore.tasks.list()统计新标签下的任务数。成功卡片展示 Previous Tag / Current Tag / Brief ID / Available Tasks 四项返回结构RemoteUseTagResult完整携带previousTag、currentTag、switched、taskCount字段。4.5 tryAddTagViaRemote新增标签重定向到 Web UIadd-tag-bridge.ts 是五个桥接中唯一不直接执行远端操作的函数API 存储下标签brief必须在 Hamster Web 界面创建。它通过tmCore.auth.getBriefCreationUrl()生成创建链接该方法的上下文校验逻辑可参考 packages/tm-core/src/modules/auth/auth-domain.ts 及其测试 auth-domain.spec.ts若 URL 为空则报错提示先执行tm context org选择组织。成功时用ui.displayCardBox渲染提示卡片footer 给出三个后续接入方式tm briefs select brief-nametm briefs select brief-idtm briefs select (interactive)返回结构RemoteAddTagResult包含redirectUrl调用方如 briefs.command.ts据此引导用户跳转。五、接入示例与回退约定README 给出的标准用法如下import { tryUpdateViaRemote } from tm/bridge; const result await tryUpdateViaRemote({ taskId: 1.2, prompt: Update task..., projectRoot: /path/to/project, // ... other params });结合源码一个完整的调用方应当这样处理返回值const result await tryUpdateViaRemote({ taskId: 1.2, prompt: Update task..., projectRoot: process.cwd(), appendMode: false, useResearch: false, report: (level, ...args) console.log([${level}], ...args) }); if (result null) { // 非 API 存储走本地文件逻辑 // ... file-based update implementation } else if (result.success) { // API 存储已处理完毕 console.log(result.message); }这是所有桥接函数统一遵守的**返回 null 即回退约定**桥接层绝不替调用方做文件存储的兜底实现只负责探测与委派职责边界清晰。六、什么时候可以删除这个包README 明确给出四个删除条件全部满足后即可整体移除✅scripts/modules/task-manager/下的 legacy 脚本被移除✅mcp-server/src/core/direct-functions/下的 MCP 直接函数被移除✅ 所有功能已迁移到 tm-core✅ CLI 与 MCP 均通过 tm-core 的 TasksDomain 直接访问能力。删除范围同样明确legacy scripts、direct functions、tm/bridge三层一并删除。届时上文的调用链图将从三跳收敛为一跳CLI/MCP → tm/core。七、工程约束与注意事项禁止积累新功能README 末尾特别强调This package should NOT accumulate new features. Its a temporary migration aid only.——迁移期内只允许承载既有桥接逻辑不允许把它当作长期模块持续演进依赖面刻意收窄从 package.json 可见运行依赖仅tm/core与四个展示类库chalk、boxen、ora、cli-table3脚本提供testvitest、lintbiome、typechecktsc工程实践上保持最小化类型即文档所有参数与返回类型都以 TypeScript 接口形式内联在桥接文件中字段注释直接说明取值语义如 taskId 的三种形态、appendMode 与 useResearch 的默认值迁移期接手代码的开发者不需要翻找 legacy 实现即可安全调用输出双轨制每个桥接函数都通过isMCP与outputFormat两个开关区分 CLI 交互spinner、boxen 卡片、表格与 MCP 机器消费纯结构化返回从 index.ts 的导出与调用方测试如 tests/unit/scripts/modules/task-manager/expand-task.test.js 中对tm/bridge的 mock可见该契约被严格遵循。结语tm/bridge是一个生命周期即设计的典型样本它用五个体积精简、契约统一的桥接函数在架构迁移的过渡期承载了存储探测、远端委派与 CLI/MCP 一致性三件大事让旧脚本与新内核可以安全并存、逐点替换。理解它等于理解了 Task Master 从 legacy 走向 tm-core 的那条最短迁移路径——以及临时代码也要有清晰边界和明确退出条件的工程取舍。【免费下载链接】claude-task-masterAn AI-powered task-management system you can drop into Cursor, Lovable, Windsurf, Roo, and others.项目地址: https://gitcode.com/GitHub_Trending/cl/claude-task-master创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表