name: Validate Skills and Conventions on: pull_request: branches: [main] push: branches: [main] jobs: validate: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - name: Install dependencies run: | pip install pyyaml - name: Validate command frontmatter run: | python -c " import yaml from pathlib import Path for cmd_file in sorted(Path('commands').glob('*.md')): with open(cmd_file) as f: content = f.read() parts = content.split('---', 2) if len(parts) < 3: raise ValueError(f'{cmd_file} missing YAML frontmatter (--- delimiters)') meta = yaml.safe_load(parts[1]) assert 'description' in meta, f'{cmd_file} frontmatter missing: description' print(f'{cmd_file} valid: {meta[\"description\"][:60]}...') " - name: Validate convention pack YAML files run: | python -c " import yaml from pathlib import Path required_fields = ['name', 'version', 'description', 'author', 'tags'] conventions_dir = Path('network/conventions') for pack_dir in sorted(conventions_dir.iterdir()): if not pack_dir.is_dir(): continue yaml_path = pack_dir / 'CONVENTION_PACK.yaml' if not yaml_path.exists(): print(f'WARNING: {pack_dir.name}/ has no CONVENTION_PACK.yaml') continue with open(yaml_path) as f: content = f.read() # Handle YAML frontmatter format if content.startswith('---'): parts = content.split('---', 2) meta = yaml.safe_load(parts[1]) else: meta = yaml.safe_load(content) for field in required_fields: assert field in meta, f'{pack_dir.name}/CONVENTION_PACK.yaml missing: {field}' print(f'{pack_dir.name} CONVENTION_PACK.yaml valid (v{meta[\"version\"]})') " - name: Test init and validate scripts run: | tmpdir=$(mktemp -d) python skills/core/scripts/init_repo.py --target-dir "$tmpdir" python skills/core/scripts/validate_structure.py --target-dir "$tmpdir" - name: Lint markdown files uses: DavidAnson/markdownlint-cli2-action@v19 with: globs: | **/*.md !node_modules continue-on-error: true