Skip to content

Add GitHub Action to automate the creation of LLMs.txt and LLMs-full.txt #7

Add GitHub Action to automate the creation of LLMs.txt and LLMs-full.txt

Add GitHub Action to automate the creation of LLMs.txt and LLMs-full.txt #7

name: Update llms.txt and llms-full.txt
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:
inputs:
pr_number:
description: 'PR number to update LLM files for'
required: true
type: number
permissions:
contents: write
pull-requests: write
jobs:
update-llms:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Check if should run
id: should-run
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "=== Manual trigger detected - will run ==="
echo "should_run=true" >> $GITHUB_OUTPUT
echo "pr_number=${{ github.event.inputs.pr_number }}" >> $GITHUB_OUTPUT
else
echo "=== PR trigger detected - will skip with instructions ==="
echo "should_run=false" >> $GITHUB_OUTPUT
echo "pr_number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
fi
- name: Skip with instructions
if: steps.should-run.outputs.should_run == 'false'
run: |
echo "⏭️ This check is skipped by default."
echo ""
echo "To update LLM summary files:"
echo "1. Click 'Re-run jobs' above → 'Run workflow'"
echo "2. OR go to Actions tab → 'Update llms.txt and llms-full.txt' → 'Run workflow'"
echo ""
echo "This will update llms.txt and llms-full.txt files in subdirectories based on your documentation changes."
echo ""
echo "This is optional and not required for PR approval."
- name: Get PR information
if: steps.should-run.outputs.should_run == 'true'
id: pr-info
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ steps.should-run.outputs.pr_number }}
run: |
echo "=== Getting PR information ==="
pr_data=$(gh pr view $PR_NUMBER --json headRefName,baseRefName,state)
head_ref=$(echo "$pr_data" | jq -r '.headRefName')
base_ref=$(echo "$pr_data" | jq -r '.baseRefName')
state=$(echo "$pr_data" | jq -r '.state')
echo "PR #$PR_NUMBER:"
echo " Head: $head_ref"
echo " Base: $base_ref"
echo " State: $state"
if [ "$state" != "OPEN" ]; then
echo "Error: PR #$PR_NUMBER is not open"
exit 1
fi
echo "head_ref=$head_ref" >> $GITHUB_OUTPUT
echo "base_ref=$base_ref" >> $GITHUB_OUTPUT
- name: Checkout repository
if: steps.should-run.outputs.should_run == 'true'
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ steps.pr-info.outputs.head_ref }}
- name: Install Cursor CLI
if: steps.should-run.outputs.should_run == 'true'
run: |
curl https://cursor.com/install -fsS | bash
echo "$HOME/.cursor/bin" >> $GITHUB_PATH
- name: Configure git
if: steps.should-run.outputs.should_run == 'true'
run: |
git config user.name "Cursor Agent"
git config user.email "[email protected]"
- name: Detect changed subdirectories
if: steps.should-run.outputs.should_run == 'true'
id: detect-changes
run: |
echo "=== Detecting changed subdirectories ==="
changed_files=$(git diff --name-only origin/${{ steps.pr-info.outputs.base_ref }}...HEAD -- docs/)
echo "Changed files in docs/:"
echo "$changed_files"
changed_subdirs=""
for file in $changed_files; do
subdir=$(echo "$file" | sed -n 's|^docs/\([^/]*\)/.*|\1|p')
if [ -n "$subdir" ] && [ -f "docs/$subdir/llms.txt" ] && [ -f "docs/$subdir/llms-full.txt" ]; then
if [[ ! "$changed_subdirs" =~ (^|[[:space:]])"$subdir"($|[[:space:]]) ]]; then
changed_subdirs="$changed_subdirs $subdir"
echo "Found subdirectory with llms files: $subdir"
fi
fi
done
changed_subdirs=$(echo "$changed_subdirs" | xargs)
echo "changed_subdirs=$changed_subdirs" >> $GITHUB_OUTPUT
echo "=== Final changed subdirectories: $changed_subdirs ==="
- name: Update LLM summary files
if: steps.should-run.outputs.should_run == 'true' && steps.detect-changes.outputs.changed_subdirs != ''
env:
MODEL: gpt-5
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CHANGED_SUBDIRS: ${{ steps.detect-changes.outputs.changed_subdirs }}
run: |
echo "=== Starting LLM summary files update ==="
echo "Processing subdirectories: $CHANGED_SUBDIRS"
cursor-agent -p "You are updating documentation summary files in a GitHub Actions runner.
IMPORTANT: Do NOT create branches, commit, push, or post PR comments. Only modify files in the working directory as needed.
# Context:
- Repo: ${{ github.repository }}
- PR Number: ${{ steps.should-run.outputs.pr_number }}
- Base Ref: ${{ steps.pr-info.outputs.base_ref }}
- Head Ref: ${{ steps.pr-info.outputs.head_ref }}
- Changed Subdirectories: $CHANGED_SUBDIRS
# Your Task:
Update llms.txt and llms-full.txt files in the changed subdirectories based on documentation changes in this PR.
# Step-by-Step Process (print each step):
1. Print 'STEP 1: Getting PR diff'
2. Get PR changes: \`gh pr diff ${{ steps.should-run.outputs.pr_number }}\`
3. Print 'STEP 2: Processing subdirectories: $CHANGED_SUBDIRS'
4. For each subdirectory in CHANGED_SUBDIRS:
a. Print 'STEP 3a: Reading docs/[subdirectory]/llms.txt'
b. Print 'STEP 3b: Reading docs/[subdirectory]/llms-full.txt'
c. Print 'STEP 3c: Analyzing changes for [subdirectory]'
d. If updates needed: Print 'STEP 3d: Updating files for [subdirectory]' and modify files
e. If no updates needed: Print 'STEP 3e: No updates needed for [subdirectory]'
5. Print 'STEP 4: File modifications complete'
6. Print 'TASK_FINISHED'
# File Requirements:
- Only modify docs/[subdirectory]/llms.txt and docs/[subdirectory]/llms-full.txt files
- Do NOT modify root-level llms.txt or llms-full.txt files
- llms.txt should be a concise summary/index of subdirectory documentation
- llms-full.txt should be a comprehensive guide with code examples
- Maintain existing format and style
- Only update files that need changes based on PR content
# Restrictions:
- NO git operations (no commit, push, branch creation)
- NO PR comments or API calls except gh pr diff
- Only file modifications in working directory
- Print progress steps as you go
- End with 'TASK_FINISHED'
Begin now and print each step clearly.
" --force --model "$MODEL" --output-format=text
echo "=== Cursor agent completed ==="
- name: Commit changes to PR branch
if: steps.should-run.outputs.should_run == 'true' && steps.detect-changes.outputs.changed_subdirs != ''
id: commit_changes
run: |
echo "=== Checking for changes ==="
git add -A
if git diff --staged --quiet; then
echo "No changes to commit"
echo "changes_committed=false" >> $GITHUB_OUTPUT
exit 0
fi
echo "Changes detected:"
git diff --staged --name-only
COMMIT_MSG="docs: update llms summaries for subdirectories (${{ steps.detect-changes.outputs.changed_subdirs }})"
git commit -m "$COMMIT_MSG"
git push origin ${{ steps.pr-info.outputs.head_ref }}
echo "changes_committed=true" >> $GITHUB_OUTPUT
echo "=== Changes committed successfully ==="
- name: Post PR comment about updates
if: steps.commit_changes.outputs.changes_committed == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ steps.should-run.outputs.pr_number }}
run: |
echo "=== Posting PR comment about updates ==="
changed_files=$(git diff HEAD~1 --name-only | grep -E "llms(-full)?\.txt$" | head -10)
COMMENT_FILE="${RUNNER_TEMP}/llms-update-comment.md"
{
echo "✅ **LLM summary files updated successfully!**"
echo ""
echo "Updated documentation summary files based on changes in subdirectories: \`${{ steps.detect-changes.outputs.changed_subdirs }}\`"
echo ""
echo "**Files updated:**"
for file in $changed_files; do
echo "- \`$file\`"
done
echo ""
echo "_These files help AI assistants provide better guidance about your documentation._"
echo ""
echo "<!-- auto-update-llms -->"
} > "$COMMENT_FILE"
gh pr comment "$PR_NUMBER" --body-file "$COMMENT_FILE"
echo "=== PR comment posted successfully ==="
- name: Report no changes needed
if: steps.should-run.outputs.should_run == 'true' && steps.detect-changes.outputs.changed_subdirs == ''
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ steps.should-run.outputs.pr_number }}
run: |
echo "ℹ️ No subdirectories with LLM summary files were changed in this PR." | \
gh pr comment "$PR_NUMBER" --body-file -