@@ -233,6 +233,11 @@ jobs:
233233 SUMMARY=$(cat /tmp/review_summary.txt)
234234 COMMENTS=$(cat /tmp/review_comments.txt)
235235
236+ # [Fix #2] CREW_API_TOKEN 校验
237+ if [ -z "${CREW_API_TOKEN}" ]; then
238+ echo "::warning::CREW_API_TOKEN not configured — skipping auto-dispatch"
239+ fi
240+
236241 # 添加轮次 label
237242 gh pr edit "$PR_NUMBER" --add-label "review-round-${ROUND}" 2>/dev/null || \
238243 gh label create "review-round-${ROUND}" --color "0E8A16" 2>/dev/null && \
@@ -257,25 +262,37 @@ jobs:
257262 EOF
258263 )"
259264
260- # 审查不通过 — 只在第 1 轮自动派回修复(避免循环:审查→派单→修复→ 再审查→ 再派单)
261- if [ "$ROUND" -eq 1 ]; then
262- curl -s -X POST "https://crew.knowlyr.com/run/employee/ceo-assistant" \
263- -H "Authorization: Bearer ${CREW_API_TOKEN}" \
264- -H "Content-Type: application/ json" \
265- -d "$(python3 -c "
266- import json
267- task = ''' PR #${ PR_NUMBER} 第 ${ ROUND} 轮审查不通过,需要派人修复。
268- 仓库: ${ REPO}
265+ # 审查不通过 — 只在第 1 轮自动派回修复(避免循环:审查->派单->修复-> 再审查-> 再派单)
266+ if [ "$ROUND" -eq 1 ] && [ -n "${CREW_API_TOKEN}" ] ; then
267+ # [Fix #1] 用环境变量+文件方式传参,避免命令注入
268+ PR_NUMBER="$PR_NUMBER" ROUND="$ROUND" REPO="$REPO" python3 << 'PYEOF' > /tmp/dispatch_payload.json
269+ import json, os
270+ summary = open('/tmp/review_summary.txt').read()
271+ comments = open('/tmp/review_comments.txt').read()
272+ task = f""" PR #{os.environ[' PR_NUMBER'] } 第 {os.environ[' ROUND'] } 轮审查不通过,需要派人修复。
273+ 仓库: {os.environ[' REPO'] }
269274
270275 审查意见:
271- ${SUMMARY }
276+ {summary }
272277
273- ${COMMENTS }
278+ {comments }
274279
275- 请根据仓库和问题类型派合适的工程师修复,修完后推代码触发下一轮审查。'''
280+ 请根据仓库和问题类型派合适的工程师修复,修完后推代码触发下一轮审查。"""
276281 print(json.dumps({'task': task}))
277- ")"
278- echo "Auto-dispatch: review feedback sent to ceo-assistant"
282+ PYEOF
283+
284+ # [Fix #3] dispatch curl 加 HTTP 状态码检查
285+ DISPATCH_RESP=$(curl -s -w "\n%{http_code}" -X POST "https://crew.knowlyr.com/run/employee/ceo-assistant" \
286+ -H "Authorization: Bearer ${CREW_API_TOKEN}" \
287+ -H "Content-Type: application/json" \
288+ -d @/tmp/dispatch_payload.json)
289+ HTTP_CODE=$(echo "$DISPATCH_RESP" | tail -n1)
290+ if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "201" ]; then
291+ echo "::warning::Auto-dispatch failed (HTTP $HTTP_CODE)"
292+ else
293+ echo "Auto-dispatch: review feedback sent to ceo-assistant"
294+ fi
295+ rm -f /tmp/dispatch_payload.json
279296 fi
280297
281298 # 第 4 轮:需要人工介入
@@ -284,15 +301,26 @@ jobs:
284301 gh label create "needs-human-review" --color "D93F0B" 2>/dev/null || true
285302 gh pr edit "$PR_NUMBER" --add-label "needs-human-review"
286303
287- # 通知 Kai
288- curl -s -X POST "https://crew.knowlyr.com/run/employee/ceo-assistant" \
289- -H "Authorization: Bearer ${CREW_API_TOKEN}" \
290- -H "Content-Type: application/json" \
291- -d "$(python3 -c "
292- import json
293- task = 'PR #${PR_NUMBER} 经过 ${ROUND} 轮审查仍未通过,需要 Kai 介入。仓库: ${REPO}。请通过飞书通知 Kai。'
304+ if [ -n "${CREW_API_TOKEN}" ]; then
305+ # [Fix #1] 用环境变量+文件方式传参,避免命令注入
306+ PR_NUMBER="$PR_NUMBER" ROUND="$ROUND" REPO="$REPO" python3 << 'PYEOF' > /tmp/escalate_payload.json
307+ import json, os
308+ task = f"PR #{os.environ['PR_NUMBER']} 经过 {os.environ['ROUND']} 轮审查仍未通过,需要 Kai 介入。仓库: {os.environ['REPO']}。请通过飞书通知 Kai。"
294309 print(json.dumps({'task': task}))
295- ")"
296- echo "Human review notification sent"
310+ PYEOF
311+
312+ # [Fix #3] dispatch curl 加 HTTP 状态码检查
313+ ESCALATE_RESP=$(curl -s -w "\n%{http_code}" -X POST "https://crew.knowlyr.com/run/employee/ceo-assistant" \
314+ -H "Authorization: Bearer ${CREW_API_TOKEN}" \
315+ -H "Content-Type: application/json" \
316+ -d @/tmp/escalate_payload.json)
317+ HTTP_CODE=$(echo "$ESCALATE_RESP" | tail -n1)
318+ if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "201" ]; then
319+ echo "::warning::Human review notification failed (HTTP $HTTP_CODE)"
320+ else
321+ echo "Human review notification sent"
322+ fi
323+ rm -f /tmp/escalate_payload.json
324+ fi
297325 fi
298326 fi
0 commit comments