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 从多个位置加载,下面按优先级从高到低列出:

位置

路径

范围

项目

.cortex/skills/.claude/skills/

项目

用户

~/.snowflake/cortex/skills/~/.claude/skills/

用户

全局

~/.snowflake/cortex/skills/

系统

会话

临时添加

会话

远程

克隆自 Git

缓存

捆绑

内置于 Cortex Code

系统

创建自定义 Skill

Skill 是包含 SKILL.md 文件的目录,该文件包含 Skill 指令,并可包含可选的示例和模板。您可以在以下位置之一创建 Skill:

范围

路径

项目

.cortex/commands/ or .claude/commands/ in the project directory

全局

~/.snowflake/cortex/commands/

用户

~/.claude/commands/

要开始构建自定义 Skill,请执行以下操作:

  1. 创建 Skill 目录。此示例在项目位置创建一个名为“my-skill”的 Skill 目录:

    mkdir -p .cortex/skills/my-skill
    
    Copy
  2. 在该目录中创建 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]
    
    Copy
  3. 使用 $$ 命令验证您的 Skill 是否出现在列表中:

    > $$
    
    Copy

    如果您的 Skill 出现在列表中,则说明其已正确加载并可供使用。

  4. 在对话中使用您的 Skill:

    > $my-skill Test it out
    
    Copy

自定义 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
---
Copy

技能最佳实践

要编写高效的 Skill,请遵循以下准则:

  • 具体明确:清晰的指令可产生更好的效果

  • 提供示例:展示预期的输入和输出

  • 包括边缘情况:处理常见错误和异常

  • 保持专注:一个 Skill 等于一个领域或能力

管理 Skill

斜杠命令

描述

/skill

交互式 Skill 管理器

/skill list

列出所有技能

/skill sync <name>

同步到全局位置

/skill add <git-url>

添加远程 Skill

Skill 冲突

当相同的 Skill 存在于多个受支持的位置且内容不同时,会发生冲突,并且 Skill 列表中会出现冲突指示符。使用 /skill sync 通过将本地作用域同步到全局作用域来解决冲突。

组合 Skill

自定义 Skill 可以引用其他 Skill,或将 Skill 与文件上下文相结合:

> $code-review Review @src/auth.py following $security-guidelines
Copy

远程 Skill

您可以从 Git 存储库添加远程 Skill。一个存储库可以包含任意数量的 Skill。远程 Skill 的布局应与本地 Skill 结构相匹配。

/skill add https://github.com/org/my-skills.git
Copy

远程 Skill 在本地缓存。要更新,请使用 /skill sync

Skill 命令参考

CLI 命令:

cortex skill list
cortex skill add <path>
cortex skill remove <path>
Copy

斜杠命令:

/skill list
/skill add <path>
Copy

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
Copy

您还可以按名称显式请求特定的 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
Copy

您还可以请求多个 Subagent 并行运行,以处理任务的不同方面:

> In parallel, search for all test files and all config files
Copy

代理可以在后台运行,同时您继续工作:

> Run a background agent to refactor all the test files
Copy

代理立即启动,并返回代理 ID 用于跟踪。代理完成后,您可以使用其 ID 获取输出:

> Get the output from agent abc1234
Copy

要监控所有正在运行的 Subagent 状态,请使用 /agents 命令(或按 Ctrl-B)打开后台进程查看器。您可以使用其 ID 停止正在运行的代理,或通过 /agents 界面操作:

> kill agent abc1234
Copy

被终止的代理会停止运行,但其上下文会被无限期保留。您可以使用其 ID 恢复已终止的代理:

> Resume agent abc1234 and continue from where it left off
Copy

代理类型

自治

自治代理无需用户交互即可运行。代理:

  • 独立完成

  • 不会阻塞提问

  • 适合明确定义的任务

非自治

非自治代理可以暂停执行以向用户提问。代理:

  • 可能会提出澄清性问题

  • 可以交互式请求权限

  • 适合需要指导的任务

自定义

自定义代理是用户定义的 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.
Copy

示例:测试运行器代理

以下 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
Copy

代理配置

自定义代理的配置在 Markdown 文件的 YAML 前置信息中指定。

工具访问权限

代理可以指定可访问的工具:

tools:
- "*"           # All tools
- Bash          # Specific tools
- Read
- Write
Copy
模型选择

您可以为特定代理选择模型。这将替换会话的默认模型。

model: claude-sonnet-4-5   # Specific model
model: auto                # Cost-optimized
Copy

工作树隔离

代理可以在隔离的 Git 工作树或分支中运行。当您请求工作树隔离时,Cortex Code CLI 会为代理创建一个单独的 Git 工作树以运行。这允许多个代理并行运行而不会产生冲突,更易于事后清理。隔离的工作树对于探索和实验尤其有用。代理创建的 Git 分支命名为 agent/<agentId>

要使用工作树隔离,只需在提示中包含它:

> Run a background agent with worktree isolation to implement feature X
Copy

蜂群模式

您可以启动一组代理并行处理复杂任务的不同方面。每个代理独立工作,所有代理完成后,结果会被汇总。所有类型的代理都可以参与蜂群模式。

蜂群的用例包括:

  • 代码分析:多个代理分析不同方面

  • 重构:并行代理处理不同文件

  • 测试:代理运行不同测试套件

  • 文档:代理记录不同组件

要创建蜂群模式,只需描述要启动的不同代理:

> 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
Copy

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 在设置文件中配置,这些文件可以位于任意配置目录(按优先级从高到低列出):

位置

路径

