Skip to main content

常见工作流

使用 CSC 探索代码库、修复 Bug、重构、测试和其他日常任务的分步指南。

本页面涵盖了日常开发的实用工作流:探索不熟悉的代码、调试、重构、编写测试、创建 PR 以及管理会话。每个部分都包含示例提示,你可以根据自己的项目进行调整。有关更高层次的模式和技巧,请参阅最佳实践。

理解新代码库

快速了解代码库概览

假设你刚加入一个新项目,需要快速了解其结构。

  1. 导航到项目根目录

    cd /path/to/project
  2. 启动 CSC

    csc
  3. 请求高层次概览

    给我介绍一下这个代码库的概览
  4. 深入特定组件

    解释这里使用的主要架构模式
    关键的数据模型有哪些?
    认证是如何处理的?

💡 提示:

  • 从广泛的问题开始,然后缩小到特定领域
  • 询问项目中使用的编码约定和模式
  • 请求项目特定术语的词汇表

查找相关代码

假设你需要定位与特定功能或特性相关的代码。

  1. 让 CSC 查找相关文件

    查找处理用户认证的文件
  2. 了解组件如何交互

    这些认证文件是如何协同工作的?
  3. 理解执行流程

    从前端到数据库追踪登录过程

💡 提示:

  • 明确说明你要查找的内容
  • 使用项目中的领域语言
  • 为你的语言安装代码智能插件,以便为 CSC 提供精确的"转到定义"和"查找引用"导航

高效修复 Bug

假设你遇到了一条错误消息,需要找到并修复其来源。

  1. 与 CSC 分享错误

    我在运行 npm test 时看到了一个错误
  2. 请求修复建议

    建议几种修复 user.ts 中 @ts-ignore 的方法
  3. 应用修复

    更新 user.ts 以添加你建议的空值检查

💡 提示:

  • 告诉 CSC 重现问题的命令并获取堆栈跟踪
  • 提及重现错误的任何步骤
  • 让 CSC 知道错误是间歇性的还是持续性的

重构代码

假设你需要更新旧代码以使用现代模式和实践。

  1. 识别需要重构的遗留代码

    在我们的代码库中查找已弃用的 API 用法
  2. 获取重构建议

    建议如何重构 utils.js 以使用现代 JavaScript 特性
  3. 安全地应用更改

    重构 utils.js 以使用 ES2024 特性,同时保持相同的行为
  4. 验证重构

    为重构的代码运行测试

💡 提示:

  • 让 CSC 解释现代方法的好处
  • 在需要时请求更改保持向后兼容性
  • 以小的、可测试的增量进行重构

使用专用子代理

