14-命令架构与注册机制
14. 命令架构与注册机制所属分组命令系统概述Claude Code 的斜杠命令slash command系统是 REPL 交互体验的核心骨架。用户在终端中输入/clear、/help、/commit等指令时背后是一条层次清晰、可扩展、可懒加载的命令流水线从内置命令数组到插件命令、Skill 目录命令、Bundled Skill、MCP 命令再到动态发现的 workflow 命令最终通过统一的getCommands(cwd)入口对外暴露。整条流水线的设计目标可以概括为三点第一启动快——绝大多数命令实现都被设计成懒加载index.ts只暴露极小的元数据对象第二可扩展——通过loadedFrom、source、availability、isEnabled等字段支持插件、MCP、feature flag、auth 状态等多维度裁剪第三安全可控——通过REMOTE_SAFE_COMMANDS、BRIDGE_SAFE_COMMANDS两道白名单将命令暴露面收敛到远程/移动端场景下安全的子集。本文从commands.ts、types/command.ts以及代表性命令目录commands/clear/、commands/help/入手剖析命令的注册流程、类型定义、过滤策略与目录组织模式。源码位置[commands.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/commands.ts)[types/command.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/types/command.ts)[commands/clear/index.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/commands/clear/index.ts)[commands/help/index.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/commands/help/index.ts)[commands/clear/clear.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/commands/clear/clear.ts)[commands/help/help.tsx](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/commands/help/help.tsx)核心实现分析1. Command 类型定义三种命令形态types/command.ts把所有命令统一抽象为Command CommandBase (PromptCommand | LocalCommand | LocalJSXCommand)即基础信息 三选一的执行体。CommandBase携带所有命令共有的元数据exporttypeCommandBase{availability?:CommandAvailability[]description:stringhasUserSpecifiedDescription?:booleanisEnabled?:()booleanisHidden?:booleanname:stringaliases?:string[]argumentHint?:stringwhenToUse?:stringloadedFrom?:commands_DEPRECATED|skills|plugin|managed|bundled|mcpkind?:workflowimmediate?:booleanisSensitive?:booleanuserFacingName?:()string}三种执行体对应三种命令形态PromptCommandtype: prompt命令本质是一段会被注入到模型上下文中的 prompt。它通过getPromptForCommand(args, context)返回ContentBlockParam[]常用于 skill如/commit会展开成帮我生成 commit message 并执行 git的指令。它还携带allowedTools、model、hooks、context: inline | fork、paths等字段决定 prompt 如何被模型消费。LocalCommandtype: local纯本地副作用命令例如/clear清空对话、/cost查看花费。它通过load()懒加载一个LocalCommandModule其call(args, context)返回{ type: text | compact | skip }。LocalJSXCommandtype: local-jsx需要渲染 Ink UI 的命令例如/help、/config。它的call(onDone, context, args)返回React.ReactNode由 REPL 渲染。local-jsx命令天然不能在非交互模式下运行也默认被 bridge 屏蔽。getCommandName与isCommandEnabled是两个工具函数前者优先取userFacingName()否则回落到name用于插件前缀剥离等场景后者把isEnabled缺省视为true。2. 命令注册commands.ts的中央清单commands.ts顶部一口气import了几乎所有内置命令模块并对一些依赖 feature flag 的命令使用require() 条件判断包裹constultraplanfeature(ULTRAPLAN)?require(./commands/ultraplan.js).default:nullconstvoiceCommandfeature(VOICE_MODE)?require(./commands/voice/index.js).default:null这种feature flag 守卫的 require配合 Bun 的 dead code elimination让外部发布版本能直接把内部功能从产物里抹掉而无需在运行时做软开关。随后是一个被memoize包裹的COMMANDS()函数返回内置命令数组。注意它不是模块级常量而是函数——注释明确说明“underlying functions read from config, which can’t be read at module initialization time”。这是为了避免在模块加载阶段就读取配置导致的状态泄漏constCOMMANDSmemoize(():Command[][addDir,advisor,agents,branch,btw,chrome,clear,/* ... */vim,...(webCmd?[webCmd]:[]),...(proactive?[proactive]:[]),...(process.env.USER_TYPEant!process.env.IS_DEMO?INTERNAL_ONLY_COMMANDS:[]),])INTERNAL_ONLY_COMMANDS是一个独立数组列出仅在 Anthropic 内部 (USER_TYPE ant) 构建中可见的命令commit、commitPushPr、bughunter、version、ultraplan、antTrace等普通用户构建会通过process.env.IS_DEMO等条件过滤掉。3. 多源命令汇聚loadAllCommands与getCommands内置命令只是冰山一角。getSkills(cwd)异步并行加载四类Skill 形态命令getSkillDirCommands(cwd)从.claude/skills/等目录扫描出的命令getPluginSkills()从已启用插件中提取的 skill 命令getBundledSkills()随包内置的 skillskills/bundled/如batch、debug、loop、verifygetBuiltinPluginSkillCommands()内置插件提供的 skill 命令。任何一个加载失败都被catch兜底为[]避免单个 skill 故障拖垮整个命令系统。loadAllCommands(cwd)用Promise.all同时拉取 skills、getPluginCommands()、getWorkflowCommands(cwd)再按固定顺序拼接bundled → builtinPlugin → skillDir → workflow → pluginCommands → pluginSkills → COMMANDS()。这个顺序决定了 typeahead 中命令的展示优先级——内置命令总在最后方便用户优先看到自定义 skill。最终的对外入口getCommands(cwd)在loadAllCommands结果之上做三件事调用getDynamicSkills()取文件操作过程中动态发现的 skill用meetsAvailabilityRequirementisCommandEnabled双重过滤对动态 skill 做去重并插入到内置命令之前、其他命令之后的位置。注释特别强调meetsAvailabilityRequirement不做 memoize因为 auth 状态可能在会话中变化比如用户刚执行了/login必须每次调用都重新评估。4.filterCommandsForRemoteMode远程模式白名单--remote模式下REPL 渲染前会调用filterCommandsForRemoteMode(commands)只保留REMOTE_SAFE_COMMANDS集合中的命令exportconstREMOTE_SAFE_COMMANDS:SetCommandnewSet([session,exit,clear,help,theme,color,vim,cost,usage,copy,btw,feedback,plan,keybindings,statusline,stickers,mobile,])注释点明这套白名单的判定标准“only affect local TUI state and don’t depend on local filesystem, git, shell, IDE, MCP”。它在两处被使用main.tsx在 REPL 渲染前预过滤避免和 CCR 初始化消息竞态以及 REPL 的handleRemoteInit在 CCR 过滤后保留本地命令。与之并列的还有BRIDGE_SAFE_COMMANDS与isBridgeSafeCommand用于从移动端/Web 客户端通过 Remote Control bridge 进来的命令。isBridgeSafeCommand的策略是local-jsx一律屏蔽会弹 Ink UIprompt一律允许本质是文本展开local命令必须在BRIDGE_SAFE_COMMANDS显式 opt-in。注释里提到 PR #19134 曾因/model从 iOS 触发本地 Ink picker 而 blanket-block 所有斜杠命令现在改为显式 allowlist。5.index.ts模式元数据与实现分离每个命令目录都遵循同一套index.ts暴露元数据、同名.ts/.tsx暴露实现的模式。以clear为例// commands/clear/index.tsconstclear{type:local,name:clear,description:Clear conversation history and free up context,aliases:[reset,new],supportsNonInteractive:false,load:()import(./clear.js),}satisfies Commandload返回一个动态import()只有用户真正输入/clear时才会加载clear.ts。clear.ts本身只是call函数的薄封装// commands/clear/clear.tsexportconstcall:LocalCommandCallasync(_,context){awaitclearConversation(context)return{type:text,value:}}help命令则是local-jsx形态的典型// commands/help/index.tsconsthelp{type:local-jsx,name:help,description:Show help and available commands,load:()import(./help.js),}satisfies Command// commands/help/help.tsx export const call: LocalJSXCommandCall async (onDone, { options: { commands } }) { return HelpV2 commands{commands} onClose{onDone} / }这种index.ts极简 实现懒加载的模式是整个commands/目录的一致约定让启动时只需评估几百个轻量元数据对象而无需把所有命令的依赖git、Ink 组件、LSP 客户端等全部拉进启动图。6. 辅助工具findCommand/getCommand/formatDescriptionWithSourcecommands.ts还提供了一系列查找与展示工具findCommand(name, commands)按name、getCommandName()、aliases三种方式匹配getCommand在找不到时抛出ReferenceError并把所有可用命令名含 alias拼接进错误信息方便用户排查formatDescriptionWithSource(cmd)给 prompt 类型命令的描述加上来源标注plugin 名、bundled、workflow等用于 typeahead 和帮助屏但模型侧仍直接使用cmd.description以避免污染语义。clearCommandsCache与clearCommandMemoizationCaches提供缓存失效能力前者连 skill 缓存一起清后者只清loadAllCommands、getSkillToolCommands、getSlashCommandToolSkills三层 memoize用于动态 skill 增量添加时刷新命令列表而不重建整个 skill 索引。关键设计要点懒加载优先index.ts只暴露satisfies Command的元数据对象实现通过load: () import(./xxx.js)在调用时才加载把启动开销压到最低。配置延后求值COMMANDS被定义为memoize的函数而非顶层常量因为部分命令的isEnabled依赖运行时配置只有getCommands真正被调用时才触发求值。多维度过滤availabilityauth 静态属性isEnabledfeature flag/环境动态属性REMOTE_SAFE_COMMANDS/BRIDGE_SAFE_COMMANDS场景白名单三层过滤分别承担谁能用“现在能不能用”在哪个通道能用三个正交维度。dead code elimination 友好内部命令通过feature(...)守卫的require写法让 Bun 在打包外部发行版时直接删除整段代码比运行时 if 判断更彻底。失败隔离getSkills中每一类 skill 加载都单独catch避免一个损坏的插件或 skill 目录让整个getCommands抛错。与其他模块的关系skills/loadSkillsDir.ts、bundledSkills.ts、builtinPlugins.ts提供命令的skill 形态来源被getSkills聚合。utils/plugins/loadPluginCommands.ts插件命令与插件 skill 的加载入口对应getPluginCommands/getPluginSkills。utils/auth.ts、utils/model/providers.tsmeetsAvailabilityRequirement依赖它们判断claude-ai/console/3P 服务身份。screens/REPL.tsx与main.tsxgetCommands的主要消费者REPL 渲染、typeahead、命令分发都基于它返回的列表。tools/SkillToolgetSkillToolCommands与getSlashCommandToolSkills为 SkillTool 提供模型可调用的 prompt 命令集合把命令系统和工具系统打通。services/mcp/MCP 加载的命令通过getMcpSkillCommands单独过滤绕开getCommands的主清单由调用方按需注入。小结Claude Code 的命令系统把丰富和快这对矛盾拆到了三个层次解决类型层用Command联合类型把 prompt/local/local-jsx 三种执行体统一到一个接口下注册层用COMMANDS()loadAllCommands把内置、插件、skill、workflow 等多源命令汇聚到一条流水线过滤层用availability/isEnabled/REMOTE_SAFE_COMMANDS三道闸门按场景裁剪。配合index.ts懒加载约定与feature()dead code elimination整个系统在拥有上百条命令的同时仍能保持亚秒级启动是后续每一条具体命令commit、review、config、plan 等能被简洁实现的基础。

