chore(deps): update google-genai requirement from <2.0.0,>=1.0.0 to >=2.8.0,<3.0.0 in /skills/blog-audio/scripts #72
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [main, master] | |
| pull_request: | |
| branches: [main, master] | |
| # Least-privilege token (closes audit VULN-501). Override per-job if needed. | |
| permissions: | |
| contents: read | |
| # Cancel superseded runs on the same ref to save runner minutes. | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| python-version: ["3.11", "3.12"] | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 (SHA-pinned, closes VULN-503) | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.0.0 (SHA-pinned) | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install dependencies | |
| # Use the dev extras group so PR builds resolve identically to local | |
| # development. The pyproject.toml `dev` group pins pytest, textstat, | |
| # and beautifulsoup4 within bounded ranges (closes audit VULN-502). | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e ".[dev]" | |
| - name: Run tests | |
| run: python -m pytest tests/ -v | |
| validate-skills: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 (SHA-pinned, closes VULN-503) | |
| - name: Validate SKILL.md frontmatter | |
| run: | | |
| echo "Checking all SKILL.md files have required frontmatter..." | |
| errors=0 | |
| for file in $(find skills -name "SKILL.md"); do | |
| if ! head -1 "$file" | grep -q "^---"; then | |
| echo "ERROR: $file missing YAML frontmatter" | |
| errors=$((errors + 1)) | |
| fi | |
| if ! grep -q "^name:" "$file"; then | |
| echo "ERROR: $file missing 'name' field" | |
| errors=$((errors + 1)) | |
| fi | |
| if ! grep -q "^description:" "$file" && ! grep -q "description: >" "$file"; then | |
| echo "ERROR: $file missing 'description' field" | |
| errors=$((errors + 1)) | |
| fi | |
| done | |
| if [ $errors -gt 0 ]; then | |
| echo "Found $errors validation errors" | |
| exit 1 | |
| fi | |
| echo "All SKILL.md files valid" | |
| - name: Validate plugin.json | |
| run: | | |
| python3 -c " | |
| import json, sys | |
| with open('.claude-plugin/plugin.json') as f: | |
| data = json.load(f) | |
| required = ['name', 'description', 'author'] | |
| missing = [k for k in required if k not in data] | |
| if missing: | |
| print(f'Missing required fields: {missing}') | |
| sys.exit(1) | |
| print('plugin.json is valid') | |
| " | |
| - name: Run `claude plugin validate` if Claude CLI is available | |
| # Best-effort: the official validator runs at marketplace submission | |
| # time. We add the CLI check here so PRs catch any schema breaks the | |
| # hand-rolled regex/JSON checks above miss. The step is non-fatal | |
| # if the CLI is not installable on the runner (continue-on-error). | |
| continue-on-error: true | |
| run: | | |
| if command -v claude >/dev/null 2>&1; then | |
| claude plugin validate . | |
| else | |
| echo "claude CLI not available on runner; falling back to hand-rolled checks above" | |
| echo "(install via the user's preferred path to make this step authoritative)" | |
| fi | |
| lint-markdown: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 (SHA-pinned, closes VULN-503) | |
| - name: Check for broken internal references | |
| run: | | |
| echo "Checking for stale blog/ path references..." | |
| errors=0 | |
| # Check that no SKILL.md or doc references the old bare blog/ path (not skills/blog/) | |
| for file in $(find skills docs -name "*.md"); do | |
| if grep -Pn '(?<!skills/)blog/references/' "$file" 2>/dev/null; then | |
| echo "WARNING: $file still references old 'blog/references/' path" | |
| errors=$((errors + 1)) | |
| fi | |
| if grep -Pn '(?<!skills/)blog/templates/' "$file" 2>/dev/null; then | |
| echo "WARNING: $file still references old 'blog/templates/' path" | |
| errors=$((errors + 1)) | |
| fi | |
| done | |
| if [ $errors -gt 0 ]; then | |
| echo "Found $errors stale path references" | |
| exit 1 | |
| fi | |
| echo "No stale path references found" | |
| lint-prose-hygiene: | |
| # Enforces CONTRIBUTING.md prose rules (no em-dashes / en-dashes / | |
| # ASCII double-hyphen). Added v1.8.4 after the 5th-round hostile audit | |
| # found 31 markdown em-dashes the v1.8.2/v1.8.3 cleanup scripts missed. | |
| # The actual check is `scripts/lint_prose.py` (fence-aware + backtick-aware). | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 (SHA-pinned) | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.0.0 | |
| with: | |
| python-version: "3.12" | |
| - name: Run prose-hygiene linter | |
| run: python3 scripts/lint_prose.py | |
| version-coherence: | |
| # Asserts that pyproject.toml, plugin.json, CITATION.cff, AND the | |
| # orchestrator skills/blog/SKILL.md frontmatter all report the same | |
| # version. Added v1.8.4 after the 5th audit found SKILL.md:19 still | |
| # said "1.8.0" while every other surface had moved to 1.8.3. | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 (SHA-pinned) | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.0.0 | |
| with: | |
| python-version: "3.12" | |
| - name: Install pytest | |
| run: pip install pytest | |
| - name: Run version-coherence pytest (canonical source v1.8.6+) | |
| # Replaces the prior heredoc duplicate. tests/test_version_coherence.py | |
| # is now the single source of truth; local devs and CI run the same | |
| # assertion logic. Closes 7TH-AUDIT-012. | |
| run: python -m pytest tests/test_version_coherence.py -v |