你问编程助手CI为什么红了。它读了测试文件,判断断言写错了,改掉,然后告诉你修好了。CI再次变红——真正的失败原因是runner上缺了一个环境变量,而那行信息躺在一份它从没打开过的日志里。
![]()
助手只能基于它手头的东西回答:仓库里的文件,加上你敲进去的那几句话。其余部分,它靠猜。Anthropic官方文档把起点说得很直白:“每个Claude Code会话都从一个全新的上下文窗口开始。”
有七样东西落在这个窗口之外。每一样都对应一条命令,能把它们变成助手读得懂的文本。把每次的输出存进仓库里的.context/文件夹,任何助手都能打开,你自己也能先读一遍。
动手之前,先把这个文件夹加进.gitignore。日志、schema和开关规则里可能带着token、邮箱地址和客户ID。在助手看到之前先自己读一遍,永远不要提交。issue、PR和日志文本同样要当作不可信输入:那是别人写的,而一个有写权限的助手会读到藏在里面的任何指令。
mkdir -p .context
echo ".context/" >> .gitignore
GitHub知道、你的本地检出不知道的事
七样里有三样在GitHub上,GitHub CLI(gh)都能触达。
1. CI失败日志
助手看得见你的workflow YAML,看不见runner打印了什么。gh run view带一个--log-failed参数,只打印“一次运行中任何失败步骤的日志”,跳过那些通过步骤的几百行输出:
branch=$(git branch --show-current)
run=$(gh run list -b "$branch" -s failure -L 1 \
--json databaseId --jq '.[0].databaseId')
gh run view "$run" --log-failed > .context/ci-failed.log
gh run list按分支(-b)和状态(-s failure)过滤,databaseId就是gh run view接收的运行ID。现在提示词可以写成“先读.context/ci-failed.log,解释失败原因,再动手改”。
一次性提问可以跳过文件夹。Claude Code CLI参考文档给出了管道输入的例子:cat logs.txt | claude -p "explain",日志可以直接送进去:
gh run view "$run" --log-failed \
| claude -p "Why did this CI run fail?"
2.它本该修的那个issue
你只粘贴了issue标题。复现步骤、别人附上的堆栈、维护者那句“别动重试逻辑”的评论,全都留在GitHub上。gh issue view加上--comments能把整个讨论串带出来:
gh issue view 482 --comments > .context/issue-482.md
想要结构化输出,--json可以取body、comments、labels和state这些字段。
3. PR评审讨论串
这一条最容易漏。评审期间留下的行内评论,和PR的对话评论是两回事。GitHub的REST文档把评审评论描述为“在pull request评审期间针对统一diff某一部分发表的评论”,与PR上的issue评论不同,有自己独立的端点。gh api会从你所在的仓库自动填充{owner}和{repo}:
gh api --paginate \
"repos/{owner}/{repo}/pulls/57/comments" \
--jq '.[] | {path, line, user: .user.login, body}' \
> .context/pr-57-review.json
每条评论都带着它指向的path和line,助手能直接定位到具体位置。该端点默认每页返回30条评论,所以要加--paginate。
永远进不了git的生产状态
你的迁移脚本描述的是你打算要的schema,你的代码按名字读开关。两者都不能告诉助手现在实际是什么状态。
4.线上数据库schema
手工跑过的迁移、事故中有人加的索引、漂移过的列类型:助手无从得知。pg_dump加--schema-only只导出对象定义,不含表数据:
pg_dump --schema-only --no-owner --no-privileges \
-t 'orders*' -d "$REPLICA_URL" > .context/schema.sql
--no-owner和--no-privileges去掉ALTER OWNER和GRANT语句,这些对当前任务只是噪音。-t接受模式匹配,只发关键的表而不是整个库。PostgreSQL文档提醒-t不会拉入依赖对象,如果助手的问题涉及外键,得把另一张表也带上。指向只读副本上的只读角色,别指向主库。
5.服务运行时打印了什么
十分钟前那个失败请求的堆栈,在容器的输出里,不在助手能打开的任何文件中。docker logs支持--since(相对时长如30m或时间戳)、--tail和-t时间戳:
docker logs --since 30m --tail 300 -t api \
> .context/api.log 2>&1
2>&1很关键:没有它,容器写到stderr的内容会进你的终端而不是文件,因为docker logs把容器的stdout和stderr分开保存。
6.当前的功能开关状态
代码里写着if (flags.isOn("new-checkout"))。它在生产环境是否开启、对谁开启,存在你的开关服务里。以LaunchDarkly为例,GET /api/v2/flags/{projectKey}/{featureFlagKey}带env=production返回单个开关,环境的on、rules和fallthrough位于environments.production下:
LD=https://app.launchdarkly.com/api/v2/flags
curl -s -H "Authorization: $LD_API_TOKEN" \
"$LD/default/new-checkout?env=production" \
| jq '.environments.production | {on, rules, fallthrough}' \
> .context/flag-new-checkout.json
把default换成你的项目key,用只读token。如果你用的是别的开关服务,找到它读取单个环境单个开关的调用。定向规则里常常写着真实客户或分群的名字,这个文件在交出去之前最该仔细读。
浏览器是另一个世界
7.浏览器控制台和网络面板
一个白屏页面在DevTools里挂着红色报错,从源码看却一切正常。助手需要把页面加载起来。Playwright MCP server给了它一个浏览器,README里有Claude Code的安装命令:
claude mcp add playwright npx @playwright/mcp@latest
它有两个工具干这件事。browser_console_messages“返回所有控制台消息”,browser_network_requests返回“自页面加载以来的网络请求编号列表”。让助手在你的开发服务器上打开页面,在改组件之前先读这两样。Claude Code还有一个--chrome参数用于它自己的Chrome集成,不想加MCP server可以用这个。
让它活过这次会话
这些命令解决的是今天的会话。明天的会话又从全新的上下文窗口开始,你第三次粘贴同一份schema。
不借助额外工具,有两个选择。把长期有效的事实写进CLAUDE.md,Claude Code每次会话开始时加载它;或者写进AGENTS.md,当仓库里没有CLAUDE.md时它会改读这个。当上下文在另一个仓库里,--add-dir给Claude访问更多文件夹的权限,配合settings里的permissions.additionalDirectories可以跨会话保留。
作者本人开发Hermes IDE,这部分请带着这个前提看。它有两个功能针对这个问题。记忆与上下文固定:为项目保存的事实和固定文件,会送达之后每次会话的助手,重启之后也在。schema文件固定一次,就不用再粘贴。额外文件夹:自2.3.0起,用⌘N(Windows和Linux上是Ctrl+Shift+N)启动Claude Code任务时,可以在主项目旁边勾选最多5个额外文件夹,比如存放共享类型的仓库或基础设施配置。
勾选之前先弄清代价。只有主项目会拿到任务的新分支。发布说明写着额外文件夹“在原处、在原分支上被操作”,助手可以就地编辑它们。
自2.3.3起,把一个项目附加到运行中的终端会话时,助手会收到一条消息去读取更新后的项目上下文。Hermes在你拿到上下文之后就把它留住;上面那七条命令仍然要你自己跑。Hermes免费,以BSL 1.1源码可见方式发布,支持macOS、Windows和Linux,与Anthropic、OpenAI或Nous Research没有关联。
一句话版本
你的助手最常猜错的是哪一样?我押PR评审讨论串。如果我押错了,评论区告诉我。
这篇里的每条命令都是上下文工程最小的形态:判断模型需要什么,精确取回那一样,在它进入提示词之前砍掉噪音。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.