diff --git a/.github/workflows/issue-validation.yml b/.github/workflows/issue-validation.yml new file mode 100644 index 0000000..343c63f --- /dev/null +++ b/.github/workflows/issue-validation.yml @@ -0,0 +1,169 @@ +name: Issue Validation + +on: + issues: + types: [opened] + +permissions: + issues: write + models: read + +jobs: + validate-issue: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 + + - 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 + run: | + cat > issue_analysis.txt << 'EOF' + ## Issue Content to Analyze: + + **Title:** ${{ github.event.issue.title }} + + **Body:** + ${{ github.event.issue.body }} + + **Labels:** ${{ join(github.event.issue.labels.*.name, ', ') }} + EOF + + - name: Validate issue with AI + id: validate + uses: actions/ai-inference@d645f067d89ee1d5d736a5990e327e504d1c5a4a # v1.1.0 + with: + prompt-file: issue_analysis.txt + system-prompt: | + You are an issue validation assistant for Donut Browser, a browser orchestrator application. + + 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: gpt-4o + + - name: Parse validation result and take action + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Get the AI response + VALIDATION_RESULT='${{ steps.validate.outputs.response }}' + + # Extract JSON from the response (handle potential markdown formatting) + JSON_RESULT=$(echo "$VALIDATION_RESULT" | sed -n '/```json/,/```/p' | sed '1d;$d' || echo "$VALIDATION_RESULT") + + # 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" + + if [ "$IS_VALID" = "false" ]; then + # Create a comment asking for more information + cat > comment.md << EOF + ## 🤖 Issue Validation + + 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. + + **Issue Type Detected:** \`$ISSUE_TYPE\` + + **Assessment:** $ASSESSMENT + + ### 📋 Missing Information: + $MISSING_INFO + + ### 💡 Suggestions for Improvement: + $SUGGESTIONS + + ### 📝 How to Provide Additional Information: + + Please edit your original issue description to include the missing information. Here are our issue templates for reference: + + - **Bug Report Template:** [View Template](.github/ISSUE_TEMPLATE/01-bug-report.md) + - **Feature Request Template:** [View Template](.github/ISSUE_TEMPLATE/02-feature-request.md) + + ### 🔧 Quick Tips: + - For **bug reports**: Include step-by-step reproduction instructions, your environment details, and any error messages + - For **feature requests**: Describe the use case, expected behavior, and why this feature would be valuable + - Add **screenshots** or **logs** when applicable + + Once you've updated the issue with the missing information, feel free to remove this comment or reply to let us know you've made the updates. + + --- + *This validation was performed automatically to ensure we have all the information needed to help you effectively.* + EOF + + # 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" + + # 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 diff --git a/.vscode/settings.json b/.vscode/settings.json index 99ec5ba..cded351 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,6 +22,7 @@ "dtolnay", "dyld", "elif", + "esac", "esbuild", "eslintcache", "frontmost",