假设你想使用专用 AI 子代理来更有效地处理特定任务。

  1. 查看可用的子代理

    /agents

    这将显示所有可用的子代理,并允许你创建新的子代理。

  2. 自动使用子代理

    CSC 会自动将适当的任务委派给专用子代理:

    审查我最近的代码更改是否存在安全问题
    运行所有测试并修复任何失败
  3. 显式请求特定子代理

    使用 code-reviewer 子代理检查 auth 模块
    让 debugger 子代理调查为什么用户无法登录
  4. 为你的工作流创建自定义子代理

    /agents

    然后选择"Create New subagent"并按照提示定义:

    • 描述子代理用途的唯一标识符(例如 code-reviewerapi-designer
    • CSC 何时应使用此代理
    • 它可以访问哪些工具
    • 描述代理角色和行为的系统提示

💡 提示:

  • .costrict/agents/ 中创建项目特定的子代理以便团队共享
  • 使用描述性的 description 字段来启用自动委派
  • 将工具访问限制为每个子代理实际需要的
  • 查看子代理文档以获取详细示例

使用计划模式进行安全的代码分析

计划模式指示 CSC 通过只读操作分析代码库来创建计划,非常适合探索代码库、规划复杂更改或安全地审查代码。在计划模式下,CSC 使用 AskUserQuestion 来收集需求并在提出计划之前明确你的目标。

何时使用计划模式

  • 多步骤实现:当你的功能需要编辑多个文件时
  • 代码探索:当你想在更改任何内容之前彻底研究代码库时
  • 交互式开发:当你想与 CSC 迭代方向时

如何使用计划模式

在会话中开启计划模式

你可以在会话中使用 Shift+Tab 循环切换权限模式来切换到计划模式。

如果你处于普通模式,Shift+Tab 首先切换到自动接受模式,由终端底部的 ⏵⏵ accept edits on 指示。再次按 Shift+Tab 将切换到计划模式,由 ⏸ plan mode on 指示。

在计划模式下启动新会话

要在计划模式下启动新会话,使用 --permission-mode plan 标志:

csc --permission-mode plan

在计划模式下运行"无头"查询

你还可以使用 -p 直接在计划模式下运行查询(即在"无头模式"下):

csc --permission-mode plan -p "分析认证系统并建议改进"

示例:规划复杂重构

csc --permission-mode plan
我需要重构我们的认证系统以使用 OAuth2。创建一个详细的迁移计划。

CSC 分析当前实现并创建一个全面的计划。通过后续追问来完善:

向后兼容性怎么处理?
数据库迁移应该如何处理?

💡 提示:Ctrl+G 在默认文本编辑器中打开计划,你可以在 CSC 继续之前直接编辑它。

当你接受一个计划时,CSC 会根据计划内容自动命名会话。名称显示在提示栏和会话选择器中。如果你已经使用 --name/rename 设置了名称,接受计划不会覆盖它。

将计划模式配置为默认

// .costrict/settings.json
{
"permissions": {
"defaultMode": "plan"
}
}

有关更多配置选项,请参阅设置文档。


处理测试

假设你需要为未覆盖的代码添加测试。

  1. 识别未测试的代码

    查找 NotificationsService.swift 中未被测试覆盖的函数
  2. 生成测试脚手架

    为通知服务添加测试
  3. 添加有意义的测试用例

    为通知服务中的边界条件添加测试用例
  4. 运行并验证测试

    运行新测试并修复任何失败

CSC 可以生成遵循项目现有模式和约定的测试。在请求测试时,要具体说明你想验证什么行为。CSC 会检查你现有的测试文件,以匹配已使用的风格、框架和断言模式。

为了获得全面的覆盖率,请让 CSC 识别你可能遗漏的边界情况。CSC 可以分析你的代码路径,并建议针对错误条件、边界值和意外输入的测试,这些很容易被忽略。


创建 Pull Request

你可以直接让 CSC 创建 Pull Request("为我的更改创建一个 pr"),或者逐步引导 CSC 完成:

  1. 总结你的更改

    总结我对认证模块所做的更改
  2. 生成 Pull Request

    创建一个 pr
  3. 审查和完善

    用更多关于安全改进的上下文来增强 PR 描述

当你使用 gh pr create 创建 PR 时,会话会自动链接到该 PR。你稍后可以使用 csc --from-pr <number> 恢复它。

💡 提示: 在提交之前审查 CSC 生成的 PR,并让 CSC 突出显示潜在的风险或注意事项。

处理文档

假设你需要为代码添加或更新文档。

  1. 识别未文档化的代码

    查找 auth 模块中没有适当 JSDoc 注释的函数
  2. 生成文档

    为 auth.js 中未文档化的函数添加 JSDoc 注释
  3. 审查和增强

    用更多上下文和示例改进生成的文档
  4. 验证文档

    检查文档是否遵循我们的项目标准

💡 提示:

  • 指定你想要的文档风格(JSDoc、docstrings 等)
  • 在文档中要求示例
  • 为公共 API、接口和复杂逻辑请求文档

处理图像

假设你需要在代码库中处理图像,并希望 CSC 帮助分析图像内容。

  1. 将图像添加到对话中

    你可以使用以下任一方法:

    1. 将图像拖放到 CSC 窗口中
    2. 复制图像并使用 ctrl+v 粘贴到 CLI 中(不要使用 cmd+v)
    3. 向 CSC 提供图像路径。例如,"分析这张图像:/path/to/your/image.png"
  2. 让 CSC 分析图像

    这张图像显示了什么?
    描述此截图中的 UI 元素
    此图表中是否有任何有问题的元素?
  3. 使用图像作为上下文

    这是错误的截图。是什么导致了它?
    这是我们当前的数据库架构。我们应该如何为新功能修改它?
  4. 从视觉内容获取代码建议

    生成与此设计模型匹配的 CSS
    什么 HTML 结构可以重建此组件?

💡 提示:

  • 当文本描述不清楚或繁琐时使用图像
  • 包含错误、UI 设计或图表的截图以获得更好的上下文
  • 你可以在对话中处理多个图像
  • 图像分析适用于图表、截图、模型等
  • 当 CSC 引用图像时(例如 [Image #1]),Cmd+Click(Mac)或 Ctrl+Click(Windows/Linux)链接以在默认查看器中打开图像

引用文件和目录

使用 @ 快速包含文件或目录,无需等待 CSC 读取它们。

  1. 引用单个文件

    解释 @src/utils/auth.js 中的逻辑

    这会将文件的完整内容包含在对话中。

  2. 引用目录

    @src/components 的结构是什么?

    这会提供包含文件信息的目录列表。

  3. 引用 MCP 资源

    显示 @github:repos/owner/repo/issues 的数据

    这会使用 @server:resource 格式从连接的 MCP 服务器获取数据。有关详细信息,请参阅 MCP 资源。

💡 提示:

  • 文件路径可以是相对路径或绝对路径
  • @ 文件引用会将文件目录和父目录中的 AGENTS.md 添加到上下文中
  • 目录引用显示文件列表,而不是内容
  • 你可以在单条消息中引用多个文件(例如,"@file1.js 和 @file2.js")

恢复之前的对话

启动 CSC 时,你可以恢复之前的会话:

  • csc --continue 继续当前目录中最近的对话
  • csc --resume 打开对话选择器或按名称恢复
  • csc --from-pr 123 恢复链接到特定 Pull Request 的会话

在活动会话中,使用 /resume 切换到不同的对话。

会话按项目目录存储。/resume 选择器显示来自同一 git 仓库(包括 worktree)的交互式会话。当你从同一仓库的另一个 worktree 中选择一个会话时,CSC 会直接恢复它,而无需你先切换目录。由 csc -p 或 SDK 调用创建的会话不会出现在选择器中,但你仍然可以通过将其会话 ID 直接传递给 csc --resume <session-id> 来恢复它。

命名你的会话

给会话起描述性名称以便以后查找。这是在处理多个任务或功能时的最佳实践。

  1. 命名会话

    启动时使用 -n 命名会话:

    csc -n auth-refactor

    或在会话中使用 /rename,这也会在提示栏上显示名称:

    /rename auth-refactor

    你还可以从选择器中重命名任何会话:运行 /resume,导航到会话,然后按 R

  2. 稍后按名称恢复

    从命令行:

    csc --resume auth-refactor

    或从活动会话中:

    /resume auth-refactor

使用会话选择器

/resume 命令(或没有参数的 csc --resume)打开一个交互式会话选择器,具有以下功能:

选择器中的键盘快捷键:

快捷键动作
/ 在会话之间导航
/ 展开或折叠分组的会话
Enter选择并恢复突出显示的会话
P预览会话内容
R重命名突出显示的会话
/搜索以过滤会话
A在当前目录和所有项目之间切换
B过滤到当前 git 分支的会话
Esc退出选择器或搜索模式

会话组织:

选择器显示带有有用元数据的会话:

  • 会话名称或初始提示
  • 距上次活动的时间
  • 消息计数
  • Git 分支(如适用)

分叉的会话(使用 /branch/rewind--fork-session 创建)在其根会话下分组在一起,使查找相关对话更容易。

💡 提示:

  • 尽早命名会话:在开始处理不同任务时使用 /rename:以后查找"payment-integration"比"explain this function"容易得多

  • 使用 --continue 快速访问当前目录中最近的对话

  • 当你知道需要哪个会话时使用 --resume session-name

  • 当你需要浏览和选择时使用 --resume(不带名称)

  • 对于脚本,使用 csc --continue --print "prompt" 以非交互模式恢复

  • 在选择器中按 P 在恢复之前预览会话

  • 恢复的对话以与原始会话相同的模型和配置开始

    工作原理:

    1. 对话存储:所有对话都会自动在本地保存其完整的消息历史
    2. 消息反序列化:恢复时,整个消息历史被还原以维护上下文
    3. 工具状态:之前对话中的工具使用和结果被保留
    4. 上下文恢复:对话恢复时所有之前的上下文保持不变

使用 Git Worktree 运行并行 CSC 会话

同时处理多个任务时,你需要每个 CSC 会话都有自己的代码库副本,这样更改就不会冲突。Git worktree 通过创建单独的工作目录来解决这个问题,每个目录都有自己的文件和分支,同时共享相同的仓库历史和远程连接。这意味着你可以让 CSC 在一个 worktree 中开发功能,同时在另一个 worktree 中修复 Bug,两个会话互不干扰。

使用 --worktree-w)标志创建一个隔离的 worktree 并在其中启动 CSC。你传递的值成为 worktree 目录名称和分支名称:

# 在名为"feature-auth"的 worktree 中启动 CSC
# 创建 .costrict/worktrees/feature-auth/ 和一个新分支
csc --worktree feature-auth

# 在另一个独立的 worktree 中启动另一个会话
csc --worktree bugfix-123

如果省略名称,CSC 会自动生成一个随机名称:

# 自动生成类似"bright-running-fox"的名称
csc --worktree

Worktree 创建在 <repo>/.costrict/worktrees/<name>,并从默认远程分支(即 origin/HEAD 指向的位置)分出。Worktree 分支命名为 worktree-<name>

基础分支无法通过 CSC 标志或设置进行配置。origin/HEAD 是存储在本地 .git 目录中的引用,Git 在你克隆时设置一次。如果仓库的默认分支后来在 GitHub 或 GitLab 上更改了,你本地的 origin/HEAD 仍然指向旧的,worktree 将从那里分出。要将本地引用与远程当前认为的默认值重新同步:

git remote set-head origin -a

这是一个标准的 Git 命令,只更新你本地的 .git 目录。远程服务器上的任何内容都不会更改。如果你希望 worktree 基于特定分支而不是远程默认分支,请使用 git remote set-head origin your-branch-name 显式设置。

要完全控制 worktree 的创建方式,包括为每次调用选择不同的基础,请配置 WorktreeCreate hook。该 hook 完全替换了 CSC 的默认 git worktree 逻辑,因此你可以从任何你需要的 ref 获取和分出。

你还可以在会话中要求 CSC"在 worktree 中工作"或"启动一个 worktree",它会自动创建一个。

子代理 Worktree

子代理也可以使用 worktree 隔离来并行工作而不产生冲突。要求 CSC"为你的代理使用 worktree",或通过在自定义子代理的 frontmatter 中添加 isolation: worktree 来配置它。每个子代理都有自己的 worktree,在子代理完成且没有更改时自动清理。

Worktree 清理

当你退出 worktree 会话时,CSC 根据你是否进行了更改来处理清理:

  • 没有更改:worktree 及其分支会自动删除
  • 存在更改或提交:CSC 提示你保留或删除 worktree。保留会保留目录和分支,以便你稍后返回。删除会删除 worktree 目录及其分支,丢弃所有未提交的更改和提交

因崩溃或中断的并行运行而成为孤立的子代理 worktree,一旦超过你的 cleanupPeriodDays 设置的时间,会在启动时自动删除,前提是它们没有未提交的更改、未跟踪的文件和未推送的提交。你使用 --worktree 创建的 worktree 永远不会被此清理删除。

要在 CSC 会话之外清理 worktree,请使用手动 worktree 管理。

💡 提示:.costrict/worktrees/ 添加到你的 .gitignore 中,以防止 worktree 内容作为未跟踪文件出现在你的主仓库中。

将 gitignored 文件复制到 Worktree

Git worktree 是全新的检出,因此它们不包含主仓库中的 .env.env.local 等未跟踪文件。要在 CSC 创建 worktree 时自动复制这些文件,请在项目根目录中添加一个 .worktreeinclude 文件。

该文件使用 .gitignore 语法列出要复制的文件。只有匹配模式且同时被 gitignore 的文件才会被复制,因此被跟踪的文件永远不会被复制。

.env
.env.local
config/secrets.json

这适用于使用 --worktree 创建的 worktree、子代理 worktree 以及桌面应用中的并行会话。

手动管理 Worktree

要更好地控制 worktree 位置和分支配置,请直接使用 Git 创建 worktree。当你需要检出特定的现有分支或将 worktree 放在仓库之外时,这很有用。

# 创建带有新分支的 worktree
git worktree add ../project-feature-a -b feature-a

# 创建带有现有分支的 worktree
git worktree add ../project-bugfix bugfix-123

# 在 worktree 中启动 CSC
cd ../project-feature-a && csc

# 完成后清理
git worktree list
git worktree remove ../project-feature-a

在官方 Git worktree 文档中了解更多信息。

💡 提示: 记住根据你的项目设置在每个新 worktree 中初始化你的开发环境。根据你的技术栈,这可能包括运行依赖安装(npm installyarn)、设置虚拟环境或遵循项目的标准设置流程。

非 Git 版本控制

Worktree 隔离默认与 git 一起使用。对于其他版本控制系统(如 SVN、Perforce 或 Mercurial),请配置 WorktreeCreate 和 WorktreeRemove hook 以提供自定义的 worktree 创建和清理逻辑。配置后,当你使用 --worktree 时,这些 hook 会替换默认的 git 行为,因此 .worktreeinclude 不会被处理。请在你的 hook 脚本中复制任何本地配置文件。

有关并行会话的自动协调(包括共享任务和消息传递),请参阅代理团队。


当 CSC 需要你注意时获取通知

当你启动一个长时间运行的任务并切换到另一个窗口时,你可以设置桌面通知,这样你就知道 CSC 何时完成或需要你的输入。这使用 Notification hook 事件,每当 CSC 等待权限、空闲并等待新提示或完成认证时触发。

  1. 将 hook 添加到你的设置中

    打开 ~/.costrict/settings.json 并添加一个调用你平台原生通知命令的 Notification hook:

    macOS

    {
    "hooks": {
    "Notification": [
    {
    "matcher": "",
    "hooks": [
    {
    "type": "command",
    "command": "osascript -e 'display notification \"CSC needs your attention\" with title \"CSC\"'"
    }
    ]
    }
    ]
    }
    }

    Linux

    {
    "hooks": {
    "Notification": [
    {
    "matcher": "",
    "hooks": [
    {
    "type": "command",
    "command": "notify-send 'CSC' 'CSC needs your attention'"
    }
    ]
    }
    ]
    }
    }

    Windows

    {
    "hooks": {
    "Notification": [
    {
    "matcher": "",
    "hooks": [
    {
    "type": "command",
    "command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('CSC needs your attention', 'CSC')\""
    }
    ]
    }
    ]
    }
    }

    如果你的设置文件已经有 hooks 键,请将 Notification 条目合并到其中,而不是覆盖。你还可以通过在 CLI 中描述你想要的内容来让 CSC 为你编写 hook。

  2. 可选:缩小匹配器范围

    默认情况下,hook 在所有通知类型上触发。要仅针对特定事件触发,请将 matcher 字段设置为以下值之一:

    匹配器触发时机
    permission_promptCSC 需要你批准工具使用
    idle_promptCSC 已完成并等待你的下一个提示
    auth_success认证完成
    elicitation_dialogCSC 正在向你提问
  3. 验证 hook

    输入 /hooks 并选择 Notification 以确认 hook 出现。选择它会显示将要运行的命令。要进行端到端测试,请让 CSC 运行一个需要权限的命令并切换离开终端,或让 CSC 直接触发通知。

有关完整的事件架构和通知类型,请参阅 Notification 参考。


将 CSC 用作 Unix 风格的工具

将 CSC 添加到你的验证流程

假设你想将 CSC 用作代码检查器或代码审查工具。

将 CSC 添加到你的构建脚本:

// package.json
{
...
"scripts": {
...
"lint:csc": "csc -p 'you are a linter. please look at the changes vs. main and report any issues related to typos. report the filename and line number on one line, and a description of the issue on the second line. do not return any other text.'"
}
}

💡 提示:

  • 在你的 CI/CD 流水线中使用 CSC 进行自动化代码审查
  • 自定义提示以检查与你项目相关的特定问题
  • 考虑为不同类型的验证创建多个脚本

管道输入,管道输出

假设你想将数据管道输入到 CSC,并以结构化格式获取返回数据。

通过 CSC 管道传输数据:

cat build-error.txt | csc -p 'concisely explain the root cause of this build error' > output.txt

💡 提示:

  • 使用管道将 CSC 集成到现有的 shell 脚本中
  • 与其他 Unix 工具组合以实现强大的工作流
  • 考虑使用 --output-format 进行结构化输出

控制输出格式

假设你需要 CSC 以特定格式输出,特别是在将 CSC 集成到脚本或其他工具时。

  1. 使用文本格式(默认)

    cat data.txt | csc -p 'summarize this data' --output-format text > summary.txt

    这仅输出 CSC 的纯文本响应(默认行为)。

  2. 使用 JSON 格式

    cat code.py | csc -p 'analyze this code for bugs' --output-format json > analysis.json

    这输出一个包含元数据(包括成本和持续时间)的消息 JSON 数组。

  3. 使用流式 JSON 格式

    cat log.txt | csc -p 'parse this log file for errors' --output-format stream-json

    这在 CSC 处理请求时实时输出一系列 JSON 对象。每条消息都是一个有效的 JSON 对象,但如果串联起来,整个输出不是有效的 JSON。

💡 提示:

  • 使用 --output-format text 进行简单集成,只需要 CSC 的响应
  • 使用 --output-format json 当你需要完整的对话日志时
  • 使用 --output-format stream-json 进行每个对话轮次的实时输出

按计划运行 CSC

假设你想让 CSC 自动定期处理任务,比如每天早上审查开放的 PR、每周审计依赖项或夜间检查 CI 失败。

根据你希望任务运行的位置选择调度选项:

选项运行位置最适合
云端计划任务CoStrict 管理的基础设施即使你的计算机关闭也应该运行的任务。在 costrict.ai/code 配置。
桌面计划任务你的机器,通过桌面应用需要直接访问本地文件、工具或未提交更改的任务。
GitHub Actions你的 CI 流水线与仓库事件(如打开的 PR)或应该与你的工作流配置一起存在的 cron 计划绑定的任务。
/loop当前 CLI 会话会话打开时的快速轮询。退出时任务被取消。

💡 提示: 在为计划任务编写提示时,要明确说明成功是什么样的以及如何处理结果。任务自主运行,因此它无法提出澄清问题。例如:"审查标记为 needs-review 的开放 PR,对任何问题留下行内评论,并在 #eng-reviews Slack 频道中发布摘要。"


向 CSC 询问其能力

CSC 内置了对其文档的访问,可以回答有关其自身功能和限制的问题。

示例问题

CSC 可以创建 Pull Request 吗?
CSC 如何处理权限?
有哪些技能可用?
如何在 CSC 中使用 MCP?
如何为 Amazon Bedrock 配置 CSC?
CSC 有哪些限制?

注意: CSC 基于文档回答这些问题。如需实践演示,请运行 /powerup 获取带有动画演示的交互式课程,或参考上面的特定工作流部分。

💡 提示:

  • CSC 始终可以访问最新的 CSC 文档,无论你使用的是哪个版本
  • 提出具体问题以获得详细答案
  • CSC 可以解释复杂的功能,如 MCP 集成、企业配置和高级工作流