福生无量摸鱼天尊

Codex 和 CC —— terminal vibe coding tutorial

这篇文章记录我熟悉的codex和claude code的常用方式,若有更好的方法欢迎联系我。

安装

其实无论是在哪个终端安装都可以,无非是权限的问题,在wsl或者git bash中是最好的,但是我习惯在Window的terminal安装了,直接安装即可,问题不大。

npm i -g @openai/codex
npm install -g @anthropic-ai/claude-code

irm https://claude.ai/install.ps1 | iex # 官方用的是这个

然后就是源配置,这里很多教程会教怎么配置json,怎么改之类的,这里选择最简单的方法:cc-switch

这里可以根据不同的cli配置不同的源,非常方便,如果使用中转网站,只需要把要用的模型名字 + api服务地址 + api设定好就行,具体每个中转网站不一样,可以进行详细的配置捏,这里我们以yunwu中转网站为例。在中转网站中小氪一手,然后选择api令牌进行配置:

具体的倍率或者名字之类的,可以在左上角模型广场中看到,claude会贵一点,codex会便宜一点,其实不必要用最好的,就选上一代降价了好模型就行。配置完了之后,打开cc-switch,进行配置:

我这里配置的是claude,官网链接可以不理,下面还有一个模型的名称,进入yunwu的控制台,在个人设置里可以复制模型的名字,填进去就行。打开terminal,输入claude或者codex,/model就可以查看对应的模型了。

zhipu GLM

不得不说国产确实🐂,态度好,模型不赖,也便宜,这里推荐GLM捏~

打开coding plan,先买一个月的,很便宜,然后去右上角找到api key注册入口,注册一个api key。

由于CC switch跟GLM关系好,所以已经内置了选项了,直接选好了丢个key进去就行

然后是配置联网搜索网页读取,可以看下面的,也可以读读doc,可能时过境迁,技术迭代之后有变化:

{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "your api",
    "ANTHROPIC_BASE_URL": "https://open.bigmodel.cn/api/anthropic",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-4.7",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-4.7",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-4.7",
    "ANTHROPIC_MODEL": "glm-4.7"
  },
  "mcpServers": {
    "web-reader": {
      "headers": {
        "Authorization": "your api"
      },
      "type": "http",
      "url": "https://open.bigmodel.cn/api/mcp/web_reader/mcp"
    },
    "web-search-prime": {
      "headers": {
        "Authorization": "your api"
      },
      "type": "http",
      "url": "https://open.bigmodel.cn/api/mcp/web_search_prime/mcp"
    }
  }
}

这里记得替换你的api哟

换行

首先是换行,得切换到终端模式才行,不然shift + enter只会发送:

/terminal-setup

开启plan模式

开启之后会根据它疑惑的颗粒度进行提问,很像deep research,非常好用:

开启方式:

# 基础 Plan 模式
claude --permission-mode plan

Mac 系统:Shift + Tab ×2

Windows 系统:Alt + M 或 Shift + Tab ×2

如果对话框冒出来: ⏸ plan mode on (alt+m to cycle) 就证明开启成功

跳过询问权限

claude --dangerously-skip-permissions

Shift + Tab ×2	

深度思考

# 在复杂问题前添加关键词
"think harder: 如何设计高并发短链服务?"
"ultrathink: 请详细分析这个算法的复杂度"

CLAUDE.md

首次使用时执行 claude init 自动生成 CLAUDE.md,存储:

  • 项目架构说明

  • 代码规范偏好

  • 常用命令别名

无需 # 指令,直接告诉 Claude"请更新 CLAUDE.md"即可

用Tmux多开claude

# 在 tmux 会话中
Ctrl+b c  # 创建新窗口
cd ~/project-a
claude

# 切换回第一个窗口
Ctrl+b 0
cd ~/project-b
claude

需要注意的是,claude不冲突的起点是工作目录不一样,工作目录一样可能会有冲突的。

other

