{"id":41374554,"url":"https://github.com/k1LoW/gh-triage","last_synced_at":"2026-02-01T20:00:50.855Z","repository":{"id":304661785,"uuid":"1019504250","full_name":"k1LoW/gh-triage","owner":"k1LoW","description":"`gh-triage` is a tool that helps you manage and triage GitHub issues and pull requests through unread notifications.","archived":false,"fork":false,"pushed_at":"2025-11-26T06:19:43.000Z","size":155,"stargazers_count":30,"open_issues_count":5,"forks_count":4,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-29T07:00:20.026Z","etag":null,"topics":["gh-extension","github","github-notifications"],"latest_commit_sha":null,"homepage":"https://github.com/notifications?query=is%3Aunread","language":"Go","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/k1LoW.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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},"funding":{"github":"k1LoW","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2025-07-14T12:32:15.000Z","updated_at":"2025-11-26T06:20:27.000Z","dependencies_parsed_at":"2025-07-14T16:25:38.442Z","dependency_job_id":"ffb14e01-39be-4912-9caa-af6804aefdae","html_url":"https://github.com/k1LoW/gh-triage","commit_stats":null,"previous_names":["k1low/gh-triage"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/k1LoW/gh-triage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k1LoW%2Fgh-triage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k1LoW%2Fgh-triage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k1LoW%2Fgh-triage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k1LoW%2Fgh-triage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/k1LoW","download_url":"https://codeload.github.com/k1LoW/gh-triage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k1LoW%2Fgh-triage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28988406,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T18:17:03.387Z","status":"ssl_error","status_checked_at":"2026-02-01T18:16:57.287Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["gh-extension","github","github-notifications"],"created_at":"2026-01-23T10:00:30.291Z","updated_at":"2026-02-01T20:00:50.849Z","avatar_url":"https://github.com/k1LoW.png","language":"Go","funding_links":["https://github.com/sponsors/k1LoW"],"categories":["🧩 Categories"],"sub_categories":["Issue / PR Management"],"readme":"# gh-triage\n\n`gh-triage` is a tool that helps you manage and triage GitHub issues, pull requests, and discussions through [unread notifications](https://github.com/notifications?query=is%3Aunread).\n\nKey features of `gh-triage` are:\n\n- **Done**: Mark Issues, Pull Requests, and Discussions that match specified conditions as done\n- **Read**: Mark Issues, Pull Requests, and Discussions that match specified conditions as read\n- **Unsubscribe**: Unsubscribe from notifications for Issues, Pull Requests, and Discussions that match specified conditions\n- **Open**: Open Issues, Pull Requests, and Discussions that match specified conditions in a browser\n- **List**: Display Issues, Pull Requests, and Discussions that match specified conditions in a list\n\nref: [Managing notifications from your inbox](https://docs.github.com/en/account-and-profile/managing-subscriptions-and-notifications-on-github/viewing-and-triaging-notifications/managing-notifications-from-your-inbox)\n\n## Usage\n\n```bash\n$ gh triage\n```\n\n### Profile Support\n\n`gh-triage` supports multiple configuration profiles. You can create different profiles for different workflows or environments.\n\n#### Using Profiles\n\n```bash\n# Use default profile\n$ gh triage\n\n# Use specific profile\n$ gh triage --profile work\n$ gh triage -p personal\n```\n\n#### Profile Configuration Files\n\n- Default profile: `default.yml`\n- Named profiles: `{profile-name}.yml`\n\nFor example:\n- `~/.local/share/gh-triage/default.yml` (default profile)\n- `~/.local/share/gh-triage/work.yml` (work profile)\n- `~/.local/share/gh-triage/personal.yml` (personal profile)\n\n## Install\n\n```bash\n$ gh extension install k1LoW/gh-triage\n```\n\n## Configuration\n\nThe configuration file is located at:\n\n- `${XDG_DATA_HOME}/gh-triage/default.yml` (if `XDG_DATA_HOME` is set)\n- OR `~/.local/share/gh-triage/default.yml` (default location)\n\nIt will be automatically created on first run.\n\n### Configuration File Migration\n\nIf you are upgrading from a previous version, your existing `config.yml` will be automatically migrated to `default.yml` on first run. The migration process:\n\n1. Checks if `default.yml` exists\n2. If not, looks for the old `config.yml` file\n3. If found, copies the content to `default.yml`\n4. Removes the old `config.yml` file\n5. Logs the migration process\n\nThis ensures a smooth transition without losing your existing configuration.\n\n### Default configuration\n\n```yaml\ndone:\n  max: 1000\n  conditions: # Auto-mark merged and closed PRs / issues as done\n    - \"merged\"\n    - \"closed\"\n\nopen:\n  max: 1\n  conditions: # Open PRs awaiting my review\n    - \"is_pull_request \u0026\u0026 me in reviewers \u0026\u0026 passed \u0026\u0026 !approved \u0026\u0026 open \u0026\u0026 !draft\"\n\nlist:\n  max: 1000\n  conditions: # List all unread notifications\n    - \"*\"\n```\n\n### Options\n\n- `done`: Conditions and maximum number for marking as done\n- `read`: Conditions and maximum number for marking as read\n- `unsubscribe`: Conditions and maximum number for unsubscribing from notifications\n- `open`: Conditions and maximum number for opening in browser\n- `list`: Conditions and maximum number for listing\n\nEach action has the following parameters:\n- `max`: Maximum number of items to process at once\n- `conditions`: Processing conditions (no processing if empty array)\n\n## Available Fields\n\ngh-triage retrieves the following information for each notification, which can be used in condition evaluation:\n\n| Field | Type | Pull Request Description | Issue Description | Discussion Description |\n|-------|------|-------------------------|-------------------|------------------------|\n| `is_pull_request` | `bool` | Always `true` for Pull Requests | Always `false` for Issues | Always `false` for Discussions |\n| `is_issue` | `bool` | Always `false` for Pull Requests | Always `true` for Issues | Always `false` for Discussions |\n| `is_discussion` | `bool` | Always `false` for Pull Requests | Always `false` for Issues | Always `true` for Discussions |\n| `me` | `string` | Username of authenticated user | Username of authenticated user | Username of authenticated user |\n| `title` | `string` | The title of the Pull Request | The title of the Issue | The title of the Discussion |\n| `owner` | `string` | Repository owner name | Repository owner name | Repository owner name |\n| `repo` | `string` | Repository name | Repository name | Repository name |\n| `number` | `int` | Pull Request number | Issue number | Discussion number |\n| `state` | `string` | State of the PR (`open`, `closed`) | State of the Issue (`open`, `closed`) | State of the Discussion (`open`, `closed`) |\n| `open` | `bool` | Whether the PR is open | Whether the Issue is open | Whether the Discussion is open |\n| `closed` | `bool` | Whether the PR is closed | Whether the Issue is closed | Whether the Discussion is closed |\n| `labels` | `[]string` | List of labels attached to the PR | List of labels attached to the Issue | List of labels attached to the Discussion |\n| `assignees` | `[]string` | List of assigned users | List of assigned users | N/A |\n| `author` | `string` | Username of the PR author | Username of the Issue author | Username of the Discussion author |\n| `html_url` | `string` | GitHub URL of the PR | GitHub URL of the Issue | GitHub URL of the Discussion |\n| `draft` | `bool` | Whether the PR is draft | N/A | N/A |\n| `merged` | `bool` | Whether the PR has been merged | N/A | N/A |\n| `mergeable` | `bool` | Whether the PR is mergeable | N/A | N/A |\n| `mergeable_state` | `string` | Mergeable state of the PR | N/A | N/A |\n| `reviewers` | `[]string` | List of requested reviewers | N/A | N/A |\n| `review_teams` | `[]string` | List of requested review teams | N/A | N/A |\n| `approved` | `bool` | Whether the PR has been approved | N/A | N/A |\n| `review_states` | `[]string` | History of review states | N/A | N/A |\n| `status_passed` | `bool` | Whether status checks have passed | N/A | N/A |\n| `checks_passed` | `bool` | Whether checks have passed | N/A | N/A |\n| `passed` | `bool` | Whether both status checks and checks have passed | N/A | N/A |\n| `failed` | `bool` | Whether status checks or checks have failed | N/A | N/A |\n| `in_progress` | `bool` | Whether status checks or checks are in progress | N/A | N/A |\n| `answered` | `bool` | N/A | N/A | Whether the Discussion has been answered |\n| `unread` | `bool` | Whether the PR is not marked as read | Whether the Issue is not marked as read | Whether the Discussion is not marked as read |\n\n## Condition Evaluation System\n\nConditions are evaluated using the [expr-lang](https://expr-lang.org/) library. You can write conditions such as:\n\n### Basic Conditions\n\n```yaml\nconditions:\n  - \"merged\"                    # Merged Pull Request\n  - \"closed\"                    # Closed Issue/PR/Discussion\n  - \"approved\"                  # Approved Pull Request\n  - \"is_pull_request\"           # Pull Request\n  - \"is_issue\"                  # Issue\n  - \"is_discussion\"             # Discussion\n  - \"answered\"                  # Answered Discussion\n  - \"state == 'open'\"           # Open state\n  - \"passed\"                    # All checks passed\n```\n\n### Complex Conditions\n\n```yaml\nconditions:\n  - \"merged \u0026\u0026 approved\"                   # Merged and approved\n  - \"is_pull_request \u0026\u0026 state == 'open'\"   # Open Pull Request\n  - \"author == 'username'\"                 # Created by specific user\n  - \"len(labels) \u003e 0\"                      # Has labels\n```\n\n### Array Operations\n\n```yaml\nconditions:\n  - \"'bug' in labels\"                      # Has bug label\n  - \"'hotfix' in labels\"                   # Has hotfix label\n  - \"len(assignees) \u003e 0\"                   # Has assignees\n  - \"'APPROVED' in review_states\"          # Review states include approved\n```\n\n### Special Conditions\n\n```yaml\nconditions:\n  - \"*\"                                    # Match all (always true)\n```\n\n## Usage Examples\n\n### Automatically mark merged Pull Requests and closed Issues as done\n\n```yaml\ndone:\n  max: 1000\n  conditions:\n    - \"merged\"\n    - \"closed\"\n```\n\n### Mark failed CI Pull Requests as done\n\n```yaml\ndone:\n  max: 100\n  conditions:\n    - \"is_pull_request \u0026\u0026 failed\"\n```\n\n### Automatically mark merged Pull Requests as read\n\n```yaml\nread:\n  max: 1000\n  conditions:\n    - \"merged\"\n```\n\n### Open Issues and PRs related to yourself in browser\n\n\n## Command Line Options\n\n| Option | Short | Description |\n|--------|-------|-------------|\n| `--profile` | `-p` | Specify profile name for configuration file |\n\n### Examples\n\n```bash\n# Use default profile\n$ gh triage\n\n# Use work profile\n$ gh triage --profile work\n\n# Use personal profile\n$ gh triage -p personal\n```\n\n```yaml\nopen:\n  max: 5\n  conditions:\n    - \"author == me\"\n    - \"me in assignees\"\n```\n\n### List items with specific labels\n\n```yaml\nlist:\n  max: 100\n  conditions:\n    - \"'urgent' in labels\"\n    - \"'bug' in labels\"\n```\n\n### Process only Pull Requests that need review\n\n```yaml\nread:\n  max: 1000\n  conditions:\n    - \"is_pull_request \u0026\u0026 state == 'open' \u0026\u0026 !approved\"\n```\n\n### Unsubscribe from closed/merged Issues/Pull Requests\n\n```yaml\nunsubscribe:\n  max: 100\n  conditions:\n    - \"closed\" # Closed Issues/Discussions\n    - \"merged\" # Merged Pull Requests\n```\n\n### Mark answered Discussions as done\n\n```yaml\ndone:\n  max: 100\n  conditions:\n    - \"is_discussion \u0026\u0026 answered\"\n```\n\n### List unanswered Discussions\n\n```yaml\nlist:\n  max: 100\n  conditions:\n    - \"is_discussion \u0026\u0026 !answered \u0026\u0026 open\"\n```\n\n## Contributing\n\nTo use this project from source, instead of a release:\n\n    go build .\n    gh extension remove triage\n    gh extension install .\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fk1LoW%2Fgh-triage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fk1LoW%2Fgh-triage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fk1LoW%2Fgh-triage/lists"}