Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
417a6ac
Make config type checking optional if typeguard is not installed (i.e…
vladsavelyev Aug 20, 2025
001f3c4
New module: Seqfu stats (#3271)
pontushojer Aug 21, 2025
997f52e
WASM workaround: if write_parquet not supported, write csv (#3309)
vladsavelyev Aug 21, 2025
805ea23
File search: do not read files if contents exclusion patterns are not…
vladsavelyev Aug 22, 2025
64dde16
Add pandoc to Docker image
vladsavelyev Aug 22, 2025
d58e581
Instruct Claude about main branch
vladsavelyev Aug 22, 2025
6227516
Fix box plot AI summaries (#3315)
vladsavelyev Aug 27, 2025
dcfb915
AI summaries: fix when provider undefined
vladsavelyev Aug 28, 2025
928e8d9
Fix using default AI provider
vladsavelyev Aug 28, 2025
1ce7127
OpenAI: default to gpt-5
vladsavelyev Aug 28, 2025
e553f29
Xenium: feedback (#3313)
vladsavelyev Aug 29, 2025
6bc7317
Fix config flag types in schema (#3318)
vladsavelyev Aug 29, 2025
01625d6
Scatter plot: fix hiding dots by legend click (#3321)
vladsavelyev Aug 29, 2025
8cb5b70
bases2fastq: fix index error (#3321) (#3328)
vladsavelyev Sep 3, 2025
2359eda
Ignore pyc files when copying html files (#3320)
aanil Sep 3, 2025
74e3478
Xenium QC: feedback - round 2 (#3323)
vladsavelyev Sep 4, 2025
695eca6
docs: Fix links causing Docusaurus warnings (#3329)
christopher-hakkaart Sep 4, 2025
e438655
Unique series label for each plot type (#3330)
vladsavelyev Sep 4, 2025
be6cb4c
Docs: cross-link sample renaming docs (fixes https://github.com/Multi…
vladsavelyev Sep 5, 2025
9cd6c06
Rename `BETA-multiqc.parquet` to `multiqc.parquet` (#3332)
vladsavelyev Sep 5, 2025
c5949d9
Cutadapt: improve sample name extraction for stdin input (#3333)
vladsavelyev Sep 5, 2025
09bbf1f
Bump v1.31 (#3331)
vladsavelyev Sep 5, 2025
178dce8
Typo in changelog
vladsavelyev Sep 5, 2025
38652eb
Xenium: fix `Transcript Quality Summary ` order. Add warnings about m…
vladsavelyev Sep 5, 2025
309600b
Rich codex (#3335)
vladsavelyev Sep 5, 2025
d5908ec
Fix flag typo in running_multiqc.md (#3347)
rzelle-lallemand Sep 16, 2025
9bc8954
Xenium docs: Mention supported version ranges.
ewels Sep 16, 2025
2fc5fe8
Dockerfile: Add variant with all LaTeX requirements, switch to LuaTeX…
ewels Sep 16, 2025
a1da442
Docs: strip <p> tags from info line for modules table
ewels Sep 17, 2025
2ce3b6d
Module docs: Convert HTML back to markdown, instead of just stripping…
ewels Sep 17, 2025
31135b2
Update Claude Code GitHub Workflow (#3353)
ewels Sep 17, 2025
3b84187
Remove bedrock availability check when creating client (#3352)
jchorl Sep 17, 2025
8f08115
Docs: make module docs use relative links
ewels Sep 17, 2025
4812752
first pass link correction (#3314)
gavinelder Sep 17, 2025
1d33809
New module: sompy (#3186)
jethror1 Sep 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .github/workflows/claude-code-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Claude Code Review

on:
pull_request:
types: [opened, synchronize]
# Optional: Only run on specific file changes
# paths:
# - "src/**/*.ts"
# - "src/**/*.tsx"
# - "src/**/*.js"
# - "src/**/*.jsx"

jobs:
claude-review:
# Only run on PRs from branches in the same repository (not forks)
# This prevents the workflow from failing when secrets aren't available
if: github.event.pull_request.head.repo.full_name == github.repository

runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1

- name: Run Claude Code Review
id: claude-review
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
Please review this pull request and provide feedback on:
- Code quality and best practices
- Potential bugs or issues
- Performance considerations
- Security concerns
- Test coverage

Use the repository's CLAUDE.md for guidance on style and conventions. Be constructive and helpful in your feedback.

Use `gh pr comment` with your Bash tool to leave your review as a comment on the PR.

# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://docs.anthropic.com/en/docs/claude-code/sdk#command-line for available options
claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"'
39 changes: 25 additions & 14 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Claude Code Review
name: Claude Code

on:
issue_comment:
Expand All @@ -11,28 +11,39 @@ on:
types: [submitted]

jobs:
claude-code-review:
claude:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
pull-requests: write
id-token: write

if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))

actions: read # Required for Claude to read CI results on PRs
steps:
- name: Checkout code
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1

- name: Run Claude PR Action
uses: anthropics/claude-code-action@beta
- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
timeout_minutes: "60"

# This is an optional setting that allows Claude to read CI results on PRs
additional_permissions: |
actions: read

# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
# prompt: 'Update the pull request description to include a summary of changes.'

# Optional: Add claude_args to customize behavior and configuration
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://docs.anthropic.com/en/docs/claude-code/sdk#command-line for available options
# claude_args: '--model claude-opus-4-1-20250805 --allowed-tools Bash(gh pr:*)'
33 changes: 21 additions & 12 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ name: "Docker image"
on:
pull_request:
paths:
# Step takes 5 min, too long for PR commits, so leaving it only to significant changes
- "pyproject.toml"
# Step takes 30 min, too long for PR commits, so leaving it only to significant changes
# - "pyproject.toml"
- "Dockerfile"
push:
# Build multiqc:dev on every push to main
Expand All @@ -21,6 +21,13 @@ jobs:
build:
if: github.repository == 'MultiQC/MultiQC'
runs-on: ubuntu-latest
strategy:
matrix:
v:
- lab: ""
build_args: ""
- lab: "pdf-"
build_args: "INSTALL_PANDOC=true"
steps:
- name: "Check out the repo"
uses: actions/checkout@v4
Expand Down Expand Up @@ -51,29 +58,31 @@ jobs:

- name: "Build dev"
uses: docker/build-push-action@v3
if: github.event_name != 'pull_request' && github.event_name != 'release'
if: github.event_name != 'release'
with:
# All available with python:3.X-slim are:
# platforms: linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x
# But 32-bit binaries likely require compilation from source so stick with linux/amd64 and linux/arm64 for now
platforms: linux/amd64,linux/arm64
push: true
# If it's a PR, use the branch name as a tag, otherwise use "dev"
build-args: ${{ matrix.v.build_args }}
# Only push if it's commit to main, or workflow_dispatch
push: ${{github.event_name != 'pull_request'}}
tags: |
${{ github.ref == 'refs/heads/main' && 'multiqc/multiqc:dev' || format('multiqc/multiqc:{0}', github.head_ref) }}
${{ github.ref == 'refs/heads/main' && 'ghcr.io/multiqc/multiqc:dev' || format('ghcr.io/multiqc/multiqc:{0}', github.head_ref) }}
multiqc/multiqc:${{matrix.v.lab}}dev
ghcr.io/multiqc/multiqc:${{matrix.v.lab}}dev

- name: "Build release"
uses: docker/build-push-action@v3
if: github.event_name != 'pull_request' && github.event_name == 'release'
if: github.event_name == 'release'
with:
# All available with python:3.X-slim are:
# platforms: linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x
# But 32-bit binaries likely require compilation from source so stick with linux/amd64 and linux/arm64 for now
platforms: linux/amd64,linux/arm64
build-args: ${{ matrix.v.build_args }}
push: true
tags: |
multiqc/multiqc:${{ github.event.release.tag_name }}
multiqc/multiqc:latest
ghcr.io/multiqc/multiqc:${{ github.event.release.tag_name }}
ghcr.io/multiqc/multiqc:latest
multiqc/multiqc:${{ matrix.v.lab }}${{ github.event.release.tag_name }}
multiqc/multiqc:${{ matrix.v.lab }}latest
ghcr.io/multiqc/multiqc:${{ matrix.v.lab }}${{ github.event.release.tag_name }}
ghcr.io/multiqc/multiqc:${{ matrix.v.lab }}latest
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,5 @@ package.json

.env
.claude

Pipfile
51 changes: 51 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,56 @@
# MultiQC Version History

## [MultiQC v1.31](https://github.com/MultiQC/MultiQC/releases/tag/v1.31) - 2025-09-05

Adding new module for [Xenium analysis](https://www.10xgenomics.com/products/xenium-analysis), 10x Genomics Xenium spatial transcriptomics quality control report.

The parquet format is stable since 1.29, renaming the output file from `BETA-multiqc.parquet` to `multiqc.parquet`.

### New modules

- Xenium QC ([#3276](https://github.com/MultiQC/MultiQC/pull/3276), [#3313](https://github.com/MultiQC/MultiQC/pull/3313), [#3323](https://github.com/MultiQC/MultiQC/pull/3323))
- Seqfu: `stats` command - FASTA/FASTQ files stats ([#3271](https://github.com/MultiQC/MultiQC/pull/3271))

### Feature updates and improvements

- Add `return_html` parameter for programmatic HTML access ([#3304](https://github.com/MultiQC/MultiQC/pull/3304))
- File search optimization: avoid reading files when contents exclusion patterns are not
provided ([#3312](https://github.com/MultiQC/MultiQC/pull/3312))
- Rename `BETA-multiqc.parquet` to `multiqc.parquet` ([#3332](https://github.com/MultiQC/MultiQC/pull/3332))

### Fixes

- Scatter plot: fix hiding dots by legend click ([#3321](https://github.com/MultiQC/MultiQC/pull/3321))
- Plots: set unique series label for each plot type ([#3330](https://github.com/MultiQC/MultiQC/pull/3330))
- Fix bulk sample renaming buttons ([#3300](https://github.com/MultiQC/MultiQC/pull/3300))
- Fix config flag types in schema ([#3318](https://github.com/MultiQC/MultiQC/pull/3318))
- Ignore pyc files when copying html files ([#3320](https://github.com/MultiQC/MultiQC/pull/3320))

### Module updates

- Picard tools: enhance QualityByCycleMetrics to support original quality scores ([#3307](https://github.com/MultiQC/MultiQC/pull/3307))
- STAR: improve module color scheme for better accessibility ([#3305](https://github.com/MultiQC/MultiQC/pull/3305), [#3306](https://github.com/MultiQC/MultiQC/pull/3306))
- Sequali: support insert size metrics ([#3303](https://github.com/MultiQC/MultiQC/pull/3303))
- Missing modules to general stats: Busco, CheckM, CheckM2, GTDB-Tk ([#3289](https://github.com/MultiQC/MultiQC/pull/3289))
- cells2stats: add support for optical pooled screening output ([#3277](https://github.com/MultiQC/MultiQC/pull/3277))
- fastp: add before-filtering mean r1/r2 length to general stats ([#3280](https://github.com/MultiQC/MultiQC/pull/3280))
- Cutadapt: improve sample name extraction for stdin input ([#3333](https://github.com/MultiQC/MultiQC/pull/3333))

### Module fixes

- bases2fastq: fix index error ([#3328](https://github.com/MultiQC/MultiQC/pull/3328))
- Picard: fix VariantCallingMetrics to support sample renaming ([#3298](https://github.com/MultiQC/MultiQC/pull/3298))
- fastp: fix sample naming for paired-end reads ([#3302](https://github.com/MultiQC/MultiQC/pull/3302))
- bcftools: fix singleton count calculation to include indels ([#3295](https://github.com/MultiQC/MultiQC/pull/3295))
- CheckM2: column spelling fix ([#3283](https://github.com/MultiQC/MultiQC/pull/3283))
- Bulk replace deprecated `hide_empty` with `hide_zero_cats` ([#3296](https://github.com/MultiQC/MultiQC/pull/3296))

### Infrastructure and packaging

- WASM workaround: if `write_parquet` not supported by polars, write a CSV file ([#3309](https://github.com/MultiQC/MultiQC/pull/3309))
- Add Claude instructions ([#3301](https://github.com/MultiQC/MultiQC/pull/3301))
- Add Claude review action ([#3299](https://github.com/MultiQC/MultiQC/pull/3299))

## [MultiQC v1.30](https://github.com/MultiQC/MultiQC/releases/tag/v1.30) - 2025-07-09

Minor improvements and fixes.
Expand Down
4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# CLAUDE.md

# IMPORTANT

Never push to main branch. When asked to add a change or create a pull request, always check if we are on main first. If we are, create a new branch and push to it.

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Development Commands
Expand Down
15 changes: 11 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
FROM python:3.12-slim
FROM python:3.13-slim

LABEL author="Phil Ewels & Vlad Savelyev" \
description="MultiQC" \
maintainer="phil.ewels@seqera.io"

# Optional pandoc installation for PDF support
ARG INSTALL_PANDOC=false

RUN mkdir /usr/src/multiqc

# Add the MultiQC source files to the container
Expand All @@ -28,6 +31,10 @@ RUN \
&& \
echo "Docker build log: Install procps" 1>&2 && \
apt-get install -y -qq procps && \
if [ "$INSTALL_PANDOC" = "true" ]; then \
echo "Docker build log: Install pandoc and LaTeX for PDF generation" 1>&2 && \
apt-get install -y -qq pandoc texlive-latex-base texlive-fonts-recommended texlive-latex-extra texlive-luatex; \
fi && \
echo "Docker build log: Clean apt cache" 1>&2 && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean -y && \
Expand All @@ -37,7 +44,7 @@ RUN \
# Install MultiQC
pip install --verbose --no-cache-dir /usr/src/multiqc && \
echo "Docker build log: Delete python cache directories" 1>&2 && \
find /usr/local/lib/python3.12 \( -iname '*.c' -o -iname '*.pxd' -o -iname '*.pyd' -o -iname '__pycache__' \) -printf "\"%p\" " | \
find /usr/local/lib/python3.13 \( -iname '*.c' -o -iname '*.pxd' -o -iname '*.pyd' -o -iname '__pycache__' \) -printf "\"%p\" " | \
xargs rm -rf {} && \
echo "Docker build log: Delete /usr/src/multiqc" 1>&2 && \
rm -rf "/usr/src/multiqc/" && \
Expand All @@ -53,7 +60,7 @@ WORKDIR /home/multiqc

# Check everything is working smoothly
RUN echo "Docker build log: Testing multiqc" 1>&2 && \
multiqc --help
multiqc --help

# Display the command line help if the container is run without any parameters
CMD multiqc --help
CMD multiqc --help
Loading