# Lint Lua/TypeScript source and validate markdown links. check: check-luacheck check-lychee npm-check luacheck --quiet . @just lint-markdown # Validate package descriptors and require version bumps for changed package files. check-packages: check-jq #!/usr/bin/env bash set -euo pipefail repo='{{justfile_directory()}}' cd "$repo" semver_gt() { local a_major a_minor a_patch b_major b_minor b_patch IFS=. read -r a_major a_minor a_patch <<<"$1" IFS=. read -r b_major b_minor b_patch <<<"$2" if [ "${a_major:-0}" -gt "${b_major:-0}" ]; then return 0; fi if [ "${a_major:-0}" -lt "${b_major:-0}" ]; then return 1; fi if [ "${a_minor:-0}" -gt "${b_minor:-0}" ]; then return 0; fi if [ "${a_minor:-0}" -lt "${b_minor:-0}" ]; then return 1; fi [ "${a_patch:-0}" -gt "${b_patch:-0}" ] } fail=0 packages=() while IFS= read -r name; do packages+=("$name"); done < <(jq -r '.packages | keys[]' packages/index.json | sort) for name in "${packages[@]}"; do desc="packages/$name/ccpm.json" if [ ! -f "$desc" ]; then printf '%s\n' "FAIL: packages/index.json lists missing descriptor $desc" >&2 fail=1 continue fi desc_name="$(jq -r '.name // empty' "$desc")" desc_version="$(jq -r '.version // empty' "$desc")" index_version="$(jq -r --arg name "$name" '.packages[$name] // empty' packages/index.json)" if [ "$desc_name" != "$name" ]; then printf '%s\n' "FAIL: $desc has name '$desc_name', expected '$name'" >&2 fail=1 fi if [ "$desc_version" != "$index_version" ]; then printf '%s\n' "FAIL: $name version differs between descriptor ($desc_version) and packages/index.json ($index_version)" >&2 fail=1 fi last_desc_commit="$(git log -n 1 --format=%H -- "$desc" || true)" if [ -z "$last_desc_commit" ]; then continue fi old_version="$(git show "$last_desc_commit:$desc" | jq -r '.version // empty')" files=() while IFS= read -r file; do files+=("$file"); done < <(jq -r '.files[]?' "$desc") if [ "${#files[@]}" -gt 0 ] && ! git diff --quiet "$last_desc_commit" -- "${files[@]}"; then if ! semver_gt "$desc_version" "$old_version"; then printf '%s\n' "FAIL: $name package files changed since $desc was last bumped ($old_version); bump $desc and packages/index.json" >&2 git diff --name-only "$last_desc_commit" -- "${files[@]}" >&2 fail=1 fi fi done for desc in packages/*/ccpm.json; do [ -e "$desc" ] || continue name="$(jq -r '.name // empty' "$desc")" if ! jq -e --arg name "$name" '.packages[$name] != null' packages/index.json >/dev/null; then printf '%s\n' "FAIL: descriptor $desc is missing from packages/index.json" >&2 fail=1 fi done trapos_desc='packages/trapos/ccpm.json' trapos_commit="$(git log -n 1 --format=%H -- "$trapos_desc" || true)" if [ -n "$trapos_commit" ]; then trapos_version="$(jq -r '.version // empty' "$trapos_desc")" old_trapos_version="$(git show "$trapos_commit:$trapos_desc" | jq -r '.version // empty')" deps=() while IFS= read -r dep; do deps+=("packages/$dep/ccpm.json"); done < <(jq -r '.dependencies[]?' "$trapos_desc") if [ "${#deps[@]}" -gt 0 ] && ! git diff --quiet "$trapos_commit" -- "${deps[@]}"; then if ! semver_gt "$trapos_version" "$old_trapos_version"; then printf '%s\n' "FAIL: trapos dependencies changed since trapos was last bumped ($old_trapos_version); bump $trapos_desc and packages/index.json" >&2 git diff --name-only "$trapos_commit" -- "${deps[@]}" >&2 fail=1 fi fi fi if [ "$fail" -ne 0 ]; then exit 1; fi printf '%s\n' 'OK: package versions aligned' # Validate local markdown links and heading anchors with lychee. lint-markdown: check-lychee lychee --config lychee.toml .