--- /dev/null
+name: Code Style Checker
+
+on:
+ workflow_dispatch: # allows manual triggering
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - master
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ model-naming:
+ runs-on: ubuntu-slim
+ steps:
+ - uses: actions/checkout@v6
+ - name: Check model naming conventions
+ run: |
+ python3 - << 'EOF'
+ import re, os, sys
+
+ pairs = re.findall(
+ r'case\s+(LLM_ARCH_\w+)\s*:\s*\n\s+return new (llama_model_\w+)\s*\(',
+ open("src/llama-model.cpp").read())
+
+ errors = []
+ for arch, cls in pairs:
+ suffix = arch[len("LLM_ARCH_"):]
+ csuffix = cls[len("llama_model_"):]
+ fname = csuffix.replace("_", "-") + ".cpp"
+
+ if not re.fullmatch(r'[A-Z][A-Z0-9_]*', suffix):
+ errors.append(f"{arch}: suffix not upper snake case, example: LLM_ARCH_MY_MODEL")
+
+ if not re.fullmatch(r'[a-z][a-z0-9_]*', csuffix):
+ errors.append(f"{arch}: class suffix not lower snake case, example: llama_model_my_model")
+
+ elif suffix.lower() != csuffix:
+ errors.append(f"{arch}: arch/class name mismatch, expected class 'llama_model_{suffix.lower()}' but got '{cls}'")
+
+ elif not os.path.isfile(f"src/models/{fname}"):
+ errors.append(f"{arch}: expects model file name to be src/models/{fname}, but not found")
+
+ if errors:
+ print('\n'.join(f" - {e}" for e in errors)); sys.exit(1)
+ print(f"OK: {len(pairs)} mappings validated.")
+ EOF