Agentic Maintenance (microsoft/aspire.dev) #1
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
| # ___ _ _ | |
| # / _ \ | | (_) | |
| # | |_| | __ _ ___ _ __ | |_ _ ___ | |
| # | _ |/ _` |/ _ \ '_ \| __| |/ __| | |
| # | | | | (_| | __/ | | | |_| | (__ | |
| # \_| |_/\__, |\___|_| |_|\__|_|\___| | |
| # __/ | | |
| # _ _ |___/ | |
| # | | | | / _| | | |
| # | | | | ___ _ __ _ __| |_| | _____ ____ | |
| # | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| | |
| # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ | |
| # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ | |
| # | |
| # This file was automatically generated by pkg/workflow/side_repo_maintenance.go (v0.79.6). DO NOT EDIT. | |
| # | |
| # To regenerate this workflow, run: | |
| # gh aw compile | |
| # Not all edits will cause changes to this file. | |
| # | |
| # For more information: https://github.github.com/gh-aw/introduction/overview/ | |
| # | |
| # This file is the agentic maintenance workflow for the SideRepoOps target | |
| # repository "microsoft/aspire.dev". It lives in the side (automation) repository and runs | |
| # maintenance operations — safe-outputs replay, label creation, activity reports, | |
| # validation, and expired-entity cleanup — against that target repository using a | |
| # dedicated cross-repo token. | |
| # | |
| # You do not need to edit this file manually. It is regenerated automatically whenever | |
| # you recompile your workflows. To regenerate, run: | |
| # gh aw compile | |
| # | |
| # For more information on the SideRepoOps pattern and how this file fits into it, see: | |
| # https://github.github.com/gh-aw/patterns/side-repo-ops/ | |
| # | |
| name: Agentic Maintenance (microsoft/aspire.dev) | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| operation: | |
| description: 'Optional maintenance operation to run' | |
| required: false | |
| type: choice | |
| default: '' | |
| options: | |
| - '' | |
| - 'safe_outputs' | |
| - 'create_labels' | |
| - 'activity_report' | |
| - 'validate' | |
| run_url: | |
| description: 'Run URL or run ID to replay safe outputs from (e.g. https://github.com/owner/repo/actions/runs/12345 or 12345). Required when operation is safe_outputs.' | |
| required: false | |
| type: string | |
| default: '' | |
| workflow_call: | |
| inputs: | |
| operation: | |
| description: 'Optional maintenance operation to run (safe_outputs, create_labels, activity_report, validate)' | |
| required: false | |
| type: string | |
| default: '' | |
| run_url: | |
| description: 'Run URL or run ID to replay safe outputs from (e.g. https://github.com/owner/repo/actions/runs/12345 or 12345). Required when operation is safe_outputs.' | |
| required: false | |
| type: string | |
| default: '' | |
| outputs: | |
| applied_run_url: | |
| description: 'The run URL that safe outputs were applied from' | |
| value: ${{ jobs.apply_safe_outputs.outputs.run_url }} | |
| schedule: | |
| - cron: "43 15 * * *" # Daily (based on minimum expires: 30 days) | |
| permissions: {} | |
| jobs: | |
| close-expired-entities: | |
| if: ${{ (!(github.event.repository.fork)) && (github.event_name != 'workflow_dispatch' && github.event_name != 'workflow_call' || inputs.operation == '') }} | |
| runs-on: ubuntu-slim | |
| permissions: | |
| discussions: write | |
| issues: write | |
| pull-requests: write | |
| # Runs on schedule: 43 15 * * * (Daily) | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Close expired discussions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_AW_TARGET_REPO_SLUG: "microsoft/aspire.dev" | |
| with: | |
| github-token: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/close_expired_discussions.cjs'); | |
| await main(); | |
| - name: Close expired issues | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_AW_TARGET_REPO_SLUG: "microsoft/aspire.dev" | |
| with: | |
| github-token: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/close_expired_issues.cjs'); | |
| await main(); | |
| - name: Close expired pull requests | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_AW_TARGET_REPO_SLUG: "microsoft/aspire.dev" | |
| with: | |
| github-token: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/close_expired_pull_requests.cjs'); | |
| await main(); | |
| apply_safe_outputs: | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'safe_outputs' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| permissions: | |
| actions: read | |
| contents: write | |
| discussions: write | |
| issues: write | |
| pull-requests: write | |
| outputs: | |
| run_url: ${{ steps.record.outputs.run_url }} | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); | |
| await main(); | |
| - name: Apply Safe Outputs | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| GH_AW_RUN_URL: ${{ inputs.run_url }} | |
| GH_AW_TARGET_REPO_SLUG: "microsoft/aspire.dev" | |
| with: | |
| github-token: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/apply_safe_outputs_replay.cjs'); | |
| await main(); | |
| - name: Record outputs | |
| id: record | |
| run: echo "run_url=${{ inputs.run_url }}" >> "$GITHUB_OUTPUT" | |
| create_labels: | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'create_labels' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| permissions: | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| version: v0.79.6 | |
| - name: Create missing labels in target repository | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_AW_CMD_PREFIX: gh aw | |
| GH_AW_TARGET_REPO_SLUG: "microsoft/aspire.dev" | |
| with: | |
| github-token: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/create_labels.cjs'); | |
| await main(); | |
| activity_report: | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'activity_report' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| timeout-minutes: 120 | |
| permissions: | |
| actions: read | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| version: v0.79.6 | |
| - name: Restore activity report logs cache | |
| id: activity_report_logs_cache | |
| uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 | |
| with: | |
| path: ./.cache/gh-aw/activity-report-logs | |
| key: ${{ runner.os }}-activity-report-logs-microsoft/aspire.dev-${{ github.ref_name }}-${{ github.run_id }} | |
| restore-keys: | | |
| ${{ runner.os }}-activity-report-logs-microsoft/aspire.dev- | |
| ${{ runner.os }}-activity-report-logs- | |
| - name: Download activity report logs in target repository | |
| timeout-minutes: 20 | |
| shell: bash | |
| env: | |
| GH_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| GH_AW_CMD_PREFIX: gh aw | |
| GH_AW_TARGET_REPO_SLUG: "microsoft/aspire.dev" | |
| run: | | |
| ${GH_AW_CMD_PREFIX} logs \ | |
| --repo "${GH_AW_TARGET_REPO_SLUG}" \ | |
| --start-date -1w \ | |
| --count 100 \ | |
| --output ./.cache/gh-aw/activity-report-logs \ | |
| --format markdown \ | |
| > ./.cache/gh-aw/activity-report-logs/report.md | |
| - name: Save activity report logs cache | |
| if: ${{ always() }} | |
| uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 | |
| with: | |
| path: ./.cache/gh-aw/activity-report-logs | |
| key: ${{ steps.activity_report_logs_cache.outputs.cache-primary-key }} | |
| - name: Generate activity report issue in target repository | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GH_AW_GITHUB_TOKEN }} | |
| script: | | |
| const fs = require('node:fs'); | |
| const reportPath = './.cache/gh-aw/activity-report-logs/report.md'; | |
| if (!fs.existsSync(reportPath)) { | |
| core.warning('Activity report markdown not found at ' + reportPath + '; skipping issue creation.'); | |
| return; | |
| } | |
| let reportBody = ''; | |
| try { | |
| reportBody = fs.readFileSync(reportPath, 'utf8').trim(); | |
| } catch (error) { | |
| core.warning('Failed to read activity report markdown at ' + reportPath + ': ' + error.message); | |
| return; | |
| } | |
| if (!reportBody) { | |
| core.warning('Activity report markdown is empty at ' + reportPath + '; skipping issue creation.'); | |
| return; | |
| } | |
| const repoSlug = process.env.GH_AW_TARGET_REPO_SLUG || ''; | |
| const [owner, repo] = repoSlug.split('/'); | |
| if (!owner || !repo) { | |
| core.setFailed('Invalid GH_AW_TARGET_REPO_SLUG: ' + repoSlug); | |
| return; | |
| } | |
| const body = [ | |
| '### Agentic workflow activity report', | |
| '', | |
| 'Repository: ' + repoSlug, | |
| 'Generated at: ' + new Date().toISOString(), | |
| '', | |
| reportBody, | |
| ].join('\n'); | |
| const createdIssue = await github.rest.issues.create({ | |
| owner, | |
| repo, | |
| title: '[aw] agentic status report', | |
| body, | |
| labels: ['agentic-workflows'], | |
| }); | |
| core.info('Created issue #' + createdIssue.data.number + ': ' + createdIssue.data.html_url); | |
| validate_workflows: | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'validate' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 | |
| with: | |
| version: v0.79.6 | |
| - name: Validate workflows and file issue on findings | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_AW_CMD_PREFIX: gh aw | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require('${{ runner.temp }}/gh-aw/actions/run_validate_workflows.cjs'); | |
| await main(); |