Esc	        中断当前操作
双击 Esc	回到上一个对话节点
@文件名	    精准引用文件
#内容	    记忆到 CLAUDE.md
Ctrl + _	撤销操作:类似 Vim 的撤销
Ctrl + V	粘贴图片

/clear        # 清空当前会话上下文(保留 CLAUDE.md),比 /compact 更高效
/compact      # 压缩长对话,节省 Token,适合会话过长时续接
/resume       # 查看所有历史对话列表,输入数字快速续接
/model        # 切换模型(Sonnet/Opus/Opus Plan 模式)
/cost         # 查看当前会话的 Token 消耗统计
/export       # 导出对话记录为文件
/terminal-setup # 配置终端支持 Shift+Enter 换行
/config       # 查看当前配置

魔法时刻

由于我们常在各种ide里使用cc,个人习惯在vscodecmd,但是有时候cmd要魔法一下,但是我又懒得每次输入那两条命令,那就在创建窗口时自动执行,首先新建一个cmd_init.txt ,在其中输入:

set http_proxy=http://127.0.0.1:7897
set https_proxy=http://127.0.0.1:7897

记得用自己的端口号,然后保存成cmd_init.cmd

管理员身份打开注册表,在计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor 中新建一个字符串值,输入刚刚保存的地址,比如说我是:

D:\something\cmd_init.cmd

保存之后,新建一个terminal,默认就会执行那两行命令。

Claude Code管理会话

通常我们可能并行有几个上下文需要管理,那么就会存在一个场景就是我突然想问一个另外的问题,但是不行污染这个上下文,应该怎么办呢?首先是查看历史,进去之后就可以看到历史会话,回车就进去了:

claude --resume

那如何把一个上下文保存到第二个上下文呢?只能说把第一个上下文进行总结成markdown,然后让第二个上下文去读,只有这种了。

那如何把上下文提取出来呢?这就要说到上下文的保存方式了,window系统一般都保存在这个目录下:

C:\Users\用户名\.claude\projects

所有会话都在里面,如果要进一步管理,可以使用:

# 安装会话提取工具(可选)
pipx install claude-conversation-extractor

# 导出为 Markdown
claude-extract --format markdown --all

万事开头写文档

首先我们要建立一个非常简单的认知,现在大模型存在的问题如下:

  • 大模型的上下文窗口并不长,我们一次喂给它的内容是有限的,所以要使用分治思想,让它一块一块的处理

  • 大模型知道的东西非常多,我们需要给它一个清晰的范围,构建明确的输入输出边界

  • 大模型对业务的实现方案有非常多种,技术选型不一定要选最优秀的,要选最合适的

由此可见,什么几行字让ai生成一个完美的软件,在现实中是不切实际的。在传统开发中,"想法"到"产品"的路径是:想法 → 需求文档 → 设计稿 → 代码 → 测试 → 上线。每一步都需要专业人员,每一步都可能出现理解偏差。

在 AI 时代,这条路径被大幅压缩:想法 → 结构化描述 → AI 生成代码 → 人工验收 → 迭代优化。因此,我们必须要先构建好自己的想法,通过结构化的描述,限定好范围,再去让ai生成对应内容。

那么如何让terminal的cc或者codex写文档呢?当然是让它生成一个markdown,后续所有内容续写即可。

需求文档 PRD

首先的首先,一定一定要清楚场景和需求,也就是构建PRD。在ai中,已经有多agent的专家模式去开发写代码了,所以ai生成一份代码,在后台通常已经走过了一轮agent,这时候我们就要清晰的表达自己的需求,这通常不会很复杂,就是一步一步的构建而已。

那么如何从0开始构建一份ai看得懂的需求文档呢,我认为针对于每一个功能,需要用户输入以下几个部分:

  1. 明确对象和对象的功能

  2. 与别的组件之间的交互

  3. few shot examples

  4. 最后补一句:“你觉得这个功能可能存在的各方面风险有什么,请给出五条质疑”

通过用户写出这三个部分的input,让ai生成专业的PRD描述,然后人为的去检验即可,如果没想到足够好的few shot example,那可以让ai生成,然后我们去思考逻辑即可。最后通过修补质疑,来让ai生成更为详细描述的PRD。

