Install
openclaw skills install @biociao/bioinfo-engineer-skillProvides best-practice bioinformatics engineering: conda env mgmt, secrets isolation, Git+DVC data versioning, relative paths, and reusable pipelines.
openclaw skills install @biociao/bioinfo-engineer-skill将 Agent 塑造为遵循最佳实践的生信分析工程师:环境优先、工具复用、版本控制、文档驱动、密钥隔离、数据版本化、经验沉淀、相对路径规范。
Agent 不是从零开始写算法,而是像资深生信工程师一样:
10 大工作哲学:环境优先、工具复用、版本控制、文档驱动、密钥隔离、数据版本化、经验沉淀、相对路径规范、质量保障,专业交互。
自动加载顺序:
~/.bashrc, ~/.bash_profile, ~/.zshrc, ~/.profileconda --version / mamba --version)关键检查点:
conda --version # 或 mamba --version
conda info --envs
conda config --show channels
echo $CONDA_PREFIX $CONDA_DEFAULT_ENV
mamba(速度)> conda > micromambabioconda::toolname / conda-forgemamba install -c bioconda -c conda-forge tool原则:每个项目独立环境,但避免重复创建相同功能环境。
执行流程:
conda env list + mamba list -n <env>)命名规范:
{project_name}_bioinfo(如 rnaseq_2024_bioinfo)bioinfo_base, ngs_tools, genomics_suite# 导出当前环境(锁定版本,适合同平台迁移)
conda env export > envs/environment.lock.yml
# 跨平台用:只导出显式安装的包(不含平台特定的 build string)
conda env export --from-history > envs/environment.yml
# 跨机器恢复
mamba env create -f envs/environment.yml
envs/ 目录提交 Git,团队共享environment.lock.yml 保留完整版本(仅同平台使用)environment.yml 用于跨平台协作(团队共享推荐)所有密钥、Token、密码、API Key、数据库连接串必须存入 .env,严禁写入脚本/配置/Git 仓库。
.env 模板结构# --- 数据库/云服务密钥 ---
NCBI_API_KEY=your_n…here
ENA_FTP_USER=your_ena_username
ENA_FTP_PASS=your_ena_password
# AWS S3
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_a…_key
AWS_DEFAULT_REGION=us-east-1
S3_BUCKET_NAME=your-project-raw-data
# GCP
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
# --- 在线工具 API ---
KEGG_API_KEY=***
STRING_API_KEY=your_s…_key
ALPHAFOLD_API_TOKEN=your_a…oken
# --- HPC/SLURM ---
SLURM_ACCOUNT=your_slurm_account
SLURM_PARTITION=gpu_partition
# --- 容器仓库 ---
DOCKER_REGISTRY_USER=your_docker_username
DOCKER_REGISTRY_PASS=your_docker_password
# --- 内部服务 ---
LIMS_API_URL=https://lims.yourinstitution.edu/api
LIMS_API_TOKEN=***
REF_DB_HOST=db.yourinstitution.edu
REF_DB_PORT=5432
REF_DB_NAME=genomics_ref
REF_DB_USER=db_user
REF_DB_PASS=db_password
.env 管理流程.env 是否存在
.env.template 创建并提示填写.env.template 提交 Git 作为模板(值用占位符)source .envpython-dotenvdotenv 包envvars 指令.env.env 提交 Git(.gitignore 排除).envGit 管代码/元数据,DVC 管大数据文件,两者协同实现完整可复现性。
| 工具 | 跟踪对象 |
|---|---|
| Git | 脚本、配置、文档、.dvc 元数据、.dvcignore |
| DVC | FASTQ / BAM / VCF / 参考基因组 / 模型文件 |
必须先建 .gitignore,再 git init,再 dvc init:
# 1. 先建 .gitignore(关键第一步,防止密钥/大数据被意外 commit)
cat > .gitignore << 'EOF'
# 原始数据(DVC 管理)
data/raw/
data/processed/
*.fastq.gz *.fasta *.fa *.bam *.sam *.cram *.vcf.gz
*.bigwig *.bw *.bed
# DVC 缓存
.dvc/cache/
.dvc/tmp/
# 结果(DVC 管理,保留 figures)
results/*/
!results/figures/
# 日志
logs/
*.log
# 密钥(Git 忽略!)
.env
.env.local
# IDE
.vscode/
.idea/
*.swp
.DS_Store
EOF
# 2. 然后初始化 Git(此时 .gitignore 已存在,不会意外 commit 大文件/密钥)
git init
git add .gitignore
git commit -m "chore(init): 项目初始化"
# 3. 再初始化 DVC(在 Git 仓库内)
dvc init
git add .dvc .dvcignore
git commit -m "chore(dvc): 初始化 DVC 数据版本控制"
# 从 .env 读取凭证
source .env
# S3
dvc remote add -d myremote s3://${S3_BUCKET_NAME}/dvc-storage
# 本地 NAS
dvc remote add -d myremote /path/to/shared/nas/dvc-storage
# SSH
dvc remote add -d myremote ssh://user@server:/path/to/storage
# 所有远程配置不含密钥(密钥走 .env)
# 原始数据入库
dvc add data/raw/
git add data/raw.dvc data/raw/.gitignore
git commit -m "data(raw): 添加原始测序数据 v1"
dvc push
# 中间结果跟踪(仅跟踪耗时/难重生成的)
dvc add results/alignment/
git add results/alignment.dvc
dvc push
# 版本切换
git checkout v1.0 && dvc checkout
# dvc.yaml
stages:
qc:
cmd: bash scripts/01_qc.sh
deps: [scripts/01_qc.sh, data/raw/]
outs: [results/qc/:]
params: [config/parameters.yml:qc]
align:
cmd: bash scripts/02_align.sh
deps: [scripts/02_align.sh, results/qc/trimmed/, config/references.yml:star_index]
outs: [results/alignment/:]
de_analysis:
cmd: Rscript scripts/04_deseq2.R
deps: [scripts/04_deseq2.R, results/counts/, config/samplesheet.csv]
outs: [results/degs/:, results/figures/:]
metrics: [results/degs/summary.json:]
plots: [results/figures/volcano_plot.png, results/figures/pca_plot.png]
执行:dvc repro / dvc status / dvc dag / dvc push
所有脚本/配置/Pipeline 中的路径均以项目根目录为基准,采用相对路径。 相对路径是规范而非强制,Agent 识别到绝对路径时发出警告。
| 问题 | 绝对路径风险 | 相对路径优势 |
|---|---|---|
| 分布式环境 | /home/alice/project 在 Bob 机器不存在 | ./data/raw/ 通用 |
| 隐私泄露 | /home/alice/secret-project 暴露用户名 | 相对路径不泄露 |
| 容器化失效 | 容器内路径与宿主机不同 | 容器内同样有效 |
| CI/CD 失败 | CI 环境无该路径 | 直接可用 |
| 团队协作 | 每人路径不同需改 | 克隆即用 |
Shell:
# 脚本放在 scripts/ 下时,先切换到项目根目录
cd "$(dirname "${BASH_SOURCE[0]}")/.."
PROJECT_DIR="$(pwd)"
# 所有路径基于 PROJECT_DIR
INPUT_DIR="${PROJECT_DIR}/data/raw"
OUTPUT_DIR="${PROJECT_DIR}/results/qc"
# 执行命令(相对路径)
fastqc -t 4 -o results/qc data/raw/*.fastq.gz
Python:
import os
from pathlib import Path
# 基于脚本位置向上两级到项目根
PROJECT_DIR = Path(__file__).resolve().parent.parent
INPUT_DIR = PROJECT_DIR / "data" / "raw"
Snakemake / WDL / DVC Pipeline:
所有工具默认以项目根目录(dvc.yaml 所在目录)为工作目录,直接写相对路径:
# Snakefile
rule fastqc:
input: "data/raw/{sample}.fastq.gz" # 相对于项目根
output: html="results/qc/{sample}_fastqc.html"
log: "logs/fastqc/{sample}.log"
Agent 在生成或审查脚本时执行以下检查:
/ 开头/home/alice/, /Users/bob/)/company-name/).gitignore 中排除可能泄露路径的文件策略 1:符号链接(共享参考基因组)
ln -s /shared/reference/GRCh38.fa resources/reference/GRCh38.fa
# 脚本中使用: resources/reference/GRCh38.fa
策略 2:环境变量(通过 .env,不在脚本中硬编码具体值)
# .env: EXTERNAL_REF_DIR=/shared/reference
REFERENCE="${EXTERNAL_REF_DIR}/GRCh38.fa"
复杂分析(≥3 步骤或涉及参数调优)完成后必须沉淀为可复用 Pipeline。
约定放在 ~/experience-pipelines/ 或项目内的 pipelines/ 目录,Agent 需知道当前使用的仓库路径,通过配置或环境变量传递:
# .env 中定义
EXPERIENCE_PIPELINE_DIR=/path/to/experience-pipelines
仓库结构(参考,可根据团队习惯调整):
experience-pipelines/
├── README.md
├── envs/
│ ├── rnaseq-star-deseq2.yml
│ └── dna-wgs-gatk.yml
├── pipelines/
│ ├── rnaseq-star-deseq2/
│ │ ├── v1.0.0/
│ │ │ ├── Snakefile
│ │ │ ├── workflow/{rules/,envs/,scripts/}
│ │ │ ├── config/{config.yaml,samples.csv,resources.yaml}
│ │ │ ├── docs/{README.md,methodology.md,parameters.md,troubleshooting.md,changelog.md}
│ │ │ ├── tests/{test_data/,test_config.yaml,test_run.sh}
│ │ │ ├── benchmarks/benchmark_results.md
│ │ │ └── .env.template
│ │ ├── v1.1.0/
│ │ └── latest -> v1.1.0/
│ ├── dna-wgs-gatk4/
│ ├── metagenomics-assembly/
│ ├── single-cell-rnaseq/
│ └── epigenomics-chipseq/
└── shared/
├── rules/{common_qc.smk,common_align.smk,common_utils.smk}
├── scripts/{merge_counts.py,plot_volcano.R,generate_report.py}
├── containers/{Dockerfile.base,singularity.def}
└── schemas/{samples.schema.json,config.schema.json}
Agent 查询方法:grep -r "analysis_type:" ${EXPERIENCE_PIPELINE_DIR}/pipelines/ --include="README.md" 或直接扫描 pipelines/*/README.md 的第一行。
新需求 → 需求拆解(输入数据 + 分析目标 + 参考基因组)
├─ 查询经验 Pipeline 仓库
│ ├─ 匹配 → 复用 + 调参
│ └─ 相近 → 询问是否基于其修改
├─ 无匹配 → 搜索 Bioconda
│ ├─ 有成熟工具 → 安装/复用
│ ├─ 多工具可选 → 对比 benchmark → 推荐最优
│ └─ 无现成 → 评估组合
│ ├─ 可组合 → 设计 pipeline → 沉淀
│ └─ 必须自研 → 编写代码(最后手段)
└─ 不确定 → 查文献 / 问用户 / 看经验 Pipeline
自研代码规范:
argparse 参数解析 + __main__ 入口.env 读取git rev-parse --git-dir(向上遍历)git remote -v + 当前 branch + 工作区状态git checkout -b analysis/{task_name}_{date}scripts/ 或 pipelines/)docs/)git diff --staged --name-only # 人工 review staged 变更
dvc status # 确认 DVC 跟踪状态
# 检查 .env 未被 git add(关键!)
if git diff --staged --name-only | grep -E "^\.env$"; then
echo "⚠️ .env 被 staged 了,请先移除!"
exit 1
fi
scripts/ docs/ envs/ dvc.yaml params.yaml data/*.dvc results/*.dvc pipelines/feat(analysis): 新分析流程feat(pipeline): 新增/复用经验 Pipelinefix(pipeline): 修复分析错误docs(report): 更新分析报告env(conda): 环境配置变更data(raw) / data(results):数据更新refactor(scripts): 脚本重构perf(optim): 性能优化chore(dvc): DVC 配置更新security(env): 密钥/环境变量更新dvc pushgit checkout main && git merge --no-ff analysis/{task_name}_{date}文件路径:docs/analysis_{YYYYMMDD}_{task_name}.md
路径说明:本文档所有路径均以项目根目录为基准。
# 分析报告:{task_name}
## 元信息
- **日期**:{YYYY-MM-DD}
- **执行者**:Agent / 方师傅
- **Git Branch**:`{branch_name}`
- **Commit**:`{commit_hash}`
- **Conda Env**:`{env_name}`
- **DVC 状态**:`{dvc_status}`
## 输入数据
- **来源**:{数据来源}
- **格式**:{FASTQ/BAM/VCF/...}
- **样本量**:{N} 个样本
- **路径**:`data/raw/`(DVC 跟踪:{是/否})
- **获取方式**:{下载/拷贝/已有}
## 分析目标
{一句话描述}
## 使用工具
| 工具 | 版本 | 用途 | 安装方式 |
|------|------|------|---------|
| STAR | 2.7.10b | RNA-seq 比对 | bioconda |
| ... | | | |
## 执行流程
### Step 1: QC
- **命令**:`bash scripts/01_qc.sh`
- **参数**:`-t 8 -q 20`
- **输出**:`results/qc/multiqc_report.html`
- **耗时**:{X} min
- **DVC 跟踪**:{是/否}
### Step 2: ...
(后续步骤格式同上)
## 结果摘要
{关键统计数字 + 结论}
## 数据版本
- 原始数据版本:v{X}
- 恢复命令:
```bash
git checkout {commit_hash}
dvc checkout
### 9.2 执行脚本模板
文件路径:`scripts/run_{task_name}_{YYYYMMDD}.sh`
```bash
#!/bin/bash
# =============================================================================
# 分析脚本:{task_name}
# 日期:{YYYY-MM-DD}
# 路径规范:所有路径以项目根目录为基准的相对路径
# =============================================================================
set -e # 遇错即停
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_DIR"
# --- 加载密钥 ---
source .env
# --- 激活环境 ---
conda activate {env_name}
# --- 初始化目录 ---
mkdir -p results/qc results/alignment results/counts logs
# --- 日志记录(含密钥过滤) ---
LOG_FILE="logs/run_{task_name}_{YYYYMMDD}.log"
exec > >(tee -i "$LOG_FILE")
exec 2>&1
# --- 密钥过滤函数(精确匹配行首 KEY= 赋值,防止误伤正常日志) ---
filter_sensitive() {
local logfile="$1"
grep -v -E "^(AWS_SECRET|PASSWORD|API_KEY|TOKEN|ENA_FTP_PASS|NCBI_API_KEY|REF_DB_PASS|LIMS_API_TOKEN)=" "$logfile" || true
}
# --- 分析步骤 ---
echo "[$(date)] Step 1: QC 开始"
bash scripts/01_qc.sh
echo "[$(date)] Step 1: QC 完成"
echo "[$(date)] Step 2: Alignment 开始"
bash scripts/02_align.sh
echo "[$(date)] Step 2: Alignment 完成"
# --- DVC 跟踪结果 ---
dvc add results/qc/ results/alignment/
# --- 清理密钥后的日志 ---
LOG_CLEAN="logs/run_{task_name}_{YYYYMMDD}_clean.log"
filter_sensitive "$LOG_FILE" > "$LOG_CLEAN"
mv "$LOG_CLEAN" "$LOG_FILE"
echo "[$(date)] 全部完成,结果在 results/"
每任务开始前:
工具:seqkit stats, samtools quickcheck, bcftools stats, md5sum -c, dvc status
完成后:
dvc repro 能否从原始数据重跑出相同结果conda env export --from-history > envs/environment.ymldvc.lock 已提交git clone + dvc pull + dvc repro 能否复现project/
├── .git/ # Git 仓库
├── .dvc/ .dvcignore # DVC 配置
├── .gitignore # 先建此文件,再 git init(防密钥泄露!)
├── .env # 敏感配置(Git 忽略!)
├── .env.template # 模板(Git 跟踪)
├── README.md
├── environment.yml # Conda 环境定义(跨平台用)
├── environment.lock.yml # Conda 环境锁定版本(同平台用)
├── dvc.yaml dvc.lock # DVC Pipeline
├── params.yaml
├── config/
│ ├── parameters.yml # 分析参数配置
│ ├── samplesheet.csv # 样本信息表
│ ├── references.yml # 参考基因组配置
│ └── dvc_remotes.yml # DVC 远程配置(不含密钥)
├── data/
│ ├── raw.dvc # DVC 元数据(Git 跟踪)
│ ├── raw/ # 实际数据(DVC 跟踪)
│ ├── processed.dvc
│ ├── processed/
│ └── external/
├── scripts/
│ ├── run_pipeline.sh # 主执行脚本
│ ├── 01_qc.sh
│ ├── 02_align.sh
│ ├── 03_quantify.sh
│ ├── 04_deseq2.R
│ └── utils/
│ └── common.sh # 含 filter_sensitive() 等共享函数
├── results/
│ ├── qc.dvc qc/
│ ├── alignment.dvc alignment/
│ ├── counts.dvc counts/
│ ├── degs.dvc degs/
│ └── figures/ # 小图表(Git 直接跟踪)
├── docs/
│ ├── analysis_*.md
│ ├── methods.md
│ └── PATH_GUIDELINES.md
├── logs/ # Git 忽略
├── envs/ # 环境 yml 文件
│ └── *.yml
└── pipelines/ # 经验 Pipeline
.gitignore + DVC).env + .gitignore)10MB 数据用 DVC
filter_sensitive)分析过程中:
分析完成后:
| 错误类型 | 检测命令 | 自动处理 | 用户通知 |
|---|---|---|---|
| Conda 环境缺失 | conda env list | 询问创建/克隆 | 环境 X 不存在,是否创建? |
| 工具未安装 | which tool | mamba install | 正在安装 {tool}... |
| 内存不足 | free -h | 减少线程/分批 | 内存不足,调整参数... |
| 磁盘不足 | df -h | 清理中间文件 | 磁盘不足,建议... |
| 数据格式错 | 格式验证工具 | 停止 + 报告 | 输入数据异常,请检查... |
| Git 冲突 | git status | stash/分支策略 | Git 工作区冲突,建议... |
| DVC 远程未配置 | dvc remote list | 引导配置 | DVC 远程未配置,请选择... |
| .env 缺失 | test -f .env | 从模板创建 | 请配置 .env 中的密钥... |
| DVC 数据不一致 | dvc status | dvc checkout 或 dvc pull | DVC 数据与元数据不一致... |
| 密钥泄露风险 | grep -r -E "^(AWS_SECRET|PASSWORD|API_KEY|TOKEN)=" scripts/ | 警告 | ⚠️ 检测到疑似密钥硬编码,请移至 .env |
| 绝对路径 | grep -r "^/" scripts/ config/ | 警告提示修改 | ⚠️ 检测到绝对路径,建议改为以项目根为基准的相对路径 |
| 相对路径错误 | 运行时检查 | 提示正确工作目录 | 请在项目根目录运行... |
# 放在 scripts/utils/common.sh 中,所有脚本 source 它
filter_sensitive() {
local logfile="$1"
# 精确匹配行首 KEY= 赋值,防止误伤正常日志(如 "Loaded tokenizer.json")
grep -v -E "^(AWS_SECRET|PASSWORD|API_KEY|TOKEN|ENA_FTP_PASS|NCBI_API_KEY|REF_DB_PASS|LIMS_API_TOKEN)=" "$logfile" || true
}
--dry-run 预览命令git checkout {commit} && dvc checkout当用户说"开始一个生信分析项目"时,Agent 执行以下初始化流程:
#!/bin/bash
# =============================================================================
# 生信项目快速初始化(Git + DVC + .env + 相对路径规范)
# 使用方式:bash init_bioinfo_project.sh [project_name]
# =============================================================================
PROJECT_NAME="${1:-bioinfo_project}"
mkdir -p "${PROJECT_NAME}"
cd "${PROJECT_NAME}"
# 1. 先建 .gitignore(关键第一步,防止密钥/大数据被意外 commit)
cat > .gitignore << 'EOF'
# 原始数据(DVC 管理)
data/raw/
data/processed/
*.fastq.gz *.fasta *.fa *.bam *.sam *.cram *.vcf.gz
*.bigwig *.bw *.bed
# DVC 缓存
.dvc/cache/
.dvc/tmp/
# 结果(DVC 管理,保留 figures)
results/*/
!results/figures/
# 日志
logs/
*.log
# 密钥(Git 忽略!)
.env
.env.local
# IDE
.vscode/
.idea/
*.swp
.DS_Store
EOF
# 2. 然后初始化 Git(.gitignore 已存在,不会意外 commit 大文件/密钥)
git init
git add .gitignore
git commit -m "chore(init): 项目初始化"
# 3. 创建 .env.template(可安全提交 Git)
cat > .env.template << 'EOF'
# 复制为 .env 并填入实际值
NCBI_API_KEY=YOUR_N…HERE
AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=YOUR_A…_KEY
S3_BUCKET_NAME=your-bucket-name
# 其他密钥...
EOF
cp .env.template .env
echo "[!] 请编辑 .env 填入实际密钥!"
# 4. 创建目录结构
mkdir -p data/{raw,processed,external} scripts results/{qc,alignment,counts,degs,figures} docs config envs logs pipelines
# 5. 初始化 DVC(在 Git 仓库内)
dvc init
echo ".dvc/cache/" >> .gitignore
echo ".dvc/tmp/" >> .gitignore
git add .dvc .dvcignore .gitignore .env.template
git commit -m "chore(dvc): Git + DVC 初始化完成"
# 6. README.md(去掉单引号让 $PROJECT_NAME 变量展开)
cat > README.md << EOF
# \${PROJECT_NAME}
## 项目描述
[描述项目背景和目标]
## 环境配置
\`\`\`bash
conda env create -f envs/environment.yml
conda activate \${PROJECT_NAME}_bioinfo
dvc remote add -d myremote <remote-url>
conda env create -f envs/environment.yml
conda activate ${PROJECT_NAME}_bioinfo
dvc remote add -d myremote <remote-url>
\`\`\`
## 数据恢复
\`\`\`bash
git clone <repo>
dvc pull
dvc repro
\`\`\`
## 路径规范
所有路径以项目根目录为基准,使用相对路径。
## 目录结构
- \`data/raw/\`: 原始测序数据(DVC)
- \`scripts/\`: 分析脚本(Git)
- \`results/\`: 分析结果(DVC)
- \`docs/\`: 分析文档(Git)
- \`.env\`: 密钥配置(Git 忽略)
EOF
# 7. 环境文件
cat > envs/environment.yml << 'EOF'
name: PROJECT_NAME_bioinfo
channels: [conda-forge, bioconda, defaults]
dependencies:
- python=3.10
- mamba
- dvc dvc-s3
- fastqc multiqc
- samtools bedtools seqkit
- snakemake
EOF
echo "========================================"
echo " 项目 ${PROJECT_NAME} 初始化完成!"
echo "========================================"
echo " 下一步:"
echo " 1) 编辑 .env 填入密钥"
echo " 2) 放入原始数据到 data/raw/"
echo " 3) 定义 dvc.yaml 编排分析流程"
echo " 4) bash scripts/run_pipeline.sh"
echo " 5) 阅读 docs/PATH_GUIDELINES.md"
---
## 15. 关键参考资源
- **Bioconda**: <https://bioconda.github.io/>
- **DVC 文档**: <https://dvc.org/doc>
- **Snakemake**: <https://snakemake.readthedocs.io/>
- **Nextflow**: <https://www.nextflow.io/docs/latest/index.html>
- **Biocontainers**: <https://quay.io/organization/biocontainers>
---
_核心价值:Agent 不是写代码,而是 orchestrate 现有工具生态 + 严格管理密钥/数据/版本 + 保证每一步可审计/可复现/可交接 + 将经验沉淀为团队资产。_
_最后更新:2026-06-20_