本文件面向框架核心开发者——修改 ncatbot/ 源码、编写测试、维护文档与 Agent Skills。
- Fork 并 clone 本仓库
- 准备开发环境
- 新建分支开发
- 测试通过
- 提交并开 Pull Request
git clone --recurse-submodules https://github.com/<你的用户名>/ncatbot.git
cd ncatbot
--recurse-submodules是必须的,docs/是 Git submodule,测试和文档构建依赖它。 若已 clone 但未拉取子模块,补执行git submodule update --init。
推荐使用 uv 管理环境:
uv sync --extra dev # 安装依赖
uv run pre-commit install # 启用 pre-commit(仅需一次)激活虚拟环境:
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate.ps1 # Windows PowerShellpre-commit 会在
git commit时自动检查格式。若自动修复了文件,请git add重新暂存后再提交。
如果你使用 VS Code + GitHub Copilot,工作区内置的 领域技能(Skills) 可极大提升效率:
| 场景 | Agent 技能 |
|---|---|
| 定位代码、追踪调用链 | codebase-nav / code-nav |
| 修 Bug、写新功能、重构 | framework-dev |
| 写测试、调试测试 | testing-framework / testing-design |
| 写文档、修文档 | docs-maintenance |
直接在 Copilot Chat 中用自然语言描述需求,Agent 会自动加载对应技能。
新建分支:
git checkout -b feat/描述性短名 # feat/ fix/ refactor/ docs/每次变更应同步考虑这四项,保持项目一致性:
| 产物 | 位置 |
|---|---|
| Code | ncatbot/ |
| Test | tests/ |
| Docs | docs/docs/notes/ |
| Skill | .agents/skills/ |
并非每个 PR 都必须四项齐全——小修复可能只涉及 Code + Test。但请在提交前有意识地检查是否需要同步其他产物。
- 跨 layer:使用绝对导入,最多到二级平台子模块(如
from ncatbot.event.qq import GroupMessageEvent) - 同 layer 内部:使用相对导入(如
from ..logger import get_early_logger)
详见
.agents/skills/framework-dev/references/import-conventions.md
git commit -m "feat(plugin): 新增热重载事件通知"
git commit -m "fix(api): 修复消息队列溢出问题 #123"
git commit -m "docs: 更新适配器指南"uv run pytest # 全部测试
uv run pytest --cov=ncatbot --cov-report=term-missing # 带覆盖率
uv run pytest tests/unit/ -v # 仅单元测试本项目采用规范驱动测试——每个测试函数的 docstring 以 spec-id 开头(如 R-10、PL-01),测试分为 unit / integration / e2e 三层。
详见 tests/README.md 了解完整的 spec-id 索引与测试规范。
uv run tox # Python 3.12 + 3.13
uv run tox -e py312 # 仅 3.12CI 会自动在多版本上运行,本地非必需。
ncatbot/
├── adapter/ # 平台适配器(NapCat、Bilibili、GitHub、Mock)
├── api/ # Bot API 客户端
├── app/ # 应用入口(BotClient)
├── cli/ # 命令行工具
├── core/ # 核心分发器、注册器、Hook 系统
├── event/ # 事件定义
├── plugin/ # 插件系统(加载器、Mixin)
├── service/ # 框架服务(RBAC、定时任务、文件监听)
├── testing/ # 测试框架(TestHarness、PluginTestHarness)
├── types/ # 消息类型、数据模型
└── utils/ # 工具模块(配置、日志)
- pyproject.toml:定义顶层依赖
- uv.lock:锁定版本(已纳入版本控制)
uv lock # 修改 pyproject.toml 后重新锁定
uv lock --upgrade # 升级所有依赖将 pyproject.toml 和 uv.lock 一起提交。
git push origin feat/描述性短名在 GitHub 上向上游仓库创建 Pull Request,说明变更内容并关联 Issue(如有)。
- 遵循 PEP8,尽量添加类型注解
- 必要时添加清晰的 docstring:
def handle_event(event: Event):
"""处理机器人事件。
Args:
event: 继承自 BaseEvent 的事件对象。
"""