本地

.claude/settings.local.json.cortex/settings.local.json

项目

.claude/settings.json.cortex/settings.json

用户

~/.claude/settings.json

全局

~/.snowflake/cortex/hooks.json

Hook 以 JSON 格式定义,指定事件、工具匹配器和 Hook 操作。下面显示了一个工具使用前 Hook 的简单示例:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash .claude/hooks/validate-bash.sh",
            "timeout": 60
          }
        ]
      }
    ]
  }
}
Copy

支持两种 Hook 类型:命令 Hook 和提示 Hook。

  • 命令 Hook 运行 Shell 命令或脚本。

    {
      "type": "command",
      "command": "bash /path/to/script.sh",
      "timeout": 60,
      "enabled": true
    }
    
    Copy
  • 提示 Hook 被评估为语言模型的自然语言提示。

    {
      "type": "prompt",
      "prompt": "Is this command safe? $ARGUMENTS",
      "timeout": 30
    }
    
    Copy

要仅在特定工具上执行 Hook,请将工具名称或模式放在 matcher 字段中。例如,要匹配所有 SQL 工具,请使用 "matcher": "SQL*"。您可以使用正则表达式匹配多个工具。

模式

匹配项

*

所有工具

Bash

仅 Bash

Edit|Write

编辑或写入

mcp__.*

所有 MCP 工具

Notebook.*

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"
  }
}
Copy

示例输出:

{
  "decision": "allow",
  "systemMessage": "Note: This operation was validated.",
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "updatedInput": {
      "command": "ls -la --color=never"
    }
  }
}
Copy

返回代码指示是否阻止操作:

  • 0:不阻止

  • 2:阻止

此信息也可以作为 JSON 输出的一部分返回,如下所示。

{
  "decision": "block",
  "reason": "Operation not allowed"
}
Copy

Hook 脚本中提供以下环境变量:

变量

描述

CORTEX_PROJECT_DIR

项目目录路径

CORTEX_CODE_REMOTE

``"true"``(如果是 Web 上下文)

CORTEX_ENV_FILE

持久环境文件路径

Hook 示例

以下示例展示了常见 Hook 用例的可能输出。

修改工具输入

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "updatedInput": {
      "command": "modified command"
    }
  }
}
Copy

添加上下文

{
  "hookSpecificOutput": {
    "hookEventName": "PostToolUse",
    "additionalContext": "Note: File was recently modified."
  }
}
Copy

显示系统消息

{
  "systemMessage": "Warning: This operation may take a while."
}
Copy

权限决策

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "allow",
    "permissionDecisionReason": "Auto-approved by policy"
  }
}
Copy

远程 Hook

您可以引用 Git 存储库中的脚本,如下所示:

{
  "type": "command",
  "command": "bash",
  "source": {
    "source": "github:org/hooks-repo/scripts/validate.sh",
    "ref": "main"
  }
}
Copy

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"
   }
}
Copy

管理 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...]
Copy

选项:

--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
Copy

备注

MCP 工具使用命名空间以避免冲突,格式如下:

mcp__{server-name}__{tool-name}
Copy

例如,来自服务器 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"]
      }
   }
}
Copy

环境变量

使用 ${VAR}$VAR 语法将环境变量的值插入配置文件。

{
"mcpServers": {
   "my-server": {
      "type": "http",
      "url": "https://api.example.com",
      "headers": {
      "Authorization": "Bearer ${MY_API_TOKEN}"
      }
   }
}
Copy

重要

最佳实践是使用环境变量存储凭据。切勿在 mcp.json 中硬编码令牌。在 Shell 的配置文件中添加一行,例如 ~/.bashrc~/.zshrc,如下所示:

export GITHUB_TOKEN="your_token_here"
Copy

通过命令行进行配置

要通过命令行添加 MCP 服务器,请使用 cortex mcp add 命令。例如:

操作

命令

添加 stdio 服务器

cortex mcp add git-server uvx mcp-server-git

添加 HTTP 服务器

cortex mcp add api-server https://api.example.com --type http

通过环境变量添加

cortex mcp add my-server npx my-mcp-server -e API_KEY=secret

通过标头添加

cortex mcp add my-server https://api.example.com -H "Authorization: Bearer token"

使用 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
Copy

首次使用时会请求权限。在 ~/.snowflake/cortex/permissions.json 中配置默认值:

{
  "allow": ["mcp__github__read_file", "mcp__github__list_repos"],
  "deny": ["mcp__github__delete_repo"]
}
Copy

MCP 配置示例

以下示例展示了常见用例的 MCP 服务器配置。

Git 服务器 (stdio)

{
  "mcpServers": {
    "git": {
      "type": "stdio",
      "command": "uvx",
      "args": ["mcp-server-git", "--repository", "/path/to/repo"]
    }
  }
}
Copy

带 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"
      }
    }
  }
}
Copy

带标头的 SSE 服务器

{
  "mcpServers": {
    "realtime": {
      "type": "sse",
      "url": "https://realtime.example.com/events",
      "headers": {
        "Authorization": "Bearer ${API_TOKEN}",
        "X-Custom-Header": "value"
      },
      "timeout": 30000
    }
  }
}
Copy

Sourcegraph 集成

{
  "mcpServers": {
    "sourcegraph": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@sourcegraph/mcp-server"],
      "env": {
        "SRC_ACCESS_TOKEN": "${SOURCEGRAPH_TOKEN}",
        "SRC_ENDPOINT": "https://sourcegraph.company.com"
      }
    }
  }
}
Copy

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