Ctrl K
ComunidadGuías…

CONTRIBUTING.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 贡献指南 / 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、密码或个人信息

## 行为准则

保持友善、尊重他人的协作氛围。任何形式的骚扰或歧视均不被容忍。