Skip to content

Reusable Workflow Reference: Skill and Locale Checks

In a nutshell

This page documents the shared workflows that check OVOS skill packaging: skill-check.yml, locale-check.yml, and spec-lint.yml. For build and OVOS-plugin (OPM) checks, see Build Checks and Plugin, License, and Repo Checks. For end-to-end skill test execution, see Skill Test Workflows. Start with the gh-automations overview for the big picture, or the full Workflow Reference index.

All reusable workflows are in .github/workflows/ and are called via:

uses: OpenVoiceOS/gh-automations/.github/workflows/<name>.yml@dev

Ref: Always use @dev.

Workflows on this page:


skill-check.yml

Analyses an OVOS skill repository for locale structure, language coverage, and skill.json validity. Silently passes for non-skill repos by default.

Source: .github/workflows/skill-check.yml

Inputs

Input Type Default Description
runner string ubuntu-latest Runner label
python_version string 3.14 Python version
locale_dir string "" Locale root path. Empty = auto-detect.
skip_if_not_skill boolean true Silently pass if no ovos.plugin.skill entry point found
fail_on_missing_en_us boolean true Fail if en-US locale directory is absent
fail_on_invalid_skill_json boolean false Fail if en-US skill.json is missing or invalid
pr_comment boolean true Post a '๐ŸŽ™๏ธ Skill' section in the shared 'OVOS PR Checks' comment on the PR. Only runs when the workflow is triggered by a pull_request event.
spec_lint boolean true Also run ovos-spec-lint (spec-lint.yml) against the skill's locale folder. Every ovos-skill-* repo already calls this workflow, so this is how spec-lint reaches the fleet without a per-repo caller PR. Set to false to opt a repo out.
spec_lint_locale_path string locale Path passed to spec-lint.yml's locale_path input.

Permissions

pull-requests: write, contents: read

Steps

Follows the canonical 3-phase pattern (continue-on-error โ†’ format โ†’ post โ†’ re-raise):

Step Description
Checkout + scripts checkout Checks out the calling repo and (on PR events) the gh-automations scripts
Setup Python actions/setup-python@v6
Run skill check check_skill.py --repo-root . --locale-dir โ€ฆ --output-json /tmp/skill-report.json. continue-on-error: true.
Format skill section Inline Python reads skill-report.json โ†’ skill-section.md
Post skill section to PR comment Calls update_pr_comment.py with --section-id skill
Skip if not an OVOS skill repo Exits 0 if is_skill: false and skip_if_not_skill: true
Fail if en-US locale is missing Exits 1 if has_en_us: false and fail_on_missing_en_us: true
Fail if skill.json is invalid Exits 1 if JSON malformed or required fields missing and fail_on_invalid_skill_json: true
Fail job if skill check failed Re-raises error after comment is posted

Since the spec_lint input landed (default true), the workflow also runs a second job. It calls spec-lint.yml as a nested reusable workflow against the skill's locale folder (spec_lint_locale_path, default locale).

Calling skill-check.yml therefore also runs spec-lint, with its own check, its own PR-comment section, and its own failure gate. Opt a repo out with spec_lint: false.

This is deliberate. Every ovos-skill-* repo already calls skill-check.yml, so the nested call is how spec-lint reaches the whole fleet without a per-repo caller PR.

PR comment content

๐ŸŽ™๏ธ **ovos-skill-hello-world.openvoiceos** โ€” 14 languages

**en-US:** 2 intents ยท 4 dialogs ยท skill.json โœ…

<details><summary>Translation coverage โ€” 13 languages (12 complete, 1 partial)</summary>

| Language | Progress | Coverage |
|----------|----------|----------|
| ca-es | `โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ` | โœ… 100% (6/6) |
| de-de | `โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘` | โš ๏ธ 83.3% (5/6) |

</details>

Coverage icons: yes for 95% or more, partial for 50 to 94%, no for less than 50%. The summary line counts languages in each band. Non-skill repos: โ„น๏ธ Not an OVOS skill repo โ€” check skipped.

Typical usage

name: Skill Check

on:
  pull_request:
    branches: [dev]
  workflow_dispatch:

jobs:
  skill_check:
    uses: OpenVoiceOS/gh-automations/.github/workflows/skill-check.yml@dev
    secrets: inherit

Stricter skill repos

To enforce a valid skill.json, set fail_on_invalid_skill_json: true (it defaults to false so the check is informational by default).


locale-check.yml

Verifies that locale folders are correctly included in the package build, by checking pyproject.toml configuration and the build manifest.

Source: .github/workflows/locale-check.yml

Inputs

Input Type Default Description
uv_prerelease string allow uv prerelease resolution mode (allow | if-necessary | explicit | disallow). Defaults to "allow": the OVOS ecosystem ships pre-1.0 alphas and relies on prerelease floor-pins resolving the way pip did.
runner string ubuntu-latest
python_version string 3.11
locale_path string "" Override locale path (relative to repo root). If empty, auto-detects.
pr_comment boolean true Post sections in the shared 'OVOS PR Checks' comment. Only runs when triggered by a pull_request event.

spec-lint.yml

Runs ovos-spec-lint against a skill's locale folder to validate it against OVOS-INTENT-1 (template syntax) and OVOS-INTENT-2 (file naming and layout).

Source: .github/workflows/spec-lint.yml

Inputs

Input Type Default Description
uv_prerelease string allow uv prerelease resolution mode (allow | if-necessary | explicit | disallow). Defaults to "allow": the OVOS ecosystem ships pre-1.0 alphas and relies on prerelease floor-pins resolving the way pip did.
runner string ubuntu-latest Runner label
python_version string 3.14 Python version
locale_path string locale Path to the locale folder (or a single / directory)
spec_version string "" OVOS spec version to target. Empty = ovos-spec-lint default. Set to '0', '1', '2', or '3' to flag features newer than that version.
strict boolean false Treat warnings as errors (passes --strict to ovos-spec-lint)
skip_if_no_locale boolean true Silently pass if locale_path does not exist
ovos_spec_tools_spec string ovos-spec-tools Pip requirement spec for the linter. Override to pin a version or install from a git URL during alpha.
pr_comment boolean true Post a '๐Ÿงช Spec Lint' section in the shared 'OVOS PR Checks' comment. Only runs when the workflow is triggered by a pull_request event.

Read next: Skill Test Workflows Related: gh-automations Overview ยท Build Checks ยท Plugin, License, and Repo Checks ยท Workflow Reference