CONTRIBUTING.md
Rama main · réplica de lectura del repositorio original.
# 贡献指南 / Contributing Guide
欢迎为 Scout Agent 贡献代码、文档或想法!请阅读以下指南。
## 开发环境
依赖以 `pyproject.toml` 为**唯一事实来源**,`uv.lock` 是跨平台锁定文件(含 Linux/macOS/Windows 的 marker 分支)。
```bash
git clone https://github.com/core-power/Scout-Agent.git
cd Scout-Agent
uv sync --frozen --extra dev --extra test # 按 uv.lock 精确还原环境
uv run pytest tests/unit -q # 运行测试
```
- `--frozen`:严格按 `uv.lock` 安装,不重新解析版本——保证本地/CI 依赖完全一致。
- `dev` 组 = pytest / pytest-asyncio / pytest-cov / ruff;`test` 组 = 测试期可选依赖(Pillow;Windows 上另装 pywinpty 以真实执行 ConPTY 用例)。
- 跑全量可选功能:`uv sync --frozen --extra dev --extra full --extra platforms`。
改了 `pyproject.toml` 的依赖后**必须**重新生成锁并一并提交,否则 CI 的 `--frozen` 会失败:
```bash
uv lock # 更新 uv.lock
uv lock --check # 校验锁与 pyproject 一致
```
未使用 uv 的环境仍可用传统方式(不享受锁定的一致性保证):
```bash
pip install -r requirements.txt
pip install -e ".[dev]"
```
## 代码规范
- Python 3.11+,遵循 [ruff](https://docs.astral.sh/ruff/) 配置(见 `pyproject.toml`,line-length 100)
- 提交前运行 `ruff check scout tests`,确保无错误(CI 的 lint 作业即此命令,为**阻断级**)
- 存量债务规则(`F401`/`E741`/`B023`/`B905`/`B904`/`B017` 等)已在 `[tool.ruff.lint].ignore` 中逐项注明条数与原因
- `scripts/ tools/ plugins/ examples/` 同样**阻断**。2026-09-24 已清零其存量违规,其中 `scripts/gen_i18n_dict.py` 原有 16 处 `F601` 字典重复键——Python 对 dict 字面量重复键**静默取最后一个值、永不报错**,会让 `i18n.js` 的英文文案随书写顺序漂移;该脚本现由 `assert_no_duplicate_keys()`(AST 自解析)在生成前硬校验
- 提交信息使用清晰的中文或英文描述,遵循 Conventional Commits 风格(如 `feat: ...` / `fix: ...`)
## 持续集成
`.github/workflows/ci.yml` 在 push 到 `main`、Pull Request 及手动触发时运行:
| 作业 | 内容 | 是否阻断 |
|------|------|----------|
| `lint` | `ruff check scout tests` + `ruff check scripts tools plugins examples` | 两者均阻断 |
| `test` | Python 3.11 / 3.12 × Ubuntu / Windows 四格矩阵,`uv sync --frozen` 后跑 `pytest tests/unit -m "not integration"` 并产出覆盖率 | 阻断 |
矩阵刻意包含 `windows-latest`:本项目主打 Windows 便携化,大量路径/编码/ConPTY 行为只在 Windows 上被真实覆盖。
## 测试
```bash
# 运行全部单元测试
pytest tests/unit -v
# 运行单个测试文件
pytest tests/unit/test_tools.py -v
```
新增功能必须附带单元测试(放在 `tests/unit/`)。涉及安全的功能(认证、沙箱、SSRF、密钥)必须补充安全相关测试。
## 如何新增工具
1. 在 `scout/tools/builtin/` 下新建目录
2. 实现继承 `ToolDefinition` 的工具类
3. 在工具目录的 `__init__.py` 中注册
4. 在 `tests/unit/` 添加测试
## 如何新增平台适配器
1. 在 `scout/adapters/platforms/` 下实现 `ChannelAdapter` 接口
2. 在 `channel_manager.py` 中注册
3. 在 Web UI 中添加配置表单
## 分支与 PR
- 从 `main` 拉取特性分支:`git checkout -b feat/xxx`
- 提交后推送并创建 Pull Request
- PR 描述中说明改动目的、测试结果;CI 必须通过
## 安全相关
- 发现安全漏洞,**不要**公开提交 Issue,请通过 [SECURITY](docs/security.md) 中的渠道私密报告
- 绝不在代码、文档或提交信息中放入真实 API Key、密码或个人信息
## 行为准则
保持友善、尊重他人的协作氛围。任何形式的骚扰或歧视均不被容忍。