## Version 1.3.1
### Performance improvements
- **Significantly improved performance on large datasets** by moving module recursion to low-level numeric matrix operations, eliminating per-call data frame dispatch, `rbind()` factor-level checks, and repeated `as.matrix()` copies.
- **Added module-level parallelization**: `process_all_modules()` and `mclink()` gain an `n_cores` argument for parallel processing via `parallel::mclapply()` on Unix-like systems (sequential fallback on Windows).

## Version 1.2.1 (2026-09-05)
### Performance improvements
- **Significantly improved performance on large datasets** by refactoring core step/loop/bracket functions to avoid redundant data frame reconstruction, repeated `rbind()` + `unique()` calls, and unnecessary `merge()` operations inside loops. `apply(x, 2, min/max)` replaced by `matrixStats::colMins()`/`colMaxs()`.
- `convert_abundance_to_presence()` rewritten with vectorized operations and now short-circuits when the input is already binary.

### Data
- Default `KO_pathway_ref` dataset `modules_ko_info.tsv` updated from `v20250402` (3846 rows) to `v20260601` (4235 rows). Same 10-column structure.

## Version 1.1.2 (2026-07-20)
### Bug fixes
- create_sub_module_sample() and process_all_pathways() now handles single-column (single-sample) input gracefully when split_by_pathway = TRUE. Previously, subsetting a single-column matrix caused implicit dimension dropping (drop = TRUE), resulting in a vector instead of a data.frame, which triggered tibble::rownames_to_column() to fail with is.data.frame(df) is not TRUE.

## Version 1.1.1 (2025-10-25)
### Bug fixes
- `mclink()`now handle single-column input gracefully without throwing an error.
