{"id":50375728,"url":"https://github.com/qsliu2017/symphony-action","last_synced_at":"2026-05-30T09:30:33.818Z","repository":{"id":342330020,"uuid":"1173588065","full_name":"qsliu2017/symphony-action","owner":"qsliu2017","description":"An implementation of openai/symphony in Github Actions","archived":false,"fork":false,"pushed_at":"2026-03-05T17:12:32.000Z","size":43,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-05T18:46:33.606Z","etag":null,"topics":["claude-code","github-actions","openai","symphony"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qsliu2017.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-05T14:32:59.000Z","updated_at":"2026-03-05T17:12:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/qsliu2017/symphony-action","commit_stats":null,"previous_names":["qsliu2017/symphony-action"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/qsliu2017/symphony-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsliu2017%2Fsymphony-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsliu2017%2Fsymphony-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsliu2017%2Fsymphony-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsliu2017%2Fsymphony-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qsliu2017","download_url":"https://codeload.github.com/qsliu2017/symphony-action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsliu2017%2Fsymphony-action/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33687717,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","github-actions","openai","symphony"],"created_at":"2026-05-30T09:30:32.570Z","updated_at":"2026-05-30T09:30:33.811Z","avatar_url":"https://github.com/qsliu2017.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Symphony Action\n\nA reusable GitHub Action that runs an infinite loop of autonomous coding agents on your GitHub\nIssues using Claude Code CLI.\n\n**Loop:** Issue opened → Claude implements it on a branch → PR opened → CI runs → Claude reviews\n→ merge → find more issues → repeat.\n\n## Quick Start\n\n### 1. Add the Symphony workflow to your repo\n\nCreate `.github/workflows/symphony.yml`:\n\n```yaml\nname: Symphony\non:\n  issues:\n    types: [opened, reopened, labeled]\n  schedule:\n    - cron: '0 * * * *'   # hourly sweep for un-claimed issues\n  workflow_dispatch:\n    inputs:\n      issue_number:\n        description: \"Issue to work on (leave blank to auto-discover)\"\n        type: number\n        required: false\n\njobs:\n  dispatch:\n    uses: \u003cyour-org\u003e/symphony-action/.github/workflows/symphony-dispatch.yml@main\n    with:\n      issue_number: ${{ github.event.issue.number || inputs.issue_number }}\n    secrets:\n      CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}\n      # ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}  # alternative: use API key instead\n\n  # Trigger review after CI passes on a symphony PR\n  review:\n    if: github.event_name == 'pull_request' \u0026\u0026 startsWith(github.head_ref, 'symphony/issue-')\n    uses: \u003cyour-org\u003e/symphony-action/.github/workflows/symphony-review.yml@main\n    with:\n      pr_number: ${{ github.event.pull_request.number }}\n    secrets:\n      CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}\n      # ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}  # alternative: use API key instead\n```\n\n### 2. Add WORKFLOW.md to your repo root\n\nCopy `WORKFLOW.md.example` to `WORKFLOW.md` and customize the prompt and settings:\n\n```bash\ncurl -O https://raw.githubusercontent.com/\u003cyour-org\u003e/symphony-action/main/WORKFLOW.md.example\nmv WORKFLOW.md.example WORKFLOW.md\n```\n\n### 3. Add the required secret\n\nIn your repo settings → Secrets → Actions, add **one** of:\n- `CLAUDE_CODE_OAUTH_TOKEN` — token from `claude setup-token` (Claude.ai Pro/Max subscription)\n- `ANTHROPIC_API_KEY` — Anthropic API key (pay-per-token)\n\n### 4. Create GitHub issue labels\n\nSymphony uses these labels to track issue state:\n\n```bash\ngh label create \"symphony:todo\"        --color \"#0075ca\" --description \"Queued for Symphony\"\ngh label create \"symphony:claimed\"     --color \"#e4e669\" --description \"Symphony has picked this up\"\ngh label create \"symphony:in-progress\" --color \"#f9c74f\" --description \"Symphony is implementing\"\ngh label create \"symphony:pr-open\"     --color \"#90be6d\" --description \"Symphony opened a PR\"\ngh label create \"symphony:reviewing\"   --color \"#43aa8b\" --description \"Symphony is reviewing the PR\"\ngh label create \"symphony:done\"        --color \"#2d6a4f\" --description \"Symphony completed this\"\ngh label create \"symphony:failed\"      --color \"#e63946\" --description \"Symphony failed on this issue\"\n```\n\nOr run the setup script:\n\n```bash\nbash \u003c(curl -s https://raw.githubusercontent.com/\u003cyour-org\u003e/symphony-action/main/scripts/setup-labels.sh)\n```\n\n---\n\n## How It Works\n\n```\nIssue opened\n     │\n     ▼\nsymphony-dispatch  ──── checks concurrency limit\n     │                  (max_concurrent_agents from WORKFLOW.md)\n     ▼\nsymphony-worker    ──── labels issue symphony:in-progress\n     │                  assesses complexity\n     │                  creates sub-issues if complex\n     │                  runs Claude Code on a branch\n     │                  opens PR\n     ▼\nCI runs on PR      ──── your existing test/lint workflows\n     │\n   CI passes\n     │\n     ▼\nsymphony-review    ──── labels issue symphony:reviewing\n     │                  runs Claude Code to review the diff\n     │                  applies fixes if needed\n     │                  merges when clean\n     ▼\nsymphony-post-merge ─── finds remaining open issues\n     │                  triggers symphony-dispatch again\n     ▼\n     (loop)\n```\n\n---\n\n## WORKFLOW.md Reference\n\n```yaml\n---\nagent:\n  max_concurrent_agents: 3     # Max parallel Symphony runs (default: 10)\n  max_turns: 10                # Max review iterations before giving up (default: 20)\n  max_retry_backoff_ms: 300000 # Max backoff between retries\n\nhooks:\n  before_run: |                # Shell script run before Claude starts\n    npm install\n  after_run: |                 # Shell script run after Claude finishes\n    npm run lint --fix\n  timeout_ms: 120000           # Hook timeout in ms\n\nclaude:\n  command: claude              # Claude Code CLI binary (default: claude)\n  model: claude-sonnet-4-6     # Model to use (default: claude-sonnet-4-6)\n  max_tokens: 8096\n\ncomplexity:\n  sub_issue_threshold: auto    # \"auto\" = Claude decides | \"never\" = always direct\n---\n\nYour prompt template goes here. Available variables:\n\n  {{ issue.number }}   — issue number\n  {{ issue.title }}    — issue title\n  {{ issue.body }}     — issue body (markdown)\n  {{ attempt }}        — retry attempt number (0 = first)\n\n  {% if attempt \u003e 0 %}\n  This block only appears on retries.\n  {% endif %}\n```\n\n---\n\n## Triggering Manually\n\nDispatch a specific issue:\n\n```bash\ngh workflow run symphony.yml \\\n  --repo your-org/your-repo \\\n  --field issue_number=42\n```\n\nRun a full sweep for unclaimed issues:\n\n```bash\ngh workflow run symphony.yml --repo your-org/your-repo\n```\n\n---\n\n## Issue State Machine\n\n```\n[no label]\n    │  (dispatch picks up)\n    ▼\n[symphony:claimed]\n    │\n    ▼\n[symphony:in-progress]  ← Claude is working\n    │\n    ├── complex → sub-issues created → [symphony:todo] on each\n    │\n    └── simple → branch created, PR opened\n                     ��\n                     ▼\n               [symphony:pr-open]  ← CI running\n                     │\n                 CI passes\n                     │\n                     ▼\n               [symphony:reviewing]  ← Claude reviewing\n                     │\n                 review clean\n                     │\n                     ▼\n                   merged → closed → [symphony:done]\n```\n\n---\n\n## Security Notes\n\n- Symphony runs with your `CLAUDE_CODE_OAUTH_TOKEN` (or `ANTHROPIC_API_KEY`) and a `GITHUB_TOKEN` with write access to issues,\n  PRs, and contents.\n- Claude Code runs inside GitHub Actions runners with access to your full repository.\n- Only use Symphony on repos where you trust automated PRs to be reviewed before merging, or\n  in repos with branch protection rules that require CI to pass.\n- Consider restricting which issues Symphony picks up by using label filters or issue templates.\n\n---\n\n## Reusable Workflows\n\nAll four workflows are reusable (`workflow_call`) and can be composed in any order:\n\n| Workflow | Purpose |\n|---|---|\n| `symphony-dispatch.yml` | Entry point; discovers and dispatches issues |\n| `symphony-worker.yml` | Implements a single issue; opens a PR |\n| `symphony-review.yml` | Reviews and merges a PR after CI passes |\n| `symphony-post-merge.yml` | Finds remaining issues after a merge |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqsliu2017%2Fsymphony-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqsliu2017%2Fsymphony-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqsliu2017%2Fsymphony-action/lists"}