相关新闻

终极指南:如何在Windows上免费获取完整功能的Postman便携版

终极指南:如何在Windows上免费获取完整功能的Postman便携版

终极指南:如何在Windows上免费获取完整功能的Postman便携版 【免费下载链接】postman-portable 🚀 Postman portable for Windows 项目地址: https://gitcode.com/gh_mirrors/po/postman-portable 你是一个文章写手,你负责为开源项目写…

2026/10/13 14:52:00 阅读更多 →
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建

账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建

多数企业依靠Excel手工统计应收账龄,普遍存在漏单、错分层、更新滞后等问题:发货开票单据零散、分次回款、红字冲销、预收款抵扣业务手工匹配极易遗漏;超180天长期逾期客户隐藏在海量台账中无法及时识别,坏账风险持续扩大&#xf…

2026/10/5 11:12:27 阅读更多 →
如何用Redline解决SwiftUI对齐难题?完整实现指南

如何用Redline解决SwiftUI对齐难题?完整实现指南

如何用Redline解决SwiftUI对齐难题?完整实现指南 【免费下载链接】Redline Redlines for SwiftUI 项目地址: https://gitcode.com/gh_mirrors/redli/Redline SwiftUI开发中,布局对齐问题常常让开发者头疼。当界面元素没有按预期对齐时&#xff0c…

