#!/usr/bin/env python3 """ RNA-seq Alignment Skill Runner Executes the RNA-seq alignment stage as a skill. """ import argparse import json import subprocess import sys from pathlib import Path from typing import Dict, Any def load_config(config_path: Path) -> Dict[str, Any]: """Load skill configuration""" import yaml with open(config_path, 'r') as f: return yaml.safe_load(f) def run_skill( input_dir: Path, hisat2_index: Path, output_dir: Path, prefix: str = "", cpu: int = 4, sample_config: Path = None, job_id: str = "unknown" ) -> Dict[str, Any]: """Run the RNA-seq alignment skill""" # Import the main module sys.path.insert(0, str(Path(__file__).parent.parent.parent / "apps" / "cli")) from run_rnaseq_align import main as align_main # Build arguments args = [ "-i", str(input_dir), "-x", str(hisat2_index), "-o", str(output_dir), "-j", job_id, "-p", prefix, "-t", str(cpu) ] if sample_config: args.extend(["--sample-config", str(sample_config)]) # Run the alignment sys.argv = ["run_rnaseq_align.py"] + args align_main() # Load and return manifest manifest_path = output_dir.parent / "final" / f"{prefix}.rnaseq_align.manifest.json" if manifest_path.exists(): with open(manifest_path, 'r') as f: return json.load(f) return {"status": "failed", "error": "Manifest not found"} def main(): parser = argparse.ArgumentParser(description="RNA-seq Alignment Skill") parser.add_argument("-i", "--input", required=True, help="Input directory with clean FASTQ") parser.add_argument("-x", "--hisat2-index", required=True, help="HISAT2 index prefix") parser.add_argument("-o", "--output", required=True, help="Output directory") parser.add_argument("-j", "--job-id", default="unknown", help="Job ID") parser.add_argument("-p", "--prefix", default="", help="Output prefix") parser.add_argument("-t", "--cpu", type=int, default=4, help="CPU threads") parser.add_argument("-c", "--config", help="Sample config YAML") args = parser.parse_args() result = run_skill( input_dir=Path(args.input), hisat2_index=Path(args.hisat2_index), output_dir=Path(args.output), prefix=args.prefix, cpu=args.cpu, sample_config=Path(args.config) if args.config else None, job_id=args.job_id ) print(json.dumps(result, indent=2)) return 0 if result.get("status") == "success" else 1 if __name__ == "__main__": sys.exit(main())