skillox lint

Author-time scan of one or more local SKILL.md files. CI-friendly exit codes, multi-file support, configurable failure threshold. Same engine as skillox audit and the hosted scanner at skillox.io.

Usage

# Lint ./SKILL.md (default)
skillox lint

# Lint a specific file
skillox lint ./my-skill/SKILL.md

# Lint multiple files (shell-expanded glob)
skillox lint ./**/SKILL.md

# In CI — exit non-zero on any high/crit finding
skillox lint --ci

# Tune the threshold (default: high)
skillox lint --ci --fail-at med

# Machine-readable output for pipelines
skillox lint --ci --format json

lint vs audit — which one to use

Both wrap the same engine. The difference is positioning:

Exit codes

Flags

--ci                      exit non-zero on any finding at/above --fail-at
--fail-at <level>         severity threshold: low | med | high | crit  (default: high)
--format <kind>           output format: human | json                  (default: human)
--no-color                strip ANSI color codes

CI example — GitHub Actions

# .github/workflows/skillox-lint.yml
name: Lint SKILL.md files
on:
  pull_request:
    paths:
      - '**/SKILL.md'

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 22 }
      - run: npm install -g skillox
      - run: skillox lint "./**/SKILL.md" --ci --fail-at high

CI example — Forgejo Actions

# .forgejo/workflows/skillox-lint.yml
name: Lint SKILL.md files
on: [pull_request]

jobs:
  lint:
    runs-on: docker
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g skillox
      - run: skillox lint "./**/SKILL.md" --ci --fail-at high

More providers + a pre-commit hook — GitLab CI, CircleCI, and a local .git/hooks/pre-commit shell script ship in the CLI's examples/ci/ folder (installed with the npm package, also browsable at git.skillox.io · examples/ci).

JSON output

For pipelines that need to parse results or report findings into another system (Sentry, Datadog, internal dashboards), use --format json. Shape:

{
  "files": [
    {
      "path": "./SKILL.md",
      "ok": true,
      "grade": "C",
      "score": 55,
      "findingsCount": 4,
      "findings": [
        {
          "ruleId": "filesystem-overreach",
          "severity": "high",
          "title": "...",
          "line": 12,
          "excerpt": "...",
          "cwe": "CWE-552"
        }
      ],
      "thresholdBreached": true
    }
  ],
  "ci": true,
  "failLevel": "high",
  "exitCode": 1
}

The hosted scan is canonical

skillox lint runs the same engine as the hosted scanner at skillox.io — same rules, same weights, same grade calculation. When you publish via the creator portal, the server-side scan is the canonical one (so a malicious creator can't fake an A locally), but for every honest author the local result matches what the portal will see. Lint clean → publish clean.