Add SameStr workflow#1257
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds a new microbiome workflow repository entry for running SameStr-based strain sharing detection on shotgun metagenomic reads, including documentation, Dockstore metadata, and a Planemo test definition.
Changes:
- Added the Galaxy workflow definition for SameStr with optional MetaPhlAn and mOTUs subworkflows.
- Added a Planemo test YAML plus Dockstore metadata for publishing/testing.
- Added initial README and CHANGELOG for the new workflow folder.
Reviewed changes
Copilot reviewed 4 out of 5 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| workflows/microbiome/samestr-workflow/Galaxy-Workflow-SameStr_Workflow.ga | New Galaxy workflow definition (SameStr + optional MetaPhlAn/mOTUs paths). |
| workflows/microbiome/samestr-workflow/Galaxy-Workflow-SameStr_Workflow-tests.yml | New Planemo test definition for the workflow (currently uses non-portable dataset references). |
| workflows/microbiome/samestr-workflow/.dockstore.yml | Dockstore descriptor pointing to the workflow and test files (missing ORCIDs). |
| workflows/microbiome/samestr-workflow/README.md | Workflow documentation (currently FMT-specific and outputs description doesn’t match workflow outputs). |
| workflows/microbiome/samestr-workflow/CHANGELOG.md | Initial changelog entry for first release. |
|
|
||
| ## Inputs | ||
|
|
||
| - **Raw Reads**: A collection of paired-end FASTQ files (`.fastq.gz`) representing pre-FMT, donor, and post-FMT samples |
| ## Outputs | ||
|
|
||
| - **stats_file**: Summary statistics of SNV profiles per sample | ||
| - **taxon_counts**: Taxonomic abundance table | ||
| - **strain_events**: Strain-level events detected across samples | ||
| - **cooccurrences**: Strain co-occurrence patterns across samples |
| "outputs": [ | ||
| { | ||
| "label": "stats_file_metaphlan", | ||
| "output_name": "stats_file_metaphlan" | ||
| }, |
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"alignment\": {\"alignment_tool\": {\"tool_choice\": \"bowtie2\", \"__current_case__\": 0, \"bowtie2_db\": \"hg19\"}, \"save_contaminants\": false}, \"fastqc\": {\"fastqc_report\": {\"select_fastqc\": \"no_fastqc\", \"__current_case__\": 1}, \"run_trim_repetitive\": false}, \"log_level\": \"INFO\", \"read_type\": {\"select_read_type\": \"paired\", \"__current_case__\": 1, \"save_unmatched\": true, \"paired_collection\": {\"__class__\": \"ConnectedValue\"}}, \"tandem\": {\"trf_step\": {\"trf_bool\": \"skip\", \"__current_case__\": 1}}, \"trimmomatic\": {\"trimmomatic_step\": {\"decide_trimmomatic\": \"run_trimmomatic\", \"__current_case__\": 0, \"sequencer\": \"NexteraPE\"}}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", | ||
| "tool_uuid": null, | ||
| "tool_version": "0.12.1+galaxy1", |
| authors: | ||
| - name: 'Xenia ' | ||
| familyName: "Morera Mart\xEDnez" | ||
| - name: 'Saim ' | ||
| familyName: Momin |
| subclass: Galaxy | ||
| publish: true | ||
| primaryDescriptorPath: /Galaxy-Workflow-SameStr_Workflow.ga | ||
| testParameterFiles: | ||
| - /Galaxy-Workflow-SameStr_Workflow-tests.yml |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Test Results (powered by Planemo)Test Summary
Errored Tests
|
Test Results (powered by Planemo)Test Summary
Errored Tests
|
| testParameterFiles: | ||
| - /samestr-workflow-tests.yml | ||
| authors: | ||
| - name: 'Xenia Morera Martinez' |
There was a problem hiding this comment.
Can you please put your ORCID id here ?
| "name": "Xenia " | ||
| }, | ||
| { | ||
| "class": "Person", |
There was a problem hiding this comment.
this doesn't match the authors in .dockstore.yml, but please also add the orcid ids here
| "owner": "iuc", | ||
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"alignment\": {\"alignment_tool\": {\"tool_choice\": \"bowtie2\", \"__current_case__\": 0, \"bowtie2_db\": \"hg19\"}, \"save_contaminants\": false}, \"fastqc\": {\"fastqc_report\": {\"select_fastqc\": \"no_fastqc\", \"__current_case__\": 1}, \"run_trim_repetitive\": false}, \"log_level\": \"INFO\", \"read_type\": {\"select_read_type\": \"paired\", \"__current_case__\": 1, \"save_unmatched\": true, \"paired_collection\": {\"__class__\": \"ConnectedValue\"}}, \"tandem\": {\"trf_step\": {\"trf_bool\": \"skip\", \"__current_case__\": 1}}, \"trimmomatic\": {\"trimmomatic_step\": {\"decide_trimmomatic\": \"run_trimmomatic\", \"__current_case__\": 0, \"sequencer\": \"NexteraPE\"}}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", |
There was a problem hiding this comment.
Can you please make the bowtie database configurable ?
There was a problem hiding this comment.
It also seems like sequencer is something to make configurable ?
| This workflow processes paired-end shotgun metagenomic sequencing reads from multiple samples. It performs the following steps: | ||
|
|
||
| - **Preprocessing**: Quality trimming and host read removal using KneadData | ||
| - **Taxonomic profiling**: MetaPhlAn4 or mOTUs for taxonomic classification |
There was a problem hiding this comment.
Is this different from Metaphlan below ?
There was a problem hiding this comment.
No, it's the same step. I'll add them together
| "name": "kneaddata", | ||
| "owner": "iuc", | ||
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"alignment\": {\"alignment_tool\": {\"tool_choice\": \"bowtie2\", \"__current_case__\": 0, \"bowtie2_db\": \"hg19\"}, \"save_contaminants\": false}, \"fastqc\": {\"fastqc_report\": {\"select_fastqc\": \"no_fastqc\", \"__current_case__\": 1}, \"run_trim_repetitive\": false}, \"log_level\": \"INFO\", \"read_type\": {\"select_read_type\": \"paired\", \"__current_case__\": 1, \"save_unmatched\": true, \"paired_collection\": {\"__class__\": \"ConnectedValue\"}}, \"tandem\": {\"trf_step\": {\"trf_bool\": \"skip\", \"__current_case__\": 1}}, \"trimmomatic\": {\"trimmomatic_step\": {\"decide_trimmomatic\": \"run_trimmomatic\", \"__current_case__\": 0, \"sequencer\": \"NexteraPE\"}}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", |
| "name": "metaphlan", | ||
| "owner": "iuc", | ||
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"analysis\": {\"analysis_type\": {\"t\": \"rel_ab\", \"__current_case__\": 0, \"tax_lev\": {\"tax_lev\": \"a\", \"__current_case__\": 0, \"split_levels\": false}}, \"min_alignment_len\": null, \"organism_profiling\": null, \"stat\": \"tavg_g\", \"stat_q\": \"0.2\", \"perc_nonzero\": \"0.33\", \"ignore_markers\": {\"__class__\": \"RuntimeValue\"}, \"avoid_disqm\": true}, \"inputs\": {\"in\": {\"selector\": \"raw\", \"__current_case__\": 0, \"raw_in\": {\"selector\": \"paired_collection\", \"__current_case__\": 2, \"in\": {\"__class__\": \"ConnectedValue\"}}, \"read_min_len\": \"70\", \"mapping\": {\"bt2_ps\": \"very-sensitive\", \"min_mapq_val\": \"5\"}}, \"db\": {\"db_selector\": \"cached\", \"__current_case__\": 0, \"cached_db\": \"mpa_vJan25_CHOCOPhlAnSGB_202503-11062025\", \"viral_analysis\": {\"profile_vsc\": \"\", \"__current_case__\": 1}}}, \"out\": {\"sample_id_key\": \"SampleID\", \"sample_id\": \"Metaphlan_Analysis\", \"use_group_representative\": false, \"CAMI_format_output\": false, \"skip_unclassified_estimation\": false, \"biom_format_output\": false, \"krona_output\": false}, \"subsample\": {\"selector\": \"no\", \"__current_case__\": 0}, \"test\": \"false\", \"__page__\": 0, \"__rerun_remap_job_id__\": null}", |
| { | ||
| "class": "Person", | ||
| "familyName": "Morera Mart\u00ednez", | ||
| "name": "Xenia " | ||
| }, |
| "owner": "bgruening", | ||
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"algorithm_advanced_options\": {\"advanced_options\": {\"customize_algorithm_options\": \"default_options\", \"__current_case__\": 1}}, \"all_taxonomic_level\": false, \"biom_format\": false, \"cami_format_option\": {\"cami_options\": \"no\", \"__current_case__\": 1}, \"full_rank_taxonomy\": false, \"full_species_name\": false, \"inputs\": {\"input_type\": {\"selector\": \"reads\", \"__current_case__\": 0, \"reads_type\": {\"selector\": \"paired\", \"__current_case__\": 0, \"forward_reads\": {\"__class__\": \"ConnectedValue\"}, \"reverse_reads\": {\"__class__\": \"ConnectedValue\"}}}, \"sample_name\": null, \"db\": {\"db_source\": \"cached\", \"__current_case__\": 0, \"db_cached\": \"db_from_2026-04-27T094930Z\"}}, \"ncbi_taxonomy_ids\": false, \"ref_motus\": false, \"result_as_counts\": false, \"save_bam\": false, \"save_mgc\": false, \"taxonomic_level_option\": {\"taxonomic_option\": \"no\", \"__current_case__\": 1}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", |
There was a problem hiding this comment.
This one too should be configurable
Test Results (powered by Planemo)Test Summary
Errored Tests
|
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
|
@mvdbeek Thanks for the suggestions. I added the fixes, let me know if there's anything else that needs to be modified |
|
I see you've made the parameters runtime values, but can you please make them workflow input parameters ? Here's a tutorial that hopefully covers how to do this: https://training.galaxyproject.org/training-material/topics/galaxy-interface/tutorials/workflow-parameters/tutorial.html |
|
@mvdbeek Thanks for the tutorial, it was very helpful. I'm not sure if it's now correct, I've added the parameters as text inputs in both the subworkflows and workflow. |
Test Results (powered by Planemo)Test Summary
Errored Tests
|
Test Results (powered by Planemo)Test Summary
Errored Tests
|
|
I'm not sure why the test is failing, in the terminal both lint and test pass. I think it might be related to the subworkflows. @mvdbeek could you provide some insight on how to fix this? |
|
Thanks @mvdbeek ! I’ve updated the database option. Let me know if any further fixes are needed from my side. |
Test Results (powered by Planemo)Test Summary
Errored Tests
|
|
working on that here: galaxyproject/idc#89. |
| @@ -0,0 +1,18 @@ | |||
| # SamestrGal for shared-strain detection in metagenomes | |||
There was a problem hiding this comment.
Not sure that's the best name for the workflow. Other WFs do not mention Galaxy in their name because it's rather obvious after all.
| collection_type: list:paired | ||
| elements: | ||
| - class: Collection | ||
| type: paired |
There was a problem hiding this comment.
| type: paired | |
| collection_type: paired |
see the recent #1292
| location: https://zenodo.org/records/20745835/files/28C_R2.fastq.gz | ||
| filetype: fastqsanger.gz | ||
| - class: Collection | ||
| type: paired |
There was a problem hiding this comment.
| type: paired | |
| collection_type: paired |
| location: https://zenodo.org/records/20745835/files/28B_R2.fastq.gz | ||
| filetype: fastqsanger.gz | ||
| - class: Collection | ||
| type: paired |
There was a problem hiding this comment.
| type: paired | |
| collection_type: paired |
| "Taxon counts (MetaPhlAn)": | ||
| asserts: | ||
| has_text: | ||
| text: "28A" | ||
| has_text: | ||
| text: "28B" | ||
| has_text: | ||
| text: "28C" | ||
| "Strain events (MetaPhlAn)": | ||
| asserts: | ||
| has_text: | ||
| text: "t__SGB15299" | ||
| has_text: | ||
| text: "t__SGB4285" | ||
| has_text: | ||
| text: "t__SGB6362" | ||
| has_text: | ||
| text: "28B" | ||
| has_text: | ||
| text: "28C" | ||
| "Co-occurrences (MetaPhlAn)": | ||
| asserts: | ||
| has_text: | ||
| text: "28A" | ||
| has_text: | ||
| text: "28B" | ||
| has_text: | ||
| text: "28C" |
There was a problem hiding this comment.
please consult #1275 and fix the asserts accordingly
| "7": { | ||
| "annotation": "Extract element identifiers from flattened collection to prepare for renaming", | ||
| "content_id": "toolshed.g2.bx.psu.edu/repos/iuc/collection_element_identifiers/collection_element_identifiers/0.0.3", | ||
| "errors": null, | ||
| "id": 7, | ||
| "input_connections": { | ||
| "input_collection": { | ||
| "id": 6, | ||
| "output_name": "output" | ||
| } | ||
| }, | ||
| "inputs": [], | ||
| "label": null, | ||
| "name": "Extract element identifiers", | ||
| "outputs": [ | ||
| { | ||
| "name": "output", | ||
| "type": "txt" | ||
| } | ||
| ], | ||
| "position": { | ||
| "left": 1170.5999450683594, | ||
| "top": 632.0133083088757 | ||
| }, | ||
| "post_job_actions": {}, | ||
| "tool_id": "toolshed.g2.bx.psu.edu/repos/iuc/collection_element_identifiers/collection_element_identifiers/0.0.3", | ||
| "tool_shed_repository": { | ||
| "changeset_revision": "3e27acfa4830", | ||
| "name": "collection_element_identifiers", | ||
| "owner": "iuc", | ||
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"input_collection\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", | ||
| "tool_uuid": null, | ||
| "tool_version": "0.0.3", | ||
| "type": "tool", | ||
| "uuid": "2277359e-9fff-4a91-ac55-de361a90439c", | ||
| "when": null, | ||
| "workflow_outputs": [] | ||
| }, | ||
| "8": { | ||
| "annotation": "Clean element identifiers after flattening to restore compatible naming for downstream tools", | ||
| "content_id": "toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regex1/1.0.3", | ||
| "errors": null, | ||
| "id": 8, | ||
| "input_connections": { | ||
| "input": { | ||
| "id": 7, | ||
| "output_name": "output" | ||
| } | ||
| }, | ||
| "inputs": [], | ||
| "label": null, | ||
| "name": "Regex Find And Replace", | ||
| "outputs": [ | ||
| { | ||
| "name": "out_file1", | ||
| "type": "input" | ||
| } | ||
| ], | ||
| "position": { | ||
| "left": 1456.9501085652712, | ||
| "top": 637.0007277299707 | ||
| }, | ||
| "post_job_actions": {}, | ||
| "tool_id": "toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regex1/1.0.3", | ||
| "tool_shed_repository": { | ||
| "changeset_revision": "503bcd6ebe4b", | ||
| "name": "regex_find_replace", | ||
| "owner": "galaxyp", | ||
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"checks\": [{\"__index__\": 0, \"pattern\": \"^[^_]+_\", \"replacement\": \"\"}], \"input\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", | ||
| "tool_uuid": null, | ||
| "tool_version": "1.0.3", | ||
| "type": "tool", | ||
| "uuid": "52c68971-3407-49c2-bd29-9bfa40c06ad5", | ||
| "when": null, | ||
| "workflow_outputs": [] | ||
| }, | ||
| "9": { | ||
| "annotation": "Rename cleaned identifiers to match SameStr expected format", | ||
| "content_id": "__RELABEL_FROM_FILE__", | ||
| "errors": null, | ||
| "id": 9, | ||
| "input_connections": { | ||
| "how|labels": { | ||
| "id": 8, | ||
| "output_name": "out_file1" | ||
| }, | ||
| "input": { | ||
| "id": 6, | ||
| "output_name": "output" | ||
| } | ||
| }, | ||
| "inputs": [ | ||
| { | ||
| "description": "runtime parameter for tool Relabel identifiers", | ||
| "name": "how" | ||
| } | ||
| ], | ||
| "label": null, | ||
| "name": "Relabel identifiers", | ||
| "outputs": [ | ||
| { | ||
| "name": "output", | ||
| "type": "input" | ||
| } | ||
| ], | ||
| "position": { | ||
| "left": 1708.700108565271, | ||
| "top": 622.8882399370019 | ||
| }, | ||
| "post_job_actions": {}, | ||
| "tool_id": "__RELABEL_FROM_FILE__", | ||
| "tool_state": "{\"how\": {\"how_select\": \"txt\", \"__current_case__\": 0, \"labels\": {\"__class__\": \"ConnectedValue\"}, \"strict\": false}, \"input\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", | ||
| "tool_uuid": null, | ||
| "tool_version": "1.1.0", | ||
| "type": "tool", | ||
| "uuid": "10bb239a-98ea-42df-b481-fcb1311da260", | ||
| "when": null, | ||
| "workflow_outputs": [] | ||
| }, |
There was a problem hiding this comment.
You should be able to replace this renaming dance with a single APPLY_RULES step.
| "11": { | ||
| "annotation": "Filter SNV profiles to retain high confidence variants for strain analysis", | ||
| "content_id": "toolshed.g2.bx.psu.edu/repos/iuc/samestr/samestr_filter/1.2025.111+galaxy0", | ||
| "errors": null, | ||
| "id": 11, | ||
| "input_connections": { | ||
| "database": { | ||
| "id": 2, | ||
| "output_name": "output" | ||
| }, | ||
| "input_names": { | ||
| "id": 10, | ||
| "output_name": "sample_name" | ||
| }, | ||
| "input_snvs": { | ||
| "id": 10, | ||
| "output_name": "npz_files" | ||
| } | ||
| }, | ||
| "inputs": [ | ||
| { | ||
| "description": "runtime parameter for tool SameStr Filter", | ||
| "name": "sample_filtering" | ||
| } | ||
| ], | ||
| "label": null, | ||
| "name": "SameStr Filter", | ||
| "outputs": [ | ||
| { | ||
| "name": "filtered_profile", | ||
| "type": "npz" | ||
| }, | ||
| { | ||
| "name": "sample_names", | ||
| "type": "tabular" | ||
| } | ||
| ], | ||
| "position": { | ||
| "left": 1823.275109572711, | ||
| "top": 190.00961124398918 | ||
| }, | ||
| "post_job_actions": {}, | ||
| "tool_id": "toolshed.g2.bx.psu.edu/repos/iuc/samestr/samestr_filter/1.2025.111+galaxy0", | ||
| "tool_shed_repository": { | ||
| "changeset_revision": "303e095c89c6", | ||
| "name": "samestr", | ||
| "owner": "iuc", | ||
| "tool_shed": "toolshed.g2.bx.psu.edu" | ||
| }, | ||
| "tool_state": "{\"clade_settings\": {\"clade_min_samples\": \"2\", \"marker_selection\": {\"retain_or_drop\": \"\", \"__current_case__\": 0}, \"marker_trunc_len\": \"20\"}, \"database\": {\"__class__\": \"ConnectedValue\"}, \"global_position_filtering\": {\"global_pos_min_n_vcov\": \"2\", \"global_pos_min_f_vcov\": \"0.0\"}, \"input_names\": {\"__class__\": \"ConnectedValue\"}, \"input_snvs\": {\"__class__\": \"ConnectedValue\"}, \"output_settings\": {\"keep_poly\": false, \"keep_mono\": false, \"delete_pos\": false}, \"sample_filtering\": {\"samples_select\": {\"__class__\": \"RuntimeValue\"}, \"samples_min_n_hcov\": \"5000\", \"samples_min_f_hcov\": \"0.0\", \"samples_min_m_vcov\": \"0.0\"}, \"sample_position_filtering\": {\"sample_pos_min_n_vcov\": \"1\", \"sample_pos_min_sd_vcov\": \"3.0\"}, \"sample_variant_filtering\": {\"sample_var_min_n_vcov\": \"2\", \"sample_var_min_f_vcov\": \"0.1\"}, \"__page__\": 0, \"__rerun_remap_job_id__\": null}", |
There was a problem hiding this comment.
Currently, you're hard-coding all the filter parameters (along with the alignment parameters in SameStr Convert and the comparison settings in SameStr Compare.
Is that really useful or does the user need control over these settings?
There was a problem hiding this comment.
Yes, it would be good if the user could modify them, especially for SameStr Convert and SameStr Filter. Right now the hard coded values match the ones that the original SameStr paper used. The only "issue" I see with making them workflow input parameters is that SameStr Filter alone has about 15 modifiable parameters, and I'm not sure if that would be too confusing for users. Do you have any suggestions or alternatives @wm75 ?
There was a problem hiding this comment.
If you think all 15 or so parameters are worth exposing, then you probably should.
Make sure you are arranging the input param boxes in a way that they get presented logically on the workflow run form. Distance to the upper-left corner in the wf editor is what determines the order in the WF run form, and you can of course use annotations to make it clear which parameters is for what, provide the default values from the paper, etc.
| } | ||
| ], | ||
| "format-version": "0.1", | ||
| "name": "Metaphlan Subworkflow", |
There was a problem hiding this comment.
You'd want to add "creator" and "license" also to subworkflows so that this information doesn't get lost when the subworkflow is used in other contexts.
There was a problem hiding this comment.
I'm also not sure whether this particular sub-workflow is structured correctly.
I guess you'd want to re-use its SameStr part in case the user wants both a metaphlan and a motus-based analysis? But then it doesn't make sense to have the metaphlan step inside the sub-workflow.
There was a problem hiding this comment.
Originally both MetaPhlAn and mOTUs subworkflows were included in the main workflow so users could select which tool to run. I guess without both the MetaPhlAn subworkflow alone doesn't make much sense. I initially tried to use the SameStr steps as the subworkflow to reuse the steps but the problem I have with this, is that since only one profiler is supposed to run, not both at the same time, I implemented a boolean input + a conditional skip for both so the user could select the preferred one. Since SameStr has required inputs it gives me and error saying cannot connect optional outputs to non-optional inputs. Is this what you meant, or what approach are you suggesting instead?
There was a problem hiding this comment.
so if you don't need to cover the case that both should run, then you don't need a sub-workflow here at all I think.
You would have the boolean + conditional skip that you're describing, and would simply add a Pick Param step that takes the metaphlan or motus output that was actually produced. The output of the pick param tool is non-optional so can be passed to SameStr without an issue.
| "format-version": "0.1", | ||
| "license": "MIT", | ||
| "name": "SamestrGal", | ||
| "release": "0.1", |
There was a problem hiding this comment.
The workflow should also have a bundled "readme", which can be a simple copy of the README file.
That might make sense if one can get the conditional branches right for all possible use cases. I guess I'd pass that question on to @SaimMomin12 |
Hi @bebatut, the goal of bringing this workflow into Galaxy is to provide a 1:1 Galaxy-based equivalent of the original Samestr workflow for the NFDI4Microbiome consortium. As such, @xens25 as part of her thesis ported the exact Nextflow implementation into Galaxy (as we did in the past for MGnify). Of course, once it's part of the Galaxy ecosystem, you're welcome to reuse its components in your workflow. |


FOR CONTRIBUTOR:
FOR REVIEWERS:
This workflow does/runs/performs … xyz … to generate/analyze/etc …namefield should be human readable (spaces are fine, no underscore, dash only where spelling dictates it), no abbreviation unless generally understood-) over underscore (_), prefer all lowercase. Folder becomes repository in iwc-workflows organization and is included in TRS id