name: Validate Registry on PR on: pull_request: branches: - main - dev # Removed paths filter - this check is required by repository ruleset # so it must run on ALL PRs to prevent blocking merges workflow_dispatch: inputs: skip_validation: description: 'Skip validation checks (maintainer override)' required: false type: boolean default: false permissions: contents: write pull-requests: write jobs: validate-and-update: runs-on: ubuntu-latest steps: - name: Checkout PR branch uses: actions/checkout@v4 with: # Use head SHA for forks (head_ref is empty), head_ref for internal PRs ref: ${{ github.event.pull_request.head.sha || github.head_ref }} fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y jq - name: Make scripts executable run: | chmod +x scripts/registry/validate-registry.sh chmod +x scripts/registry/auto-detect-components.sh chmod +x scripts/registry/register-component.sh chmod +x scripts/prompts/validate-pr.sh - name: Auto-detect new components id: auto_detect run: | echo "## 🔍 Auto-Detection Results" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY # Run auto-detect in dry-run mode first to see what would be added if ./scripts/registry/auto-detect-components.sh --dry-run > /tmp/detect-output.txt 2>&1; then cat /tmp/detect-output.txt >> $GITHUB_STEP_SUMMARY # Check if new components were found if grep -q "Found.*new component" /tmp/detect-output.txt; then echo "new_components=true" >> $GITHUB_OUTPUT echo "" >> $GITHUB_STEP_SUMMARY echo "âš ī¸ New components detected - will auto-add to registry" >> $GITHUB_STEP_SUMMARY else echo "new_components=false" >> $GITHUB_OUTPUT echo "✅ No new components found" >> $GITHUB_STEP_SUMMARY fi else echo "new_components=false" >> $GITHUB_OUTPUT echo "❌ Auto-detection failed" >> $GITHUB_STEP_SUMMARY fi - name: Add new components to registry if: steps.auto_detect.outputs.new_components == 'true' run: | echo "## 📝 Adding New Components" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY ./scripts/registry/auto-detect-components.sh --auto-add | tee -a $GITHUB_STEP_SUMMARY - name: Validate prompts use defaults id: validate_prompts run: | echo "## 🔍 Prompt Validation" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if ./scripts/prompts/validate-pr.sh > /tmp/prompt-validation.txt 2>&1; then echo "prompt_validation=passed" >> $GITHUB_OUTPUT echo "✅ All agents use default prompts!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY cat /tmp/prompt-validation.txt >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY else echo "prompt_validation=failed" >> $GITHUB_OUTPUT echo "❌ Prompt validation failed!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY cat /tmp/prompt-validation.txt >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**How to fix:**" >> $GITHUB_STEP_SUMMARY echo "1. Restore defaults: \`./scripts/prompts/use-prompt.sh default\`" >> $GITHUB_STEP_SUMMARY echo "2. If adding a variant, add it to \`.opencode/prompts//\` instead" >> $GITHUB_STEP_SUMMARY echo "3. See [CONTRIBUTING.md](docs/contributing/CONTRIBUTING.md) for details" >> $GITHUB_STEP_SUMMARY exit 1 fi - name: Validate registry id: validate run: | echo "## ✅ Registry Validation" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if ./scripts/registry/validate-registry.sh -v > /tmp/validation-output.txt 2>&1; then echo "validation=passed" >> $GITHUB_OUTPUT echo "✅ All registry paths are valid!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY tail -20 /tmp/validation-output.txt >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY else echo "validation=failed" >> $GITHUB_OUTPUT echo "❌ Registry validation failed!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY cat /tmp/validation-output.txt >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY exit 1 fi - name: Commit registry updates if: | steps.auto_detect.outputs.new_components == 'true' && github.head_ref != '' && steps.validate_prompts.outputs.prompt_validation == 'passed' && steps.validate.outputs.validation == 'passed' run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" if ! git diff --quiet registry.json; then git add registry.json git commit -m "chore: auto-update registry with new components [skip ci]" git push origin ${{ github.head_ref }} echo "## 🚀 Registry Updated" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "Registry has been automatically updated with new components." >> $GITHUB_STEP_SUMMARY echo "Changes have been pushed to this PR branch." >> $GITHUB_STEP_SUMMARY else echo "## â„šī¸ No Changes to Commit" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "Registry is already up to date." >> $GITHUB_STEP_SUMMARY fi - name: Fork PR notice if: | steps.auto_detect.outputs.new_components == 'true' && github.head_ref == '' && steps.validate_prompts.outputs.prompt_validation == 'passed' && steps.validate.outputs.validation == 'passed' run: | echo "## âš ī¸ External PR - Manual Action Required" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "New components detected, but cannot auto-commit to fork." >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Please run locally:**" >> $GITHUB_STEP_SUMMARY echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY echo "./scripts/registry/auto-detect-components.sh --auto-add" >> $GITHUB_STEP_SUMMARY echo "git add registry.json" >> $GITHUB_STEP_SUMMARY echo "git commit -m 'chore: update registry'" >> $GITHUB_STEP_SUMMARY echo "git push" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - name: Post validation summary if: always() run: | echo "" >> $GITHUB_STEP_SUMMARY echo "---" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY PROMPT_VALID="${{ steps.validate_prompts.outputs.prompt_validation }}" REGISTRY_VALID="${{ steps.validate.outputs.validation }}" if [ "$PROMPT_VALID" = "passed" ] && [ "$REGISTRY_VALID" = "passed" ]; then echo "### ✅ All Validations Passed" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "- ✅ Prompts use defaults" >> $GITHUB_STEP_SUMMARY echo "- ✅ Registry paths are valid" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "This PR is ready for review!" >> $GITHUB_STEP_SUMMARY else echo "### ❌ Validation Failed" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if [ "$PROMPT_VALID" != "passed" ]; then echo "- ❌ Prompt validation failed" >> $GITHUB_STEP_SUMMARY else echo "- ✅ Prompt validation passed" >> $GITHUB_STEP_SUMMARY fi if [ "$REGISTRY_VALID" != "passed" ]; then echo "- ❌ Registry validation failed" >> $GITHUB_STEP_SUMMARY else echo "- ✅ Registry validation passed" >> $GITHUB_STEP_SUMMARY fi echo "" >> $GITHUB_STEP_SUMMARY echo "Please fix the issues above before merging." >> $GITHUB_STEP_SUMMARY fi - name: Fail if validation failed if: | (steps.validate_prompts.outputs.prompt_validation == 'failed' || steps.validate.outputs.validation == 'failed') && github.event.inputs.skip_validation != 'true' run: | echo "❌ Validation failed - blocking PR merge" echo "Maintainer can override by running workflow manually with 'skip_validation' enabled" exit 1