当你完成了所有功能的描述,必然最开始的功能会膨胀或者乱了一些,这时候你就要让ai进行总结,把这个markdown总结成一个成熟的项目,有成熟的项目目标,具体的功能划分等等。这里的prompt要根据你的项目来,最核心的是要总结出该项目最核心的几条workflow的功能需求。后续的所有技术展开都是根据这几条workflow来的。

技术文档

通过对需求文档的构建,我们对功能的划分已经结束了,这时候要做的就是写技术文档,通常最难的一点就是对整体技术的把控,这时候就需要用到上面提到的几条workflow了,需求文档通常来说会又臭又长,把整个上下文空间填满了,但是总结过的workflow就很清爽的表达了核心的要点和限制条件。那么有输入了,如何构建技术文档的输出呢?

分层

首先是敲定整体的系统架构,通过分层设计,把每个业务锁定在层里,这里要遵循的就是一个哲学思想:抽象和自动化。简单来说,这里可以分为四层:

层级

核心职责

关键约束

向下依赖

表现层

HTTP路由、参数校验、DTO转换、鉴权

只依赖应用层接口

应用层

应用层

用例编排、事务管理、跨聚合协调

不持业务逻辑,无状态

领域层、基础设施层

领域层

实体、值对象、聚合根、业务规则

不依赖任何外层(纯净)

仅依赖抽象接口

基础设施层

仓储实现、消息发送、RPC调用

依赖领域层定义接口

具体技术组件

上面是传统的四层架构,当然现在hpc的技术下的数据密集型系统分层包括:

  • 采集层:日志埋点、CDC、Kafka,负责数据接入

  • 存储层:HDFS、S3、OSS,负责低成本持久化

  • 加速层:Flink、Spark Streaming,负责低延迟计算(处理近期数据)

  • 批处理层:Spark SQL、Hive,负责全量计算(生成历史物化视图)

  • 服务层:HBase、ClickHouse、API,负责高吞吐查询

采集层给存储层提供数据持久化,存储层给加速层提供流式计算和增量计算服务,加速层给批处理层提供数据合并、物化视图等服务,批处理层给服务层提供curd之类的功能。

需要注意的是:

  1. 避免贫血模型:领域层只存数据无行为,逻辑泄漏到应用层

  2. 避免循环依赖:应用层和服务层互相调用,通过事件总线解耦

  3. 避免跨层事务:分布式场景下,用Saga模式替代ACID事务

  4. 避免过度分层:简单CRUD系统用三层架构即可,DDD增加复杂度

敲定技术栈

那么对于技术栈,这里要做的就是横向拉个表格,然后选择自己需要库。先单个技术栈分析,选择自己需要的,然后把技术栈进行交叉分析,分析针对业务的可行性,可行性验证完毕即可开始分层。那么如何分析呢,主要有以下指标:

  • 数据规模:读写的速率和存储的规模

  • 并发量级:单体?上云?

  • 延迟敏感度:单体?上云?Redis?K8S?

技术选型不一定要选最新的,最合适的就是最好的,构建技术栈的时候,要从底向上的进行构建层与层之间必须设定好接口。必须要留下监控性能指标的api接口。

work

这时候只需要ai去work,prompt就是根据需求文档的前面的总结 + 一个一个的需求,在技术文档中找到对应的内容,进行代码生成。

当然有很多别的skill,比如说代码生成的风格,如awesome-cursorrules。当你对agent或者context engine的优化技术懂的足够多,你会在这篇博客中找到影子,后续会继续优化它。

我骂我自己

当然你可能会说,哎这个太复杂了,我就写一点小功能,至于吗?

我的回答是至于。如果要搓demo,那简单的需求文档就能解决了,但是这种demo复用非常困难,容易报错,我的建议就是当你开始coding,就养成好习惯,从文档开始,后续的每一步都有锚点,这非常重要。

参考文档:

  1. vibe vibe

  2. Vibe Coding 屠龙纲要