dependency-sync
依赖同步技能
自动检测修改后的代码文件中的新导入,并更新包清单。此技能确保当代码编写使用新依赖时,相应的清单文件(package.json、pyproject.toml、requirements.txt等)会自动更新。
变量
| 变量 | 默认值 | 描述 |
|---|---|---|
| AUTO_INSTALL | true | 自动安装检测到的依赖 |
| PROMPT_BEFORE_INSTALL | false | 安装前询问用户(覆盖AUTO_INSTALL) |
| INCLUDE_DEV_DEPS | true | 检测开发依赖(测试框架、linters) |
| COMMIT_CHANGES | true | 将清单更改作为任务的一部分提交 |
| TRIGGER_DOCS_AUDIT | true | 添加依赖后运行docs-audit --new-only |
指令
强制性 - 按照下面的工作流程步骤顺序进行。不要跳过步骤。
- 从git diff或实施上下文中检测修改过的文件
- 从修改过的文件中解析导入/需求
- 与当前清单依赖进行比较
- 确定项目的包管理器
- 安装缺失的依赖
- 可选触发新库的docs-audit
红旗 - 停止并重新考虑
如果你即将:
- 在不验证导入是否真的使用的情况下安装包
- 跳过清单检测(假设包管理器)
- 安装到错误的清单(例如,devDependencies vs dependencies)
- 在不检查包是否存在于注册表的情况下安装
停止 -> 验证导入是否真实 -> 检查清单 -> 然后安装
工作流程
1. 收集修改过的文件
确定当前实施中修改过的文件:
# 如果在git上下文
git diff --name-only HEAD~1 HEAD -- "*.py" "*.ts" "*.js" "*.tsx" "*.jsx" "*.go" "*.rs"
# 或从任务上下文 - 被写入/编辑的文件
2. 提取导入
根据语言解析每个修改过的文件中的导入:
| 语言 | 导入模式 |
|---|---|
| Python | import X, from X import Y |
| TypeScript/JavaScript | import X from 'Y', require('Y') |
| Go | import "X" |
| Rust | use X::Y, extern crate X |
3. 检测包管理器
检查清单文件以确定包管理器:
| 清单 | 包管理器 | 安装命令 |
|---|---|---|
pyproject.toml(带uv) |
uv | uv add <package> |
pyproject.toml(poetry) |
poetry | poetry add <package> |
requirements.txt |
pip | pip install <package> |
package.json |
npm/yarn/pnpm | npm install <package> |
Cargo.toml |
cargo | cargo add <package> |
go.mod |
go | go get <package> |
pubspec.yaml |
pub | flutter pub add <package> |
4. 比较依赖
对于每个提取的导入:
- 将导入名称规范化为包名称(例如,
from PIL import Image->pillow) - 检查包是否存在于清单中
- 如果缺失,添加到安装列表
5. 安装依赖
执行缺失依赖的安装命令:
# Python with uv
uv add <package1> <package2>
# Node.js
npm install <package1> <package2>
# Rust
cargo add <package1> <package2>
# Go
go get <package1> <package2>
6. 安装后操作
如果TRIGGER_DOCS_AUDIT为true且添加了新依赖:
- 运行
/ai-dev-kit:docs-audit --new-only - 如果文档缺失,建议
/ai-dev-kit:docs-add-stack
食谱
Python导入映射
- IF: 解析Python导入
- THEN: 阅读
cookbook/python-imports.md - RESULT: 规范化的包名称
Node导入映射
- IF: 解析JavaScript/TypeScript导入
- THEN: 阅读
cookbook/node-imports.md - RESULT: 规范化的包名称
分类规则
- IF: 确定依赖是开发还是生产
- THEN: 阅读
cookbook/dependency-classification.md - RESULT: 清单中正确的目标
快速参考
导入到包映射
| 导入 | 包名称 | 注释 |
|---|---|---|
PIL |
pillow |
Python成像 |
cv2 |
opencv-python |
OpenCV |
yaml |
pyyaml |
YAML解析器 |
sklearn |
scikit-learn |
ML库 |
bs4 |
beautifulsoup4 |
HTML解析 |
pg |
pg(npm)/asyncpg(py) |
PostgreSQL |
@tanstack/react-query |
@tanstack/react-query |
直接匹配 |
开发依赖指示器
| 模式 | 分类 |
|---|---|
pytest, vitest, jest |
测试框架(开发) |
eslint, ruff, black |
Linter(开发) |
@types/* |
类型定义(开发) |
*-dev, *-debug |
开发工具(开发) |
集成点
此技能被调用:
- 由lane-executor:在任务中实现代码后
- 由测试工程师:在编写需要新测试依赖的测试后
- 手动:通过
/ai-dev-kit:dependency-sync命令
在Lane Executor中的示例集成
## 实施后步骤
完成实施后:
1. 运行`dependency-sync`技能以更新清单
2. 运行`post-impl-docs`技能以更新文档
3. 验证构建/测试仍然通过
输出
成功报告
{
"status": "success",
"dependencies_added": [
{"name": "asyncpg", "version": "^0.29.0", "manifest": "pyproject.toml", "type": "production"},
{"name": "pytest-asyncio", "version": "^0.23.0", "manifest": "pyproject.toml", "type": "development"}
],
"manifest_updated": "pyproject.toml",
"commit_sha": "abc123",
"docs_audit_triggered": true
}
无变化报告
{
"status": "no_changes",
"message": "所有导入已经在清单中",
"files_scanned": 5,
"imports_found": 12,
"imports_matched": 12
}