- Notifications
You must be signed in to change notification settings - Fork1.1k
feat: add notification warning alert to Tasks page (#20900)#41
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| # This workflow checks if a PR requires documentation updates. | |
| # It creates a Coder Task that uses AI to analyze the PR changes, | |
| # search existing docs, and comment with recommendations. | |
| # | |
| # Triggered by: Adding the "doc-check" label to a PR, or manual dispatch. | |
| name:AI Documentation Check | |
| on: | |
| pull_request: | |
| types: | |
| -labeled | |
| workflow_dispatch: | |
| inputs: | |
| pr_url: | |
| description:"Pull Request URL to check" | |
| required:true | |
| type:string | |
| template_preset: | |
| description:"Template preset to use" | |
| required:false | |
| default:"" | |
| type:string | |
| jobs: | |
| doc-check: | |
| name:Analyze PR for Documentation Updates Needed | |
| runs-on:ubuntu-latest | |
| if:| | |
| (github.event.label.name == 'doc-check' || github.event_name == 'workflow_dispatch') && | |
| (github.event.pull_request.draft == false || github.event_name == 'workflow_dispatch') | |
| timeout-minutes:30 | |
| env: | |
| CODER_URL:${{ secrets.DOC_CHECK_CODER_URL }} | |
| CODER_SESSION_TOKEN:${{ secrets.DOC_CHECK_CODER_SESSION_TOKEN }} | |
| permissions: | |
| contents:read | |
| pull-requests:write | |
| actions:write | |
| steps: | |
| -name:Determine PR Context | |
| id:determine-context | |
| env: | |
| GITHUB_ACTOR:${{ github.actor }} | |
| GITHUB_EVENT_NAME:${{ github.event_name }} | |
| GITHUB_EVENT_PR_HTML_URL:${{ github.event.pull_request.html_url }} | |
| GITHUB_EVENT_PR_NUMBER:${{ github.event.pull_request.number }} | |
| GITHUB_EVENT_SENDER_ID:${{ github.event.sender.id }} | |
| GITHUB_EVENT_SENDER_LOGIN:${{ github.event.sender.login }} | |
| INPUTS_PR_URL:${{ inputs.pr_url }} | |
| INPUTS_TEMPLATE_PRESET:${{ inputs.template_preset || '' }} | |
| GH_TOKEN:${{ github.token }} | |
| run:| | |
| echo "Using template preset: ${INPUTS_TEMPLATE_PRESET}" | |
| echo "template_preset=${INPUTS_TEMPLATE_PRESET}" >> "${GITHUB_OUTPUT}" | |
| # For workflow_dispatch, use the provided PR URL | |
| if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]]; then | |
| if ! GITHUB_USER_ID=$(gh api "users/${GITHUB_ACTOR}" --jq '.id'); then | |
| echo "::error::Failed to get GitHub user ID for actor ${GITHUB_ACTOR}" | |
| exit 1 | |
| fi | |
| echo "Using workflow_dispatch actor: ${GITHUB_ACTOR} (ID: ${GITHUB_USER_ID})" | |
| echo "github_user_id=${GITHUB_USER_ID}" >> "${GITHUB_OUTPUT}" | |
| echo "github_username=${GITHUB_ACTOR}" >> "${GITHUB_OUTPUT}" | |
| echo "Using PR URL: ${INPUTS_PR_URL}" | |
| # Convert /pull/ to /issues/ for create-task-action compatibility | |
| ISSUE_URL="${INPUTS_PR_URL/\/pull\//\/issues\/}" | |
| echo "pr_url=${ISSUE_URL}" >> "${GITHUB_OUTPUT}" | |
| # Extract PR number from URL for later use | |
| PR_NUMBER=$(echo "${INPUTS_PR_URL}" | grep -oP '(?<=pull/)\d+') | |
| echo "pr_number=${PR_NUMBER}" >> "${GITHUB_OUTPUT}" | |
| elif [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then | |
| GITHUB_USER_ID=${GITHUB_EVENT_SENDER_ID} | |
| echo "Using label adder: ${GITHUB_EVENT_SENDER_LOGIN} (ID: ${GITHUB_USER_ID})" | |
| echo "github_user_id=${GITHUB_USER_ID}" >> "${GITHUB_OUTPUT}" | |
| echo "github_username=${GITHUB_EVENT_SENDER_LOGIN}" >> "${GITHUB_OUTPUT}" | |
| echo "Using PR URL: ${GITHUB_EVENT_PR_HTML_URL}" | |
| # Convert /pull/ to /issues/ for create-task-action compatibility | |
| ISSUE_URL="${GITHUB_EVENT_PR_HTML_URL/\/pull\//\/issues\/}" | |
| echo "pr_url=${ISSUE_URL}" >> "${GITHUB_OUTPUT}" | |
| echo "pr_number=${GITHUB_EVENT_PR_NUMBER}" >> "${GITHUB_OUTPUT}" | |
| else | |
| echo "::error::Unsupported event type: ${GITHUB_EVENT_NAME}" | |
| exit 1 | |
| fi | |
| -name:Extract changed files and build prompt | |
| id:extract-context | |
| env: | |
| PR_URL:${{ steps.determine-context.outputs.pr_url }} | |
| PR_NUMBER:${{ steps.determine-context.outputs.pr_number }} | |
| GH_TOKEN:${{ github.token }} | |
| run:| | |
| echo "Analyzing PR #${PR_NUMBER}" | |
| # Build task prompt - using unquoted heredoc so variables expand | |
| TASK_PROMPT=$(cat <<EOF | |
| Review PR #${PR_NUMBER} and determine if documentation needs updating or creating. | |
| PR URL: ${PR_URL} | |
| WORKFLOW: | |
| 1. Setup (repo is pre-cloned at ~/coder) | |
| cd ~/coder | |
| git fetch origin pull/${PR_NUMBER}/head:pr-${PR_NUMBER} | |
| git checkout pr-${PR_NUMBER} | |
| 2. Get PR info | |
| Use GitHub MCP tools to get PR title, body, and diff | |
| Or use: git diff main...pr-${PR_NUMBER} | |
| 3. Understand Changes | |
| Read the diff and identify what changed | |
| Ask: Is this user-facing? Does it change behavior? Is it a new feature? | |
| 4. Search for Related Docs | |
| cat ~/coder/docs/manifest.json | jq '.routes[] | {title, path}' | head -50 | |
| grep -ri "relevant_term" ~/coder/docs/ --include="*.md" | |
| 5. Decide | |
| NEEDS DOCS if: New feature, API change, CLI change, behavior change, user-visible | |
| NO DOCS if: Internal refactor, test-only, already documented, non-user-facing, dependency updates | |
| FIRST check: Did this PR already update docs? If yes and complete, say "No Changes Needed" | |
| 6. Comment on the PR using this format | |
| COMMENT FORMAT: | |
| ## 📚 Documentation Check | |
| ### ✅ Updates Needed | |
| - **[docs/path/file.md](github_link)** - Brief what needs changing | |
| ### 📝 New Docs Needed | |
| - **docs/suggested/location.md** - What should be documented | |
| ### ✨ No Changes Needed | |
| [Reason: Documents already updated in PR | Internal changes only | Test-only | No user-facing impact] | |
| --- | |
| *This comment was generated by an AI Agent through [Coder Tasks](https://coder.com/docs/ai-coder/tasks)* | |
| DOCS STRUCTURE: | |
| Read ~/coder/docs/manifest.json for the complete documentation structure. | |
| Common areas include: reference/, admin/, user-guides/, ai-coder/, install/, tutorials/ | |
| But check manifest.json - it has everything. | |
| EOF | |
| ) | |
| # Output the prompt | |
| { | |
| echo "task_prompt<<EOFOUTPUT" | |
| echo "${TASK_PROMPT}" | |
| echo "EOFOUTPUT" | |
| } >> "${GITHUB_OUTPUT}" | |
| -name:Checkout create-task-action | |
| uses:actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8# v5.0.0 | |
| with: | |
| fetch-depth:1 | |
| path:./.github/actions/create-task-action | |
| persist-credentials:false | |
| ref:main | |
| repository:coder/create-task-action | |
| -name:Create Coder Task for Documentation Check | |
| id:create_task | |
| uses:./.github/actions/create-task-action | |
| with: | |
| coder-url:${{ secrets.DOC_CHECK_CODER_URL }} | |
| coder-token:${{ secrets.DOC_CHECK_CODER_SESSION_TOKEN }} | |
| coder-organization:"default" | |
| coder-template-name:coder | |
| coder-template-preset:${{ steps.determine-context.outputs.template_preset }} | |
| coder-task-name-prefix:doc-check | |
| coder-task-prompt:${{ steps.extract-context.outputs.task_prompt }} | |
| github-user-id:${{ steps.determine-context.outputs.github_user_id }} | |
| github-token:${{ github.token }} | |
| github-issue-url:${{ steps.determine-context.outputs.pr_url }} | |
| comment-on-issue:true | |
| -name:Write outputs | |
| env: | |
| TASK_CREATED:${{ steps.create_task.outputs.task-created }} | |
| TASK_NAME:${{ steps.create_task.outputs.task-name }} | |
| TASK_URL:${{ steps.create_task.outputs.task-url }} | |
| PR_URL:${{ steps.determine-context.outputs.pr_url }} | |
| run:| | |
| { | |
| echo "## Documentation Check Task" | |
| echo "" | |
| echo "**PR:** ${PR_URL}" | |
| echo "**Task created:** ${TASK_CREATED}" | |
| echo "**Task name:** ${TASK_NAME}" | |
| echo "**Task URL:** ${TASK_URL}" | |
| echo "" | |
| echo "The Coder task is analyzing the PR changes and will comment with documentation recommendations." | |
| } >> "${GITHUB_STEP_SUMMARY}" |