Skip to content

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

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

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

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