2026/10/4 7:11:50 阅读更多 →

最新新闻

Redisson集成全攻略:原始依赖与Spring Boot Starter实战对比

Redisson集成全攻略:原始依赖与Spring Boot Starter实战对比

在实际项目中,用 Redis 做分布式锁、缓存预热、接口幂等性控制,几乎是 Java 后端开发绕不开的日常操作。而 Redisson 作为 Redisson 官方出品的 Java 客户端,能提供分布式锁、限流器、消息队列、本地缓存等一系列高级能力,很多团队…

2026/10/14 7:07:35 阅读更多 →
AnyPS5实战指南:从局域网到公网,让任何设备都能远程玩PS5

AnyPS5实战指南:从局域网到公网,让任何设备都能远程玩PS5

你是不是也遇到过这种场景:客厅电视被家里人占着追剧,刚入手的 PS5 只能搁那儿吃灰;出差住酒店,手痒想打两把,主机却远在几百公里外;晚上躺在床上想玩会儿游戏,又懒得把显示器和主机全搬到卧室。…

2026/10/14 7:07:34 阅读更多 →
Natron G‘MIC Wave 节点完全指南:波浪变形滤镜的参数详解与应用配置

Natron G‘MIC Wave 节点完全指南:波浪变形滤镜的参数详解与应用配置

