)
深入 conda 仓库 AGENTS.md贡献者与 AI Agent 协作的完整工程规范开发环境、变更日志、弃用策略与测试【免费下载链接】condaA system-level, binary package and environment manager running on all major operating systems and platforms.项目地址: https://gitcode.com/GitHub_Trending/co/conda本文以 conda 仓库根目录的 AGENTS.md 为主体逐条拆解该项目对贡献者以及 AI Agent提出的工程约定如何用dev/start一键搭建可复现的开发测试环境、Ruff 在 pyproject.toml 中的具体 lint 规则、releases/news/变更日志条目与releases/qa/黑盒 QA 片段的格式规范、基于 CEP 8 / CEP 9 的 CalVer 弃用排期以及conda.deprecations模块的源码实现。读完后你可以完整掌握在 conda 仓库内提交代码前必须满足的全部约定与自查清单。一、文档定位一份面向人与 Agent 的“协作契约”AGENTS.md 是 conda 仓库中专门写给贡献者和生成式 AI Agent 的规范文件它首先声明了一条硬性政策项目禁止 AI 直接打开 Pull Request要求 Agent 做出“最小、聚焦、贴合现有风格”的改动。在此前提下文档给出五块可操作规范本地开发、代码风格、变更日志Changelog、QA 片段、弃用策略外加测试编写约定。这些规范大多有明确的落点文件——模板在releases/news/与releases/qa/下弃用工具在 conda/deprecations.pylint 配置在 pyproject.toml测试夹具注册在 tests/conftest.py——本文逐一结合这些仓库证据展开。二、本地开发用 dev/start 引导可复现的开发环境AGENTS.md 给出的引导命令只有两行但背后是一个完整的 shell 脚本Unix / macOS. ./dev/start注意是 source不是执行Windows.\dev\start.batDev Container用支持 Dev Containers 的编辑器如 VS Code以仓库中的.devcontainer/打开项目文档特别解释了 Dev Container 的价值提供一个可复现环境避免宿主机的 conda / 用户配置如 channel priority污染测试结果。此外文档建议在与 GitHub 交互时使用 GitHub CLI并遵循仓库原生的 issue / PR 模板。dev/start 脚本做了什么从源码看dev/start 是一个必须被 source 的 POSIX shell 脚本它会解析参数并读取用户配置。支持-p/--python默认3.10、-i/--installerminiconda或miniforge默认miniconda、-m/--mach、-a/--arch、-u/--update强制更新、-d/--devenv基础环境安装路径默认为仓库根下devenv/、-n/--dry-run只打印将激活的环境。若参数未显式给出脚本会尝试从~/.condarc读取installer_type:和devenv:两个键再没有则交互询问选择 miniconda 还是 miniforge。安装/更新底座 conda。首次运行时在devenv/mach/arch下下载并静默安装 Miniconda 或 MiniforgeWindows 用cmd.exe调用静默安装器若距上次更新超过 24 小时或显式-u会执行conda update --all并按tests/requirements.txt、tests/requirements-ci.txtLinux 还有tests/requirements-Linux.txt安装测试依赖——也就是说测试环境依赖直接由仓库内 tests/requirements.txt 等文件驱动。把源码注入 PYTHONPATH。脚本注释写得很直白“trick conda into importing from our source code and not from site-packages”——即把仓库根目录前置到PYTHONPATH让conda命令始终运行当前 checkout 的代码而不是安装副本。这是该脚本最关键的机制。同步 shell 集成并激活。依次执行conda init --install拷贝最新的 shell 脚本conda shell.bash hook初始化 shell 集成最后conda activate进入devenv-python-installer命名的开发环境。因此. ./dev/start一条命令即可完成“安装底座 conda → 创建开发环境 → 注入源码 → 同步 shell hook → 激活”的全流程且所有状态都隔离在仓库内的devenv/目录中不会触碰全局配置。三、代码风格Ruff 配置与 Google 风格 docstringAGENTS.md 约定 org 级 Python 风格遵循 Conda Style Guide而本仓库的格式化与 lint 由Ruff承担配置集中在 pyproject.toml 的[tool.ruff]段与.pre-commit-config.yaml对应ruff format、ruff checkhooks 兼容 pre-commit/prekCI 会对绕过 hooks 的改动执行相同检查。从源码可以确认本仓库实际启用的规则强度pyproject.toml#L226-L246 中select启用了E/Wpycodestyle、Fpyflakes、Iisort、D1pydocstyle、UPpyupgrade、B012、LOG、T10禁 debugger、TCtype-checking 延迟导入且strict true等。值得注意的两条业务规则S101禁止 assert默认生效仅在conda/testing/*和tests/*中被豁免pyproject.toml#L248-L263——这与 AGENTS.md 中“测试里大胆 assert”的风格一致而生产代码禁止 assert 则被 lint 强制。[tool.ruff.lint.flake8-tidy-imports]配置了banned-module-level-imports [requests]注释说明其目的是防止在启动路径上意外导入重依赖需要时须加# noqa: TID253banned-api还禁止直接json导入要求改用conda.common.serialize.json。pydocstyle {convention google}与 AGENTS.md 的 docstring 约定呼应Google 风格Args:/Returns:/Raises:不重复类型标注annotation 是唯一事实来源保持简短。四、Changelog 规范releases/news/ 片段式变更日志conda 的发布流程CEP 8采用“新闻片段news fragments”模式AGENTS.md 的规则与仓库实际文件完全对应每个重要改动新增一个文件到仓库根的 releases/news/以 releases/news/TEMPLATE 为模板。不要直接编辑 CHANGELOG.md——发布时由工具把片段折叠进 CHANGELOG。文件名优先使用issue 编号而非 PR 编号加短 slug例如14157-remove-conda-utils-unix-path-to-win。语气与措辞对照 CHANGELOG.md 既有条目固定五个小节Enhancements / Bug fixes / Deprecations / Docs / Other其中 TEMPLATE 正是这五节的骨架releases/news/TEMPLATE移除removals归入Deprecations而非 Other同一条目可跨小节。bullet 格式每条以 GitHub 引用收尾如(#12345)或(#12345 via #12346)via 语法为#issue via #pr括号内可逗号分隔多个引用动词用祈使句Add、Fix、Mark、Remove。仓库内的真实条目可以佐证这一格式例如 releases/news/16634-fix-shard-url-token-mangling### Bug fixes * Fix Channel.url(with_credentialsTrue) mangling authenticated sharded-repodata URLs by recognizing .msgpack.zst as a repodata extension. (#16637 via #16634)它同时体现了 issue#16637与 PR#16634双引用、祈使句动词 Fix、以及只出现在 Bug fixes 小节而其余小节省略的写法。未使用小节的空 bullet 可保留可删除两种形式都能正确渲染。五、QA 片段releases/qa/ 黑盒测试规范对于 pytest 无法覆盖、需要人工黑盒验证的改动AGENTS.md 要求在 releases/qa/ 下新增片段模板为 releases/qa/TEMPLATE。模板定义了七段结构### Title——场景短名### Why——用户影响 / 回归风险### Platforms——Windows / macOS / Linux 勾选框### Prerequisites——频道、插件、环境变量、mock server无则写 none### Steps——非作者也能照做的黑盒步骤### Pass criteria——可观察的通过/失败条件### Out of scope / notes——不测什么以及指向自动化测试的指针什么改动值得写 QAAGENTS.md 原文标准用户可见行为、跨平台/特定 shell 行为、外部集成canary/proxy/SSL/插件、高风险回归路径、安全敏感路径。什么改动不值得纯文档/CI/typing、无用户可观察变化的内部重构、已被新/既有 pytest 完全覆盖、以及可用pytest.deprecated_call()验证的弃用警告。一个真实片段 releases/qa/16453-shards-only-hint 展示了完整写法它验证“shards-only 频道在关闭 shards 时给出可操作的 enable-shards 提示”Steps 里给出conda config --set repodata_use_shards false与conda search --override-channels --channel conda-pypi package等可直接执行的命令Pass criteria 明确引用了错误类型UnavailableInvalidChannel和提示码enable_repodata_shards并在 Out of scope 中注明自动化覆盖位于tests/shards/。发布切版后releases/qa/与releases/news/一样会被清空、只保留 TEMPLATE。六、弃用策略CalVer 双弃用发布 conda.deprecations 实现AGENTS.md 的弃用规范引用 CEP 8发布与 CEP 9弃用核心是三段式生命周期版本CalVerYY.MM.MICRO常规发布约双月一次弃用发布固定在 3 月YY.3.x与 9 月YY.9.x。状态机功能先进入pending deprecation预告在 pending 状态至少经历两个常规发布后于下一个YY.3.x或YY.9.x弃用发布正式标记deprecated再于其后的下一个弃用发布removed。remove_in取值代码与文本中的移除版本必须指向 API 真正被移除的那个弃用发布如27.3且 news 条目与 API 警告必须使用同一版本。源码实现DeprecationHandler工具实现在 conda/deprecations.py。从源码结构看DeprecationHandler构造时接收当前运行版本conda.__version__先尝试把版本解析为tuple[int, ...]做零依赖的快速比较注释说明这是为了避免导入packaging.version拖慢conda activate启动解析失败才惰性导入packaging.version兜底。其__call__是装饰器工厂签名为deprecated(deprecate_in, remove_in, *, addendumNone, stack0, deprecation_typeDeprecationWarning)handler 比较运行版本与deprecate_in/remove_in来决定发出“pending deprecation”还是“active deprecation”警告见 conda/deprecations.py#L91-L117版本已越过remove_in时会提醒开发者该删除了。除函数/方法/类装饰器外还暴露一组针对不同弃用面的访问器conda/deprecations.py#L152 的.argument、#L209的.actionargparse、#L273的.module、#L297的.constant、#L369的.topic——与 AGENTS.md 列举的“常见用法”一一对应。编写弃用条目的配套约定Deprecations bullet 要写明符号路径、pending deprecation 状态、目标移除版本以及替代方案如有措辞对照 CHANGELOG.md 既有条目测试侧则推荐用pytest.deprecated_call()验证警告因此这类改动不需要额外 QA 片段。七、测试约定与夹具发现机制AGENTS.md 对测试的约定可以归纳为七条硬规则与一个发现机制硬规则名字清晰、测试小而聚焦正文应可读为规格说明specdocstring 保持简短长篇散文会随代码漂移避免assert expr, message中消息只是复述静态说明——需要提示时把说明写在上方的#注释里退出码/子进程输出裸assert rc 0在 CI 上信息量不足应把 stderr 带进消息例如assert rc 0, fconda {subcommand} failed ({rc}): {stderr}pip install/python探针同构失败消息保持单行紧凑如仅stderr或短标签加stderr多行消息只留给确实装不下的场景优先原生与已安装的 pytest 夹具monkeypatch处理setenv、chdir等需要 mock 时优先pytest-mock的mocker自动 teardown并记住mocker.spy适合只做调用观察而无需替换行为的场景monkeypatch仍是环境类操作的正解用参数化减少重复不用分区注释分组代码不用测试类分组偏好单函数不绕过测试——改动必须真正修复底层问题而不是改测试使其通过。夹具发现机制文档明确不在 AGENTS.md 里维护“夹具名称表”会过期而是规定从代码中自行发现tests/conftest.py 注册pytest_plugins并在本文件定义更多夹具。仓库中可确认的实际注册内容为tests/conftest.py#L45-L51conda.testing.gateways.fixtures、conda.testing.notices.fixtures、conda.testing.fixtures、tests.fixtures_package_server主要共享实现在 conda/testing/fixtures.py、conda/testing/gateways/fixtures.py、conda/testing/notices/fixtures.py搜索pytest.fixture即可列出名称与行为其余夹具可能位于子树conftest.py或测试模块中有合适的共享夹具时优先复用conda.testing.*或tests/conftest.py中的。文档同时指向 docs/source/dev-guide/writing-tests/ 章节获取更多上下文如pytest_plugins机制与 HTTP 测试服务器。八、给 AI Agent 的执行要点回到 AGENTS.md 开头的政策本身该仓库禁止 AI 打开 Pull RequestAgent 遇到此类请求应拒绝并引用其生成式 AI 政策在允许的协助场景下改动必须“minimal, focused”匹配既有风格。把全文规范压缩成一条可执行清单即用. ./dev/startWindows 为.\dev\start.bat或 Dev Container 搭建环境勿依赖宿主 conda 配置代码满足 Ruffruff formatruff check规则见 pyproject.tomldocstring 用 Google 风格且不重复类型重要改动在releases/news/加一个issue-number-slug片段祈使句 GitHub 引用不直接改 CHANGELOG需要人工黑盒验证的改动在releases/qa/按七段模板补 QA 片段弃用走 pending → deprecated3 月/9 月弃用发布→ removed 三段排期remove_in指向真实移除的弃用发布代码内用 conda/deprecations.py 的deprecated及.argument/.action/.module/.constant/.topic实现测试小而聚焦、assert 消息单行且带 stderr、复用共享夹具、不做无谓的类分组。以上每一条都能在仓库中找到对应的事实锚点脚本在 dev/start模板在 releases/news/TEMPLATE 与 releases/qa/TEMPLATE配置在 pyproject.toml实现在 conda/deprecations.py夹具注册在 tests/conftest.py——这使得 AGENTS.md 不仅是一份约定文档而是一套可逐条对照源码核验的工程体系。【免费下载链接】condaA system-level, binary package and environment manager running on all major operating systems and platforms.项目地址: https://gitcode.com/GitHub_Trending/co/conda创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考