mirror of
https://github.com/zhom/donutbrowser.git
synced 2026-04-22 20:06:18 +02:00
224 lines
9.6 KiB
YAML
224 lines
9.6 KiB
YAML
name: Issue Validation
|
||
|
||
on:
|
||
issues:
|
||
types: [opened]
|
||
|
||
permissions:
|
||
contents: read
|
||
issues: write
|
||
models: read
|
||
|
||
jobs:
|
||
validate-issue:
|
||
runs-on: ubuntu-latest
|
||
|
||
steps:
|
||
- name: Checkout repository
|
||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1
|
||
|
||
- name: Get issue templates
|
||
id: get-templates
|
||
run: |
|
||
# Read the issue templates
|
||
if [ -f ".github/ISSUE_TEMPLATE/01-bug-report.md" ]; then
|
||
echo "bug-template-exists=true" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
if [ -f ".github/ISSUE_TEMPLATE/02-feature-request.md" ]; then
|
||
echo "feature-template-exists=true" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Create issue analysis prompt
|
||
id: create-prompt
|
||
env:
|
||
ISSUE_TITLE: ${{ github.event.issue.title }}
|
||
ISSUE_BODY: ${{ github.event.issue.body }}
|
||
ISSUE_LABELS: ${{ join(github.event.issue.labels.*.name, ', ') }}
|
||
run: |
|
||
cat > issue_analysis.txt << EOF
|
||
## Issue Content to Analyze:
|
||
|
||
**Title:** $ISSUE_TITLE
|
||
|
||
**Body:**
|
||
$ISSUE_BODY
|
||
|
||
**Labels:** $ISSUE_LABELS
|
||
EOF
|
||
|
||
- name: Validate issue with AI
|
||
id: validate
|
||
uses: actions/ai-inference@334892bb203895caaed82ec52d23c1ed9385151e # v2.0.4
|
||
with:
|
||
prompt-file: issue_analysis.txt
|
||
system-prompt: |
|
||
You are an issue validation assistant for Donut Browser, an anti-detect browser.
|
||
|
||
Analyze the provided issue content and determine if it contains sufficient information based on these requirements:
|
||
|
||
**For Bug Reports, the issue should include:**
|
||
1. Clear description of the problem
|
||
2. Steps to reproduce the issue (numbered list preferred)
|
||
3. Expected vs actual behavior
|
||
4. Environment information (OS, browser version, etc.)
|
||
5. Error messages, stack traces, or screenshots if applicable
|
||
|
||
**For Feature Requests, the issue should include:**
|
||
1. Clear description of the requested feature
|
||
2. Use case or problem it solves
|
||
3. Proposed solution or how it should work
|
||
4. Priority level or importance
|
||
|
||
**General Requirements for all issues:**
|
||
1. Descriptive title
|
||
2. Sufficient detail to understand and act upon
|
||
3. Professional tone and clear communication
|
||
|
||
Respond in JSON format with the following structure:
|
||
```json
|
||
{
|
||
"is_valid": true|false,
|
||
"issue_type": "bug_report"|"feature_request"|"other",
|
||
"missing_info": [
|
||
"List of missing required information"
|
||
],
|
||
"suggestions": [
|
||
"Specific suggestions for improvement"
|
||
],
|
||
"overall_assessment": "Brief assessment of the issue quality"
|
||
}
|
||
```
|
||
|
||
Be constructive and helpful in your feedback. If the issue is incomplete, provide specific guidance on what's needed.
|
||
model: openai/gpt-4o
|
||
|
||
- name: Check if first-time contributor
|
||
id: check-first-time
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
ISSUE_AUTHOR: ${{ github.event.issue.user.login }}
|
||
run: |
|
||
# Check if user has created issues before (excluding the current one)
|
||
ISSUE_COUNT=$(gh api "/repos/${{ github.repository }}/issues" \
|
||
--jq "map(select(.user.login == \"$ISSUE_AUTHOR\" and .number != ${{ github.event.issue.number }})) | length" \
|
||
--paginate || echo "0")
|
||
|
||
if [ "$ISSUE_COUNT" = "0" ]; then
|
||
echo "is_first_time=true" >> $GITHUB_OUTPUT
|
||
echo "✅ First-time contributor detected"
|
||
else
|
||
echo "is_first_time=false" >> $GITHUB_OUTPUT
|
||
echo "ℹ️ Returning contributor"
|
||
fi
|
||
|
||
- name: Parse validation result and take action
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
RESPONSE_FILE: ${{ steps.validate.outputs.response-file }}
|
||
run: |
|
||
# Read from the response file (RESPONSE env var gets truncated for large outputs)
|
||
if [ -n "$RESPONSE_FILE" ] && [ -f "$RESPONSE_FILE" ]; then
|
||
echo "Reading response from file: $RESPONSE_FILE"
|
||
RAW_OUTPUT=$(cat "$RESPONSE_FILE")
|
||
else
|
||
echo "::error::Response file not found: $RESPONSE_FILE"
|
||
exit 1
|
||
fi
|
||
|
||
# Extract JSON if wrapped in markdown code fences; otherwise use raw
|
||
JSON_RESULT=$(printf "%s" "$RAW_OUTPUT" | sed -n '/```json/,/```/p' | sed '1d;$d')
|
||
if [ -z "$JSON_RESULT" ]; then
|
||
JSON_RESULT="$RAW_OUTPUT"
|
||
fi
|
||
|
||
# Validate JSON before parsing
|
||
if ! echo "$JSON_RESULT" | jq empty 2>/dev/null; then
|
||
echo "::error::Invalid JSON in AI response"
|
||
echo "Raw output:"
|
||
echo "$RAW_OUTPUT"
|
||
exit 1
|
||
fi
|
||
|
||
# Parse JSON fields
|
||
IS_VALID=$(echo "$JSON_RESULT" | jq -r '.is_valid // false')
|
||
ISSUE_TYPE=$(echo "$JSON_RESULT" | jq -r '.issue_type // "other"')
|
||
MISSING_INFO=$(echo "$JSON_RESULT" | jq -r '.missing_info[]? // empty' | sed 's/^/- /')
|
||
SUGGESTIONS=$(echo "$JSON_RESULT" | jq -r '.suggestions[]? // empty' | sed 's/^/- /')
|
||
ASSESSMENT=$(echo "$JSON_RESULT" | jq -r '.overall_assessment // "No assessment provided"')
|
||
|
||
echo "Issue validation result: $IS_VALID"
|
||
echo "Issue type: $ISSUE_TYPE"
|
||
|
||
# Prepare greeting message for first-time contributors
|
||
IS_FIRST_TIME="${{ steps.check-first-time.outputs.is_first_time }}"
|
||
GREETING_SECTION=""
|
||
if [ "$IS_FIRST_TIME" = "true" ]; then
|
||
GREETING_SECTION="## 👋 Welcome!\n\nThank you for your first issue ❤️ If this is a feature request, please make sure it is clear what you want, why you want it, and how important it is to you. If you posted a bug report, please make sure it includes as much detail as possible.\n\n---\n\n"
|
||
fi
|
||
|
||
if [ "$IS_VALID" = "false" ]; then
|
||
# Create a comment asking for more information
|
||
{
|
||
printf "%b" "$GREETING_SECTION"
|
||
printf "## 🤖 Issue Validation\n\n"
|
||
printf "Thank you for submitting this issue! However, it appears that some required information might be missing to help us better understand and address your concern.\n\n"
|
||
printf "**Issue Type Detected:** \`%s\`\n\n" "$ISSUE_TYPE"
|
||
printf "**Assessment:** %s\n\n" "$ASSESSMENT"
|
||
printf "### 📋 Missing Information:\n%s\n\n" "$MISSING_INFO"
|
||
printf "### 💡 Suggestions for Improvement:\n%s\n\n" "$SUGGESTIONS"
|
||
printf "### 📝 How to Provide Additional Information:\n\n"
|
||
printf "Please edit your original issue description to include the missing information. Here are our issue templates for reference:\n\n"
|
||
printf -- "- **Bug Report Template:** [View Template](.github/ISSUE_TEMPLATE/01-bug-report.md)\n"
|
||
printf -- "- **Feature Request Template:** [View Template](.github/ISSUE_TEMPLATE/02-feature-request.md)\n\n"
|
||
printf "### 🔧 Quick Tips:\n"
|
||
printf -- "- For **bug reports**: Include step-by-step reproduction instructions, your environment details, and any error messages\n"
|
||
printf -- "- For **feature requests**: Describe the use case, expected behavior, and why this feature would be valuable\n"
|
||
printf -- "- Add **screenshots** or **logs** when applicable\n\n"
|
||
printf "Once you have updated the issue with the missing information, feel free to remove this comment or reply to let us know you have made the updates.\n\n"
|
||
printf -- "---\n*This validation was performed automatically to ensure we have all the information needed to help you effectively.*\n"
|
||
} > comment.md
|
||
|
||
# Post the comment
|
||
gh issue comment ${{ github.event.issue.number }} --body-file comment.md
|
||
|
||
# Add a label to indicate validation needed
|
||
gh issue edit ${{ github.event.issue.number }} --add-label "needs-info"
|
||
|
||
echo "✅ Validation comment posted and 'needs-info' label added"
|
||
else
|
||
echo "✅ Issue contains sufficient information"
|
||
|
||
# Prepare a summary comment even when valid
|
||
SUGGESTIONS_SECTION=""
|
||
if [ -n "$SUGGESTIONS" ]; then
|
||
SUGGESTIONS_SECTION=$(printf "### 💡 Suggestions:\n%s\n\n" "$SUGGESTIONS")
|
||
fi
|
||
|
||
{
|
||
printf "%b" "$GREETING_SECTION"
|
||
printf "## 🤖 Issue Validation\n\n"
|
||
printf "**Issue Type Detected:** \`%s\`\n\n" "$ISSUE_TYPE"
|
||
printf "**Assessment:** %s\n\n" "$ASSESSMENT"
|
||
printf "%b" "$SUGGESTIONS_SECTION"
|
||
printf -- "---\n*This validation was performed automatically to help triage issues.*\n"
|
||
} > comment.md
|
||
|
||
# Post the summary comment
|
||
gh issue comment ${{ github.event.issue.number }} --body-file comment.md
|
||
|
||
# Add appropriate labels based on issue type
|
||
case "$ISSUE_TYPE" in
|
||
"bug_report")
|
||
gh issue edit ${{ github.event.issue.number }} --add-label "bug"
|
||
;;
|
||
"feature_request")
|
||
gh issue edit ${{ github.event.issue.number }} --add-label "enhancement"
|
||
;;
|
||
esac
|
||
fi
|
||
|
||
- name: Cleanup
|
||
run: |
|
||
rm -f issue_analysis.txt comment.md
|