| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- name: Sync Documentation
- on:
- push:
- branches:
- - main
- paths:
- - 'registry.json'
- - '.opencode/agent/**'
- - '.opencode/command/**'
- - '.opencode/context/**'
- workflow_dispatch:
- inputs:
- force_update:
- description: 'Force documentation update even if no changes detected'
- required: false
- type: boolean
- default: false
- permissions:
- contents: write
- pull-requests: write
- issues: write
- jobs:
- check-sync-needed:
- name: Check if Docs Need Sync
- runs-on: ubuntu-latest
- outputs:
- needs_sync: ${{ steps.check.outputs.needs_sync }}
- changes_detected: ${{ steps.check.outputs.changes_detected }}
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
- with:
- fetch-depth: 2
-
- - name: Install dependencies
- run: |
- sudo apt-get update
- sudo apt-get install -y jq
-
- - name: Check if sync needed
- id: check
- run: |
- # Skip if this is an automated commit to prevent loops
- COMMIT_MSG=$(git log -1 --pretty=%B)
- if echo "$COMMIT_MSG" | grep -qE "\[skip ci\]|\[skip-docs\]|auto-update registry|bump version|Sync documentation"; then
- echo "needs_sync=false" >> $GITHUB_OUTPUT
- echo "changes_detected=Automated commit - skipping to prevent loops" >> $GITHUB_OUTPUT
- exit 0
- fi
-
- # Force update if requested
- if [ "${{ github.event.inputs.force_update }}" = "true" ]; then
- echo "needs_sync=true" >> $GITHUB_OUTPUT
- echo "changes_detected=Force update requested" >> $GITHUB_OUTPUT
- exit 0
- fi
-
- # Check if registry.json changed
- if git diff HEAD^ HEAD --name-only | grep -q "registry.json"; then
- echo "needs_sync=true" >> $GITHUB_OUTPUT
- echo "changes_detected=Registry updated" >> $GITHUB_OUTPUT
- exit 0
- fi
-
- # Check if component files changed
- if git diff HEAD^ HEAD --name-only | grep -qE "^\.opencode/(agent|command|context)/"; then
- echo "needs_sync=true" >> $GITHUB_OUTPUT
- echo "changes_detected=Component files updated" >> $GITHUB_OUTPUT
- exit 0
- fi
-
- echo "needs_sync=false" >> $GITHUB_OUTPUT
- echo "changes_detected=No relevant changes" >> $GITHUB_OUTPUT
- sync-documentation:
- name: Sync Documentation with OpenCode
- runs-on: ubuntu-latest
- needs: check-sync-needed
- if: needs.check-sync-needed.outputs.needs_sync == 'true'
- outputs:
- branch_name: ${{ steps.create_branch.outputs.branch_name }}
- issue_number: ${{ steps.create_issue.outputs.result }}
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- - name: Create sync branch
- id: create_branch
- run: |
- BRANCH_NAME="docs/auto-sync-$(date +%Y%m%d-%H%M%S)"
- echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
-
- git config user.name "github-actions[bot]"
- git config user.email "github-actions[bot]@users.noreply.github.com"
-
- git checkout -b "$BRANCH_NAME"
- git push -u origin "$BRANCH_NAME"
-
- - name: Create sync issue for OpenCode
- id: create_issue
- uses: actions/github-script@v7
- with:
- script: |
- const issue = await github.rest.issues.create({
- owner: context.repo.owner,
- repo: context.repo.repo,
- title: '🤖 Auto-sync documentation with registry',
- body: `## Documentation Sync Request
-
- **Trigger:** ${{ needs.check-sync-needed.outputs.changes_detected }}
- **Branch:** \`${{ steps.create_branch.outputs.branch_name }}\`
- **Commit:** ${{ github.sha }}
-
- ### Task
-
- Please review the current \`registry.json\` and update the following documentation files to ensure they accurately reflect the current component counts and descriptions:
-
- 1. **README.md** - Update installation profile component counts:
- - Essential profile: Update component count
- - Developer profile: Update component count
- - Business profile: Update component count
- - Full profile: Update component count
- - Advanced profile: Update component count
-
- 2. **README.md** - Verify "What's Included" section lists match registry
-
- 3. **docs/README.md** - Ensure component references are accurate
-
- ### Instructions
-
- 1. Read \`registry.json\` to get current component counts
- 2. Extract profile component counts from \`.profiles.<profile>.components | length\`
- 3. Update README.md sections that reference component counts
- 4. Ensure consistency across all documentation
- 5. Commit changes with message: "docs: sync component counts with registry [skip-docs]"
-
- **IMPORTANT:** Include \`[skip-docs]\` in commit message to prevent workflow loops!
-
- ### Context Files to Load
-
- - \`registry.json\` - Source of truth for components
- - \`README.md\` - Main documentation file
- - \`docs/README.md\` - Documentation index
-
- ### Validation
-
- After updates, verify:
- - All component counts match registry
- - No broken links
- - Consistent formatting
- - No duplicate information
-
- /opencode
-
- ---
-
- **Note:** This is an automated documentation sync. Review changes carefully before merging.`,
- labels: ['documentation', 'automated']
- });
-
- return issue.data.number;
-
- - name: Wait for OpenCode to process
- run: |
- echo "OpenCode will process the issue and make changes to branch: ${{ steps.create_branch.outputs.branch_name }}"
- echo "Issue created: #${{ steps.create_issue.outputs.result }}"
- echo ""
- echo "The workflow will:"
- echo "1. OpenCode reads the issue"
- echo "2. Analyzes registry.json"
- echo "3. Updates documentation files"
- echo "4. Commits changes to the branch"
- echo "5. Another workflow will create a PR after OpenCode finishes"
- echo ""
- echo "Check the issue for progress: https://github.com/${{ github.repository }}/issues/${{ steps.create_issue.outputs.result }}"
- echo ""
- echo "⏳ Note: OpenCode may take several minutes to complete the task."
- echo "The PR will be created automatically once OpenCode commits changes."
- # This job is intentionally removed - PR creation should be manual or triggered by a separate event
- # after OpenCode completes its work, not on a timer
-
- cleanup-on-failure:
- name: Cleanup on Failure
- runs-on: ubuntu-latest
- needs: [check-sync-needed, sync-documentation]
- if: failure()
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Delete branch if created
- run: |
- BRANCH_NAME="${{ needs.sync-documentation.outputs.branch_name }}"
- if [ -n "$BRANCH_NAME" ]; then
- git push origin --delete "$BRANCH_NAME" || true
- echo "Cleaned up branch: $BRANCH_NAME"
- fi
-
- - name: Comment on issue
- if: needs.sync-documentation.outputs.issue_number
- uses: actions/github-script@v7
- with:
- script: |
- await github.rest.issues.createComment({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: ${{ needs.sync-documentation.outputs.issue_number }},
- body: '❌ Documentation sync workflow failed. Please check the workflow logs and sync manually if needed.'
- });
-
- await github.rest.issues.update({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: ${{ needs.sync-documentation.outputs.issue_number }},
- state: 'closed',
- labels: ['documentation', 'automated', 'failed']
- });
|