Github Actions Linter
/install github-actions-linter
GitHub Actions Linter
Lint GitHub Actions workflow files for syntax errors, security issues, deprecated actions, and best practices violations.
Commands
All commands use the bundled Python script at scripts/gha_linter.py.
1. Lint a workflow file
python3 scripts/gha_linter.py lint \x3Cfile-or-directory> [--strict] [--format text|json|markdown]
Runs all lint rules against one or more workflow files. If given a directory, scans for *.yml and *.yaml files recursively.
Flags:
--strict— exit code 1 on any warning (not just errors)--format— output format:text(default),json,markdown
2. Audit for security issues
python3 scripts/gha_linter.py security \x3Cfile> [--format text|json|markdown]
Focused security audit: shell injection via ${{ }} in run:, hardcoded secrets, overly permissive permissions, untrusted event contexts in expressions.
3. Check for deprecated actions
python3 scripts/gha_linter.py deprecated \x3Cfile> [--format text|json|markdown]
Detect outdated action versions (e.g., actions/checkout@v2, actions/setup-node@v3 when v4 exists) and suggest upgrades.
4. Validate workflow structure
python3 scripts/gha_linter.py validate \x3Cfile> [--format text|json|markdown]
Structural validation only: required keys (on, jobs), valid trigger events, valid runs-on labels, job dependency graph (circular deps, missing refs).
Lint Rules (28 total)
Syntax & Structure (8 rules)
- missing-on — Workflow missing
ontrigger - missing-jobs — Workflow missing
jobssection - empty-jobs — Jobs section is empty
- missing-runs-on — Job missing
runs-on - missing-steps — Job missing
steps - empty-steps — Steps list is empty
- invalid-trigger — Unknown trigger event name
- circular-deps — Circular job dependency via
needs
Security (8 rules)
- shell-injection —
${{ }}expression inrun:(potential injection) - hardcoded-secret — Hardcoded password/token/key patterns in workflow
- permissive-permissions —
permissions: write-allor no permissions block - untrusted-context — Dangerous contexts in expressions (
github.event.issue.title,github.event.pull_request.body, etc.) - pull-request-target —
pull_request_targetwith checkout of PR head (known attack vector) - third-party-action — Non-verified third party action without pinned SHA
- env-in-run — Secret used directly in
run:instead of viaenv: - excessive-permissions — Job requests more permissions than needed
Deprecated & Outdated (4 rules)
- deprecated-action — Action version is outdated (v1/v2 when v4 exists)
- deprecated-runner — Using deprecated runner labels (ubuntu-18.04, macos-10.15)
- set-output-deprecated — Using deprecated
::set-output::command - save-state-deprecated — Using deprecated
::save-state::command
Best Practices (8 rules)
- missing-timeout — Job without
timeout-minutes(default 6h is dangerous) - missing-name — Step without
name(harder to debug) - latest-tag — Action pinned to
@mainor@master(unstable) - no-concurrency — Workflow without
concurrency(can waste resources) - hardcoded-runner — Hardcoded runner version instead of
-latest - long-run-command —
run:block exceeds 50 lines (should be a script) - duplicate-step-id — Duplicate
idin steps within same job - missing-if-continue —
continue-on-error: truewithout explanation comment
Output Formats
Text (default)
workflow.yml:12:3 error [shell-injection] Expression ${{ github.event.issue.title }} in run: is vulnerable to injection
workflow.yml:25:5 warning [missing-timeout] Job 'build' has no timeout-minutes (default: 360 min)
workflow.yml:31:7 warning [missing-name] Step at index 2 has no name
3 issues (1 error, 2 warnings)
JSON
{
"file": "workflow.yml",
"issues": [...],
"summary": {"errors": 1, "warnings": 2, "info": 0}
}
Markdown
Summary table with severity, rule, location, and message.
CI Integration
# .github/workflows/lint-actions.yml
name: Lint Workflows
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: python3 scripts/gha_linter.py lint .github/workflows/ --strict
Exit codes: 0 = clean, 1 = errors found (or warnings in --strict mode).
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install github-actions-linter - 安装完成后,直接呼叫该 Skill 的名称或使用
/github-actions-linter触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Github Actions Linter 是什么?
Lint and validate GitHub Actions workflow YAML files for common mistakes, security issues, deprecated actions, and best practices. Use when asked to lint, va... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 86 次。
如何安装 Github Actions Linter?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install github-actions-linter」即可一键安装,无需额外配置。
Github Actions Linter 是免费的吗?
是的,Github Actions Linter 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
Github Actions Linter 支持哪些平台?
Github Actions Linter 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Github Actions Linter?
由 charlie-morrison(@charlie-morrison)开发并维护,当前版本 v1.0.0。