mirror of
https://github.com/coder/coder.git
synced 2026-09-21 12:44:32 +08:00
<!-- If you have used AI to produce some or all of this PR, please ensure you have read our [AI Contribution guidelines](https://coder.com/docs/about/contributing/AI_CONTRIBUTING) before submitting. --> Making this PR to test the workflow --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
206 lines
8.2 KiB
YAML
206 lines
8.2 KiB
YAML
# 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}"
|