diff --git a/.gitea/workflows/pr-pipeline.yaml b/.gitea/workflows/pr-pipeline.yaml index a52a61b..8dbfc2e 100644 --- a/.gitea/workflows/pr-pipeline.yaml +++ b/.gitea/workflows/pr-pipeline.yaml @@ -19,55 +19,73 @@ jobs: auth: runs-on: ubuntu-latest steps: - - name: Authorization check + - name: Checkout repository run: | - [ -f scripts/prose-auth-check.sh ] || { echo "✅ No auth script — skipping"; exit 0; } - bash scripts/prose-auth-check.sh + git clone --depth=50 "https://${{ gitea.server_url }}/${{ gitea.repository }}.git" . + git fetch origin "${{ gitea.ref }}" --depth=50 + git checkout "${{ gitea.sha }}" + + - name: Authorization check + run: bash scripts/prose-auth-check.sh validate: runs-on: ubuntu-latest needs: auth steps: + - name: Checkout repository + run: | + git clone --depth=50 "https://${{ gitea.server_url }}/${{ gitea.repository }}.git" . + git fetch origin "${{ gitea.ref }}" --depth=50 + git checkout "${{ gitea.sha }}" + - name: YAML frontmatter validation run: | echo "=== Prose Contract Frontmatter Validation ===" FAILED=0 for f in $(find . -name "*.prose.md" -not -path "./.git/*" -not -path "./runs/*"); do FM=$(sed -n '/^---$/,/^---$/p' "$f" | sed '1d;$d') - [ -z "$FM" ] && { echo " ❌ $f: No YAML frontmatter"; FAILED=1; continue; } + [ -z "$FM" ] && { echo " ❌ $f: No YAML frontmatter"; FAILED=$((FAILED+1)); continue; } KIND=$(echo "$FM" | grep '^kind:' | awk '{print $2}') case "$KIND" in function|responsibility|gateway|pattern|test|template|architecture|enforcement) echo " ✅ $f: kind=$KIND" ;; - *) echo " ❌ $f: Invalid kind='$KIND'"; FAILED=1 ;; + *) echo " ❌ $f: Invalid kind='$KIND'"; FAILED=$((FAILED+1)) ;; esac - echo "$FM" | grep -q '^name:' || { echo " ❌ $f: Missing name"; FAILED=1; } - echo "$FM" | grep -q '^description:' || { echo " ❌ $f: Missing description"; FAILED=1; } + echo "$FM" | grep -q '^name:' || { echo " ❌ $f: Missing name"; FAILED=$((FAILED+1)); } + echo "$FM" | grep -q '^description:' || { echo " ❌ $f: Missing description"; FAILED=$((FAILED+1)); } done - [ $FAILED -eq 1 ] && { echo "❌ FRONTMATTER FAILED"; exit 1; } + [ $FAILED -gt 0 ] && { echo "❌ FRONTMATTER FAILED ($FAILED error(s))"; exit 1; } echo "✅ Frontmatter validation passed" lint: runs-on: ubuntu-latest needs: validate steps: - - name: Structure + regression + consistency lint + - name: Checkout repository run: | - [ -f scripts/prose-lint.sh ] || { echo "✅ No lint script — skipping"; exit 0; } - bash scripts/prose-lint.sh + git clone --depth=50 "https://${{ gitea.server_url }}/${{ gitea.repository }}.git" . + git fetch origin "${{ gitea.ref }}" --depth=50 + git checkout "${{ gitea.sha }}" + + - name: Structure + regression + consistency lint + run: bash scripts/prose-lint.sh ai-review: runs-on: ubuntu-latest needs: validate steps: + - name: Checkout repository + run: | + git clone --depth=50 "https://${{ gitea.server_url }}/${{ gitea.repository }}.git" . + git fetch origin "${{ gitea.ref }}" --depth=50 + git checkout "${{ gitea.sha }}" + - name: AI-powered contract review env: LITELLM_URL: ${{ secrets.LITELLM_URL }} LITELLM_KEY: ${{ secrets.LITELLM_KEY }} - run: | - [ -f scripts/prose-ai-review.sh ] || { echo "✅ No AI review script — skipping"; exit 0; } - bash scripts/prose-ai-review.sh + run: bash scripts/prose-ai-review.sh gate: runs-on: ubuntu-latest