chore: release 0.5.0 #4
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: Static Validation | |
| on: | |
| pull_request: | |
| branches: [ main ] | |
| push: | |
| branches: [ main ] | |
| jobs: | |
| validate: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.11' | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install pyyaml | |
| - name: Validate JSON and YAML files | |
| run: | | |
| python -c " | |
| import yaml | |
| import sys | |
| # Validate plugin.json can be read | |
| try: | |
| with open('.claude-plugin/plugin.json') as f: | |
| import json | |
| json.load(f) | |
| print('✓ plugin.json is valid') | |
| except Exception as e: | |
| print(f'✗ plugin.json validation failed: {e}') | |
| sys.exit(1) | |
| # Validate marketplace.json can be read | |
| try: | |
| with open('.claude-plugin/marketplace.json') as f: | |
| import json | |
| json.load(f) | |
| print('✓ marketplace.json is valid') | |
| except Exception as e: | |
| print(f'✗ marketplace.json validation failed: {e}') | |
| sys.exit(1) | |
| # Validate config.example.yaml | |
| try: | |
| with open('config/config.example.yaml') as f: | |
| yaml.safe_load(f) | |
| print('✓ config.example.yaml is valid') | |
| except Exception as e: | |
| print(f'✗ config.example.yaml validation failed: {e}') | |
| sys.exit(1) | |
| " | |
| - name: Check version consistency | |
| run: | | |
| python -c " | |
| import json | |
| import sys | |
| # Read plugin.json version | |
| with open('.claude-plugin/plugin.json') as f: | |
| plugin_version = json.load(f)['version'] | |
| # Read marketplace.json version | |
| with open('.claude-plugin/marketplace.json') as f: | |
| marketplace_version = json.load(f)['plugins'][0]['version'] | |
| print(f'plugin.json version: {plugin_version}') | |
| print(f'marketplace.json version: {marketplace_version}') | |
| if plugin_version != marketplace_version: | |
| print('✗ ERROR: Version mismatch!') | |
| print(f' plugin.json: {plugin_version}') | |
| print(f' marketplace.json: {marketplace_version}') | |
| print('') | |
| print('Fix by updating both files to the same version.') | |
| sys.exit(1) | |
| print('✓ Versions match') | |
| " | |
| - name: Check SKILL.md structure | |
| run: | | |
| python -c " | |
| import os | |
| import sys | |
| skill_dirs = [d for d in os.listdir('skills') if os.path.isdir(f'skills/{d}')] | |
| missing_skill_md = [] | |
| for skill_dir in skill_dirs: | |
| skill_md_path = f'skills/{skill_dir}/SKILL.md' | |
| if not os.path.exists(skill_md_path): | |
| missing_skill_md.append(skill_md_path) | |
| if missing_skill_md: | |
| print('✗ Missing SKILL.md files:') | |
| for path in missing_skill_md: | |
| print(f' - {path}') | |
| sys.exit(1) | |
| print(f'✓ All {len(skill_dirs)} skills have SKILL.md') | |
| " | |
| - name: Validation summary | |
| run: | | |
| echo "================================" | |
| echo "All static validation passed!" | |
| echo "" | |
| echo "Note: Run /bitwize-music:test locally before submitting PR" | |
| echo "================================" |