validate-registry.yml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. name: Validate Registry on PR
  2. on:
  3. pull_request:
  4. branches:
  5. - main
  6. - dev
  7. # Removed paths filter - this check is required by repository ruleset
  8. # so it must run on ALL PRs to prevent blocking merges
  9. workflow_dispatch:
  10. inputs:
  11. skip_validation:
  12. description: 'Skip validation checks (maintainer override)'
  13. required: false
  14. type: boolean
  15. default: false
  16. permissions:
  17. contents: write
  18. pull-requests: write
  19. jobs:
  20. validate-and-update:
  21. runs-on: ubuntu-latest
  22. steps:
  23. - name: Checkout PR branch
  24. uses: actions/checkout@v4
  25. with:
  26. # For forks: fetch from fork repo, for internal: use head_ref
  27. repository: ${{ github.event.pull_request.head.repo.full_name }}
  28. ref: ${{ github.event.pull_request.head.ref }}
  29. fetch-depth: 0
  30. token: ${{ secrets.GITHUB_TOKEN }}
  31. - name: Detect fork PR
  32. id: fork_check
  33. run: |
  34. if [ "${{ github.event.pull_request.head.repo.full_name }}" != "${{ github.repository }}" ]; then
  35. echo "is_fork=true" >> $GITHUB_OUTPUT
  36. echo "🔀 Fork PR detected from: ${{ github.event.pull_request.head.repo.full_name }}"
  37. else
  38. echo "is_fork=false" >> $GITHUB_OUTPUT
  39. echo "📝 Internal PR detected"
  40. fi
  41. - name: Install dependencies
  42. run: |
  43. sudo apt-get update
  44. sudo apt-get install -y jq
  45. - name: Make scripts executable
  46. run: |
  47. chmod +x scripts/registry/validate-registry.sh
  48. chmod +x scripts/registry/auto-detect-components.sh
  49. chmod +x scripts/registry/register-component.sh
  50. chmod +x scripts/prompts/validate-pr.sh
  51. - name: Auto-detect new components
  52. id: auto_detect
  53. run: |
  54. echo "## 🔍 Auto-Detection Results" >> $GITHUB_STEP_SUMMARY
  55. echo "" >> $GITHUB_STEP_SUMMARY
  56. # Run auto-detect in dry-run mode first to see what would be added
  57. if ./scripts/registry/auto-detect-components.sh --dry-run > /tmp/detect-output.txt 2>&1; then
  58. cat /tmp/detect-output.txt >> $GITHUB_STEP_SUMMARY
  59. # Check if new components were found
  60. if grep -q "Found.*new component" /tmp/detect-output.txt; then
  61. echo "new_components=true" >> $GITHUB_OUTPUT
  62. echo "" >> $GITHUB_STEP_SUMMARY
  63. echo "⚠️ New components detected - will auto-add to registry" >> $GITHUB_STEP_SUMMARY
  64. else
  65. echo "new_components=false" >> $GITHUB_OUTPUT
  66. echo "✅ No new components found" >> $GITHUB_STEP_SUMMARY
  67. fi
  68. else
  69. echo "new_components=false" >> $GITHUB_OUTPUT
  70. echo "❌ Auto-detection failed" >> $GITHUB_STEP_SUMMARY
  71. fi
  72. - name: Add new components to registry
  73. if: steps.auto_detect.outputs.new_components == 'true'
  74. run: |
  75. echo "## 📝 Adding New Components" >> $GITHUB_STEP_SUMMARY
  76. echo "" >> $GITHUB_STEP_SUMMARY
  77. ./scripts/registry/auto-detect-components.sh --auto-add | tee -a $GITHUB_STEP_SUMMARY
  78. - name: Validate prompt library structure
  79. id: validate_prompts
  80. run: |
  81. echo "## 🔍 Prompt Library Validation" >> $GITHUB_STEP_SUMMARY
  82. echo "" >> $GITHUB_STEP_SUMMARY
  83. if ./scripts/prompts/validate-pr.sh > /tmp/prompt-validation.txt 2>&1; then
  84. echo "prompt_validation=passed" >> $GITHUB_OUTPUT
  85. echo "✅ Prompt library structure is valid!" >> $GITHUB_STEP_SUMMARY
  86. echo "" >> $GITHUB_STEP_SUMMARY
  87. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  88. cat /tmp/prompt-validation.txt >> $GITHUB_STEP_SUMMARY
  89. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  90. else
  91. echo "prompt_validation=failed" >> $GITHUB_OUTPUT
  92. echo "❌ Prompt library validation failed!" >> $GITHUB_STEP_SUMMARY
  93. echo "" >> $GITHUB_STEP_SUMMARY
  94. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  95. cat /tmp/prompt-validation.txt >> $GITHUB_STEP_SUMMARY
  96. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  97. echo "" >> $GITHUB_STEP_SUMMARY
  98. echo "**Architecture:**" >> $GITHUB_STEP_SUMMARY
  99. echo "- Agent files (.opencode/agent/*.md) = Canonical defaults" >> $GITHUB_STEP_SUMMARY
  100. echo "- Prompt variants (.opencode/prompts/<agent>/<model>.md) = Model-specific" >> $GITHUB_STEP_SUMMARY
  101. echo "- default.md files should NOT exist" >> $GITHUB_STEP_SUMMARY
  102. echo "" >> $GITHUB_STEP_SUMMARY
  103. echo "See [CONTRIBUTING.md](docs/contributing/CONTRIBUTING.md) for details" >> $GITHUB_STEP_SUMMARY
  104. exit 1
  105. fi
  106. - name: Validate registry
  107. id: validate
  108. run: |
  109. echo "## ✅ Registry Validation" >> $GITHUB_STEP_SUMMARY
  110. echo "" >> $GITHUB_STEP_SUMMARY
  111. if ./scripts/registry/validate-registry.sh -v > /tmp/validation-output.txt 2>&1; then
  112. echo "validation=passed" >> $GITHUB_OUTPUT
  113. echo "✅ All registry paths are valid!" >> $GITHUB_STEP_SUMMARY
  114. echo "" >> $GITHUB_STEP_SUMMARY
  115. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  116. tail -20 /tmp/validation-output.txt >> $GITHUB_STEP_SUMMARY
  117. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  118. else
  119. echo "validation=failed" >> $GITHUB_OUTPUT
  120. echo "❌ Registry validation failed!" >> $GITHUB_STEP_SUMMARY
  121. echo "" >> $GITHUB_STEP_SUMMARY
  122. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  123. cat /tmp/validation-output.txt >> $GITHUB_STEP_SUMMARY
  124. echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
  125. exit 1
  126. fi
  127. - name: Commit registry updates (Internal PRs only)
  128. if: |
  129. steps.fork_check.outputs.is_fork == 'false' &&
  130. steps.auto_detect.outputs.new_components == 'true' &&
  131. steps.validate_prompts.outputs.prompt_validation == 'passed' &&
  132. steps.validate.outputs.validation == 'passed'
  133. run: |
  134. git config --local user.email "github-actions[bot]@users.noreply.github.com"
  135. git config --local user.name "github-actions[bot]"
  136. if ! git diff --quiet registry.json; then
  137. git add registry.json
  138. git commit -m "chore: auto-update registry with new components [skip ci]"
  139. git push origin ${{ github.event.pull_request.head.ref }}
  140. echo "## 🚀 Registry Updated" >> $GITHUB_STEP_SUMMARY
  141. echo "" >> $GITHUB_STEP_SUMMARY
  142. echo "Registry has been automatically updated with new components." >> $GITHUB_STEP_SUMMARY
  143. echo "Changes have been pushed to this PR branch." >> $GITHUB_STEP_SUMMARY
  144. else
  145. echo "## ℹ️ No Changes to Commit" >> $GITHUB_STEP_SUMMARY
  146. echo "" >> $GITHUB_STEP_SUMMARY
  147. echo "Registry is already up to date." >> $GITHUB_STEP_SUMMARY
  148. fi
  149. - name: Fork PR notice
  150. if: |
  151. steps.fork_check.outputs.is_fork == 'true' &&
  152. steps.auto_detect.outputs.new_components == 'true' &&
  153. steps.validate_prompts.outputs.prompt_validation == 'passed' &&
  154. steps.validate.outputs.validation == 'passed'
  155. uses: actions/github-script@v7
  156. with:
  157. script: |
  158. github.rest.issues.createComment({
  159. issue_number: context.issue.number,
  160. owner: context.repo.owner,
  161. repo: context.repo.repo,
  162. body: `## 📝 Registry Update Needed
  163. Hi @${{ github.event.pull_request.user.login }}! 👋
  164. New components were detected in your PR. Since this is a fork PR, I can't auto-commit the registry updates for security reasons.
  165. **Please run these commands locally:**
  166. \`\`\`bash
  167. ./scripts/registry/auto-detect-components.sh --auto-add
  168. git add registry.json
  169. git commit -m "chore: update registry"
  170. git push
  171. \`\`\`
  172. Once you push the updated registry, the checks will pass! ✅`
  173. });
  174. - name: Fork PR summary
  175. if: steps.fork_check.outputs.is_fork == 'true'
  176. run: |
  177. echo "## 🔀 Fork PR Detected" >> $GITHUB_STEP_SUMMARY
  178. echo "" >> $GITHUB_STEP_SUMMARY
  179. echo "This is an external contribution - thank you! 🎉" >> $GITHUB_STEP_SUMMARY
  180. echo "" >> $GITHUB_STEP_SUMMARY
  181. if [ "${{ steps.auto_detect.outputs.new_components }}" == "true" ]; then
  182. echo "⚠️ **Action Required:** New components detected" >> $GITHUB_STEP_SUMMARY
  183. echo "" >> $GITHUB_STEP_SUMMARY
  184. echo "A comment has been posted with instructions to update the registry." >> $GITHUB_STEP_SUMMARY
  185. else
  186. echo "✅ No registry updates needed" >> $GITHUB_STEP_SUMMARY
  187. fi
  188. - name: Post validation summary
  189. if: always()
  190. run: |
  191. echo "" >> $GITHUB_STEP_SUMMARY
  192. echo "---" >> $GITHUB_STEP_SUMMARY
  193. echo "" >> $GITHUB_STEP_SUMMARY
  194. PROMPT_VALID="${{ steps.validate_prompts.outputs.prompt_validation }}"
  195. REGISTRY_VALID="${{ steps.validate.outputs.validation }}"
  196. if [ "$PROMPT_VALID" = "passed" ] && [ "$REGISTRY_VALID" = "passed" ]; then
  197. echo "### ✅ All Validations Passed" >> $GITHUB_STEP_SUMMARY
  198. echo "" >> $GITHUB_STEP_SUMMARY
  199. echo "- ✅ Prompt library structure is valid" >> $GITHUB_STEP_SUMMARY
  200. echo "- ✅ Registry paths are valid" >> $GITHUB_STEP_SUMMARY
  201. echo "" >> $GITHUB_STEP_SUMMARY
  202. echo "This PR is ready for review!" >> $GITHUB_STEP_SUMMARY
  203. else
  204. echo "### ❌ Validation Failed" >> $GITHUB_STEP_SUMMARY
  205. echo "" >> $GITHUB_STEP_SUMMARY
  206. if [ "$PROMPT_VALID" != "passed" ]; then
  207. echo "- ❌ Prompt library validation failed" >> $GITHUB_STEP_SUMMARY
  208. else
  209. echo "- ✅ Prompt library validation passed" >> $GITHUB_STEP_SUMMARY
  210. fi
  211. if [ "$REGISTRY_VALID" != "passed" ]; then
  212. echo "- ❌ Registry validation failed" >> $GITHUB_STEP_SUMMARY
  213. else
  214. echo "- ✅ Registry validation passed" >> $GITHUB_STEP_SUMMARY
  215. fi
  216. echo "" >> $GITHUB_STEP_SUMMARY
  217. echo "Please fix the issues above before merging." >> $GITHUB_STEP_SUMMARY
  218. fi
  219. - name: Fail if validation failed
  220. if: |
  221. (steps.validate_prompts.outputs.prompt_validation == 'failed' || steps.validate.outputs.validation == 'failed') &&
  222. github.event.inputs.skip_validation != 'true'
  223. run: |
  224. echo "❌ Validation failed - blocking PR merge"
  225. echo "Maintainer can override by running workflow manually with 'skip_validation' enabled"
  226. exit 1