name: Resource Sync on: schedule: - cron: "0 4 * * *" workflow_dispatch: inputs: limit: description: "Candidate fetch limit per source" required: false default: "20" max_promotions: description: "Optional max number of candidate promotions" required: false default: "" enforce_pashto_relevance: description: "Also remove existing entries without Pashto evidence" required: false default: "true" permissions: contents: write pull-requests: write env: RESOURCE_LIMIT: ${{ github.event.inputs.limit || '20' }} MAX_PROMOTIONS: ${{ github.event.inputs.max_promotions || '' }} ENFORCE_PASHTO_RELEVANCE: ${{ github.event.inputs.enforce_pashto_relevance || 'true' }} jobs: sync: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install -e ".[dev]" - name: Review existing resources for stale or low-value entries run: | if [ "${ENFORCE_PASHTO_RELEVANCE}" = "true" ]; then python scripts/review_existing_resources.py --enforce-pashto-relevance else python scripts/review_existing_resources.py fi - name: Sync candidate resources run: python scripts/sync_resources.py --limit "${RESOURCE_LIMIT}" - name: Auto-promote valid candidates run: | if [ -n "${MAX_PROMOTIONS}" ]; then python scripts/promote_candidates.py --max-promotions "${MAX_PROMOTIONS}" else python scripts/promote_candidates.py fi - name: Validate catalog run: python scripts/validate_resource_catalog.py - name: Generate resource views run: python scripts/generate_resource_views.py - name: Ensure labels exist uses: actions/github-script@v7 with: script: | const labels = [ { name: "resource-update", color: "0e8a16", description: "Automated resource catalog updates" }, { name: "needs-review", color: "fbca04", description: "Needs maintainer review before merge" } ]; for (const label of labels) { try { await github.rest.issues.getLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label.name }); } catch (error) { if (error.status === 404) { await github.rest.issues.createLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label.name, color: label.color, description: label.description }); } else { throw error; } } } - name: Create review PR uses: peter-evans/create-pull-request@v6 with: branch: bot/resource-sync delete-branch: true commit-message: "chore(resources): sync candidate feed and auto-promote valid entries" title: "chore(resources): sync and auto-promote Pashto resources" body: | Automated daily resource sync. Scope: - Reviews existing catalog entries and removes stale ones only with strong logged reasons - Updates `resources/catalog/pending_candidates.json` - Auto-promotes valid non-duplicate candidates into `resources/catalog/resources.json` - Regenerates resource indexes and search payload labels: | resource-update needs-review add-paths: | resources/catalog/pending_candidates.json resources/catalog/resources.json resources/catalog/removal_log.json resources/README.md resources/datasets/README.md resources/models/README.md resources/benchmarks/README.md resources/tools/README.md resources/papers/README.md resources/projects/README.md resources/codes/README.md docs/search/resources.json