docs/project/CONTRIBUTING.zh.md
感谢你对 PicoClaw 的关注!本项目是一个社区驱动的开源项目,目标是构建 轻量灵活,人人可用 的个人AI助手。我们欢迎一切形式的贡献:Bug 修复、新功能、文档、翻译和测试。
PicoClaw 本身在很大程度上是借助 AI 辅助开发的——我们拥抱这种方式,并围绕它构建了贡献流程。
我们致力于维护一个友好、互相尊重的社区环境。请保持善意、建设性的态度,并善意地理解他人。任何形式的骚扰或歧视均不被接受。
对于较大的新功能,请先提交 Issue 讨论设计方案,再动手写代码。这能避免无效投入,也确保与项目方向保持一致。
git clone https://github.com/<你的用户名>/picoclaw.git
cd picoclaw
git remote add upstream https://github.com/sipeed/picoclaw.git
makemake build # 构建二进制文件(会先执行 go generate)
make generate # 仅执行 go generate
make check # 完整的提交前检查:deps + fmt + vet + test
make test # 运行所有测试
go test -run TestName -v ./pkg/session/ # 运行单个测试
go test -bench=. -benchmem -run='^$' ./... # 运行基准测试
make fmt # 格式化代码
make vet # 静态分析
make lint # 完整的 lint 检查
所有 CI 检查通过后 PR 才能被合并。推送代码前请先在本地运行 make check,提前发现问题。
始终从 main 分支切出,并在 PR 中以 main 为目标分支。不要直接向 main 或任何 release/* 分支推送代码:
git checkout main
git pull upstream main
git checkout -b 你的功能分支名
请使用描述性的分支名,例如:fix/telegram-timeout、feat/ollama-provider、docs/contributing-guide。
Fix session leak (#123)。提 PR 前,请将你的分支变基到上游 main:
git fetch upstream
git rebase upstream/main
PicoClaw 在很大程度上借助 AI 辅助开发,我们完全拥抱这种开发方式。但贡献者必须清楚地了解自己在使用 AI 工具时所承担的责任。
每个 PR 都必须通过 PR 模板中的 🤖 AI 代码生成 部分披露 AI 参与情况,共分三个级别:
| 级别 | 说明 |
|---|---|
| 🤖 完全由 AI 生成 | AI 编写代码,贡献者负责审查和验证 |
| 🛠️ 主要由 AI 生成 | AI 起草,贡献者做了较大修改 |
| 👨💻 主要由人工编写 | 贡献者主导,AI 仅提供辅助或未使用 AI |
我们期望你诚实填写。三种级别均可接受,没有任何歧视——重要的是贡献的质量。
使用 AI 生成代码并不能减轻你作为贡献者的责任。在提交含有 AI 生成代码的 PR 之前,你必须:
如果明显可以看出贡献者没有阅读或测试 AI 生成的代码,该 PR 将被直接关闭,不予审查。
AI 生成的代码与人工编写的代码遵循相同的质量要求:
make check)。AI 生成的代码需要格外仔细的安全审查。请特别关注以下方面:
244eb0b 就是真实案例)exec.Command、shell 调用等)如果你不确定某段 AI 生成代码是否安全,请在 PR 中说明——审查者会帮助判断。
make check 并确认通过。PR 模板要求填写:
请尽量提交小而易于审查的 PR。一个涉及 5 个文件共 200 行改动的 PR,远比涉及 30 个文件共 2000 行改动的 PR 容易审查。如果你的功能较大,可以考虑将其拆分为一系列逻辑完整的小 PR。
main — 活跃开发分支。所有功能 PR 均以 main 为目标。该分支受保护:禁止直接推送,合并前必须获得至少一名维护者的批准。release/x.y — 稳定发布分支,在某个版本准备发布时从 main 切出。这些分支的保护级别高于 main。main 的前提条件PR 必须同时满足以下所有条件,才能被合并:
只有维护者才能合并 PR。贡献者不能合并自己的 PR,即使拥有写权限也不行。
为保持 main 历史清晰可读,我们对大多数 PR 使用 Squash Merge。每个合并的 PR 变为一个包含 PR 编号的单独 commit,例如:
feat: Add Ollama provider support (#491)
如果一个 PR 包含多个独立、结构清晰、能讲述完整故事的 commit,维护者可视情况使用普通 merge。
当某个版本准备就绪时,维护者会从 main 切出 release/x.y 分支。此后:
main 上的某个修复属于安全漏洞、数据丢失或崩溃类问题,维护者会将相关 commit cherry-pick 到受影响的 release/x.y 分支,并发布补丁版本。如果你认为 main 上的某个修复应该被回溯到某个 release 分支,请在 PR 描述中注明,或单独开一个 Issue 说明。最终决定由维护者做出。
Release 分支的保护级别高于 main,在任何情况下均不允许直接推送。
sync.RWMutex")。审查重点:
请给出建设性且具体的反馈。"如果两个 goroutine 同时调用这个函数可能会有竞态条件,建议在这里加一个 mutex" 远比 "这里看起来有问题" 更有帮助。
提交对应PR后,可以参考下表联系对应的审查人员沟通
| Function | Reviewer |
|---|---|
| Provider | @yinwm |
| Channel | @yinwm/@alexhoshina |
| Agent | @lxowalle/@Zhaoyikaiii |
| Tools | @lxowalle |
| SKill | |
| MCP | |
| Optimization | @lxowalle |
| Security | |
| AI CI | @imguoguo |
| UX | |
| Document |
有疑问时,请先开 Issue 讨论,再动手写代码。这几乎没有成本,却能避免大量无效投入。
PicoClaw 的架构在人工监督下,经由 AI 辅助完成了大量设计和实现工作。如果你发现某处看起来奇怪或过度设计,这可能是该过程留下的痕迹——欢迎提 Issue 讨论。
我们相信,负责任地使用 AI 辅助开发能产生优秀的成果。我们同样相信,人类必须对自己提交的内容负责。这两点并不矛盾。
感谢你的贡献!