Cortex Code CLI 可扩展性¶
Cortex Code CLI 可以通过自定义行为、专用代理、生命周期 hook 以及外部工具集成进行扩展。本主题介绍四种主要的可扩展机制:
- Skills(技能)
将特定领域的知识和指令注入对话中的 Markdown 文件。使用 Skills 向 Cortex Code 传授您组织的最佳实践、编码规范或专业化工作流程。
- Subagents(子代理)
自主且专业化的 AI 代理,可独立处理特定任务。Subagents 支持并行执行、专注化的专业能力以及复杂的多步骤工作流程。
- Hooks(钩子)
在关键生命周期阶段拦截并自定义 Cortex Code 行为的脚本。使用钩子验证工具输入、记录操作或强制执行策略。
- MCP(模型上下文协议)
一种开放标准,用于将 Cortex Code 连接到外部工具和数据源,例如 GitHub、Jira 和数据库。
Skill¶
Skill 通过注入专门指令并启用附加工具,以特定领域的知识和能力扩展 Cortex Code。
什么是 Skill?¶
Skill 是包含以下内容的 Markdown 文件:
特定领域的指令和最佳实践
何时利用 Skill
示例工作流程
可选工具配置
当您调用某个 Skill 时,其指令会被注入到对话上下文中。
使用 Skill¶
运行 /skill list 列出可用的 Skill,并通过名称调用它们,将对应 Skill 加载到对话中。
Skill 位置¶
Skill 从多个位置加载,下面按优先级从高到低列出:
位置 |
路径 |
范围 |
|---|---|---|
项目 |
|
项目 |
用户 |
|
用户 |
全局 |
|
系统 |
会话 |
临时添加 |
会话 |
远程 |
克隆自 Git |
缓存 |
捆绑 |
内置于 Cortex Code |
系统 |
创建自定义 Skill¶
Skill 是包含 SKILL.md 文件的目录,该文件包含 Skill 指令,并可包含可选的示例和模板。您可以在以下位置之一创建 Skill:
范围 |
路径 |
|---|---|
项目 |
|
全局 |
|
用户 |
|
要开始构建自定义 Skill,请执行以下操作:
创建 Skill 目录。此示例在项目位置创建一个名为“my-skill”的 Skill 目录:
mkdir -p .cortex/skills/my-skill
在该目录中创建
SKILL.md文件,并添加 Skill 指令。此示例展示了基本结构:--- name: my-skill description: Brief description of what this skill does tools: - optional_tool_name --- # When to Use - Describe when this skill should be invoked - List specific user intents or scenarios # What This Skill Provides Explain the capabilities and knowledge this skill adds. # Instructions Step-by-step guidance for the AI when this skill is active. ## Best Practices - Best practice 1 - Best practice 2 ## Common Patterns ### Pattern 1 Description and example. ### Pattern 2 Description and example. # Examples ## Example 1: Basic Usage User: $my-skill Do something Assistant: [Expected behavior] ## Example 2: Advanced Usage User: $my-skill Complex task with @file.txt Assistant: [Expected behavior]
使用
$$命令验证您的 Skill 是否出现在列表中:> $$
如果您的 Skill 出现在列表中,则说明其已正确加载并可供使用。
在对话中使用您的 Skill:
> $my-skill Test it out
自定义 Skill 设置¶
每个 Skill 的选项都在 SKILL.md 文件顶部的 YAML frontmatter 中定义。支持的如下几个选项:
选项 |
描述 |
|---|---|
name: <skill name> |
需要:4,可用:2。唯一标识符 |
description: <description> |
需要:4,可用:2。在 $$ 列表中显示 |
tools: |
可选:要在此 Skill 中启用的工具 |
- tool_name_1 |
|
- tool_name_2 |
此示例展示了使用两种工具的 Skill:
---
name: database-admin
description: Database administration tasks
tools:
- snowflake_sql_execute
- snowflake_object_search
---
技能最佳实践¶
要编写高效的 Skill,请遵循以下准则:
具体明确:清晰的指令可产生更好的效果
提供示例:展示预期的输入和输出
包括边缘情况:处理常见错误和异常
保持专注:一个 Skill 等于一个领域或能力
管理 Skill¶
斜杠命令 |
描述 |
|---|---|
|
交互式 Skill 管理器 |
|
列出所有技能 |
|
同步到全局位置 |
|
添加远程 Skill |
Skill 冲突¶
当相同的 Skill 存在于多个受支持的位置且内容不同时,会发生冲突,并且 Skill 列表中会出现冲突指示符。使用 /skill sync 通过将本地作用域同步到全局作用域来解决冲突。
组合 Skill¶
自定义 Skill 可以引用其他 Skill,或将 Skill 与文件上下文相结合:
> $code-review Review @src/auth.py following $security-guidelines
远程 Skill¶
您可以从 Git 存储库添加远程 Skill。一个存储库可以包含任意数量的 Skill。远程 Skill 的布局应与本地 Skill 结构相匹配。
/skill add https://github.com/org/my-skills.git
远程 Skill 在本地缓存。要更新,请使用 /skill sync。
Skill 命令参考¶
CLI 命令:
cortex skill list
cortex skill add <path>
cortex skill remove <path>
斜杠命令:
/skill list
/skill add <path>
Skill 故障排除¶
- Skill 未激活
使用与 Skill 目的相关的特定语言
明确提及 Skill:“Use semantic-view-optimization”
检查可用性:
/skill list
- 意外行为
提供有关目标的更多背景信息
尝试更具体的请求
提交反馈:
/feedback
Subagent¶
Subagent 是自治的、专业化的 AI 代理,可独立处理特定任务。它们支持并行执行、专注的专业能力以及复杂的多步骤工作流程。
Subagent:
独立于主对话执行
拥有自己的上下文和工具访问权限
可以在前台或后台运行
专注于特定领域或任务
内置 Subagent 类型¶
general-purpose¶
可以访问所有工具的多用途代理。最适合:
复杂的研究任务
多步骤代码更改
需要多种工具的任务
explore¶
快速代码库探索专家。最适合用于:
按模式查找文件
在代码中搜索关键字
了解代码库结构
快速侦察
您可以指定 Explore 代理的搜索深度:
"quick":选择使用 时默认使用的角色和仓库。基本搜索"medium":选择使用 时默认使用的角色和仓库。中等探索"very thorough":选择使用 时默认使用的角色和仓库。全面分析
plan¶
设计并概述复杂的实施计划。最适合用于:
设计实施策略
识别关键文件
评估架构权衡
创建分步计划
feedback¶
结构化反馈收集。最适合用于:
收集用户输入
结构化问题
会话反馈
运行 Subagent¶
Cortex Code 会在适当情况下自动委派给 Subagent。例如,此查询委托给 Explore 代理:
> Find all files that import the authentication module
您还可以按名称显式请求特定的 Subagent 类型:
> Use an Explore agent to find all database query definitions
> Use the Explore agent to find all API endpoint definitions
> Launch a Plan agent to design the authentication refactor
您还可以请求多个 Subagent 并行运行,以处理任务的不同方面:
> In parallel, search for all test files and all config files
代理可以在后台运行,同时您继续工作:
> Run a background agent to refactor all the test files
代理立即启动,并返回代理 ID 用于跟踪。代理完成后,您可以使用其 ID 获取输出:
> Get the output from agent abc1234
要监控所有正在运行的 Subagent 状态,请使用 /agents 命令(或按 Ctrl-B)打开后台进程查看器。您可以使用其 ID 停止正在运行的代理,或通过 /agents 界面操作:
> kill agent abc1234
被终止的代理会停止运行,但其上下文会被无限期保留。您可以使用其 ID 恢复已终止的代理:
> Resume agent abc1234 and continue from where it left off
代理类型¶
- 自治
自治代理无需用户交互即可运行。代理:
独立完成
不会阻塞提问
适合明确定义的任务
- 非自治
非自治代理可以暂停执行以向用户提问。代理:
可能会提出澄清性问题
可以交互式请求权限
适合需要指导的任务
- 自定义
自定义代理是用户定义的 Subagent,具有专门的提示和配置。您可以在 Markdown 文件中创建针对特定领域或工作流程的代理,类似于自定义 Skill。
创建自定义 Subagent¶
自定义子代理在带有 YAML 前置信息的 Markdown 文件中定义。前置信息指定了代理的名称、描述、工具访问权限和模型。正文包含指导代理行为的系统提示。
您可以将自定义代理 Markdown 文件存储在以下三个位置之一:
范围 |
路径 |
|---|---|
项目 |
.cortex/agents/ or .claude/agents/ |
全局 |
~/.snowflake/cortex/agents/ |
用户 |
~/.claude/agents/ |
代理定义的格式如下所示:
---
name: my-agent
description: What this agent specializes in
tools:
- Bash
- Read
- Write
model: claude-sonnet-4-5
---
# System Prompt
You are a specialized agent for [domain].
## Your Responsibilities
1. Task 1
2. Task 2
## Guidelines
- Guideline 1
- Guideline 2
## Output Format
Describe expected output format.
示例:测试运行器代理¶
以下 Markdown 文件定义了一个自定义测试运行器代理,用于运行测试并汇总结果:
---
name: test-runner
description: Runs tests and reports results
tools:
- Bash
- Read
- Grep
---
# Test Runner Agent
You run tests and provide clear reports of the results.
## Process
1. Identify the test framework (pytest, jest, go test, etc.)
2. Run appropriate test command
3. Parse and summarize results
4. Highlight failures with relevant code context
## Output Format
## Test Results Summary
- Total: X
- Passed: Y
- Failed: Z
## Failures
### Test Name
- File: path/to/file.py
- Error: Description
- Relevant code snippet
代理配置¶
自定义代理的配置在 Markdown 文件的 YAML 前置信息中指定。
- 工具访问权限
代理可以指定可访问的工具:
tools: - "*" # All tools - Bash # Specific tools - Read - Write
- 模型选择
您可以为特定代理选择模型。这将替换会话的默认模型。
model: claude-sonnet-4-5 # Specific model model: auto # Cost-optimized
工作树隔离¶
代理可以在隔离的 Git 工作树或分支中运行。当您请求工作树隔离时,Cortex Code CLI 会为代理创建一个单独的 Git 工作树以运行。这允许多个代理并行运行而不会产生冲突,更易于事后清理。隔离的工作树对于探索和实验尤其有用。代理创建的 Git 分支命名为 agent/<agentId>。
要使用工作树隔离,只需在提示中包含它:
> Run a background agent with worktree isolation to implement feature X
蜂群模式¶
您可以启动一组代理并行处理复杂任务的不同方面。每个代理独立工作,所有代理完成后,结果会被汇总。所有类型的代理都可以参与蜂群模式。
蜂群的用例包括:
代码分析:多个代理分析不同方面
重构:并行代理处理不同文件
测试:代理运行不同测试套件
文档:代理记录不同组件
要创建蜂群模式,只需描述要启动的不同代理:
> Launch a swarm of agents:
> 1. Explore agent to find all database queries
> 2. Explore agent to find all API endpoints
> 3. Explore agent to find all test files
Subagent 最佳实践¶
将 Subagent 用于以下用途:
复杂任务:分解为可并行执行的子任务
探索:使用 Explore 代理进行代码库搜索
规划:在重大变更之前使用 Plan 代理
后台工作:不需要关注的长时间运行的任务
Subagent 可能不适合以下情况:
简单查询:直接使用工具更快
单文件编辑:主代理更高效
交互式工作:当您需要即时反馈时
详细提示通常更有效:
良好 |
查找包含数据库查询的所有 Python 文件,并按行号列出 |
|---|---|
更优 |
使用 Explore 代理(非常彻底)查找所有包含数据库查询的 Python 文件。对于每个文件,提取查询模式并识别潜在的 SQL 注入风险。 |
查看活动 Subagent¶
/agents命令在 Cortex Code 会话中使用
/agents命令打开交互式代理查看器。该界面显示所有正在运行的代理及其类型、状态和输出预览。- 后台进程查看器
在 Cortex Code CLI 会话中,按 Ctrl-B 可查看:
所有后台进程
代理会话
Bash 进程
代理限制¶
以下限制适用于 Cortex Code CLI 中的 Subagent:
最多 50 个并发后台代理
代理继承会话权限
后台代理无法生成其他后台代理
Hook¶
Hook 允许您在生命周期关键点拦截并自定义 Cortex Code 的行为。Hook 是为响应事件而执行的提示或 Shell 脚本:
使用工具之前:验证或修改工具输入
使用工具之后:添加上下文或日志结果
用户输入时:注入会话上下文
会话事件发生时:初始化或清理
Hook 事件¶
以下事件可以触发 Hook:
事件 |
描述 |
可以阻止 |
|---|---|---|
PreToolUse |
工具执行前 |
是 |
PostToolUse |
工具执行后 |
否 |
PermissionRequest |
需要权限时 |
是 |
UserPromptSubmit |
用户提交提示时 |
否 |
SessionStart |
会话开始时 |
否 |
SessionEnd |
会话结束时 |
否 |
PreCompact |
上下文压缩之前 |
否 |
Stop |
用户停止 Claude 时 |
否 |
SubagentStop |
Subagent 停止时 |
否 |
通知 |
系统通知时 |
否 |
设置 |
初始化期间 |
否 |
配置 Hook¶
Hook 在设置文件中配置,这些文件可以位于任意配置目录(按优先级从高到低列出):
位置 |
路径 |
|---|---|
本地 |
|
项目 |
|
用户 |
|
全局 |
|
Hook 以 JSON 格式定义,指定事件、工具匹配器和 Hook 操作。下面显示了一个工具使用前 Hook 的简单示例:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/validate-bash.sh",
"timeout": 60
}
]
}
]
}
}
支持两种 Hook 类型:命令 Hook 和提示 Hook。
命令 Hook 运行 Shell 命令或脚本。
{ "type": "command", "command": "bash /path/to/script.sh", "timeout": 60, "enabled": true }
提示 Hook 被评估为语言模型的自然语言提示。
{ "type": "prompt", "prompt": "Is this command safe? $ARGUMENTS", "timeout": 30 }
要仅在特定工具上执行 Hook,请将工具名称或模式放在 matcher 字段中。例如,要匹配所有 SQL 工具,请使用 "matcher": "SQL*"。您可以使用正则表达式匹配多个工具。
模式 |
匹配项 |
|---|---|
|
所有工具 |
|
仅 Bash |
|
编辑或写入 |
|
所有 MCP 工具 |
|
NotebookEdit、 NotebookExecute |
编写 Hook 脚本¶
Hook 脚本通过标准输入接收 JSON 输入,并通过标准输出返回 JSON 输出。输出中包含一个字段,用于指示操作是被允许还是被拒绝。(可选)Hook 脚本可以返回工具输入的修改版本。
示例输入:
{
"session_id": "abc123",
"transcript_path": "/path/to/transcript.json",
"cwd": "/working/directory",
"permission_mode": "default",
"hook_event_name": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "ls -la"
}
}
示例输出:
{
"decision": "allow",
"systemMessage": "Note: This operation was validated.",
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"updatedInput": {
"command": "ls -la --color=never"
}
}
}
返回代码指示是否阻止操作:
0:不阻止
2:阻止
此信息也可以作为 JSON 输出的一部分返回,如下所示。
{
"decision": "block",
"reason": "Operation not allowed"
}
Hook 脚本中提供以下环境变量:
变量 |
描述 |
|---|---|
|
项目目录路径 |
|
|
|
持久环境文件路径 |
Hook 示例¶
以下示例展示了常见 Hook 用例的可能输出。
修改工具输入¶
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"updatedInput": {
"command": "modified command"
}
}
}
添加上下文¶
{
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": "Note: File was recently modified."
}
}
显示系统消息¶
{
"systemMessage": "Warning: This operation may take a while."
}
权限决策¶
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "Auto-approved by policy"
}
}
远程 Hook¶
您可以引用 Git 存储库中的脚本,如下所示:
{
"type": "command",
"command": "bash",
"source": {
"source": "github:org/hooks-repo/scripts/validate.sh",
"ref": "main"
}
}
Hook 最佳实践¶
保持 Hook 快速:超时默认为 60 秒
优雅地处理错误:如果不确定,则返回 exit 0
用于调试的日志:写入文件以进行故障排除
使用匹配器:针对特定工具,而非全部工具
彻底测试:使用 Hook 管理器验证行为
模型上下文协议 (MCP)¶
您可以使用模型上下文协议 (MCP) 将 Cortex Code CLI 连接到外部工具和数据源。MCP 是用于将 AI 代理连接到外部工具(如 GitHub、Jira 和数据库)的开放标准。配置完成后, MCP 服务器使 Cortex Code 能够访问内置功能之外的托管工具。
传输类型¶
Cortex Code 支持三种 MCP 传输类型:
类型 |
用例 |
连接 |
|---|---|---|
stdio |
本地工具,CLI 包装器 |
使用 stdin/stdout 的子进程 |
http |
Web 服务、APIs |
HTTP 请求 |
sse |
实时服务 |
服务器发送的事件 |
您可以使用 OAuth 对 HTTP MCP 服务器进行身份验证。首次连接到配置为 OAuth 的服务器时,Cortex Code CLI 会打开浏览器窗口,用户在其中进行身份验证。生成的令牌会存储在 ~/.snowflake/cortex/mcp_oauth/ 中,并根据需要自动刷新。以下是示例 OAuth 配置:
{
"oauth": {
"client_id": "pre-registered-client-id",
"client_name": "My Client",
"redirect_port": 8585,
"scope": "openid mcp read write",
"authorization_server_url": "https://auth.example.com"
}
}
管理 MCP 服务器¶
您可以在交互式 Cortex Code CLI 会话中发出 /mcp 命令,以打开交互式 MCP 状态查看器。使用 cortex mcp 命令通过命令行管理 MCP 服务器配置。
命令 |
描述 |
|---|---|
命令行 |
Description |
cortex mcp add |
添加新服务器(见下文) |
cortex mcp list |
列出已配置的服务器 |
cortex mcp get <server> |
获取特定服务器的详细信息 |
cortex mcp remove <server> |
移除服务器 |
cortex mcp start <server> |
检查服务器状态和可用工具 |
添加服务器¶
cortex mcp add 命令接受用于配置服务器的选项。
cortex mcp add <name> <command> [args...]
选项:
--transport, -t Transport type (stdio, http, sse)
--type Alias for --transport
--env, -e Environment variable (KEY=value)
--header, -H HTTP header
--timeout Connection timeout in ms
备注
MCP 工具使用命名空间以避免冲突,格式如下:
mcp__{server-name}__{tool-name}
例如,来自服务器 github 的工具 search 被命名为 mcp__github__search。
MCP 配置¶
MCP 服务器配置存储在 ~/.snowflake/cortex/mcp.json 中的键 mcpServers 下。以下示例显示了包含单个 MCP 服务器的配置文件结构:
{
"mcpServers": {
"server-name": {
"type": "stdio",
"command": "command-to-run",
"args": ["arg1", "arg2"]
}
}
}
环境变量¶
使用 ${VAR} 或 $VAR 语法将环境变量的值插入配置文件。
{
"mcpServers": {
"my-server": {
"type": "http",
"url": "https://api.example.com",
"headers": {
"Authorization": "Bearer ${MY_API_TOKEN}"
}
}
}
重要
最佳实践是使用环境变量存储凭据。切勿在 mcp.json 中硬编码令牌。在 Shell 的配置文件中添加一行,例如 ~/.bashrc 或 ~/.zshrc,如下所示:
export GITHUB_TOKEN="your_token_here"
通过命令行进行配置¶
要通过命令行添加 MCP 服务器,请使用 cortex mcp add 命令。例如:
操作 |
命令 |
|---|---|
添加 stdio 服务器 |
|
添加 HTTP 服务器 |
|
通过环境变量添加 |
|
通过标头添加 |
|
使用 MCP 工具¶
配置完成后,MCP 工具会在 Cortex Code CLI 会话中自动可用。您可通过自然语言命令调用它们:
Show me recent GitHub pull requests
Create a Jira ticket for this bug
Query the PostgreSQL database for user activity
首次使用时会请求权限。在 ~/.snowflake/cortex/permissions.json 中配置默认值:
{
"allow": ["mcp__github__read_file", "mcp__github__list_repos"],
"deny": ["mcp__github__delete_repo"]
}
MCP 配置示例¶
以下示例展示了常见用例的 MCP 服务器配置。
Git 服务器 (stdio)¶
{
"mcpServers": {
"git": {
"type": "stdio",
"command": "uvx",
"args": ["mcp-server-git", "--repository", "/path/to/repo"]
}
}
}
带 OAuth 的 HTTP API¶
{
"mcpServers": {
"my-api": {
"type": "http",
"url": "https://api.example.com/mcp",
"oauth": {
"client_id": "my-client-id",
"redirect_port": 8585,
"scope": "openid mcp"
}
}
}
}
带标头的 SSE 服务器¶
{
"mcpServers": {
"realtime": {
"type": "sse",
"url": "https://realtime.example.com/events",
"headers": {
"Authorization": "Bearer ${API_TOKEN}",
"X-Custom-Header": "value"
},
"timeout": 30000
}
}
}
Sourcegraph 集成¶
{
"mcpServers": {
"sourcegraph": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@sourcegraph/mcp-server"],
"env": {
"SRC_ACCESS_TOKEN": "${SOURCEGRAPH_TOKEN}",
"SRC_ENDPOINT": "https://sourcegraph.company.com"
}
}
}
}
MCP 故障排除¶
- 服务器未连接
在会话中检查
/mcp,确保其已列出使用
cortex mcp start <服务器>测试连接性确保在环境变量中正确设置凭据
使用
cat ~/.snowflake/cortex/logs/mcp.log查看日志以获取线索
- 工具未显示
运行
cortex mcp list验证配置确保工具名称有效(仅包含字母、数字、下划线和连字符)
检查工具名称是否少于 64 个字符
- OAuth 问题
清除缓存的令牌:
rm ~/.snowflake/cortex/mcp_oauth/{server}*重新连接以触发新的 OAuth 流程
检查重定向端口是否可用(默认 8585)
- 环境变量未展开
使用
${VAR}语法(带大括号),而不是$VAR确保在 Shell 中设置了变量 (
echo $VAR)检查变量名称中的拼写错误
MCP 最佳实践¶
使用描述性服务器名称:使工具命名空间清晰
设置适当的超时:工具列表默认超时为 10 分钟
安全凭据:使用环境变量,而非硬编码密钥
测试连接:在依赖服务器之前使用
cortex mcp start