音视频视频处理图形学桌面应用 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_mirrors/na/Natron 点击查看 …

2026/10/14 7:07:34 阅读更多 →
基于蝴蝶优化算法的IEEE30节点无功优化Matlab实现

基于蝴蝶优化算法的IEEE30节点无功优化Matlab实现

1. 无功优化问题的工程本质与算法选型逻辑1.1 无功功率优化到底在优化什么做过电力系统仿真的朋友都知道,最优无功功率分配(ORPD)和最优潮流(OPF)之间有一条清晰的边界:OPF关心的是整个电网的经济运行点&am…

2026/10/14 7:07:34 阅读更多 →
管网三维自动化建模的关键技术:数据治理、拓扑生成与参数调优

管网三维自动化建模的关键技术:数据治理、拓扑生成与参数调优

简介:蚂蚁管网三维自动化建模软件是一款面向城市管网规划、设计与维护人员的专业工具,将二维管网数据(如CSV中的坐标与属性)自动转化为三维模型,支持OBJ与3DTiles格式输出,可无缝对接GIS、BIM等平台。压缩包…

2026/10/14 7:07:34 阅读更多 →
TypeScript只读映射类型:Readonly<Record>与直接声明对比

TypeScript只读映射类型:Readonly<Record>与直接声明对比

1. TypeScript 只读映射类型深度解析在 TypeScript 的类型系统中&#xff0c;Readonly<Record<K, V>> 和 { readonly [K in Key]: Value } 这两种看似相似的只读映射类型声明方式&#xff0c;在实际项目中有完全不同的类型行为和适用场景。作为从 TypeScript 1.5 版…

2026/10/14 7:06:34 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →