nf-core / nf-core/modules

Audit: Module directory names that don't match the tool invoked in script block

Open
#11,073 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Nextflow
Stars
429
Forks
1.1k
Avg merge
1d 6h
Merged PRs (30d)
153

Description

Summary

An automated scan of all 1767 nf-core modules found 39 modules where the directory name (modules/nf-core/<tool>/<subtool>/) does not match the actual command invoked in the script: block of main.nf. Per nf-core convention, modules should follow tool/subtool naming that matches the CLI tool being called.

This issue was prompted by the discussion in #10959 (comment) about mcstaging/* modules being grouped by purpose rather than by tool name.

Each case below needs human review to determine the appropriate action (rename, restructure, or document as acceptable exception).


Mismatches by Category

🔬 Imaging / mcmicro modules (grouped by purpose instead of tool)

These modules are grouped under umbrella directories by function rather than by tool name:

Reviewed? Module path Dir tool name Actual command Notes
deprecated by @kbestak mcstaging/imc2mc mcstaging python /imc2mc/scripts/imc2mc.py Tool is imc2mc, grouped under mcstaging
mcstaging/macsima2mc mcstaging python /staging/macsima2mc/macsima2mc.py Tool is macsima2mc
mcstaging/phenoimager2mc mcstaging python /phenoimager2mc/scripts/phenoimager2mc.py Tool is phenoimager2mc
vizgenpostprocessing/compiletilesegmentation vizgenpostprocessing vpt Tool is vpt (Vizgen Postprocessing Tool)
vizgenpostprocessing/preparesegmentation vizgenpostprocessing vpt Tool is vpt
vizgenpostprocessing/runsegmentationontile vizgenpostprocessing vpt Tool is vpt
coreograph coreograph python /app/UNetCoreograph.py Script is UNetCoreograph.py
basicpy basicpy /opt/main.py Container-embedded script, no basicpy CLI binary (borderline)
🧬 Tool suite vs. individual tool binary

The directory uses a suite/package name but the script calls a differently-named binary from that suite:

Reviewed? Module path Dir tool name Actual command Notes
@famosab : leave as is because fibertools is more descriptive and the actual tool name, acceptable exception fibertoolsrs/addnucleosomes fibertoolsrs ft fibertools-rs installs as ft
same fibertoolsrs/extract fibertoolsrs ft Same
same fibertoolsrs/predictm6a fibertoolsrs ft Same
@famosab : I would say if we want to be really strict these modules should be called tama/.. but as that would need deprecation and gstama is not completely wrong I would leave them as is, acceptable exception gstama/collapse gstama tama_collapse.py Conda pkg is gs-tama, tool is tama
same gstama/merge gstama tama_merge.py Same
same gstama/polyacleanup gstama tama_flnc_polya_cleanup.py Same
@famosab: leave as is, the tool never uses the suite name in the subscripts but the nf-core module naming is compliant to our guidelines, acceptable exception cmseq/polymut cmseq polymut.py cmseq is the suite, polymut is the specific tool
vrhyme/extractunbinned vrhyme extract_unbinned_sequences.py Helper script in vRhyme, not vRhyme itself
vrhyme/linkbins vrhyme link_bin_sequences.py Same
fcs/fcsadaptor fcs av_screen_x Internal NCBI FCS-adaptor binary name
📦 Conda package name vs. CLI binary name

The directory uses the Conda package name, but the installed binary has a different name:

Reviewed? Module path Dir tool name Actual command Notes
dragmap/align dragmap dragen-os DragMap package installs dragen-os binary
dragmap/hashtable dragmap dragen-os Same
pbccs pbccs ccs PacBio Conda pkg pbccs, binary is ccs
pbjasmine pbjasmine jasmine Conda pkg pbjasmine, binary is jasmine
biohansel biohansel hansel Conda pkg bio_hansel, binary is hansel
kofamscan kofamscan exec_annotation kofamscan installs exec_annotation as its CLI
variantbam variantbam variant VariantBam binary is just variant
🔧 Wrapper/parallel tools with different names
Reviewed? Module path Dir tool name Actual command Notes
@famosab: can be left as is, we like parallelization but its not needed to be part of the module name, acceptable exception ltrfinder ltrfinder LTR_FINDER_parallel Parallel wrapper, not ltr_finder itself
@famosab: I think the meta.yml is wrong, gt never appears in the script block, I would say correct the meta and we are good ltrharvest ltrharvest LTR_HARVEST_parallel Parallel wrapper (note: gt/ltrharvest correctly calls gt ltrharvest)
🏷️ Functional/descriptive names instead of tool names
Reviewed? Module path Dir tool name Actual command Notes
unzip unzip 7za Calls p7zip, not unzip
unzipfiles unzipfiles 7za Same
zip zip 7z Calls p7zip, not zip
shasum shasum sha256sum macOS shasum vs GNU sha256sum
amps amps postprocessing.AMPS.r Actually calls HOPS package script
multiqcsav multiqcsav multiqc Calls multiqc with SAV plugin, not a standalone tool
🔀 Subcommand under wrong parent
Reviewed? Module path Dir tool name Actual command Notes
@famosab: this command is now callable as bcftools roh-viz, the module script should be updated to reflect this bcftools/rohviz bcftools roh-viz Standalone tool, not a bcftools subcommand
@famosab: leave as is, the tool never uses the suite name in the subscripts but the nf-core module naming is compliant to our guidelines, acceptable exception genotyphi/parse genotyphi parse_typhi_mykrobe.py Script name doesn't match directory
@famosab: the tool author is inconsistent in their naming, acceptable exception gens/preparecovandbaf gens generate_cov_and_baf CLI entry point doesn't match directory
macsyfinder/download macsyfinder msf_data install Separate database management tool
checkm2/databasedownload checkm2 aria2c Just a download; checkm2 never called
🌐 Platform/runtime tools
Reviewed? Module path Dir tool name Actual command Notes
@famosab: acceptable exception deeptmhmm deeptmhmm biolib run DTU/DeepTMHMM Runs via BioLib platform CLI

Methodology

  • Automated scan of all 1767 module main.nf files
  • Compared directory tool name against the primary command in the script: block
  • Excluded shell builtins (cat, echo, mkdir, etc.) and version-reporting blocks
  • Minor variations (case, hyphens, version suffixes like gatk4gatk) were not flagged
  • Each finding needs human review — some may be acceptable exceptions

Suggested Actions

For each module, the community should decide:

  1. Rename the module directory to match the actual tool (preferred for most cases)
  2. Accept as exception with documentation (e.g., functional modules like unzip/zip)
  3. Move to pipeline-local if the module is too pipeline-specific for the shared repository

Context

  • PR discussion: #10959
  • Convention: modules should be tool/subtool matching the CLI call
  • Related: imaging community modules grouped by purpose rather than tool name

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the listed module paths and inspect each module's main.nf script block, using the naming convention and PR #10959 discussion as context. For every mismatch, determine whether to rename or restructure the module, document it as an acceptable exception, or move it pipeline-local. Done means all 39 cases have a recorded community decision.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, shell
Domain
tooling
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.