-
Notifications
You must be signed in to change notification settings - Fork 564
Add GitHub Action to automate the creation of LLMs.txt and LLMs-full.txt #296
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
25 commits
Select commit
Hold shift + click to select a range
63fa1d0
Add GitHub Action to automate the creation of LLMs.txt
youssefea 84337c2
Rename workflow to update llms.txt files
youssefea c767b17
test commit
youssefea e72fdc4
Modify GitHub Actions workflow for documentation updates
youssefea 2c3298c
Update model version from gpt-4o to gpt-5
youssefea 13da6cb
Refactor GitHub Actions workflow for documentation updates
youssefea 2665fda
Update main.yml
youssefea 64c6872
Refactor GitHub Actions workflow for LLM updates
youssefea abde586
Update main.yml
youssefea 2d88dcc
docs: update llms summaries for PR #296
cursoragent 9d5f95c
updates
youssefea 91b6ad5
Restrict llms.txt updates and enhance logging
youssefea 55bf3aa
update web react page to test llms.txt update
youssefea 424ffaa
docs: update llms summaries for subdirectories (base-account)
cursoragent 6407734
update automation name
youssefea 91f6f3c
add llms txt automation
youssefea fe26c49
bring back react to test
youssefea c76d059
update llms automation
youssefea 31fb64a
update github action
youssefea 040508c
make trigger manual
youssefea 5965cbe
update yml
youssefea cfe499e
update yml
youssefea b7ddc2d
update
youssefea 3a425e7
update yml
youssefea ce88318
update flow
youssefea File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,237 @@ | ||
| 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 "cursoragent@cursor.com" | ||
|
|
||
| - 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 - | ||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,56 @@ | ||
| name: LLM Files Update Available | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [opened, synchronize, reopened, ready_for_review] | ||
|
|
||
| permissions: | ||
| pull-requests: write | ||
|
|
||
| jobs: | ||
| post-instruction: | ||
| if: ${{ !startsWith(github.head_ref, 'docs/') }} | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Post instruction comment | ||
| env: | ||
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| PR_NUMBER: ${{ github.event.pull_request.number }} | ||
| run: | | ||
| # Check if instruction comment already exists | ||
| existing_comment=$(gh pr view $PR_NUMBER --json comments --jq '.comments[] | select(.body | contains("<!-- llms-instruction -->")) | .id' || echo "") | ||
|
|
||
| INSTRUCTION_FILE="${RUNNER_TEMP}/instruction-comment.md" | ||
| { | ||
| echo "⏭️ **LLM Summary Files Update Available**" | ||
| echo "" | ||
| echo "This PR can automatically update \`llms.txt\` and \`llms-full.txt\` files in subdirectories based on your documentation changes." | ||
| echo "" | ||
| echo "**To trigger the automation:**" | ||
| echo "" | ||
| echo "**Option 1: From PR checks below** ⬇️" | ||
| echo "- Find \"Update llms.txt and llms-full.txt\" in the checks list below" | ||
| echo "- Click \"Details\" → \"Re-run jobs\" → \"Run workflow\"" | ||
| echo "" | ||
| echo "**Option 2: From Actions tab**" | ||
| echo "- Go to [Actions tab](https://github.com/${{ github.repository }}/actions/workflows/llms-txt-automation.yml)" | ||
| echo "- Click \"Run workflow\" → Enter PR #$PR_NUMBER" | ||
| echo "" | ||
| echo "**What it does:**" | ||
| echo "- Detects which subdirectories have documentation changes" | ||
| echo "- Updates the corresponding \`llms.txt\` and \`llms-full.txt\` summary files" | ||
| echo "- Commits the changes directly to this PR branch" | ||
| echo "" | ||
| echo "_This automation is optional and not required for PR approval._" | ||
| echo "" | ||
| echo "<!-- llms-instruction -->" | ||
| } > "$INSTRUCTION_FILE" | ||
|
|
||
| if [ -n "$existing_comment" ]; then | ||
| echo "Updating existing instruction comment" | ||
| gh api repos/${{ github.repository }}/issues/comments/$existing_comment \ | ||
| -X PATCH -f body="$(cat $INSTRUCTION_FILE)" | ||
| else | ||
| echo "Posting new instruction comment" | ||
| gh pr comment $PR_NUMBER --body-file "$INSTRUCTION_FILE" | ||
| fi |
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 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 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
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.