Skip to content

Add Seqera Studios configuration for training environment#803

Draft
ewels wants to merge 109 commits intomasterfrom
studios
Draft

Add Seqera Studios configuration for training environment#803
ewels wants to merge 109 commits intomasterfrom
studios

Conversation

@ewels
Copy link
Member

@ewels ewels commented Feb 2, 2026

No description provided.

ewels added 30 commits January 30, 2026 14:02
Reorganize docs from suffix-based (.pt.md) to folder-based structure:
- docs/en/ contains all English source content
- docs/{lang}/ contains translations with inheritance from English
- Language configs use INHERIT: ../en/mkdocs.yml for DRY setup

Add translation tooling:
- _scripts/translate.py: Claude-powered translation CLI
- _scripts/docs.py: Parallel multi-language build CLI
- _scripts/translation_fixer.py: Post-translation cleanup
- _scripts/mkdocs_hooks.py: Warning banner for untranslated content

Add CI workflows:
- translate.yml: Manual workflow to trigger translations
- Updated docs-dev.yml and docs-release.yml for multi-language builds

Add language picker JavaScript for mike versioning compatibility.
Add TRANSLATING.md contributor guide.
… comments

- Update MODEL to use 'claude-sonnet-4-5' alias for auto-updates
- Add check_api_key() with helpful error message and setup instructions
- Add multi-line /* */ comment support for Groovy/Nextflow/Java
- Replace hardcoded SUPPORTED_LANGS with get_supported_langs() reading from
  language_names.yml as single source of truth
Update references to mkdocs.yml and docs/ paths in:
- CONTRIBUTING.md
- CLAUDE.md
- preview_release.py
- .claude/ skills and commands
- Remove requirements.txt and _scripts/pyproject.toml
- Add MkDocs dependencies to docs.py inline script
- Update netlify.toml to use uv run
- Update CONTRIBUTING.md with uv instructions
- Fix Netlify uv PATH (use export instead of source env)
- Update mkdocs.Dockerfile to install plugins directly (no requirements.txt)
- Remove requirements.txt trigger from docker-mkdocs workflow
- Add -w /docs/docs/en to all Docker commands in docs
- Update preview commands to use uv
- Remove pillow, cairosvg, mkdocs-static-i18n from docs.py (not used)
- Remove CARDS=false references from docs (social cards plugin not configured)
- Fix image paths in LICENSE.md and README.md for new docs structure
- Add better error capture for parallel builds
- Update pip install instruction to use uv in CONTRIBUTING.md
- Add resolve_en_path() to handle paths relative to CWD, repo root, or EN_DOCS_PATH
- Add --include/-i option to add_missing for filtering by pattern (e.g., 'hello_nextflow')
…ules

- Add note that terms like channel/process/workflow may be translated in prose
- Clarify that language-specific llm-prompt.md takes precedence for prose
- Code blocks always use English for executable code
… files

- Added Translation Context Rules section explaining code vs prose distinction
- Code blocks: keep ALL Nextflow syntax in English (must be executable)
- Prose text: follow language-specific glossary for translations
- Added language-specific examples for each
TRANSLATING.md:
- Added clear workflow diagrams for automatic updates
- Documented how to review and approve translation PRs
- Added guide for fixing existing translations
- Added guide for adding missing courses
- Added guide for adding new languages
- Improved script reference documentation

