Auto Optimization Draft PR #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
| name: Auto Optimization Draft PR | |
| "on": | |
| issues: | |
| types: [opened, edited, reopened, labeled] | |
| workflow_dispatch: | |
| inputs: | |
| issue_number: | |
| description: "Monthly optimization task issue number" | |
| required: true | |
| jobs: | |
| auto-pr: | |
| if: contains(github.event.issue.labels.*.name, 'monthly-optimization-task') || inputs.issue_number != '' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| actions: write | |
| contents: write | |
| issues: write | |
| pull-requests: write | |
| env: | |
| FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - name: Check automation prerequisites | |
| id: prereqs | |
| env: | |
| ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} | |
| run: | | |
| mkdir -p data/output/auto_optimization | |
| if [ -z "${ANTHROPIC_API_KEY}" ]; then | |
| echo "has_anthropic_key=false" >> "$GITHUB_OUTPUT" | |
| echo "Claude automation skipped: ANTHROPIC_API_KEY is not configured for this repo." > data/output/auto_optimization/skip_reason.txt | |
| else | |
| echo "has_anthropic_key=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Load issue context | |
| id: issue_context | |
| run: | | |
| python3 - <<'PY' | |
| import json | |
| import os | |
| import urllib.request | |
| from pathlib import Path | |
| repo = os.environ["GITHUB_REPOSITORY"] | |
| issue_number = os.environ["ISSUE_NUMBER"] | |
| token = os.environ["GITHUB_TOKEN"] | |
| api_url = f"https://api.github.com/repos/{repo}/issues/{issue_number}" | |
| request = urllib.request.Request( | |
| api_url, | |
| headers={ | |
| "Accept": "application/vnd.github+json", | |
| "Authorization": f"Bearer {token}", | |
| "X-GitHub-Api-Version": "2022-11-28", | |
| "User-Agent": "auto-optimization-pr", | |
| }, | |
| ) | |
| with urllib.request.urlopen(request) as response: | |
| issue = json.load(response) | |
| issue_context = { | |
| "number": issue["number"], | |
| "title": issue["title"], | |
| "body": issue.get("body", ""), | |
| } | |
| output_dir = Path("data/output/auto_optimization") | |
| output_dir.mkdir(parents=True, exist_ok=True) | |
| (output_dir / "issue_context.json").write_text( | |
| json.dumps(issue_context, ensure_ascii=False, indent=2) + "\n", | |
| encoding="utf-8", | |
| ) | |
| with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as output: | |
| print("issue_title<<EOF", file=output) | |
| print(issue_context["title"], file=output) | |
| print("EOF", file=output) | |
| print("issue_body<<EOF", file=output) | |
| print(issue_context["body"], file=output) | |
| print("EOF", file=output) | |
| PY | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| ISSUE_NUMBER: ${{ inputs.issue_number || github.event.issue.number }} | |
| - name: Prepare auto optimization payload | |
| id: auto_payload | |
| run: | | |
| python3 scripts/prepare_auto_optimization_pr.py \ | |
| --issue-context-file data/output/auto_optimization/issue_context.json \ | |
| --output-dir data/output/auto_optimization >> "$GITHUB_OUTPUT" | |
| - name: Append task summary | |
| run: cat data/output/auto_optimization/task_summary.md >> "$GITHUB_STEP_SUMMARY" | |
| - name: Append skip reason | |
| if: steps.prereqs.outputs.has_anthropic_key != 'true' || steps.auto_payload.outputs.should_run != 'true' | |
| run: | | |
| if [ -f data/output/auto_optimization/skip_reason.txt ]; then | |
| cat data/output/auto_optimization/skip_reason.txt >> "$GITHUB_STEP_SUMMARY" | |
| else | |
| echo "No eligible low-risk auto-pr-safe tasks were found; skipping draft PR generation." >> "$GITHUB_STEP_SUMMARY" | |
| fi | |
| - name: Prepare automation branch | |
| if: steps.prereqs.outputs.has_anthropic_key == 'true' && steps.auto_payload.outputs.should_run == 'true' | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
| git checkout -B "${{ steps.auto_payload.outputs.branch_name }}" | |
| - name: Run Claude auto optimization | |
| if: steps.prereqs.outputs.has_anthropic_key == 'true' && steps.auto_payload.outputs.should_run == 'true' | |
| uses: anthropics/claude-code-action@v1 | |
| with: | |
| anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} | |
| github_token: ${{ secrets.GITHUB_TOKEN }} | |
| use_bedrock: false | |
| use_vertex: false | |
| prompt: | | |
| Do not ask for additional approval. | |
| Do not create a pull request yourself. The workflow will handle git, draft PR creation, and CI dispatch. | |
| Only implement the low-risk tasks explicitly marked `[auto-pr-safe]`. | |
| Ignore any medium-risk or high-risk tasks. | |
| You are working inside CryptoStrategies, the shared strategy-logic repository. | |
| Prefer minimal changes in shared helpers, documentation, and tests. | |
| Avoid changing shared production strategy behavior unless the task remains clearly low-risk and local. | |
| If the selected low-risk tasks do not map cleanly to this repository, leave the working tree unchanged. | |
| Run the most relevant tests or ruff checks when you make a change. | |
| ## Issue Title | |
| ${{ steps.issue_context.outputs.issue_title }} | |
| ## Issue Body | |
| ${{ steps.issue_context.outputs.issue_body }} | |
| - name: Detect changes | |
| id: changes | |
| if: steps.prereqs.outputs.has_anthropic_key == 'true' && steps.auto_payload.outputs.should_run == 'true' | |
| run: | | |
| if git diff --quiet; then | |
| echo "has_changes=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "has_changes=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Commit and push automation branch | |
| if: steps.changes.outputs.has_changes == 'true' | |
| run: | | |
| git add -A | |
| git commit -m "${{ steps.auto_payload.outputs.commit_message }}" | |
| git push --force-with-lease origin "${{ steps.auto_payload.outputs.branch_name }}" | |
| - name: Create or update draft PR | |
| id: draft_pr | |
| if: steps.changes.outputs.has_changes == 'true' | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| BRANCH_NAME="${{ steps.auto_payload.outputs.branch_name }}" | |
| PR_TITLE="${{ steps.auto_payload.outputs.pr_title }}" | |
| PR_BODY_FILE="${{ steps.auto_payload.outputs.pr_body_file }}" | |
| EXISTING_PR_NUMBER=$(gh pr list --state open --head "${BRANCH_NAME}" --json number --jq '.[0].number // empty') | |
| if [ -n "${EXISTING_PR_NUMBER}" ]; then | |
| gh pr edit "${EXISTING_PR_NUMBER}" --title "${PR_TITLE}" --body-file "${PR_BODY_FILE}" | |
| PR_URL=$(gh pr view "${EXISTING_PR_NUMBER}" --json url --jq '.url') | |
| echo "pr_action=updated" >> "$GITHUB_OUTPUT" | |
| else | |
| PR_URL=$(gh pr create --draft --base main --head "${BRANCH_NAME}" --title "${PR_TITLE}" --body-file "${PR_BODY_FILE}") | |
| echo "pr_action=created" >> "$GITHUB_OUTPUT" | |
| fi | |
| echo "pr_url=${PR_URL}" >> "$GITHUB_OUTPUT" | |
| - name: Dispatch CI workflow on automation branch | |
| if: steps.changes.outputs.has_changes == 'true' | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: gh workflow run ci.yml --ref "${{ steps.auto_payload.outputs.branch_name }}" | |
| - name: Append automation result | |
| if: steps.prereqs.outputs.has_anthropic_key == 'true' && steps.auto_payload.outputs.should_run == 'true' | |
| run: | | |
| if [ "${{ steps.changes.outputs.has_changes }}" = "true" ]; then | |
| { | |
| echo "" | |
| echo "## Draft PR Result" | |
| echo "- Draft PR ${{ steps.draft_pr.outputs.pr_action }}: ${{ steps.draft_pr.outputs.pr_url }}" | |
| echo "- CI workflow dispatched on branch: `${{ steps.auto_payload.outputs.branch_name }}`" | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| else | |
| echo "No code changes were produced for the selected low-risk tasks." >> "$GITHUB_STEP_SUMMARY" | |
| fi |