代码错误
AI助手的持久代码查找、需求和发布跟踪器。 SQLite支持,通过MCP服务器+CLI公开。
AI助手在会话之间失去上下文。代码bug为代码审查结果、需求、依赖阻断器、并行代理协调和发布里程碑提供了持久的内存,并且令牌开销最小。
Session 1: Review code → log 50 findings → forget them
Session 2: summary → instant orientation → fix 20 → update status
Session 3: pull_next → claim work → mark integrated → next agent picks up没有上下文丢失。无需重新读取文件。没有象征性的重提。平行代理人不参加比赛。
为什么是代码bug
用人工智能助手构建一个真正的代码库会产生四个问题,随着时间的推移,这些问题会变得更加复杂:
- 结果丢失了。 你花了2万个代币来审查一个文件,在聊天中记录了12个bug,而下一个会话根本不知道它们的存在。
- 需求漂移。 REQUIREMENTS.md被手动编辑,被遗忘,与代码相矛盾,没有人抓住它。
- 平行代理竞争。 两个代理都选择了相同的bug,都编辑了相同的文件,都认为自己已经发布了它。
- 释放失去了对其中内容的跟踪。 工作被困在特色树枝上长达9天。“我们在1.1上的位置在哪里?”没有单一的答案。
codebugs是一个SQLite数据库(.codebugs/findings.db)这就解决了这四个问题。8个独立模块、59个MCP工具、1个CLI。
安装
# Global install (recommended)
pipx install codebugs
# Or with pip/uv
pip install codebugs设置
克劳德代码(MCP)
添加 ~/.claude.json (全球)或 .mcp.json (每个项目):
{
"mcpServers": {
"codebugs": {
"command": "codebugs-mcp"
}
}
}数据库位于 .codebugs/findings.db 在当前工作目录中,每个项目都有自己的。添加 .codebugs/ 致你的 .gitignore.
独立运行模块
使用 --mode 只加载您需要的工具:
{
"mcpServers": {
"codebugs": {
"command": "codebugs-mcp",
"args": ["--mode", "findings"]
}
}
}| 模式 | 工具 | 使用它时 |
|---|---|---|
findings | 8 | 仅代码审查/错误跟踪 |
reqs | 11 | 仅规范跟踪 |
sweep | 9 | 批量迭代/状态机任务 |
bench | 4 | 性能基准 |
merge | 5 | 多代理合并协调 |
blockers | 4 | 跨实体依赖关系跟踪 |
milestones | 18 | 发布+流媒体+容量感知拉取 |
all | 59 | 默认值--全部 |
CLI采用相同的标志: codebugs --mode findings summary.
其他MCP客户端
任何兼容MCP的客户端都可以连接到 codebugs-mcp 通过stdio传输。
八个模块
| 模块 | 域 | 标题工具 |
|---|---|---|
| 发现 | 漏洞、技术债务、审查结果 | summary, add, query, categories |
| 需求 | 功能要求(FR-N) | reqs_summary, reqs_add, reqs_verify, reqs_search_similar |
| 阻碍因素 | “X被Y阻塞”依赖图 | blockers_add, blockers_check |
| 打扫 | 使用状态机进行批量迭代 | codesweep_create, codesweep_next, codesweep_mark |
| 长凳 | 性能基准快照 | codebench_import, codebench_query |
| 合并 | 并行代理合并序列化 | codemerge_start, codemerge_claim |
| 里程碑 | 发布、流媒体、容量感知拉取 | pull_next, milestone_status, milestone_close |
模块是自注册的——添加新模块是在其自己的文件本地进行的。看 docs/superpowers/specs/ 建筑史。
快速浏览
发现——记录下来,永远不要重新发现
MCP工具:
| 工具 | 目的 |
|---|---|
summary | 仪表板概述-- 从这里开始 用于定向 |
add | 记录发现的严重性、类别、文件、描述 |
batch_add | 一次记录多个发现 |
update | 更改状态、添加注释、更新标签或元数据 |
query | 使用分页和分组进行搜索/筛选 |
stats | 交叉表计数(严重性x类别/文件/状态) |
categories | 列出现有类别-- 之前打电话 add 为了保持一致性 |
staleness_check | 与git历史进行比较;标记过时的发现 |
CLI:
codebugs add -s high -c n_plus_one -f src/api.py -d "Query in loop at line 42"
codebugs summary
codebugs query --status open --severity critical
codebugs update CB-1 --status fixed --notes "Fixed in PR #42"
codebugs categories当添加新发现时 里程碑自动路由器 自动将其附加到 stream/triage (或 stream/security 当 severity=critical 和 category 以...开始 security:).该发现及其分诊条目属于同一交易。
要求——核实发货内容,表面矛盾
MCP工具:
| 工具 | 目的 |
|---|---|
reqs_summary | 需求仪表板-- 从这里开始 |
reqs_add | 添加要求(FR-001、优先级、状态、测试覆盖率) |
reqs_update | 更改状态、描述、优先级、测试覆盖率 |
reqs_query | 按状态、优先级、部分、自由文本搜索/筛选 |
reqs_stats | 交叉表计数(状态x优先级) |
reqs_verify | 自动检查:重影测试文件、重复ID、状态矛盾 |
reqs_import | 从REQUIMENTS.md导入(解析markdown表) |
reqs_embed / reqs_batch_embed | 存储嵌入向量 |
reqs_search_similar | 跨需求的语义搜索 |
reqs_embedding_stats | 嵌入覆盖率报告 |
CLI:
codebugs reqs-import REQUIREMENTS.md
codebugs reqs-summary
codebugs reqs-verify
codebugs reqs-query --status Implemented --priority Must
codebugs reqs-update FR-090 --status Superseded --notes "Replaced by vault architecture"
codebugs reqs-export REQUIREMENTS.md阻止程序——“X被Y阻止”,自动解除阻止
MCP工具:
| 工具 | 目的 |
|---|---|
blockers_add | 推迟一个项目,直到另一个项目解决、日期过去或手动信号发出 |
blockers_query | 按项目、依赖关系、触发器类型筛选的列表阻止程序 |
blockers_check | 查找当前可操作的项目(所有拦截程序均已满足) |
blockers_resolve | 取消或手动解决阻止程序 |
触发器有三种类型: entity_resolved (等待另一个发现/要求达到终端状态), date (在特定日期时间解除阻塞),以及 manual (操作员信号)。当你标记一个发现时 fixed,每一个等待它的阻断器都会自动解除阻断,并在下一个阻断器中浮出水面 blockers_check.
里程碑——释放容器+固定流+容量感知拉取
MCP工具:
| 工具 | 目的 |
|---|---|
milestone_status | 一个里程碑的汇总(按状态/大小、仅分支机构、已阻止、距离目标天数计数) |
milestone_list | 列出里程碑,按种类/状态筛选 |
milestone_create | 创建发布或流 |
milestone_update | 突变 description, target_date, state |
milestone_add_item | 将错误/需求/外部参考附加到里程碑 |
milestone_move_item | 在里程碑之间移动项目 |
milestone_set_status | 打开/正在进行/已完成/已解除/推迟 |
milestone_defer | 移动到 stream/maintenance 状态=“已发送” |
milestone_close | 如果仍有打开/仅分支/被阻止的项目,则拒绝(强制覆盖,流除外) |
milestone_audit_query | 完整的状态转换历史 |
triage_inbox | 等待分拣的物品 |
triage_dismiss | 拒绝分诊项目;传播到基础实体 |
triage_promote | 将分流项目移动到目标里程碑 |
pull_next | 原子性地为调用代理声明下一个符合条件的项目 |
release_item | 自由球员容量(status='done' 或 'abandoned') |
wip_status | 快照 agent_capacity 每个代理人 |
mark_branch_only | 将项目标记为仅存在于功能分支上 |
mark_integrated | Mark与提交SHA合并到main;仅清除分支 |
自动创建四个种子里程碑:
stream/triage--未排序结果的收件箱(默认目的地)stream/maintenance--延期/童子军工作stream/security--紧急修复(抢先发布工作)release/1.1--1.0之后的首次发布
pull_next 优先级顺序: stream/security > release/* (最早 target_date 第一)> stream/triage > stream/maintenance在一个里程碑内:优先ASC,然后 created_at ASC。
资格: 项目是 open,无活性阻断剂(跳过 item_kind='external'),需要验收 size='large',并且必须声明发布里程碑中的一个大错误 linked_frs 其id解析为中的行 requirements来自多个代理的并发调用是原子性的——声明通过以下方式序列化 BEGIN IMMEDIATE.
CLI:
codebugs milestone-list
codebugs milestone-status release/1.1
codebugs triage-inbox
codebugs wip-status
codebugs milestone-audit --milestone release/1.1一个典型的自主代理循环:
# 1. Agent claims the next eligible item.
item = pull_next(agent_id="agent-A", capacity={"large": 1, "small": 2, "triage": 5})
# 2. (Optional) flag a feature branch.
mark_branch_only(item_ref=item["item_ref"], branch_name="feat/CB-1234")
# 3. After integration, mark it done with the commit SHA.
mark_integrated(item_ref=item["item_ref"], commit="abc123…")
# 4. Free the agent's capacity slot.
release_item(item_ref=item["item_ref"], status="done")关闭释放运行关闭门:未完成、仅分支和阻断门项目拒绝让里程碑发货。 force=True (有记录的原因)覆盖——但是 stream/* 里程碑 不能 即使用力,也要关闭。
扫描——具有递归感知生命周期的批量迭代
MCP工具:
| 工具 | 目的 |
|---|---|
codesweep_create | 创建新扫掠(可选 lifecycle=[...], terminal_states=[...], transitions={...} 对于状态机) |
codesweep_add | 添加项目。 原子扰乱:现有项目碰撞 recurrence_count,刷新 last_seen,取消存档 |
codesweep_next | 下一批未处理(非终端、非归档)项目 |
codesweep_mark | 过渡状态(遗留 processed=True 仍然有效) |
codesweep_status | 进度概述 |
codesweep_archive / codesweep_archive_items | 软删除 |
codesweep_list_items / codesweep_list | 检查 |
codebugs sweep-create --name lint-pass --batch-size 5
codebugs sweep-add lint-pass src/*.py --tags critical
codebugs sweep-next lint-pass
codebugs sweep-mark lint-pass src/api.py
codebugs sweep-status lint-pass具有自定义生命周期(例如用于追溯发现):
codebugs sweep-create --name retro-findings \
--lifecycle DETECTED,CONFIRMED,ESCALATED,RESOLVED,DROPPED \
--terminal-states RESOLVED,DROPPED
codebugs sweep-add retro-findings finding-2026-04-todo-bypassed --tags silent_abandonment
codebugs sweep-mark retro-findings finding-2026-04-todo-bypassed --state CONFIRMED
codebugs sweep-archive-items retro-findings --state RESOLVED --older-than 30d工作台--随时间变化的性能快照
MCP工具:
| 工具 | 目的 |
|---|---|
codebench_import | 导入基准测试结果(文件或内联) |
codebench_query | 跨运行筛选和趋势指标 |
codebench_list | 列出记录的跑步记录 |
codebench_delete | 删除跑步记录 |
Merge--并行代理合并序列化
MCP工具:
| 工具 | 目的 |
|---|---|
codemerge_start | 打开合并会话 |
codemerge_claim | 会话的索赔文件(咨询文件级索赔) |
codemerge_check | 检查是否存在重叠索赔 main |
codemerge_merge | 标记正在进行的合并(获取TTL全局合并锁) |
codemerge_finish | 松开锁 |
运作原理
问题
人工智能代码审查会议产生的结果会丢失。多个代理并行进行双索赔工作。需求文件漂移。释放失去了对其中内容的跟踪。
解决方案
codebug将所有内容存储在一个本地SQLite数据库中。人工智能助手在发现结果、需求和里程碑项目时将其写入,然后在未来的会话中查询数据库以进行即时上下文恢复。并发代理通过同一数据库进行协调——没有竞争条件,原子声明。
代币节省A. summary 调用返回约200个令牌的结构化JSON概述。如果没有代码错误,重建相同的上下文需要花费2K-10K+的文件读取和对话历史令牌。
典型工作流程
代码审查循环:
- AI审查代码,调用
categories为了命名的一致性,那么add对于每一个发现。 - 每
add自动将发现路由到stream/triage. - 下一节:人工智能通话
summary→ 50 公开调查结果→query --severity critical→ 修复最坏的情况→update CB-N --status fixed. - 随着时间的推移,
categories揭示系统性问题——“12tz_naive_datetime已修复9个文件→ 是时候制定皮棉规则了。"
释放循环:
- 分类:人工智能呼叫
triage_inbox→triage_dismiss无缺陷,triage_promote真实物品release/1.1(与linked_frs对于需要FR行的那些)。 - 执行:每个并行代理调用
pull_next(agent_id=..., capacity=...)→ 领取下一个符合条件的物品。 - 着陆后:
mark_integrated(item, commit)→release_item(item, status='done'). - 关闭:
milestone_close("release/1.1").如果树枝上有东西搁浅,拒绝;列出违规者及其分支机构名称。
模式(突出显示)
所有桌子共享 .codebugs/findings.db 具有灵活的JSON列。模式是累加的——每个模块都拥有自己的表,声明依赖关系,并以累加的方式迁移。
研究结果
| 字段 | 类型 | 描述 |
|---|---|---|
id | text | 自动生成(CB-1, CB-2, ...)或用户提供 |
severity | 文本 | critical, high, medium, low |
category | text | 用户定义(例如。 n_plus_one, missing_validation, security:xss) |
file | text | 相对于项目根目录的文件路径 |
status | 文本 | open, in_progress, fixed, not_a_bug, wont_fix, stale |
description | text | 怎么了 |
source | 文本 | claude, ruff, human, mypy, ... |
tags | json | 用于特殊分组的字符串数组 |
meta | json | lines, module, rule_code, cwe_id, ... |
reported_at_commit, reported_at_ref | text | 过期检查的来源 |
需求
| 字段 | 类型 | 描述 |
|---|---|---|
id | text | 用户提供(FR-001, NFR-001, ...) |
section, description, priority, status, source, test_coverage | 文本 | 每行元数据 |
embedding | blob | 用于语义搜索的可选float32向量 |
tags, meta | json |
里程碑
| 表 | 目的 |
|---|---|
milestones | 蛞蝓(release/1.1, stream/triage)、种类、状态、目标日期、描述 |
milestone_items | (milestone_id, item_kind, item_ref) 链接、大小、优先级、状态、接受、仅分支、完成提交 |
milestone_audit | 仅附加日志:actor、action、from_state→ to_state、原因、时间戳 |
agent_capacity | 根据代理人WIP(large_held, small_held, triage_held,最后一次拉动/释放) |
项目种类有 bug (根据验证 findings), requirement (根据验证 requirements),或 external (自由形式,跳过拦截器)。这 (milestone_id, item_kind, item_ref) 独特的约束可防止双重附着。
阻塞器
| 字段 | 类型 | 描述 |
|---|---|---|
item_id, item_type | text | 被阻止的实体(例如。 CB-5 / finding) |
blocked_by, blocked_by_type | text | 依赖关系(日期/手动触发器为空) |
trigger_type | 文本 | entity_resolved, date, manual |
trigger_at | text | 日期触发器的UTC日期时间 |
reason | text | 人类解释 |
清扫
| 表 | 目的 |
|---|---|
codesweeps | sweep_id、名称、描述、生命周期、终端状态、转换DAG |
codesweep_items | (sweep_id, item) 唯一密钥; state, recurrence_count, first_seen, last_seen, archived_at |
杀手级功能
随时间变化的模式检测
$ codebugs categories
category total open fixed
tz_naive_datetime 15 3 12
n_plus_one 8 2 6
missing_input_validation 6 4 2如果你一直固定同一个类别→ 是时候制定皮棉规则了。代码bug将被动的bug修复转化为主动的预防。
需求验证
reqs_verify 在文档发货前发现其腐烂:
$ codebugs reqs-verify
Verified 683 requirements.
12 issue(s) found:
check sev id message
tests high FR-350 Test file not found: test_entity_graph.py
status high FR-090 Description mentions 'superseded' but status is 'Planned'
status medium FR-006 Must-priority requirement implemented without test coverage
ids medium -- Numbering gaps (5+): FR-025..FR-029, FR-316..FR-329语义需求搜索
存储嵌入(调用方通过任何嵌入API生成向量),并从语义上查找相关需求:
reqs_embed(req_id="FR-001", embedding=[0.1, 0.2, ...])
reqs_search_similar(query_embedding=[...], limit=5, min_similarity=0.3)SQLite中的Float32-BLOB存储;强力余弦相似性——快速满足数千种需求。
关门执法
milestone_close("release/1.1") 不会让你发布一个工作滞留在分支上的版本:
$ codebugs milestone-status release/1.1
release/1.1 (release, state=open)
target: 2026-06-15 (35 days)
Items: 12 total (3 open/in_progress, 9 done)
Branch-only: CB-1234
Blocked: CB-1240当您尝试关闭它时:
ValueError: cannot close release/1.1: unfinished items (3): CB-1234, CB-1240, CB-1242;
branch-only items (1): CB-1234@feat/CB-1234;
items with active blockers (1): CB-1240
(use force=True with reason to override)溪流(stream/*)根本拒绝关闭——它们是永久性的桶。
需求
- Python 3.11+
- 除此之外没有外部运行时依赖关系
mcp>=1.0.0(对于服务器) - SQLite(与Python捆绑在一起)
发展
# Run tests
uv run python -m pytest tests/ -v
# Lint
uv run ruff check src/ tests/
# Format
uv run ruff format src/ tests/看 CLAUDE.md 建筑规则和惯例。
许可证
麻省理工学院
