Add YAML/Ansible linting, CI, and Claude tooling#182
Merged
Conversation
Introduce yamllint and ansible-lint configs (in ansible/ so ansible.cfg supplies module/role context) and fix the tree to pass ansible-lint's production profile and yamllint cleanly (from ~3,294 findings to 0). Config: - ansible/.yamllint owns YAML validity/style; relaxed to the repo's deliberate long-URL / inline-dict house style, but flags real breakage (trailing space, duplicate keys, unquoted octal, missing EOF newline). - ansible/.ansible-lint targets the production profile with a fully documented skip_list for deliberately-deferred rules (var-naming, multi-template task names, and build-from-source patterns: no-changed-when, command-instead-of-*, latest[git], no-handler). Mechanical, behaviour-preserving fixes (verified as a semantic no-op): - FQCN for all module actions (~1,414) - yes/no -> true/false, jinja spacing, task-name casing - octal file modes -> symbolic; block-style version dicts Correctness fixes surfaced by the linters: - vars written as a list instead of a mapping in 6 container tasks (vep, PopGen_suite, python-ml, python-ml-base, RStudio, ubuntu) — the variables were never being set; also cleared 57 jinja[invalid] errors - 11 world-writable directory bugs (mode: o=rwx,g=rx,o=rx typo for u=rwx) - empty None tag; unquoted min_ansible_version floats File permissions: added explicit symbolic modes to ~400 tasks following existing conventions (dirs u=rwx,g=rwx,o=rx; source/data u=rw,g=r,o=r; mode: preserve when copying prebuilt binaries so exec bits survive). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Tooling to keep the tree clean and make adding software easy for agents and contributors: - .github/workflows/lint.yml: runs the same yamllint + ansible-lint commands on push/PR. - .claude/settings.json + .claude/hooks/lint-yaml.sh: PostToolUse hook that runs yamllint on every edited ansible/**/*.y*ml for instant feedback (full ansible-lint is left to /lint and CI). - .claude/skills/add-software: scaffolds a compiled or containerised package end-to-end (double-tag rule, path vars, checksums, symbolic modes, block-style dicts, task skeletons). - .claude/skills/lint: runs and explains the linters. - CLAUDE.md: new Linting & CI section documenting the workflow and the conventions the linters enforce. - .gitignore: ignore the ansible-lint runtime cache (ansible/.ansible/). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces repo-wide YAML/Ansible linting (yamllint + ansible-lint), documents how to run it locally, and wires the same checks into GitHub Actions CI. It also adds Claude Code support files (skills + hook) to help keep the Ansible tree lint-clean over time.
Changes:
- Add lint configurations (
ansible/.yamllint,ansible/.ansible-lint) and update documentation (CLAUDE.md) describing the linting workflow. - Apply large-scale mechanical Ansible YAML cleanups (FQCN usage, boolean normalization, mode normalization, task-name reshaping, document headers).
- Add automation: CI workflow (
.github/workflows/lint.yml) and Claude hook/skill files to run linting consistently.
Reviewed changes
Copilot reviewed 207 out of 208 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| CLAUDE.md | Documents linting/CI workflow and conventions enforced by linters. |
| ansible/roles/containers/tasks/main.yml | Normalizes include_tasks usage (FQCN) and indentation cleanup. |
| ansible/roles/containers/tasks/bio/trycycler.yaml | Adds document start, FQCN, and mode normalization. |
| ansible/roles/containers/tasks/bio/TRIBES.yaml | Adds document start, FQCN, and mode normalization. |
| ansible/roles/containers/tasks/bio/proteowizard.yaml | Adds document start, FQCN, and mode normalization. |
| ansible/roles/containers/tasks/bio/pggb.yaml | Adds document start, FQCN, formatting, and mode normalization. |
| ansible/roles/containers/tasks/bio/gatk.yaml | Adds document start, FQCN, and mode normalization. |
| ansible/roles/containers/tasks/bio/ClinSV.yaml | Adds document start, FQCN, and mode normalization. |
| ansible/roles/containers/tasks/bio/bcbio.yaml | Adds document start, FQCN, and improves task naming/messages. |
| ansible/roles/containers/tasks/astro/main.yml | Rewrites version vars into block style; uses FQCN include_tasks. |
| ansible/roles/containers/meta/main.yml | Adds document start and quotes min_ansible_version. |
| ansible/roles/compiled/tasks/main.yml | Normalizes include_tasks usage (FQCN) and indentation cleanup. |
| ansible/roles/compiled/tasks/ilifu/user_tools.yaml | Adds FQCN, boolean normalization, and mode normalization. |
| ansible/roles/compiled/tasks/ilifu/main.yml | Normalizes include_tasks (FQCN) and list formatting. |
| ansible/roles/compiled/tasks/ilifu/disk_management.yaml | Adds FQCN, boolean normalization, and formatting cleanup. |
| ansible/roles/compiled/tasks/common/zstd.yaml | Adds document start, FQCN, module naming, and file modes. |
| ansible/roles/compiled/tasks/common/uv.yaml | Adds FQCN and standardizes download/unpack steps and module install. |
| ansible/roles/compiled/tasks/common/ucx.yaml | Adds document start, FQCN, and modes for build steps. |
| ansible/roles/compiled/tasks/common/squashfuse.yaml | Adds document start, FQCN, and module task naming/modes. |
| ansible/roles/compiled/tasks/common/rustup.yaml | Updates to FQCN/boolean normalization and adds module template mode. |
| ansible/roles/compiled/tasks/common/rust.yaml | Updates to FQCN/boolean normalization and adds module template mode. |
| ansible/roles/compiled/tasks/common/ruby.yaml | Adds document start, FQCN, modes, and task-name cleanup. |
| ansible/roles/compiled/tasks/common/rclone.yaml | Adds FQCN, directory modes, and module template mode. |
| ansible/roles/compiled/tasks/common/perlbrew.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/common/perl.yaml | Adds FQCN, task-name cleanup, and module template mode. |
| ansible/roles/compiled/tasks/common/pandoc.yaml | Adds document start, FQCN, fixes directory mode typo, and module mode. |
| ansible/roles/compiled/tasks/common/openjdk.yaml | Adds FQCN, directory modes, and module template mode. |
| ansible/roles/compiled/tasks/common/openblas.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/common/ollama.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/nodejs.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/nextflow.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/common/neovim.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/mono.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/micromamba.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/common/mamba.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/common/latex.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/common/julia.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/common/jre.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/jemalloc.yaml | Adds document start, FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/harfbuzz.yaml | Adds document start, FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/golang.yaml | Adds document start, FQCN, fixes directory mode typo, and module mode. |
| ansible/roles/compiled/tasks/common/gocryptfs.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/common/githubcli.yaml | Adds document start, FQCN, fixes directory mode typo, and module mode. |
| ansible/roles/compiled/tasks/common/git-lfs.yaml | Adds document start, FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/gettext.yaml | Adds document start, FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/fzf.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/common/fribidi.yaml | Adds document start, FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/fftw.yaml | Adds document start, FQCN include_tasks, and module template mode. |
| ansible/roles/compiled/tasks/common/dotnet.yaml | Adds document start, FQCN, fixes directory mode typo, and module mode. |
| ansible/roles/compiled/tasks/common/cuda.yaml | Adds FQCN and reformats long command invocation; module install updated. |
| ansible/roles/compiled/tasks/common/cmake.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/common/boost.yaml | Adds document start, FQCN, and task-name cleanup. |
| ansible/roles/compiled/tasks/common/apache_spark.yaml | Adds document start, FQCN, and download mode. |
| ansible/roles/compiled/tasks/common/apache_maven.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/common/apache_hadoop.yaml | Adds document start, FQCN, and download mode. |
| ansible/roles/compiled/tasks/common/anaconda.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/yacrd.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/whatshap.yaml | Adds FQCN, formatting cleanup, and module template mode. |
| ansible/roles/compiled/tasks/bio/vip.yaml | Adds FQCN, directory modes, and module template mode. |
| ansible/roles/compiled/tasks/bio/vg.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/vcftools.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/vcfbub.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/varfish.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/trimmomatic.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/trimgalore.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/subread.yaml | Adds FQCN, formatting cleanup, and module template mode. |
| ansible/roles/compiled/tasks/bio/star.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/stacks.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/sra_toolkit.yaml | Adds document start, FQCN, fixes directory mode typo, and module mode. |
| ansible/roles/compiled/tasks/bio/spliceai.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/snpeff.yaml | Adds FQCN and download mode. |
| ansible/roles/compiled/tasks/bio/shapeit5.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/seqkit.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/savvysuite.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/samtools.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/salmon.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/rsem.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/rfmix.yaml | Adds FQCN, directory modes, and module template mode. |
| ansible/roles/compiled/tasks/bio/reviewer.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/pysam.yaml | Adds FQCN, formatting cleanup, and module template mode. |
| ansible/roles/compiled/tasks/bio/PRSice-2.yaml | Adds document start, FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/porechop.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/popdel.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/polypolish.yaml | Adds document start, FQCN, formatting cleanup, and module template mode. |
| ansible/roles/compiled/tasks/bio/plink-ng.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/picard.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/panpatch.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/nanostat.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/nanoplot.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/nanofilt.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/nanocomp.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/muscle.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/multiqc.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/mtoolbox.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/miniwdl.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/minimap2.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/meryl.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/merqury.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/medaka.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/mdanalysis.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/mash.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/manta.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/lirical.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/libmaus2.yaml | Adds FQCN, directory mode, and naming cleanup. |
| ansible/roles/compiled/tasks/bio/kraken2.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/iqtree.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/htslib.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/hisat2.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/hifiasm.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/hapgen2.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/glimpse.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/gfaffix.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/GenomeStrip.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/genome_browser.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/gemini.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/gatk.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/fragpipe.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/filtlong.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/fastqc.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/expansionhunter.yaml | Adds FQCN, download mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/exomiser_data.yaml | Adds FQCN and download mode; adjusts debug task. |
| ansible/roles/compiled/tasks/bio/dorado.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/cutadapt.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/cnvpytor.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/chopper.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/cdhit.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/tasks/bio/canvas.yaml | Adds FQCN, formatting cleanup, and module template mode. |
| ansible/roles/compiled/tasks/bio/bwa.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/bracken.yaml | Adds document start, FQCN, and module template mode. |
| ansible/roles/compiled/tasks/bio/bowtie2.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/blast.yaml | Adds FQCN/boolean normalization and module template mode. |
| ansible/roles/compiled/tasks/bio/bismark.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/bedtools.yaml | Adds FQCN and uses mode: preserve for copied binaries. |
| ansible/roles/compiled/tasks/bio/beast2.yaml | Adds FQCN and module template mode. |
| ansible/roles/compiled/tasks/bio/bcftools.yaml | Adds FQCN, directory mode, and module template mode. |
| ansible/roles/compiled/meta/main.yml | Adds document start and quotes min_ansible_version. |
| ansible/roles/all/tasks/main.yml | Normalizes become boolean, adds tags, and uses FQCN for file tasks. |
| ansible/roles/all/meta/main.yml | Adds document start and quotes min_ansible_version. |
| ansible/all.yaml | Adds play name and clarifies play purpose. |
| ansible/.yamllint | Introduces yamllint config tuned for repo needs (validity-focused). |
| ansible/.ansible-lint | Introduces ansible-lint production profile config and skip_list rationale. |
| .gitignore | Ignores ansible runtime cache directory. |
| .github/workflows/lint.yml | Adds CI job to run yamllint + ansible-lint via uv. |
| .claude/skills/lint/SKILL.md | Adds /lint skill documenting lint commands and fix guidance. |
| .claude/settings.json | Adds Claude PostToolUse hook configuration. |
| .claude/hooks/lint-yaml.sh | Adds hook script to run yamllint on edited Ansible YAML files. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Address Copilot review feedback: - Restore natural task names that the mechanical name[template] reword had mangled (stray `" "` / `' '` quote fragments and orphaned path fragments) in exomiser, kallisto, panpatch, subread, trimmomatic, vg, git-lfs, homebrew (treePL/vcflib), and uv. name[template] is skipped in the config, so these gain nothing from reordering. - canvas.yaml: mode u=wrx -> u=rwx (consistent bit ordering). - uv.yaml: module-file mode u=rw,g=rw,o=r -> u=rw,g=r,o=r (match the module-template convention; no group write). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
actions/checkout@v4 -> v5 and astral-sh/setup-uv@v5 -> v8, both of which run on Node 24, silencing the Node 20 deprecation warning. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Collaborator
Author
|
@MikeCTZA you don't have to pretend to look at this. Similar to other PR. But afaik I'm the only one that even uses this repo 😂 |
Comment on lines
13
to
15
| - name: "Uncompress {{ the_data.name }}" | ||
| debug: | ||
| ansible.builtin.debug: | ||
| msg: "Remember to decompressing {{ the_data.name }}" |
Collaborator
There was a problem hiding this comment.
to appproving if this is to changing
MikeCTZA
approved these changes
Jul 3, 2026
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…plates) Populate GitHub's community standards, all previously missing: - LICENSE: MIT, Copyright (c) 2020-2026 ilifu. - CONTRIBUTING.md: setup (uv, Python 3.13+), the add-software workflow, the conventions the linters enforce (double-tag, checksums, symbolic modes, FQCN), how to lint, and the PR process. - CODE_OF_CONDUCT.md: Contributor Covenant 2.1 (enforcement contact left as a marked placeholder to fill in later). - SECURITY.md: private reporting via GitHub advisories; scoped to this repo's real surface (committed secrets, checksum integrity, file permissions). - .github/PULL_REQUEST_TEMPLATE.md: checklist grounded in the repo conventions. - .github/ISSUE_TEMPLATE/: software-request and bug-report issue forms + config. - .github/CODEOWNERS: default reviewer. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Agentic Advice: documents the Claude Code tooling (/add-software and /lint skills, the lint-on-edit hook, CLAUDE.md, shared vs. local settings). - Contributing: points to CONTRIBUTING.md, the CoC, and the issue forms. - License: MIT. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds YAML + Ansible linting to the repo, brings the whole tree to a clean pass, wires up CI, and adds Claude Code tooling to keep it that way and make adding software easy.
Two commits for reviewability:
Linting
ansible/.yamllintowns YAML validity/style;ansible/.ansible-linttargets theproductionprofile with a fully documentedskip_listfor deliberately-deferred rules (var-naming, multi-template task names, and build-from-source patterns:no-changed-when,command-instead-of-*,latest[git],no-handler).cd ansible && uv run yamllint . && uv run ansible-lint.Real bugs the linters caught (and this PR fixes)
vars:written as a list instead of a mapping in 6 container tasks (vep,PopGen_suite,python-ml,python-ml-base,RStudio,ubuntu) — those variables were never being set. Also cleared 57 downstreamjinja[invalid]errors.mode: o=rwx,g=rx,o=rx, a typo foru=rwx).Nonetag and unquotedmin_ansible_versionfloats.Mechanical fixes (behaviour-preserving)
yes/no→true/false, jinja spacing, task-name casing, block-style version dicts.u=rwx,g=rwx,o=rx, source/datau=rw,g=r,o=r,mode: preservewhen copying prebuilt binaries so exec bits survive). No unquoted octal.Tooling
.github/workflows/lint.yml) runs the same two linters on push/PR..claude/hooks/lint-yaml.sh) runs yamllint on every editedansible/**/*.y*ml./add-softwareskill scaffolds a compiled or containerised package end-to-end;/lintskill runs/explains the checks.CLAUDE.mdgains a Linting & CI section. Personal.claude/settings.local.jsonstays gitignored.Follow-ups (not in this PR)
latest[git]clones to specific refs (needs per-repo tags).🤖 Generated with Claude Code