WP Plugin Starter 1.0.0: a fresh start

The parts every wpallstars plugin needs: settings screen with search and an empty General tab, Read Me tab, features as classes, replaced plugins, the shared GitHub updater, release and check scripts, CI and the shared rules. scripts/rename-plugin.sh starts a new plugin; scripts/sync-core.sh keeps plugins' core files in step with this starter. Built with aidevops (https://aidevops.sh).
This commit is contained in:
marcus committed 2026-10-03 03:30:42 +01:00
commit 2f91c3e6af
62 files changed
+10929

No files matched your search

+134
View File
@@ -0,0 +1,134 @@
#!/usr/bin/env bash
# Code checks for the plugin, the same ones CI runs on every pull request
# (.github/workflows/ci.yml). Changes nothing.
#
# Usage: scripts/lint.sh [CHECK]...
# php PHP syntax of every PHP file, with the local php.
# js JavaScript syntax of every JS file (node --check).
# shell ShellCheck on every shell script.
# workflows actionlint on .github/workflows (skipped if not installed).
# phpcs WordPress Coding Standards, security sniffs and PHP 7.4
# compatibility (phpcs.xml.dist).
# phpstan Static analysis (phpstan.neon.dist): no new findings beyond
# phpstan-baseline.neon.
# With no CHECK, runs them all. phpcs and phpstan need `composer install`.
#
# Exit status: 0 when every check passes, 1 when any fails, 2 on bad usage.
set -euo pipefail
readonly ALL_CHECKS="php js shell workflows phpcs phpstan"
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
readonly ROOT
FAILED=""
usage() {
sed -n '2,17p' "$0" | sed 's/^# \{0,1\}//'
return 0
}
say() {
local message="$1"
printf '\n== %s\n' "$message"
return 0
}
need_vendor() {
local tool="$1"
if [ ! -x "$ROOT/vendor/bin/$tool" ]; then
printf 'lint: vendor/bin/%s is missing; run: composer install\n' "$tool" >&2
return 1
fi
return 0
}
check_php() {
local file output status=0
while IFS= read -r -d '' file; do
if ! output="$(php -l "$file" 2>&1)"; then
printf '%s\n' "$output"
status=1
fi
done < <(git -C "$ROOT" ls-files -z '*.php')
return "$status"
}
check_js() {
local file status=0
while IFS= read -r -d '' file; do
node --check "$file" || status=1
done < <(git -C "$ROOT" ls-files -z '*.js')
return "$status"
}
check_shell() {
local files=()
local file
while IFS= read -r -d '' file; do
files+=("$file")
done < <(git -C "$ROOT" ls-files -z '*.sh')
[ "${#files[@]}" -eq 0 ] && return 0
# -x follows the scripts' `# shellcheck source=` lines (scripts/lib/).
shellcheck -x --severity=style "${files[@]}"
return $?
}
check_workflows() {
if [ ! -d "$ROOT/.github/workflows" ]; then
return 0
fi
if ! command -v actionlint >/dev/null 2>&1; then
printf 'actionlint is not installed; skipped (CI runs it)\n'
return 0
fi
actionlint
return $?
}
check_phpcs() {
need_vendor phpcs || return 1
vendor/bin/phpcs -q --report=full
return $?
}
check_phpstan() {
need_vendor phpstan || return 1
vendor/bin/phpstan analyse --memory-limit=4G --no-progress
return $?
}
main() {
local checks="$*"
local check
if [ -z "$checks" ]; then
checks="$ALL_CHECKS"
fi
for check in $checks; do
case " $ALL_CHECKS " in
*" $check "*) ;;
*)
usage >&2
return 2
;;
esac
done
cd "$ROOT"
for check in $checks; do
say "$check"
if "check_$check"; then
printf 'ok\n'
else
FAILED="$FAILED $check"
fi
done
if [ -n "$FAILED" ]; then
printf '\nlint: failed:%s\n' "$FAILED" >&2
return 1
fi
printf '\nlint: all passed (%s)\n' "$checks"
return 0
}
main "$@"