关于 Codigest
Codigest 是一款本地命令行工具,可将选定代码、变更或捕获的终端输出整理为 AI 对话和编码 Agent 所需的上下文。开发者可控制分享内容,查看纳入的文件,并对密钥进行遮蔽。
主要功能
- 01打包项目、选定文件及其导入项
- 02显示文本和函数级变更
- 03捕获命令并打包失败输出及相关代码
- 04报告已纳入和未纳入的文件
- 05排除环境文件并遮蔽令牌
适用场景
- 01在 AI 对话中分享选定的项目代码
- 02查看基线以来的函数级变更
- 03向 Agent 提供失败测试及相关代码
MCP 相关
提供 stdio MCP 服务,供 MCP 客户端请求 Codigest 上下文输出。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Codigest
与 AI 分享你选择的代码上下文:你的项目、几个文件、变更内容,或运行失败的命令。
文档:nanisaac.github.io/codigest(安装、指南和命令参考)。한국어
针对特定版本的自动安全扫描(A–F),并非独立安全认证。
了解评级机制。
Codigest 是一款命令行工具,适合你想向 ChatGPT、Claude 或编码 Agent 询问代码问题时使用。 它会将你选择的项目内容转换为一个文本块,方便粘贴到任何聊天中。
模型只知道你展示给它的内容。手动复制文件很慢,容易漏掉关键文件,也很容易粘贴超出问题所需的内容。Codigest 让你决定要分享什么,然后替你收集:整个项目、某个文件及其导入的文件、你指定基准点以来的变更,或失败的测试及其指向的代码。
功能
- 打包你选择的代码。 将整个项目、选定的文件和文件夹,或它们导入的本地文件(Python、JS/TS)连同文件树打包为一个文本块。
- 展示变更内容。 显示自你设定的基准以来的文本差异或函数级差异,不会改动你的 Git 历史。
- 包含终端输出。 记录你运行的命令,并可连同错误指向的文件一起提供失败的命令。
- 说明包含的内容。 每个打包结果都会报告大小;
pack会说明每个文件的包含原因,并列出未纳入的文件。 - 保护机密信息。 永不包含
.env文件和密钥,并会遮蔽代码或输出中的令牌。 - 支持 Agent。 Claude Code、Cursor 和其他 MCP 客户端可以请求相同的输出。
Codigest 不会调用任何 AI 模型;它只负责准备你要发送给模型的内容。所有操作都在你的设备上运行。
以下工作流之一:测试失败后,只需运行一个命令,就能收集模型所需的内容。
安装
预编译二进制文件,无需 Python。Windows(PowerShell):
irm https://raw.githubusercontent.com/NaNIsaac/codigest/main/install.ps1 | iex
Linux、macOS 和 Termux:
curl -fsSL https://raw.githubusercontent.com/NaNIsaac/codigest/main/install.sh | sh
在 Windows 上,这会将 cdg 安装到 %LOCALAPPDATA%\Programs\codigest(并将其添加到用户 PATH);在 Linux 和 macOS 上安装到 ~/.local/bin;在 Termux 中安装到 $PREFIX/bin。再次运行同一行即可更新。CDG_VERSION=0.12.1 可指定固定版本,CDG_INSTALL_DIR=... 可选择安装目录(此时不会更改 PATH)。支持平台:Windows x64、Linux x64 和 ARM64、macOS Intel 和 Apple Silicon、Android ARM64(Termux;CI 中的测试也会在 Termux 内运行)。可手动下载的压缩包见发布页面。你的项目无需进行任何设置。两个脚本都会根据 GitHub 为压缩包记录的 SHA-256 校验值进行验证。在 Linux 和 macOS 上,如果同一目录中存在来自 Python 包的 cdg,install.sh 不会替换它,除非设置了 CDG_FORCE=1。
Python 包
同样的命令也发布在 PyPI 上,包名为 codigest。使用 uv 安装,它也会获取所需的 Python 版本(3.15),并将其与项目隔离:
winget install --id astral-sh.uv # Windows (skip if you have uv)
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS/Linux
uv tool install codigest
uv tool update-shell # then restart your terminal
命令是 codigest,也可以简写为 cdg。两种安装方式都会提供名为 cdg 的命令,因此请确保 PATH 中只保留其中一种。如果安装时在 lazy import 处出现语法错误,请运行 uv self update,然后重试。
接下来,cdg term install 会为你的 shell 添加钩子,保留每条命令的输出,供 cdg pack 和 cdg term 使用。运行该命令前,此功能处于关闭状态;请参阅终端捕获。
在 Windows 上,PowerShell 的 help codigest 与 codigest --help 是两个独立命令。
如需可选的原生 Get-Help 集成,且不自动捕获命令:
cdg shell-help install # register comment-based PowerShell help
# open a new PowerShell window
help codigest # or: Get-Help codigest
cdg shell-help uninstall # remove it when no longer needed
这会向你的 PowerShell 配置文件添加一个小型转发函数;其他 help 命令不受影响。CLI 自带的完整命令参考仍可通过 cdg --help 查看。
在终端中,以下每条命令都会将结果复制到剪贴板。添加 -s 也会打印结果,添加 -o FILE 也会将结果写入文件,添加 --no-copy 则不会改动剪贴板,添加 -m "..." 可将你的问题或指令放入其中。当输出被重定向到管道或文件(cdg scan > ctx.xml、cdg digest | less、脚本、编码 Agent 的 shell)时,结果会打印出来,但不会复制到剪贴板;添加 --copy 可强制复制。通过 SSH 使用时,内容会复制到你输入命令的那台机器的剪贴板(OSC 52),而不是远程机器;请参阅输出选项。
1. 与 AI 聊天分享你的项目
在项目中运行 scan,然后粘贴:
cdg scan
$ cdg scan
Copied snapshot to clipboard
Snapshot 3 files, ~121 tokens
现在,剪贴板中包含文件树和每个文件的内容,并遵循 .gitignore 规则:
<project_snapshot project="project">
<project_structure>
├── .gitignore
├── prices.py
└── test_prices.py
</project_structure>
<source_code>
<file path=".gitignore">
.venv/
__pycache__/
.pytest_cache/
</file>
<file path="prices.py">
def apply_discount(price, percent):
return price * (1 - percent)
</file>
<file path="test_prices.py">
from prices import apply_discount
def test_ten_percent():
assert apply_discount(200, 10) == 180
</file>
</source_code>
</project_snapshot>
大型项目在复制前会先询问(超过 30k 个 token 或 100 个文件)。这类项目可以像下一节所示那样,分享较少的内容。
2. 只分享部分内容或变更内容
cdg scan src/app.py -r # one file and the local files it imports, recursively
cdg scan src/billing/ docs/ # folders, files, or both
cdg scan src/app.py -l # with line numbers, so answers can say "line 42"
cdg scan src/app.py:40-80 # only lines 40 to 80, numbered (src/app.py:42 for one line)
cdg digest # signatures and docstrings only, much smaller
cdg digest src/billing/ # the same for one folder
cdg tree -L 2 # the file tree, two levels deep
从这里开始的示例仍是同一个项目,只是时间稍晚一些:prices.py 新增了一个 Cart 类,legacy/ 中则有一个旧版 MATLAB 文件。
digest 是开始对话时使用的概览。它会按出现顺序列出 Python 文件中的每个函数、类和顶层变量,以及 MATLAB 文件中的函数和 %% 分节,并标出它们的起始行和文档字符串的第一行(MATLAB 文件则显示帮助注释的第一行)。类属性和 dataclass 字段也会连同其值一起列出;较长的值会被缩短:
$ cdg digest -s
<code_digest project="project" contents="signatures and docstrings, no bodies">
<project_structure>
├── .gitignore
├── legacy
│ └── discount.m
├── prices.py
└── test_prices.py
</project_structure>
<file path="legacy/discount.m">
1: function p = discount(price, percent)
Price after taking off percent percent.
3: %% Apply
</file>
<file path="prices.py">
1: TAX_RATE = 0.1
4: def apply_discount(price: float, percent: float) -> float
Price after taking off `percent` percent.
9: class Cart
Items and the discount that applies to all of them.
12: def __init__(self, percent: float=0)
16: def total(self) -> float
Sum after discount and tax.
</file>
<file path="test_prices.py">
4: def test_ten_percent()
</file>
</code_digest>
Digest 3 files, ~192 tokens
看过这些内容的模型可以准确询问所需内容(“显示 Cart.total”),而 cdg scan prices.py:16-19 会仅提供该方法,行号与原文件一致:
$ cdg scan prices.py:16-19 -s
<project_snapshot project="project">
<project_structure>
└── prices.py
</project_structure>
<source_code>
<file path="prices.py" lines="16-19">
16: def total(self) -> float:
17: """Sum after discount and tax."""
18: subtotal = sum(apply_discount(p, self.percent) for p in self.items)
19: return subtotal * (1 + TAX_RATE)
</file>
</source_code>
</project_snapshot>
tree -L 可避免大型目录或供应商目录导致输出过多:
$ cdg tree -L 1
├── .gitignore
├── legacy/ (1 file)
├── prices.py
└── test_prices.py
如需在工作过程中分享变更内容,请先设置基线:
cdg mark # e.g. before a refactor
# ... work ...
cdg diff # text diff since the mark
cdg semdiff # Python: which functions and classes changed
基线是保存在 .codigest/ 中的一份私有副本;不会改动你的 Git 历史记录。
3. 提供运行失败的命令
通过 cdg cap 运行命令。输出与直接运行时完全相同;Codigest 会保留一份副本。然后请求生成一个 pack:
cdg cap -- pytest -q # or npm test, cargo test, go test ./..., make
cdg pack
$ cdg pack
Packed ~370 / 30,000 tokens
failed pytest -q (exit 1, just now)
changes uncommitted changes (git)
+ test_prices.py line 5 in failing output
+ prices.py changed
Copied pack to clipboard
内容包括:运行失败的命令、尚未提交的 Git 变更、报错指向第 5 行的 test_prices.py,以及你编辑过的 prices.py。
具体复制了哪些内容
<context_pack project="project">
<terminal_history>
<command index="1" command="pytest -q" exit_code="1" cwd="~/project" duration="1.5s" at="2026-10-17T01:58:14+09:00">
<output>
F [100%]
================================= FAILURES ==================================
_____________________________ test_ten_percent ______________________________
def test_ten_percent():
> assert apply_discount(200, 10) == 180
E assert -1800 == 180
E + where -1800 = apply_discount(200, 10)
test_prices.py:5: AssertionError
========================== short test summary info ==========================
FAILED test_prices.py::test_ten_percent - assert -1800 == 180
1 failed in 0.11s
</output>
</command>
</terminal_history>
<changes source="uncommitted changes (git)">
diff --git a/prices.py b/prices.py
index 3d691df..428752a 100644
--- a/prices.py
+++ b/prices.py
@@ -1,2 +1,2 @@
def apply_discount(price, percent):
- return price * (1 - percent / 100)
+ return price * (1 - percent)
</changes>
<file path="test_prices.py" reason="line 5 in failing output">
1: from prices import apply_discount
2:
3:
4: def test_ten_percent():
5: assert apply_discount(200, 10) == 180
</file>
<file path="prices.py" reason="changed">
1: def apply_discount(price, percent):
2: return price * (1 - percent)
</file>
</context_pack>
未纳入预算的文件会列在 <omitted> 块中,让模型知道它看不到哪些内容。
普通的 cdg pack 会按以下顺序填满令牌预算(默认 30,000):
- 过去一小时内,本项目最近一次失败的命令输出中提到的文件:
File "x.py", line 7(Python)、x.py:7(pytest、ruff、gcc、rustc、eslint)、x.ts(7,3)(tsc)。 同一命令再次通过后,就不再使用那次失败记录。若文件只在输出中被提及,并非由你修改,则会以摘录形式加入:输出指向的每个位置前后各十行,并标注lines="40-60"属性。较短的文件会完整加入。 - 失败的 Python 测试所调用的项目函数和类,完整加入,原因标记为
called from failing test ...。如果回溯以断言结束,只会指出测试;即使错误已经提交、差异中没有任何内容,这也会加入被测试的代码。 - 你修改过的文件:Git 中未提交和未跟踪的文件,或自
cdg mark以来的更改。较长的更改文件会按其差异块涉及的部分加入(差异本身已经包含在打包内容中)。 - 导入这些文件的测试(
test_*.py、*_test.py、*.test.ts、*.spec.js等)。 - 这些文件导入的项目文件:Python 导入,以及 JS/TS 中的相对导入(
./x、x.ts对应的./x.js、dir/index.ts对应的./dir)。
指定文件名时,只会获取这些文件。--with 会重新加入自动选择的来源:
cdg pack src/prices.py # just this file
cdg pack src/prices.py --with tests # this file and its tests
cdg pack --with changes # only your changes, no failure
cdg pack --with failure,changes,tests,imports # the same as plain `cdg pack`
只要来源处于启用状态,失败的命令和差异就始终会包含在内。较长的命令输出会保留前 80 行和后 40 行(包括最初的失败信息和摘要);cdg term -f 可显示全部内容。令牌数按每四个字符估算,因此预算只是近似值。
让流程更顺畅
cdg term install 会为你的 shell 安装钩子,让每条命令都自动捕获,无需输入 cdg cap
(cdg term uninstall 会移除钩子)。cdg term 会显示已捕获的内容;参见
终端捕获。
4. 让 Agent 获取内容
通过 MCP 连接你的编码 Agent,让它自行请求上下文,而不是让你粘贴:
claude mcp add --scope user codigest -- cdg mcp # Claude Code
其他客户端(Cursor、VS Code、Claude Desktop):添加一个 stdio 服务,命令为 cdg,参数为
["mcp"]。工具列表见 MCP 工具。
能够运行 shell 命令的 Agent 无需任何设置。它的 shell 不是终端,因此 cdg
会直接向它输出结果,不会接触你的剪贴板。适合 Agent 的工作方式:
cdg tree -L 2 # where things are
cdg digest src/ # what is defined where, with line numbers
cdg scan src/prices.py:16-19 # read the parts that matter, numbered the same way
cdg mark # before editing
cdg semdiff # afterwards: which functions it changed
cdg cap -- pytest -q && cdg pack # run the tests; on failure, the pack has what to fix
每个代码块中的代码都与文件中的写法完全一致(->、<、& 不会转义),因此从中复制的代码可以直接粘贴回去。大型 scan 如果无人回答大小确认问题,会显示提示后停止,而不会一直等待;-y 会将所有内容一并获取。
参考
所有命令
cdg --help 会按相同的分组列出这些命令。
| 命令 | 功能 | 写入项目的内容 |
|---|---|---|
scan | 将整个项目或选定路径作为一个代码块输出 | 无 |
digest | 输出带编号的签名和文档字符串,不含函数体(Python、MATLAB) | 无 |
tree | 项目目录树(-L N 用于限制深度) | 无 |
mark | 设置基线 | .codigest/ |
diff | 自基线以来的文本差异 | 无 |
semdiff | 自基线以来的函数和类级别更改(Python) | 无 |
cap | 运行命令并保留其输出 | 无 |
term | 最近捕获的命令及其输出 | 无 |
pack | 最近一次失败、失败中提及的文件以及你的更改 | 无 |
mcp | 为 Agent 提供的 MCP 服务 | 无 |
status | pack 在此处会使用的内容:最近一次失败、更改、基线 | 无 |
init | 用于文件筛选的 .codigest/config.toml | .codigest/、.gitignore |
clean | 删除 .codigest/(会先询问,使用 -y 跳过询问) | 删除 .codigest/ |
通用选项:-s / --stdout 也会打印结果(状态消息会发送到 stderr;通过管道传输时默认启用),--copy / --no-copy 会覆盖剪贴板默认设置(在终端中复制,通过管道传输时不复制),-o FILE 也会将结果写入文件,-m / --message 会添加一条指令。
scan -l 会添加行号,scan -a 会忽略配置筛选器,scan -y 会跳过确认(CI)。scan、diff、semdiff 和 digest 的 -r / --resolve 也会纳入目标文件导入的本地文件。scan 和 term 支持使用 --format markdown|json,适用于会渲染 Markdown 的聊天工具或脚本(默认格式为 XML)。任何命令上的 --preset NAME 都会填入保存在 .codigest/config.toml 或用户配置的 [presets.<command>.NAME] 下的选项;在它之后输入的选项优先。cdg <command> --help 会列出所有选项。
终端捕获
cdg cap 会实时流式输出命令结果,并记录命令行、合并后的 stdout/stderr、退出代码和工作目录。cdg term --context 还会附带捕获时的主机名和 shell 名称。电脑名称为可选项,因为它可能包含敏感信息;较早的捕获记录没有主机名,而 cdg term 仍会在不包含主机名的情况下复制内容。你机器上所有项目的捕获记录共用一个存储区,因此可以在任何目录中使用 cap 和 term。
cdg cap "npm run build | tail -20" # quote pipelines
cdg term # last command and its output
cdg term -n 3 # last 3
cdg term -f # last failed one
cdg term --context # add the PC hostname and shell to the copied context (opt-in)
cdg term --here -n 3 # last 3 run in this project
cdg term -i 2 # only the command from 2 runs ago
cdg term -n 3 --format json # the last 3 as JSON (markdown also works)
cdg term path # where captures are stored (override with CODIGEST_HOME)
cdg term clear # delete all captures
未通过 cap 运行的命令会从原生 shell 历史记录(PowerShell、bash、zsh、fish)中读取,但不包含其输出。
自动捕获
cdg term install 会修改已安装 shell 对应的 PowerShell 配置文件、~/.bashrc 和 ~/.zshrc;使用 --shell powershell|bash|zsh|all 选择 shell。在 Windows 上,Git Bash 计作 bash。命令仍会在当前会话中运行(cd、变量和函数都可以正常使用),并按输入内容出现在历史记录中。需要真实终端的程序会被跳过:编辑器、分页器、ssh、全屏工具(tmux、zellij、herdr、k9s、yazi 等)、带有 -it 的 docker/podman/kubectl、npm/pnpm/yarn/bun 的 init 或 create、npx create-*、pip uninstall、gh auth login、az login、gcloud auth login 和 gcloud init、aws configure、ssh-keygen、sudo,以及数据库 shell(psql、mysql、sqlite3 等)。如果提示符所在行没有以换行符结尾,它会一直留在捕获管道中,直到出现下一个换行符,因此命令看起来会像是卡住了。
- 跳过单条命令:在命令行开头加一个空格。
- 跳过更多程序:
$env:CODIGEST_CAP_SKIP = '^\s*(myrepl|mytui)\b'(bash/zsh:export CODIGEST_CAP_SKIP='^(myrepl|mytui)( |$)',这是一个扩展正则表达式)。 - 在当前会话中禁用:
$env:CODIGEST_NOCAP = 1(bash/zsh:export CODIGEST_NOCAP=1)。 - 移除钩子:
cdg term uninstall。每个启动文件都会恢复为安装前的确切字节内容(包括换行符、BOM 和末尾换行符);安装时创建的文件会连同为其创建的文件夹一起删除,数据文件夹中的钩子副本也会删除。捕获的命令会保留,直到运行cdg term clear。
运行其他命令的程序
有些程序会替你运行命令行,例如 hanfix 中的 hf(它会用韩文键盘布局重新运行上一条输入的命令)。这类程序会被整体捕获,它运行的命令也会接收到捕获管道,而不是终端。此类程序可以通过以下两个步骤与钩子配合使用:
- 加载时将其命令名称添加到
CODIGEST_RUNNERS;钩子不会捕获以其中任何名称开头的行。请使用追加方式,这样启动文件加载它和 codigest 的顺序就无关紧要:- PowerShell:
$global:CODIGEST_RUNNERS += 'hf' - bash/zsh:
CODIGEST_RUNNERS="${CODIGEST_RUNNERS-} hf"(空格分隔的 shell 变量)
- PowerShell:
- 在每行命令运行时,通过当时查找到的
__cdg_run(如果已定义)运行它。它会对该行应用钩子自身的规则:需要终端的程序会保留终端,其他程序会在该行下被捕获。- PowerShell:
if (Get-Command __cdg_run -CommandType Function -ErrorAction Ignore) { . __cdg_run $line } else { Invoke-Expression $line } - bash/zsh:
if typeset -f __cdg_run >/dev/null; then __cdg_run "$line"; else eval "$line"; fi
- PowerShell:
不执行步骤 2 的程序仍可列入 CODIGEST_RUNNERS:这样它运行的命令会保留终端,且不会被捕获。thefuck 就是一个例子:
$global:CODIGEST_RUNNERS += 'fuck'(bash/zsh:CODIGEST_RUNNERS="${CODIGEST_RUNNERS-} fuck")。
程序也可以在运行前替换输入的行:按下 Enter 时,钩子会将该行传给 CODIGEST_REWRITERS 中列出的每个函数,第一个声明处理该行的函数会提供要运行的行。随后该行会像输入的内容一样继续处理:它会进入 shell 历史记录(在 PowerShell 中包括 PSReadLine 和引擎的历史记录),钩子的规则会决定是否捕获它,且 $? 反映的是该行自身的状态码。单独输入 hf 时可以采用这种方式;在较长的行中输入 hf 时,仍需使用上述步骤。
- PowerShell:
$global:CODIGEST_REWRITERS += 'name'。函数接收该行,并返回$null(而不是该行)、新行,或@{ Line = <new>; Confirm = $true }以请求确认。 - bash/zsh:
CODIGEST_REWRITERS="${CODIGEST_REWRITERS-} name"。函数接收该行,将REPLY设为新行并返回 0;返回 2 表示请求确认;若该行不由它处理,则返回 1。 - 收到确认请求时,钩子会显示新行并附上
[Enter / Ctrl+C]:按 Enter 运行该行,按任意其他键则放弃该行(不会运行任何内容,也不会将其添加到历史记录)。 - 如果函数失败、返回其他值,或提供的行无法解析,则会保留原样输入的行,且不显示消息。若函数耗时超过 200 ms,其结果也会被丢弃。这不是超时机制:钩子会等待函数返回,因此函数若卡住,按下 Enter 后也会被阻塞。
- 函数不应自行添加历史记录。
- 以空格开头输入的行会保留该空格,因此不会被捕获。
- 在 PowerShell 远程会话、嵌套提示符或调试器中不可用。
在 PowerShell 中,钩子可以与其他 PSConsoleHostReadLine 实现(VS Code 的 shell integration、atuin)配合使用:它会调用该实现获取命令行,因此能看到用户输入的内容,并且只包装该实现返回的内容。如果钩子加载后又加载了其他实现,那么在 shell 等待输入时,钩子也会重新置于最前面;即使该实现自行读取命令行(atuin 就是如此),也同样如此。加载其他实现后的第一行不会被捕获。
profile 加载的是 cdg term install 放入数据文件夹(与捕获文件同级的 shell/)中的钩子副本,而不是软件包内的文件。更新 codigest 后,请再次运行 cdg term install 以刷新该副本。
限制:
- 捕获到的程序会向管道而非 TTY 写入,因此有些程序会失去颜色或进度条。
- 在 bash(4+)和 zsh 中,多行命令(跨多行输入的循环、heredoc)、后台任务(
cmd &)以及使用!历史扩展的行不会被捕获;它们会正常运行。在 bash 中,以子 shell( ... )开头的行也不会被捕获。 - 在 bash 中,钩子使用 DEBUG 陷阱,并保留首个提示符出现前设置的一组陷阱(starship、bash-preexec);之后设置的 DEBUG 陷阱会替换它。
- 在 bash 中,VS Code 的 shell 集成如果在钩子加载后加载,会停止捕获(#52)。
- 长输出有长度限制:PowerShell 钩子会保留前后各 2,000 行;bash 或 zsh 的捕获文件超过 4 MB 时,会各读取开头和末尾的 1 MB。存储随后会将内容保留至 64 KB。
- 在 PowerShell 中,命令的退出代码非零或错误显示在屏幕上时,该命令会被视为失败;使用
-ErrorAction隐藏的错误不算失败。 - PowerShell 钩子不会包装远程会话、嵌套提示符或调试器中的行。
MCP 工具
| 工具 | 返回内容 |
|---|---|
pack | 最近一次失败、该失败提及的文件、这些文件的更改及其导入内容,并按预算截取(targets、with、budget、message) |
terminal_history | 最近的命令及其输出和退出代码(count、failed、here:仅限当前项目,默认开启) |
scan | 项目快照(targets、resolve、message) |
diff / semdiff | 自基线以来的文本 / 结构更改 |
digest | 仅包含签名和文档字符串 |
tree | 目录树 |
这些工具返回的文本与 CLI 打印的内容相同。它们都不会移动基线,并且会拒绝访问 MCP 服务启动所在项目之外的路径。
配置
cdg init 会写入 .codigest/config.toml。[filter]` 部分控制每条命令会处理哪些文件:
[filter]
# Only these extensions (omit to include every non-ignored file)
extensions = [".py", ".ts", ".rs", ".md", ".json"]
# Extra exclusions, in .gitignore syntax (.gitignore itself is always honored)
exclude_patterns = [
"*.lock",
"tests/data/",
"legacy_code/"
]
.git/、.codigest/、虚拟环境、node_modules/ 和 __pycache__/ 始终会被跳过。
隐私与安全
- 凭据文件。 任何命令都不会包含
.env*(.env.example等模板除外)、*.pem、*.key、*.p12、*.pfx、密钥库、.netrc、.pgpass和 SSH 私钥。scan会说明哪些文件被排除,pack会将它们列为已省略文件,而差异中的相关代码块会替换为提示。 - 代码和差异中的令牌。 Codigest 输出的所有内容中,私钥、JWT、厂商令牌(OpenAI、GitHub、AWS、Google、
Slack、GitLab、npm、Stripe
sk_/rk_、Hugging Facehf_)以及 URL 中的密码都会被屏蔽。token = get_token()这类普通代码则会保留原样。 - 捕获内容中的机密。 此外,写入磁盘前还会检查终端输出中的
Authorization标头,以及key=value和key: value格式的键值对;键名可能带引号("password": "..."),也可能以下划线或连字符加机密名称结尾 (AWS_SECRET_ACCESS_KEY、DB_PASS;也包括pass和pwd)。打印凭据的命令输出绝不会被存储:env、printenv、gh auth token、aws configure和aws sts get-session-token/assume-role、az account get-access-token、gcloud auth print-access-token、kubectl get secret、kubectl config view --raw、op read、bw get、pass show、vault read、对.env、.npmrc、.pypirc、.netrc、密钥文件或credentials.json执行cat,以及其他少数命令(完整列表见src/codigest/core/redact.py中的DENY_COMMANDS)。 - 这些规则能识别常见格式,但无法涵盖所有可能的机密。
- 你的项目。 没有命令会更改源文件。只有
mark和init会创建.codigest/,其中包含自己的.gitignore(*),因此它永远不会出现在git status中;init还会将其添加到项目的.gitignore中。 - 捕获文件的位置。
cdg term path会显示文件路径。在 macOS 和 Linux 上,只有你自己可以读取该文件。cdg term clear会将其删除。 - 没有任何内容会离开你的设备。 Codigest 不会发起网络请求。上下文只会发送到你粘贴的位置,或你连接的 MCP 客户端。
从 0.9 升级
- 管道或重定向输出现在无需
-s即可打印,也不再复制;如果脚本依赖剪贴板,请添加--copy。 <file>块会原样保存代码,而不再进行 XML 转义。.codigest/prompts.toml中的自定义模板现在也会收到未经转义的代码块;只有{instruction}会转义。digest输出现在会按源文件顺序编号、包含文档字符串,并接受多个路径。
从 0.8 升级
scan、diff、semdiff和digest不再保存到.codigest/*.txt;请使用-o FILE。diff --no-save等选项已移除。cdg init不再设置基线;请运行cdg mark。cdg pack FILES只会打包指定文件;如需使用之前的行为,请添加--with failure,changes,tests,imports。- 输出不再以模型的内置指令(“You are an expert...”)开头。请用
-m提供自己的指令,或在.codigest/prompts.toml中设置模板。
工作原理
- 基线。
.codigest/anchor/.shadow_git中的 Git 仓库,与项目自身的仓库分开。mark会将当前状态提交到该仓库;diff、semdiff、status和pack会将工作树与其进行比较。 - 捕获内容。 单个以换行符分隔的 JSON 文件会保存最近 200 条命令;每条输出上限为 64 KB,并保留开头和结尾部分。
- 输出。 文件内容会原样放入
<file>块。只有文件中出现 Codigest 自带块的结束标记(字面形式的</file>)时,才会写成</file>,以防提前结束代码块。 - MCP。 服务是一个通过 stdio 运行的小型 JSON-RPC 循环。每个工具都会使用
-s --no-copy调用常规 CLI,因此 Agent 看到的内容与你会粘贴的内容完全一致。
开发
git clone https://github.com/NaNIsaac/codigest
cd codigest
uv run cdg --help # run from the checkout
uv run --with pytest pytest -q # tests
许可证
MIT。请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。