3737 printf 'summary=%s\n' "No PR context; skipping gatekeeper checks." >> "$GITHUB_OUTPUT"
3838 echo "details=" >> "$GITHUB_OUTPUT"
3939 echo "is_bot=false" >> "$GITHUB_OUTPUT"
40+ echo "docs_only=false" >> "$GITHUB_OUTPUT"
4041 exit 0
4142 fi
4243
@@ -59,10 +60,44 @@ jobs:
5960 printf 'summary=%s\n' "Not a Devin-authored PR. Skipping human-review enforcement." >> "$GITHUB_OUTPUT"
6061 echo "details=" >> "$GITHUB_OUTPUT"
6162 echo "is_bot=false" >> "$GITHUB_OUTPUT"
63+ echo "docs_only=false" >> "$GITHUB_OUTPUT"
6264 exit 0
6365 fi
6466 echo "is_bot=true" >> "$GITHUB_OUTPUT"
6567
68+ # 2b. Docs-only changes skip additional approvals
69+ PR_FILES=$(gh api "repos/$REPO/pulls/$PR/files" --paginate)
70+ DOCS_ONLY=$(
71+ echo "$PR_FILES" | jq -r '
72+ if length == 0 then
73+ "false"
74+ else
75+ all(.[]; (
76+ (.filename | test("(?i)^(docs|doc)/"))
77+ or (.filename | test("(?i)\\.(md|mdx|markdown|rst|adoc)$"))
78+ or (.filename | test("(?i)(^|/)(README|CHANGELOG)(\\..*)?$"))
79+ )) | tostring
80+ end
81+ '
82+ )
83+
84+ if [ "$DOCS_ONLY" = "true" ]; then
85+ FILES_LIST=$(echo "$PR_FILES" | jq -r '[.[].filename] | map("- " + .) | join("\n")')
86+ echo "docs_only=true" >> "$GITHUB_OUTPUT"
87+ echo "conclusion=success" >> "$GITHUB_OUTPUT"
88+ printf 'summary=%s\n' "Docs-only changes detected. Additional approvals are not required." >> "$GITHUB_OUTPUT"
89+ {
90+ echo "details<<EOF"
91+ echo "Docs-only files:"
92+ echo "$FILES_LIST"
93+ echo "EOF"
94+ } >> "$GITHUB_OUTPUT"
95+ echo "approvals_list=" >> "$GITHUB_OUTPUT"
96+ echo "approvals_missing=0" >> "$GITHUB_OUTPUT"
97+ exit 0
98+ fi
99+ echo "docs_only=false" >> "$GITHUB_OUTPUT"
100+
66101 # 3. Reduce to latest review per human
67102 LATEST_REVIEWS_JSON=$(
68103 echo "$PR_DATA" | jq -c '
@@ -153,11 +188,16 @@ jobs:
153188 APPROVERS : ${{ steps.evaluate.outputs.approvals_list }}
154189 MISSING : ${{ steps.evaluate.outputs.approvals_missing }}
155190 CONCLUSION : ${{ steps.evaluate.outputs.conclusion }}
191+ DOCS_ONLY : ${{ steps.evaluate.outputs.docs_only }}
156192 run : |
157193 set -euo pipefail
158194 MARKER="<!-- bot-proxy-gatekeeper-comment -->"
159195 APPROVER_LINE="Current approvals: ${APPROVERS:-none}"
160- if [ "$CONCLUSION" = "success" ]; then
196+ if [ "$DOCS_ONLY" = "true" ]; then
197+ MSG=$(printf "%s\n%s" \
198+ "$MARKER" \
199+ "📝 **Docs-only changes**: additional approvals are not required.")
200+ elif [ "$CONCLUSION" = "success" ]; then
161201 MSG=$(printf "%s\n%s\n\n**%s**" \
162202 "$MARKER" \
163203 "✅ **Review Requirements Satisfied**: 2 different human approvals are present." \
0 commit comments