.github/workflows/translate-auto.yml:
- New workflow that triggers on push to master when docs/en/docs/*.md changes
- Detects which languages have outdated translations
- Updates translations in parallel (max 2 to limit API load)
- Creates PRs automatically for review
TRANSLATING.md:
- Explicitly discourage manual translations (will be overwritten)
- Add detailed review guidelines with Mermaid flow diagram
- Clarify that prompt updates are the ONLY way to fix translations
- Remove all manual translation instructions
- Add clear workflow for reporting issues

CONTRIBUTING.md:
- Expand translation section with rationale for AI-only approach
- Add instructions for readers finding errors
- Add instructions for contributors improving prompts

_scripts/general-llm-prompt.md:
- Massively expand from ~80 to ~300 lines
- Add detailed code block examples for Groovy, Bash, config files
- Add console output rules (never translate)
- Add comprehensive admonition documentation
- Add heading anchor preservation rules
- Add link translation rules with examples
- Add tab block documentation
- Add frontmatter rules
- Add special elements (kbd, icons, placeholders, snippets)
- Add formatting preservation guidelines
- Add common mistakes to avoid section
- Add quality checklist
- Use GitHub [!WARNING] and [!CAUTION] admonition syntax
- Move CLI reference to bottom (requires API key most don't have)
- Clarify that prompt updates trigger regeneration in same PR
- Promote GitHub Actions workflow as primary method
- Add [!NOTE] for CLI section explaining API key requirement
- Update CONTRIBUTING.md to match (warning admonition, GH Actions first)
- Update language list to include pl, tr
- Add note that translations are AI-generated
- Add TRANSLATING.md to resources section
Translated files:
- docs/pt/docs/index.md - Main landing page
- docs/pt/docs/help.md - Help page
- docs/pt/docs/envsetup/ - Environment setup (4 files)
- docs/pt/docs/hello_nextflow/ - Complete Hello Nextflow course (10 files)

Also updated:
- docs/pt/llm-prompt.md - Translation glossary with informal tone (você)
  and context-dependent rules (prose vs code)

Build verified successfully. Transcripts folder excluded per spec.
Translate all documentation files to Italian:
- Main index and help pages
- Environment setup guide (envsetup/)
- Complete Hello Nextflow course (hello_nextflow/)

All 6 parts of Hello Nextflow are now translated:
- Part 1: Hello World
- Part 2: Hello Channels
- Part 3: Hello Workflow
- Part 4: Hello Modules
- Part 5: Hello Containers
- Part 6: Hello Config

Translations follow the guidelines in docs/it/llm-prompt.md
Translated files:
- Main index and help pages
- Environment setup guides (3 files)
- Hello Nextflow course (10 files including all 6 parts)

Translation guidelines followed:
- Formal polite Korean (합쇼체/하십시오체)
- Code blocks kept in English (executable code)
- Technical terms translated per glossary in docs/ko/llm-prompt.md
- Admonition titles translated (Note→참고, Tip→팁, Warning→경고, etc.)
Translated files:
- docs/fr/docs/index.md - Main landing page
- docs/fr/docs/help.md - Help page
- docs/fr/docs/envsetup/ - Environment setup (4 files)
- docs/fr/docs/hello_nextflow/ - Complete Hello Nextflow course (10 files)

Translation uses formal tone (vous) with French quotation marks.
Technical terms translated in prose, kept in English in code blocks.
ewels and others added 23 commits February 1, 2026 00:51
Second review pass fixing:
- Untranslated code comments in pt, es, it, ko, de, fr, hi, tr
- Italian formal Lei → informal voi tone corrections
- Hindi section headers (Takeaway → सीख)
- Korean image alt text translations
- German code comments in nf4_science and hello_nf-core
- French code comments in side_quests and hello_nf-core
- Turkish console output consistency fix
- Spanish code comments in side_quests and nf4_science

67 files modified across 9 languages
Third pass fixing remaining issues:

Portuguese (pt): All checks pass - no issues
Spanish (es): Fixed 'Hola' → 'Hello' in course names (7 instances)
Italian (it): Fixed remaining Lei→voi forms (47+ files), translated code comments
Korean (ko): Fixed 'Part' → '파트' in 12 files, translated code comments
German (de): Fixed 15 admonition keywords (Warnung→warning, Tipp→tip)
French (fr): Translated remaining code comments (6 instances)
Hindi (hi): Translated remaining code comments (5 instances)
Polish (pl): All checks pass - no issues
Turkish (tr): Fixed 'Merhaba' → 'Hello' in course names, translated code comments

73 files changed
- Italian: 18 comments in nf4_science/genomics, nf4_science/rnaseq, side_quests/debugging
- Turkish: 12 comments in side_quests/debugging
Co-authored-by: Matthias Hörtenhuber <mashehu@users.noreply.github.com>
- German: Capitalize 'Deutsch' in language_names.yml
- German: Add gender-star guidance (e.g., Entwickler*innen)
- Polish: Switch to informal tone (Ty/Wy instead of Pan/Pani)
- Polish: Add declension rules with apostrophe endings
- Polish: Add translations for core terms (channel, process, etc.)
- Polish: Clarify when to use inline code for keywords

Co-authored-by: mashehu <mashehu@users.noreply.github.com>
Co-authored-by: itrujnara <itrujnara@users.noreply.github.com>
- standalone: 독립 → 단독 (avoid political independence connotation)
- mini-course: 미니 과정 → 단기 과정 (more formal/professional)
- wrap: 래핑하다 → 적용하다 (avoid physical packaging connotation)

Co-authored-by: jhlee0637 <jhlee0637@users.noreply.github.com>
This addresses reviewer feedback about untranslated headings on course landing pages
(e.g. 'Course Summary', 'Additional information') and cookie consent text.

Changes:
- Create ui-strings.yml files for all 9 languages with translated:
  - Course landing page section headings
  - Default content for technical requirements and videos
- Modify index_page_hook.py to load translations from ui-strings.yml
- Add translated cookie consent to each language's mkdocs.yml
- Update new_lang command to copy ui-strings.yml and include consent template
- Document ui-strings.yml in general-llm-prompt.md for future translations

Tested: Korean, English, and German builds show correct translations.
Missed Hindi language in the previous commit. This adds:
- docs/hi/ui-strings.yml with translated course landing page strings
- Cookie consent translation in docs/hi/mkdocs.yml
The original sentence 'wissenschaftlichen Rechenanforderungen' was overly
complex and sounded dated. Simplified to be more direct and tutorial-appropriate.

Co-authored-by: mashehu <mashehu@users.noreply.github.com>
- Simplify complex sentence in nextflow_run/index.md (same fix as hello_nextflow)
- Add Writing Style section to German LLM prompt with guidance on:
  - Keeping sentences short and direct
  - Avoiding dated/formal phrasing
  - Breaking complex sentences into simpler ones
- Change 'Deutsch' to 'deutsch' in language selector to match other languages
- Add note to German LLM prompt to preserve lowercase 'deutsch'

Co-authored-by: mashehu <mashehu@users.noreply.github.com>
The YouTube playlist link was hardcoded in English. Now loaded from
ui-strings.yml with translations for all 10 languages.
German (29 files):
- Remove 'Reise' (journey) metaphors throughout
- Simplify overly complex sentences with multiple subordinate clauses
- Replace 'wirst du in der Lage sein' with simpler 'kannst du'
- Remove dated academic phrasing
- Shorten verbose survey introduction texts

Korean (17 files):
- Replace '미니 과정/미니 코스' with '단기 과정' (mini-course)
- Replace '독립형/독립 과정' with '단독형/단독 과정' (standalone)
- Replace '래핑' with '적용' (wrap → apply in Nextflow context)

Polish (17 files):
- Capitalize second-person pronouns (ci→Ci, twój→Twój, etc.)
- Change formal 'Państwa' to informal 'Twoje'
…icker

- scripts/build-multilang.sh: Discover languages from docs/ directories instead of hardcoded list
- _scripts/docs.py: Add sync-language-picker command to update extra.alternate from language_names.yml
- docs/en/mkdocs.yml: Regenerated language picker (now alphabetically sorted)
- Enhance frontmatter descriptions with usage context for preview,
  stop-preview, new-module, new-lesson, and add-exercise skills
- Add shared repo-conventions.md reference to 7 skills that lacked it
- Remove redundant "When to Use" section from check-highlights body
- Move deep review checklist from validate/SKILL.md to separate
  reference file at validate/references/deep-review-checklist.md
- Reduce verbosity in run-tutorial and find-todos output examples

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add prompt precedence rule to general prompt (language-specific overrides general)
- Consolidate technical term lists in general prompt (operators, directives, tools)
- Add output validation section to general prompt
- Standardize structure across all 9 language prompts
- Add Common Mistakes section to each language with specific examples
- Remove duplicated "Terms to Keep in English" lists from language prompts
- Resolve glossary conflicts (French workflow, Italian input/output)
- Add contribution guide to TRANSLATING.md

Net result: -370 lines (deduplication), clearer structure, better error prevention.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@netlify
Copy link

netlify bot commented Feb 2, 2026

Deploy Preview for nextflow-training ready!

Name Link
🔨 Latest commit 61ccee6
🔍 Latest deploy log https://app.netlify.com/projects/nextflow-training/deploys/69807dd97021ea0008b10579
😎 Deploy Preview https://deploy-preview-803--nextflow-training.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 2, 2026

Nextflow linting complete!

❌ 1 files had 1 errors
✅ 169 files had no errors
🔧 125 files would be changed by auto-formatting

💡 Tip: Click filename locations to go directly to that code.

View all 1 issues
Type Location Message
Error hello-nf-core/solutions/core-hello-part2/nextflow.config:154:17 Invalid include source: '/home/runner/work/training/training/hello-nf-core/solutions/core-hello-part2/conf/test_full.config'
View formatting changes
FileDiff
hello-nextflow/solutions/1-hello-world/hello-world-2.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     output:
     path 'output.txt'
 
hello-nextflow/solutions/1-hello-world/hello-world-3.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/2-hello-channels/hello-channels-1.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -29,7 +28,7 @@ workflow {
     main:
     // create a channel for inputs
     greeting_ch = channel.of('Hello Channels!')
-                        .view()
+        .view()
     // emit a greeting
... (truncated)
hello-nextflow/solutions/2-hello-channels/hello-channels-2.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -29,7 +28,7 @@ workflow {
     main:
     // create a channel for inputs
     greeting_ch = channel.of('Hello', 'Bonjour', 'Holà')
-                        .view()
+        .view()
     // emit a greeting
... (truncated)
hello-nextflow/solutions/2-hello-channels/hello-channels-3.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -28,12 +27,12 @@ workflow {
 
     main:
     // declare an array of input greetings
-    greetings_array = ['Hello','Bonjour','Holà']
+    greetings_array = ['Hello', 'Bonjour', 'Holà']
     // create a channel for inputs
... (truncated)
hello-nextflow/solutions/2-hello-channels/hello-channels-4.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -29,11 +28,11 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .view { csv -> "Before splitCsv: $csv" }
-                        .splitCsv()
-                        .view { csv -> "After splitCsv: $csv" }
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-1.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-2.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-3.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-4.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/4-hello-modules/hello-modules-2.nf
View
@@ -7,7 +7,6 @@ include { sayHello } from './modules/sayHello.nf'
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
@@ -24,7 +23,6 @@ process convertToUpper {
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
... (truncated)
hello-nextflow/solutions/4-hello-modules/hello-modules-3.nf
View
@@ -8,7 +8,6 @@ include { convertToUpper } from './modules/convertToUpper.nf'
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
@@ -38,8 +37,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
... (truncated)
hello-nextflow/solutions/4-hello-modules/hello-modules-4.nf
View
@@ -18,8 +18,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
     // emit a greeting
     sayHello(greeting_ch)
     // convert the greeting to uppercase
hello-nextflow/solutions/4-hello-modules/modules/collectGreetings.nf
View
@@ -4,7 +4,6 @@
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
hello-nextflow/solutions/4-hello-modules/modules/convertToUpper.nf
View
@@ -4,7 +4,6 @@
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
hello-nextflow/solutions/4-hello-modules/modules/sayHello.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/5-hello-containers/hello-containers-2.nf
View
@@ -20,8 +20,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
     // emit a greeting
     sayHello(greeting_ch)
     // convert the greeting to uppercase
hello-nextflow/solutions/5-hello-containers/modules/collectGreetings.nf
View
@@ -2,7 +2,6 @@
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
hello-nextflow/solutions/5-hello-containers/modules/convertToUpper.nf
View
@@ -4,7 +4,6 @@
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
hello-nextflow/solutions/5-hello-containers/modules/sayHello.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/6-hello-config/hello-config.nf
View
@@ -20,8 +20,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
     // emit a greeting
     sayHello(greeting_ch)
     // convert the greeting to uppercase
hello-nextflow/solutions/6-hello-config/modules/collectGreetings.nf
View
@@ -2,7 +2,6 @@
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
hello-nextflow/solutions/6-hello-config/modules/convertToUpper.nf
View
@@ -4,7 +4,6 @@
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
hello-nextflow/solutions/6-hello-config/modules/sayHello.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/6-hello-config/nextflow.config
View
@@ -6,7 +6,7 @@ conda.enabled = true
 */
 process {
     memory = 1.GB
-    withName: 'cowpy' {
+    withName: cowpy {
         memory = 2.GB
         cpus = 2
     }
@@ -35,7 +35,7 @@ profiles {
         process.resourceLimits = [
             memory: 750.GB,
             cpus: 200,
-            time: 30.d
+            time: 30.d,
... (truncated)
hello-nf-core/solutions/composable-hello/hello.nf
View
@@ -14,9 +14,7 @@ include { collectGreetings } from './modules/collectGreetings.nf'
 include { cowpy } from './modules/cowpy.nf'
 
 workflow HELLO {
-
     take:
-    // channel of greetings
     greeting_ch
 
     main:
hello-nf-core/solutions/composable-hello/main.nf
View
@@ -9,12 +9,12 @@ params.greeting = 'greetings.csv'
 workflow {
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.greeting)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
 
     // call the imported workflow on the channel of greetings
     HELLO(greeting_ch)
 
     // view the outputs emitted by the workflow
-    HELLO.out.view { output -> "Output: $output" }
+    HELLO.out.view { output -> "Output: ${output}" }
... (truncated)
hello-nf-core/solutions/composable-hello/modules/collectGreetings.nf
View
@@ -10,8 +10,8 @@ process collectGreetings {
     val batch_name
 
     output:
-    path "COLLECTED-${batch_name}-output.txt" , emit: outfile
-    val count_greetings , emit: count
+    path "COLLECTED-${batch_name}-output.txt", emit: outfile
+    val count_greetings, emit: count
 
     script:
     count_greetings = input_files.size()
hello-nf-core/solutions/composable-hello/modules/convertToUpper.nf
View
@@ -15,6 +15,6 @@ process convertToUpper {
 
     script:
     """
-    cat '$input_file' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
+    cat '${input_file}' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
     """
 }
hello-nf-core/solutions/composable-hello/modules/cowpy.nf
View
@@ -17,6 +17,6 @@ process cowpy {
 
     script:
     """
-    cat $input_file | cowpy -c "$character" > cowpy-${input_file}
+    cat ${input_file} | cowpy -c "${character}" > cowpy-${input_file}
     """
 }
hello-nf-core/solutions/composable-hello/modules/sayHello.nf
View
@@ -15,6 +15,6 @@ process sayHello {
 
     script:
     """
-    echo '$greeting' > '$greeting-output.txt'
+    echo '${greeting}' > '${greeting}-output.txt'
     """
 }
hello-nf-core/solutions/core-hello-part2/conf/base.config
View
@@ -11,13 +11,13 @@
 process {
 
     // TODO nf-core: Check the defaults for all processes
-    cpus   = { 1      * task.attempt }
-    memory = { 6.GB   * task.attempt }
-    time   = { 4.h    * task.attempt }
+    cpus = { 1 * task.attempt }
+    memory = { 6.GB * task.attempt }
+    time = { 4.h * task.attempt }
 
     errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' }
-    maxRetries    = 1
-    maxErrors     = '-1'
+    maxRetries = 1
... (truncated)
hello-nf-core/solutions/core-hello-part2/conf/modules.config
View
@@ -15,7 +15,6 @@ process {
     publishDir = [
         path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" },
         mode: params.publish_dir_mode,
-        saveAs: { filename -> filename.equals('versions.yml') ? null : filename }
+        saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
     ]
-
 }
hello-nf-core/solutions/core-hello-part2/conf/test.config
View
@@ -14,18 +14,18 @@ process {
     resourceLimits = [
         cpus: 2,
         memory: '4.GB',
-        time: '1.h'
+        time: '1.h',
     ]
 }
 
 params {
-    config_profile_name        = 'Test profile'
+    config_profile_name = 'Test profile'
     config_profile_description = 'Minimal test dataset to check pipeline function'
 
     // Input data
... (truncated)
hello-nf-core/solutions/core-hello-part2/main.nf
View
@@ -13,9 +13,9 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
-include { HELLO  } from './workflows/hello'
+include { HELLO } from './workflows/hello'
 include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_hello_pipeline'
-include { PIPELINE_COMPLETION     } from './subworkflows/local/utils_nfcore_hello_pipeline'
+include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_hello_pipeline'
 /*
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     NAMED WORKFLOWS FOR PIPELINE
@@ -26,7 +26,6 @@ include { PIPELINE_COMPLETION     } from './subworkflows/local/utils_nfcore_hell
 // WORKFLOW: Run main analysis pipeline depending on type of input
 //
... (truncated)
hello-nf-core/solutions/core-hello-part2/modules/local/collectGreetings.nf
View
@@ -10,8 +10,8 @@ process collectGreetings {
     val batch_name
 
     output:
-    path "COLLECTED-${batch_name}-output.txt" , emit: outfile
-    val count_greetings , emit: count
+    path "COLLECTED-${batch_name}-output.txt", emit: outfile
+    val count_greetings, emit: count
 
     script:
     count_greetings = input_files.size()
hello-nf-core/solutions/core-hello-part2/modules/local/convertToUpper.nf
View
@@ -15,6 +15,6 @@ process convertToUpper {
 
     script:
     """
-    cat '$input_file' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
+    cat '${input_file}' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
     """
 }
hello-nf-core/solutions/core-hello-part2/modules/local/cowpy.nf
View
@@ -17,6 +17,6 @@ process cowpy {
 
     script:
     """
-    cat $input_file | cowpy -c "$character" > cowpy-${input_file}
+    cat ${input_file} | cowpy -c "${character}" > cowpy-${input_file}
     """
 }
hello-nf-core/solutions/core-hello-part2/modules/local/sayHello.nf
View
@@ -15,6 +15,6 @@ process sayHello {
 
     script:
     """
-    echo '$greeting' > '$greeting-output.txt'
+    echo '${greeting}' > '${greeting}-output.txt'
     """
 }
hello-nf-core/solutions/core-hello-part2/subworkflows/local/utils_nfcore_hello_pipeline/main.nf
View
@@ -8,13 +8,13 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
-include { UTILS_NFSCHEMA_PLUGIN     } from '../../nf-core/utils_nfschema_plugin'
-include { paramsSummaryMap          } from 'plugin/nf-schema'
-include { samplesheetToList         } from 'plugin/nf-schema'
-include { paramsHelp                } from 'plugin/nf-schema'
-include { completionSummary         } from '../../nf-core/utils_nfcore_pipeline'
-include { UTILS_NFCORE_PIPELINE     } from '../../nf-core/utils_nfcore_pipeline'
-include { UTILS_NEXTFLOW_PIPELINE   } from '../../nf-core/utils_nextflow_pipeline'
+include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin'
+include { paramsSummaryMap } from 'plugin/nf-schema'
+include { samplesheetToList } from 'plugin/nf-schema'
+include { paramsHelp } from 'plugin/nf-schema'
... (truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
View
@@ -10,9 +10,9 @@
 
 workflow UTILS_NEXTFLOW_PIPELINE {
     take:
-    print_version        // boolean: print version
-    dump_parameters      // boolean: dump parameters
-    outdir               //    path: base directory used to publish pipeline results
+    print_version // boolean: print version
+    dump_parameters // boolean: dump parameters
+    outdir //    path: base directory used to publish pipeline results
     check_conda_channels // boolean: check conda channels
 
     main:
@@ -72,10 +72,10 @@ def getWorkflowVersion() {
 //
... (truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config
View
@@ -1,9 +1,9 @@
 manifest {
-    name            = 'nextflow_workflow'
-    author          = """nf-core"""
-    homePage        = 'https://127.0.0.1'
-    description     = """Dummy pipeline"""
+    name = 'nextflow_workflow'
+    author = """nf-core"""
+    homePage = 'https://127.0.0.1'
+    description = """Dummy pipeline"""
     nextflowVersion = '!>=23.04.0'
-    version         = '9.9.9'
-    doi             = 'https://doi.org/10.5281/zenodo.5070524'
+    version = '9.9.9'
+    doi = 'https://doi.org/10.5281/zenodo.5070524'
... (truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
View
@@ -125,12 +125,12 @@ def paramsSummaryMultiqc(summary_params) {
         }
 
     def yaml_file_text = "id: '${workflow.manifest.name.replace('/', '-')}-summary'\n" as String
-    yaml_file_text     += "description: ' - this information is collected when the pipeline is started.'\n"
-    yaml_file_text     += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
-    yaml_file_text     += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
-    yaml_file_text     += "plot_type: 'html'\n"
-    yaml_file_text     += "data: |\n"
-    yaml_file_text     += "${summary_section}"
+    yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n"
+    yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
+    yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
+    yaml_file_text += "plot_type: 'html'\n"
+    yaml_file_text += "data: |\n"
... (truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config
View
@@ -1,9 +1,9 @@
 manifest {
-    name            = 'nextflow_workflow'
-    author          = """nf-core"""
-    homePage        = 'https://127.0.0.1'
-    description     = """Dummy pipeline"""
-    nextflowVersion  = '!>=23.04.0'
-    version         = '9.9.9'
-    doi             = 'https://doi.org/10.5281/zenodo.5070524'
+    name = 'nextflow_workflow'
+    author = """nf-core"""
+    homePage = 'https://127.0.0.1'
+    description = """Dummy pipeline"""
+    nextflowVersion = '!>=23.04.0'
+    version = '9.9.9'
... (truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part2/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-part3/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-part3/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-part3/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-part3/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-part3/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/convertToUpper.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/cowpy.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/sayHello.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/nf-core/cat/cat/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/nf-core/cat/cat/tests/nextflow_unzipped_zipped.config(truncated)
hello-nf-core/solutions/core-hello-part3/modules/nf-core/cat/cat/tests/nextflow_zipped_unzipped.config(truncated)
hello-nf-core/solutions/core-hello-part3/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-part4/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-part4/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-part4/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-part4/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-part4/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/convertToUpper.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/cowpy.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/cowpy/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/sayHello.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/nf-core/cat/cat/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/nf-core/cat/cat/tests/nextflow_unzipped_zipped.config(truncated)
hello-nf-core/solutions/core-hello-part4/modules/nf-core/cat/cat/tests/nextflow_zipped_unzipped.config(truncated)
hello-nf-core/solutions/core-hello-part4/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-part5/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-part5/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-part5/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-part5/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-part5/main.nf(truncated)
hello-nf-core/solutions/core-hello-part5/modules/local/convertToUpper.nf(truncated)
hello-nf-core/solutions/core-hello-part5/modules/local/cowpy.nf(truncated)
hello-nf-core/solutions/core-hello-part5/modules/local/cowpy/main.nf(truncated)
hello-nf-core/solutions/core-hello-part5/modules/local/sayHello.nf(truncated)
hello-nf-core/solutions/core-hello-part5/modules/nf-core/cat/cat/main.nf(truncated)
hello-nf-core/solutions/core-hello-part5/modules/nf-core/cat/cat/tests/nextflow_unzipped_zipped.config(truncated)
hello-nf-core/solutions/core-hello-part5/modules/nf-core/cat/cat/tests/nextflow_zipped_unzipped.config(truncated)
hello-nf-core/solutions/core-hello-part5/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part5/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part5/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part5/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part5/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part5/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part5/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part5/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-start/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-start/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-start/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-start/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-start/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/workflows/hello.nf(truncated)
nextflow-run/solutions/3-main.nf(truncated)
nextflow-run/solutions/modules/collectGreetings.nf(truncated)
nextflow-run/solutions/modules/convertToUpper.nf(truncated)
nextflow-run/solutions/modules/sayHello.nf(truncated)
nextflow-run/solutions/nextflow.config(truncated)
side-quests/solutions/debugging/buggy_workflow.nf(truncated)
side-quests/solutions/essential_scripting_patterns/main.nf(truncated)

@ewels
Copy link
Member Author

ewels commented Feb 2, 2026

Sadly seems that docker-in-docker is still problematic in Studios:

Example Nextflow CLI output with error
root@ip-172-31-40-73:~/training/hello-nextflow# nextflow run solutions/5-hello-containers/hello-containers-2.nf -c solutions/5-hello-containers/nextflow.config 
Nextflow 25.10.3 is available - Please consider updating your version to it

 N E X T F L O W   ~  version 25.10.2

Launching `solutions/5-hello-containers/hello-containers-2.nf` [silly_davinci] DSL2 - revision: 7fb7d4ac03

executor >  local (8)
[c3/e4267e] process > sayHello (2)       [100%] 3 of 3 ✔
[12/eba44b] process > convertToUpper (3) [100%] 3 of 3 ✔
[7e/2f1416] process > collectGreetings   [100%] 1 of 1 ✔
[75/4b73aa] process > cowpy              [  0%] 0 of 1
ERROR ~ Error executing process > 'cowpy'

Caused by:
  Process `cowpy` terminated with an error exit status (125)


Command executed:

  cat COLLECTED-batch-output.txt | cowpy -c "turkey" > cowpy-COLLECTED-batch-output.txt

Command exit status:
  125

Command output:
  (empty)

Command error:
  Unable to find image 'community.wave.seqera.io/library/cowpy:1.1.5--3db457ae1977a273' locally
  1.1.5--3db457ae1977a273: Pulling from library/cowpy
  dafa2b0c44d2: Pulling fs layer
  f88da01cff0b: Pulling fs layer
  92dc97a3ef36: Pulling fs layer
  4f4fb700ef54: Pulling fs layer
  403f74b0f85e: Pulling fs layer
  0ea1a16bbe82: Pulling fs layer
  dec6b097362e: Pulling fs layer
  17dc7ea432cc: Pulling fs layer
  10b8c00c10a5: Pulling fs layer
  4f4fb700ef54: Pulling fs layer
  030a47592a0a: Pulling fs layer
  e1686ff32a11: Pulling fs layer
  c23bdb422167: Pulling fs layer
  bb36d6c3110d: Pulling fs layer
  403f74b0f85e: Download complete
  f88da01cff0b: Download complete
  4f4fb700ef54: Download complete
  bb36d6c3110d: Download complete
  030a47592a0a: Download complete
  dec6b097362e: Download complete
  92dc97a3ef36: Download complete
  0ea1a16bbe82: Download complete
  17dc7ea432cc: Download complete
  10b8c00c10a5: Download complete
  c23bdb422167: Download complete
  dafa2b0c44d2: Download complete
  e1686ff32a11: Download complete
  dec6b097362e: Pull complete
  dafa2b0c44d2: Pull complete
  403f74b0f85e: Pull complete
  f88da01cff0b: Pull complete
  4f4fb700ef54: Pull complete
  bb36d6c3110d: Pull complete
  92dc97a3ef36: Pull complete
  17dc7ea432cc: Pull complete
  10b8c00c10a5: Pull complete
  030a47592a0a: Pull complete
  0ea1a16bbe82: Pull complete
  c23bdb422167: Pull complete
  e1686ff32a11: Pull complete
  Digest: sha256:1ebc0043e8cafa61203bf42d29fd05bd14e7b4298e5e8cf986504c15f5aa4160
  Status: Downloaded newer image for community.wave.seqera.io/library/cowpy:1.1.5--3db457ae1977a273
  docker: Error response from daemon: failed to mount /tmp/containerd-mount2111467694: mount source: "overlay", target: "/tmp/containerd-mount2111467694", fstype: overlay, flags: 0, data: "workdir=/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/15/work,upperdir=/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/15/fs,lowerdir=/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/14/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/13/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/12/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/11/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/10/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/9/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/8/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/7/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/6/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/5/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/4/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/3/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/2/fs:/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/1/fs,index=off", err: invalid argument
  
  Run 'docker run --help' for more information

Work dir:
  /workspace/training/hello-nextflow/work/75/4b73aa65b79bacccefa14b265b5999

Container:
  community.wave.seqera.io/library/cowpy:1.1.5--3db457ae1977a273

Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run`

 -- Check '.nextflow.log' file for details
ERROR ~ Cannot access first() element from an empty List

 -- Check '.nextflow.log' file for details

Base automatically changed from lang to master February 2, 2026 23:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Comments