From bfe6ebd39c0d33aacd7a661d73ae6f8b52be8504 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:31:17 +0800 Subject: [PATCH 01/24] Add Harper workflow for grammar and style checks --- .github/workflows/harper.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/harper.yml diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml new file mode 100644 index 0000000000..531049e92e --- /dev/null +++ b/.github/workflows/harper.yml @@ -0,0 +1,23 @@ +name: Harper + +on: + pull_request: + workflow_dispatch: + +jobs: + harper: + name: Grammar and Style Check + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install Harper CLI + run: cargo install harper-cli --locked + + - name: Run Harper + run: harper-cli lint docs src/pages From 0d20fcf27204eeeda53d3f6d6e973cf37783f189 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:41:40 +0800 Subject: [PATCH 02/24] Remove Rust installation step from workflow --- .github/workflows/harper.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 531049e92e..d5d3d43da4 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -13,9 +13,6 @@ jobs: - name: Checkout uses: actions/checkout@v6 - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - name: Install Harper CLI run: cargo install harper-cli --locked From 5b966a796ae7e3b660c9070391e5043fc6d19966 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:47:48 +0800 Subject: [PATCH 03/24] Update Harper CLI installation method in workflow --- .github/workflows/harper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index d5d3d43da4..6e51988c6c 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@v6 - name: Install Harper CLI - run: cargo install harper-cli --locked + run: cargo install --git https://github.com/Automattic/harper harper-cli --locked - name: Run Harper run: harper-cli lint docs src/pages From 56c9370b6e1020ce3987c648c56b7f94bd6a2897 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:54:45 +0800 Subject: [PATCH 04/24] Update Harper CLI lint command to use find --- .github/workflows/harper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 6e51988c6c..1da0178edc 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -17,4 +17,4 @@ jobs: run: cargo install --git https://github.com/Automattic/harper harper-cli --locked - name: Run Harper - run: harper-cli lint docs src/pages + run: find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | xargs -0 harper-cli lint From 1613f33ced35acc11d74f9eff15d42ac6c371377 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Thu, 2 Jul 2026 00:49:39 +0800 Subject: [PATCH 05/24] Add new terms to the harper dictionary --- .harper-dictionary.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt index 79a397e136..2bf6d8bc9c 100644 --- a/.harper-dictionary.txt +++ b/.harper-dictionary.txt @@ -1 +1,9 @@ HPC +DDP +SPMD +DPP +GWDG +SageMaker +Slurm +SBATCH +py From cb8179bd1e930161edcd95d6464a03c0d4e0ed84 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:17:29 +0800 Subject: [PATCH 06/24] Update .harper-dictionary.txt --- .harper-dictionary.txt | 149 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt index 2bf6d8bc9c..77eaec0b9a 100644 --- a/.harper-dictionary.txt +++ b/.harper-dictionary.txt @@ -7,3 +7,152 @@ SageMaker Slurm SBATCH py +TabItem +mdx +br +vpn +html +png +SLURM +GWDG +vLLM +vllm +Gemma +NetID +CUI +SRDE +srde +OSP +GOIS +gDTN +conda +QuickLinks +QuickLink +req +cvf +rclone +nvidia +smi +Nsight +ETL +ffcv +NVIDIA +DALI +ImageNet +linux +TMPDIR +HDF5 +hdf5 +LMDB +OS +np +lmd +lmdb +jpeg +Bcolz +Zarr +Globus +nyu +inode +r +julia +OOD +du +s +hr +VSCode +mv +ln +vscode +RStudio +rstudio +ide +myquota +mailto +rclone +RClone +Gb +GB +TB +Tb +MB +Mb +Descr +pr +XXXXX +br +srun +pty +sbatch +c4 +t2 +smi +NVIDIA +NVML +P0 +P12 +nvtop +sdiag +slurmctld +DBD +rpc +cnt +Backfiring +etc +gettimeofday +seff +rpsquota +sched +sacct +walltime +alphafold +renv +knitro +amd +lammps +matlab +mathematica +crystal17 +namd +squashfs +orca +gaussian +vnc +hadoop +sas +xvfb +jupyter +schrodinger +comsol +stata +Lmod +sif +sqf +apptainer +Guano +HuggingFace +rw +ModuleNotFoundError +ro +Xeon +H200 +SIF +L40S +OCI +Infiniband +WD40 +N/A +H100 +A100 +LINPACK +Tandon +SoE +Courant +CILVR +anaconda3 +ubuntu +whoami +pwd +ood +salloc +sinfo From 5b7af723dfce2a5552f5ec877d2a3757fa8671f9 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:02:26 +0800 Subject: [PATCH 07/24] Update harper.yml --- .github/workflows/harper.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 1da0178edc..29828e46fc 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -16,5 +16,13 @@ jobs: - name: Install Harper CLI run: cargo install --git https://github.com/Automattic/harper harper-cli --locked + - name: Show Harper CLI Help + run: | + harper-cli --help + echo "----------------" + harper-cli lint --help + - name: Run Harper - run: find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | xargs -0 harper-cli lint + run: | + find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ + xargs -0 harper-cli lint From 4118ded349589054d720b6aec61416a520b0391e Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:12:46 +0800 Subject: [PATCH 08/24] Update harper.yml --- .github/workflows/harper.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 29828e46fc..3e68ac5996 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -16,13 +16,8 @@ jobs: - name: Install Harper CLI run: cargo install --git https://github.com/Automattic/harper harper-cli --locked - - name: Show Harper CLI Help - run: | - harper-cli --help - echo "----------------" - harper-cli lint --help - - name: Run Harper run: | find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ - xargs -0 harper-cli lint + xargs -0 harper-cli lint \ + --user-dict-path ./.harper-dictionary.txt From e7c5300b841afeda596946e3586e3a7b92f74871 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 00:00:33 +0800 Subject: [PATCH 09/24] Update harper.yml --- .github/workflows/harper.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 3e68ac5996..6995d021dc 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -16,6 +16,14 @@ jobs: - name: Install Harper CLI run: cargo install --git https://github.com/Automattic/harper harper-cli --locked + - name: Generate Harper spelling report + run: | + find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ + xargs -0 harper-cli lint \ + --user-dict-path ./.harper-dictionary.txt \ + --only Spelling::SpellCheck \ + --format compact || true + - name: Run Harper run: | find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ From ebb69ab03d4f5c7bde001fcfacdef80063a56845 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 00:36:52 +0800 Subject: [PATCH 10/24] Change report generation from spelling to compact --- .github/workflows/harper.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 6995d021dc..9a6e517086 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -16,12 +16,11 @@ jobs: - name: Install Harper CLI run: cargo install --git https://github.com/Automattic/harper harper-cli --locked - - name: Generate Harper spelling report + - name: Generate Harper compact report run: | find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ xargs -0 harper-cli lint \ --user-dict-path ./.harper-dictionary.txt \ - --only Spelling::SpellCheck \ --format compact || true - name: Run Harper From 181ec9945576a213ab5bb625b7db4a498790b6c4 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 01:26:12 +0800 Subject: [PATCH 11/24] Update harper.yml --- .github/workflows/harper.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 9a6e517086..4a98516f7f 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -16,12 +16,16 @@ jobs: - name: Install Harper CLI run: cargo install --git https://github.com/Automattic/harper harper-cli --locked - - name: Generate Harper compact report + - name: Generate Harper JSON Report run: | find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ xargs -0 harper-cli lint \ --user-dict-path ./.harper-dictionary.txt \ - --format compact || true + --format json \ + > harper-report.json || true + + - name: Show Harper Report + run: cat harper-report.json - name: Run Harper run: | From 8d39bb588b87c2d1cb8fae64d0fdb569915d93fe Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 10:21:47 +0800 Subject: [PATCH 12/24] make harper not fail --- .github/workflows/harper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 4a98516f7f..41501155a0 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -31,4 +31,4 @@ jobs: run: | find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ xargs -0 harper-cli lint \ - --user-dict-path ./.harper-dictionary.txt + --user-dict-path ./.harper-dictionary.txt || true From 1d83d13e56e4dd17514dbc40d576b73c84e4cde1 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 11:01:16 +0800 Subject: [PATCH 13/24] Update harper.yml --- .github/workflows/harper.yml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 41501155a0..d9d197a457 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -24,11 +24,29 @@ jobs: --format json \ > harper-report.json || true - - name: Show Harper Report - run: cat harper-report.json + - name: Extract Spelling Candidates + run: | + python - <<'PY' + import json + + with open("harper-report.json", encoding="utf-8") as f: + reports = json.load(f) + + words = set() + for report in reports: + for lint in report.get("lints", []): + if lint.get("kind") == "Spelling": + word = lint.get("matched_text") + if word: + words.add(word) + + print("Suggested dictionary candidates:") + for word in sorted(words, key=str.lower): + print(word) + PY - name: Run Harper run: | find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ xargs -0 harper-cli lint \ - --user-dict-path ./.harper-dictionary.txt || true + --user-dict-path ./.harper-dictionary.txt || true From e823000e3465e74a38cec2761a2655fae8ab02e6 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:37:00 +0800 Subject: [PATCH 14/24] Update .harper-dictionary.txt --- .harper-dictionary.txt | 524 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 524 insertions(+) diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt index 77eaec0b9a..f4f6fe2f53 100644 --- a/.harper-dictionary.txt +++ b/.harper-dictionary.txt @@ -156,3 +156,527 @@ pwd ood salloc sinfo +Act5C +admixtools +advanpix +ai +AIfSR +AllocCPUS +allowfullscreen +amanda +amdahl +AMPLab +amplgurobilink +AnyConnect +api +aql +argparse +ArgumentParser +argv +Aria2 +aria2 +AutoModel +Autoscaling +B. +B2 +bai +baiUrlTemplate +BAM +bcftools +BDGP5 +bgzip +BigBed +BigTable +bioconda +bioinformatic +Bourne +Burwood +bw +c1 +c5 +c9b4b +CACHEDIR +CANCELLED +cancelled +Cancelling +cancelling +Carahsoft +catalogue +Catalogue +cd +CentOS +centos +Ceph +cftuvSUX +cgsb +chmod +chrom +chromStart +CloudBank +CLS +cmd +Colab +ColdFront +cos6 +cp38 +cpuinfo +cpus +CRAN +cs012 +csv +cuda +cuda12 +cudnn9 +cvzf +Cyberinfrastructure +Cygwin +d8c +d8f +Dataproc +Dataproc's +DBI +debian +Debrunner +devicelogin +df +dmel +dnf +docker +DOI +DOIs +doisearch +dos2unix +dplyr +Drosophila +drwx +drwxr +drwxrwxr +DS3 +DTN +dtn +DTNs +DUA +DUAs +editfacl +edu +el9 +eleuther +emacs +Emeriti +ENV +env +envs +Esc +ExitCode +f +FACL +faidx +FAIpQLSdehngqL1xso +fb +FBgn0000042 +fc +FDT +FFTW +fftw +file1 +file2 +fileToSearch +FileZilla +FlyBase +FORC +FORTRAN +ForwardAgent +FP16 +fs +G. +ga +Gb +gcc +GCP +GCP's +GCS +gDTNs +Geene +gemini +getenv +getfacl +GFF3 +gff3 +GID +gif +GitBash +glibc +GLIBCXX +globus +gpt +GQA +gra533 +gra752 +gtf +GTF +GTF2 +Guanaco +gz +h. +HDFS +hdfs +hisat2 +HISTCONTROL +HISTSIZE +HiveQL +Horovod +hpc +HSRN +htslib +huggingface +huggingface’s +I2 +I2CC +igv +IGV +IIQ +ILSVRC +ImageNet’s +ims +ins +Internet2 +ipa +ipykernel +IRB +iso +isoforms +ItemType +j. +JBrowse +jeff +JobID +JOBID +JobName +json +JSONLines +JsonSerDe +K. +Kaggle +kb +Keras +kubernetes +LABNAME +Laiba +langchain +LESSOPEN +libmambapy +LIBPATHS +linux64 +llamaindex +llm +llvm +LMOD +lmod +lofreq +LogLevel +lp +lr +LR +lua +MacOS +macs2 +macs3 +mafft +Mathworks +MathWorks +mct +md +MD +mdw303 +mdw303test +Mehnaz +melanogaster +mem +meminfo +Miniconda +Miniforge +miniforge3 +Miniforge3 +MJSynth +mkdir +MKL +mmfs +MoabXterm +MobaKeyGen +MobaXterm +MobaXTerm +ModelCatalog +ModelCtalog +mozallowfullscreen +mozilla +MPI +mpi4py +mpiexec +MPS +Multi-Factor +multi-processor +multi-step +multi-user +MultiWorkerMirroredStrategy +MXNet +MYchdSIR4EFcYeOthelfQ +n. +n0dx20hk701 +n2 +n3 +NA +nano +Nano +ncpus +NDR400 +netcdf +NETID +netid +NetID1 +NetID2 +NetID3 +netrc +Nextflow +nfs4 +NFS4 +NFSv4 +NIST +NODELIST +NodeManagers +non-active +non-commercial +Non-Linear +nproc +ntasks +NUM +numberOfLines +nv +nvidia +o +O. +o4 +OK +OMP +OnDemand +OpenAssistant +openmpi +OpenShift +openVPN +OpenWebUI +os +OSC +out +Doing +Packrat +partition1 +pc +penv +perl +PID +pnas +pnetcdf +Portkey +Post-Processing +PostreSQL +powershell +pre-built +pre-compiled +pre-installation +pre-installed +pre-requisite +prem +printenv +project1 +ProQuest +ps +pwm +py3 +Pythia +python3 +PYTHONNOUSERSITE +PYTHONPATH +QualityOfService +Qualtrics +Quickconnect +Qwen +r6 +ra +raz +Rclone +rclone +re-running +redownloading +refSeqs +Renviron +requestor’s +reshape2 +ResNet +resrtictions +rf +rhel +rmdir +rp +Rprofile +Rscript +rsqlite +rsync +Rsync +RTS +rwx +RWX +rwxrwxr +rwxrwxrwx +RX +S3 +Sabastian +samtools +Sawe +sbin +scancel +scheduler’s +scp +segmentations +SELINUX +semi-structured +SerDe +ServerAliveInterval +setfacl +SFTP +sftp +SGLang +sgtatham +sha256 +SHLVL +sif +Simulink +Slurm +slurm +slurmstepd +Slurm’s +Solaris +sp +SQLiteStudio +squeue +sr +src +SRR307023 +SRR307024 +SRR307025 +SRR307026 +SRR307027 +SRR307028 +SRR307029 +SRR307030 +SSO +Stata's +STEAMROOT +Storable +StrictHostKeyChecking +sub-directories +sub-directory +subdir +subdir2 +sudo +susie +susie's +svc +svg +sw77 +Sxxxx +Sys +sys +Syslabs +sysparm +System32 +szip +T16 +t97br4zzvip +TAH +TBD +tc001 +TCL +tf +tgz +THB3P2vrDKcg +tibble +Tigst +tmp +tok +Top500 +Tos +Trino +tsqueryId +tsv +txt +u +U4Vmh2Rw4idTcwqzLhNX1g +UID +un-loads +un-tar +unix +UNIX +unix2dos +up +Keep +url +urlTemplate +UserKnownHostsFile +usernm +usp +usr +uv +ux +v. +v1 +v5 +VASP +VCF +vcf +venv +vertexai +VertexAI +vglrun +virtualenv +vm +w +wc +webkitallowfullscreen +webpage +Webpage +webpages +Wget +wget +whatToFind +WiFi +win10 +Windowns +WinSCP +wo +WordNet +wq +wsl +WSL2 +WSP +x. +X11 +x11 +x32 +x7 +xa0 +xa020242026 +XDG +xfs +XQuartz +xr +xvf +xvzf +XXXXSgS6Tp +xzf +yml +yourNetID +YV6MOhplKNwxXjASHYnDtM +zcat +zfs +zU +Zvvga2Y8kQZN +zypper From 0ab4847d7e87a890e6cfa253634311d8ad96f259 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:58:31 +0800 Subject: [PATCH 15/24] Modify Harper workflow to check selected rules Updated the workflow to check selected Harper rules instead of running the Harper CLI directly. Added Python script to process and report selected lints. --- .github/workflows/harper.yml | 48 +++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index d9d197a457..6499f4382a 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -45,8 +45,48 @@ jobs: print(word) PY - - name: Run Harper + - name: Check Selected Harper Rules run: | - find docs src/pages -type f \( -name "*.md" -o -name "*.mdx" \) -print0 | \ - xargs -0 harper-cli lint \ - --user-dict-path ./.harper-dictionary.txt || true + python - <<'PY' + import json + import sys + from pathlib import Path + + with open("harper-report.json", encoding="utf-8") as f: + reports = json.load(f) + + selected = [] + + for report in reports: + file = report.get("file") + path = Path(file) + lines = path.read_text(encoding="utf-8", errors="ignore").splitlines() if path.exists() else [] + + for lint in report.get("lints", []): + kind = lint.get("kind") + rule = lint.get("rule") + line_no = lint.get("line") + message = lint.get("message") + text = lint.get("matched_text") + + keep = False + + if kind in {"Spelling", "Grammar", "Repetition"}: + keep = True + + if kind == "Capitalization" and rule == "UseTitleCase": + if line_no and 1 <= line_no <= len(lines): + if lines[line_no - 1].lstrip().startswith("#"): + keep = True + + if keep: + selected.append((file, line_no, kind, rule, text, message)) + + if selected: + print("Selected Harper lints found:") + for file, line, kind, rule, text, message in selected: + print(f"{file}:{line}: [{kind}::{rule}] {text!r} - {message}") + sys.exit(1) + + print("No selected Harper lints found.") + PY From 03a415686e524a99f59c5747053e67e58a887b96 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 14:06:44 +0800 Subject: [PATCH 16/24] Update harper.yml --- .github/workflows/harper.yml | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 6499f4382a..4558fb9ad8 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -33,6 +33,7 @@ jobs: reports = json.load(f) words = set() + for report in reports: for lint in report.get("lints", []): if lint.get("kind") == "Spelling": @@ -40,9 +41,12 @@ jobs: if word: words.add(word) - print("Suggested dictionary candidates:") - for word in sorted(words, key=str.lower): - print(word) + with open("dictionary-candidates.txt", "w", encoding="utf-8") as out: + out.write("Suggested dictionary candidates:\n") + for word in sorted(words, key=str.lower): + out.write(word + "\n") + + print(open("dictionary-candidates.txt", encoding="utf-8").read()) PY - name: Check Selected Harper Rules @@ -59,8 +63,8 @@ jobs: for report in reports: file = report.get("file") - path = Path(file) - lines = path.read_text(encoding="utf-8", errors="ignore").splitlines() if path.exists() else [] + path = Path(file) if file else None + lines = path.read_text(encoding="utf-8", errors="ignore").splitlines() if path and path.exists() else [] for lint in report.get("lints", []): kind = lint.get("kind") @@ -80,13 +84,28 @@ jobs: keep = True if keep: - selected.append((file, line_no, kind, rule, text, message)) + selected.append( + f"{file}:{line_no}: [{kind}::{rule}] {text!r} - {message}" + ) + + with open("filtered-harper-report.txt", "w", encoding="utf-8") as out: + for item in selected: + out.write(item + "\n") if selected: print("Selected Harper lints found:") - for file, line, kind, rule, text, message in selected: - print(f"{file}:{line}: [{kind}::{rule}] {text!r} - {message}") + print(open("filtered-harper-report.txt", encoding="utf-8").read()) sys.exit(1) print("No selected Harper lints found.") PY + + - name: Upload Harper Reports + if: always() + uses: actions/upload-artifact@v6 + with: + name: harper-reports + path: | + harper-report.json + filtered-harper-report.txt + dictionary-candidates.txt From b30a67da8acee29b657d3c1f12690e1fe1684e42 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 15:14:07 +0800 Subject: [PATCH 17/24] Update harper.yml --- .github/workflows/harper.yml | 58 ++++++++++++++---------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 4558fb9ad8..1e51808d1f 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -13,8 +13,25 @@ jobs: - name: Checkout uses: actions/checkout@v6 + - name: Cache Cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-harper-${{ hashFiles('.github/workflows/harper.yml') }} + restore-keys: | + ${{ runner.os }}-cargo-harper- + - name: Install Harper CLI - run: cargo install --git https://github.com/Automattic/harper harper-cli --locked + run: | + if ! command -v harper-cli >/dev/null 2>&1; then + cargo install --git https://github.com/Automattic/harper harper-cli --locked + else + echo "Harper CLI found in cache." + fi - name: Generate Harper JSON Report run: | @@ -41,12 +58,9 @@ jobs: if word: words.add(word) - with open("dictionary-candidates.txt", "w", encoding="utf-8") as out: - out.write("Suggested dictionary candidates:\n") - for word in sorted(words, key=str.lower): - out.write(word + "\n") - - print(open("dictionary-candidates.txt", encoding="utf-8").read()) + print("Suggested dictionary candidates:") + for word in sorted(words, key=str.lower): + print(word) PY - name: Check Selected Harper Rules @@ -54,7 +68,6 @@ jobs: python - <<'PY' import json import sys - from pathlib import Path with open("harper-report.json", encoding="utf-8") as f: reports = json.load(f) @@ -63,8 +76,6 @@ jobs: for report in reports: file = report.get("file") - path = Path(file) if file else None - lines = path.read_text(encoding="utf-8", errors="ignore").splitlines() if path and path.exists() else [] for lint in report.get("lints", []): kind = lint.get("kind") @@ -73,39 +84,16 @@ jobs: message = lint.get("message") text = lint.get("matched_text") - keep = False - if kind in {"Spelling", "Grammar", "Repetition"}: - keep = True - - if kind == "Capitalization" and rule == "UseTitleCase": - if line_no and 1 <= line_no <= len(lines): - if lines[line_no - 1].lstrip().startswith("#"): - keep = True - - if keep: selected.append( f"{file}:{line_no}: [{kind}::{rule}] {text!r} - {message}" ) - with open("filtered-harper-report.txt", "w", encoding="utf-8") as out: - for item in selected: - out.write(item + "\n") - if selected: print("Selected Harper lints found:") - print(open("filtered-harper-report.txt", encoding="utf-8").read()) + for item in selected: + print(item) sys.exit(1) print("No selected Harper lints found.") PY - - - name: Upload Harper Reports - if: always() - uses: actions/upload-artifact@v6 - with: - name: harper-reports - path: | - harper-report.json - filtered-harper-report.txt - dictionary-candidates.txt From 25a3a241ae96a31e1911b27befc4fe727539fdfe Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 15:23:54 +0800 Subject: [PATCH 18/24] Update .harper-dictionary.txt --- .harper-dictionary.txt | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt index f4f6fe2f53..fe4788a0b4 100644 --- a/.harper-dictionary.txt +++ b/.harper-dictionary.txt @@ -680,3 +680,61 @@ zfs zU Zvvga2Y8kQZN zypper +anyconnect +autoscaling +bam +behaviour +behaviours +cancelled +CANCELLED +cancelling +Cancelling +catalogue +Catalogue +column1 +column2 +column3 +column4 +column6 +column7 +Customising +facl +forc +gtf +HH +huggingface’s +igv +ImageNet’s +jbrowse +JobID +kevin +kevyin +labelled +lefthand +libPaths +lr +Mathworks +md +miniforge +miniforge3 +MobaXterm +mpi +nano +nextflow +nfs4 +OK +ondemand +out +Doing +pid +portkey +rsync +rwx +scheduler’s +Slurm’s +un +unix +up +Keep +vertexai +webpage From 5de2f1360fe507b2c763bb16f5e07ffd7d577849 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 15:55:56 +0800 Subject: [PATCH 19/24] Update .harper-dictionary.txt --- .harper-dictionary.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt index fe4788a0b4..2f3d966ba6 100644 --- a/.harper-dictionary.txt +++ b/.harper-dictionary.txt @@ -382,8 +382,6 @@ MacOS macs2 macs3 mafft -Mathworks -MathWorks mct md MD @@ -738,3 +736,11 @@ up Keep vertexai webpage +approver +requestor’s +ImageNet’s +huggingface’s +Slurm’s +MobaXTerm +Assefa +JOBID From d429fe719aa7a88f5489d9bbad2b1af8a5aa7e20 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:12:46 +0800 Subject: [PATCH 20/24] Update harper.yml --- .github/workflows/harper.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 1e51808d1f..42913894c3 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -84,10 +84,12 @@ jobs: message = lint.get("message") text = lint.get("matched_text") - if kind in {"Spelling", "Grammar", "Repetition"}: - selected.append( - f"{file}:{line_no}: [{kind}::{rule}] {text!r} - {message}" - ) + if kind == "Spelling" and rule == "SpellCheck": + keep = True + if kind == "Grammar": + keep = True + if kind == "Repetition": + keep = True if selected: print("Selected Harper lints found:") From 258b0b30be2f38692350c083604b7eb20987c87c Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Fri, 3 Jul 2026 22:10:08 +0800 Subject: [PATCH 21/24] Refactor Harper CI workflow and linting logic --- .github/workflows/harper.yml | 39 ++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 42913894c3..3c6644f74b 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -20,10 +20,9 @@ jobs: ~/.cargo/bin ~/.cargo/registry ~/.cargo/git - target - key: ${{ runner.os }}-cargo-harper-${{ hashFiles('.github/workflows/harper.yml') }} + key: ${{ runner.os }}-cargo-harper restore-keys: | - ${{ runner.os }}-cargo-harper- + ${{ runner.os }}-cargo-harper - name: Install Harper CLI run: | @@ -53,10 +52,12 @@ jobs: for report in reports: for lint in report.get("lints", []): - if lint.get("kind") == "Spelling": - word = lint.get("matched_text") - if word: - words.add(word) + kind = lint.get("kind") + rule = lint.get("rule") + word = lint.get("matched_text") + + if kind == "Spelling" and rule == "SpellCheck" and word: + words.add(word) print("Suggested dictionary candidates:") for word in sorted(words, key=str.lower): @@ -73,23 +74,35 @@ jobs: reports = json.load(f) selected = [] + total_lints = 0 + + IGNORED_RULES = { + ("Spelling", "OkToOkay"), + ("Spelling", "DisjointPrefixes"), + } for report in reports: file = report.get("file") for lint in report.get("lints", []): + total_lints += 1 + kind = lint.get("kind") rule = lint.get("rule") line_no = lint.get("line") message = lint.get("message") text = lint.get("matched_text") - if kind == "Spelling" and rule == "SpellCheck": - keep = True - if kind == "Grammar": - keep = True - if kind == "Repetition": - keep = True + if (kind, rule) in IGNORED_RULES: + continue + + if kind in {"Spelling", "Grammar", "Repetition"}: + selected.append( + f"{file}:{line_no}: [{kind}::{rule}] {text!r} - {message}" + ) + + print(f"Total Harper lint count: {total_lints}") + print(f"Selected lint count: {len(selected)}") if selected: print("Selected Harper lints found:") From f9d0e3c06464774065c733f450b386323b760e9c Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:08:23 +0800 Subject: [PATCH 22/24] Enhance Harper rule check with ignore conditions Added a function to ignore certain spelling texts based on specific criteria. --- .github/workflows/harper.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.github/workflows/harper.yml b/.github/workflows/harper.yml index 3c6644f74b..8e176743f4 100644 --- a/.github/workflows/harper.yml +++ b/.github/workflows/harper.yml @@ -68,6 +68,7 @@ jobs: run: | python - <<'PY' import json + import re import sys with open("harper-report.json", encoding="utf-8") as f: @@ -81,6 +82,34 @@ jobs: ("Spelling", "DisjointPrefixes"), } + def should_ignore_spelling_text(text): + if not text: + return False + + stripped = text.strip() + + # URLs and URL fragments + if stripped.startswith(("http://", "https://", "www.")): + return True + + # File paths / command paths + if "/" in stripped: + return True + + # Long hashes, IDs, tokens + if len(stripped) >= 16 and any(c.isdigit() for c in stripped): + return True + + # Hex-like strings, e.g. d5442a5dc4baadd48b32 + if len(stripped) >= 8 and re.fullmatch(r"[a-fA-F0-9]+", stripped): + return True + + # Mostly random-looking alphanumeric tokens + if len(stripped) >= 12 and re.fullmatch(r"[A-Za-z0-9_-]+", stripped): + return True + + return False + for report in reports: file = report.get("file") @@ -96,6 +125,9 @@ jobs: if (kind, rule) in IGNORED_RULES: continue + if kind == "Spelling" and should_ignore_spelling_text(text): + continue + if kind in {"Spelling", "Grammar", "Repetition"}: selected.append( f"{file}:{line_no}: [{kind}::{rule}] {text!r} - {message}" From b967a45069560a0d99ce28c2cd0a51476ada25a4 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:13:23 +0800 Subject: [PATCH 23/24] Update .harper-dictionary.txt --- .harper-dictionary.txt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt index 2f3d966ba6..e620e68e79 100644 --- a/.harper-dictionary.txt +++ b/.harper-dictionary.txt @@ -687,8 +687,6 @@ cancelled CANCELLED cancelling Cancelling -catalogue -Catalogue column1 column2 column3 @@ -744,3 +742,19 @@ Slurm’s MobaXTerm Assefa JOBID +ImageNet +Acknowledgements +afterwards +Customizing +nnodes +CANCELLED +Cancelling +cancelling +cancelled +behaviour +Backfilling +favourite +MobaXterm +flavours +labelled +behaviours From 2774f7a17568399e2c1cd490276ff666e58414e0 Mon Sep 17 00:00:00 2001 From: Amanda-dong <159391549+Amanda-dong@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:21:38 +0800 Subject: [PATCH 24/24] Add 'analyses' to the dictionary --- .harper-dictionary.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt index e620e68e79..152e4462d3 100644 --- a/.harper-dictionary.txt +++ b/.harper-dictionary.txt @@ -28,6 +28,7 @@ gDTN conda QuickLinks QuickLink +analyses req cvf rclone