{"id":31358305,"url":"https://github.com/leonsteinhaeuser/project-beta-automations","last_synced_at":"2025-09-26T21:58:19.325Z","repository":{"id":42047447,"uuid":"411458411","full_name":"leonsteinhaeuser/project-beta-automations","owner":"leonsteinhaeuser","description":"This automation provides the ability to automate issues and pull requests related to Github Projects (ProjectV2 / Beta).  If the issue or pull request is not attached to a project, it is automatically added to the project and its desired column. In addition to status automation, this automation also supports custom field management.","archived":false,"fork":false,"pushed_at":"2024-05-01T13:03:41.000Z","size":80,"stargazers_count":90,"open_issues_count":10,"forks_count":26,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-30T21:03:12.759Z","etag":null,"topics":["automation","beta","github","github-action","github-actions","github-beta-issue","github-beta-project","issue","issue-automation","issues","project","project-automation","project-management","pull-request","pull-request-automation","pull-requests","utils"],"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/leonsteinhaeuser.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}},"created_at":"2021-09-28T22:42:17.000Z","updated_at":"2025-06-02T18:28:55.000Z","dependencies_parsed_at":"2023-01-11T17:22:10.387Z","dependency_job_id":"cdfbbc07-0a8f-431f-ac4e-a51e5d6074a1","html_url":"https://github.com/leonsteinhaeuser/project-beta-automations","commit_stats":{"total_commits":58,"total_committers":11,"mean_commits":"5.2727272727272725","dds":0.4482758620689655,"last_synced_commit":"d1c1261558118c0876fdb2b57a649303925e5a70"},"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/leonsteinhaeuser/project-beta-automations","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonsteinhaeuser%2Fproject-beta-automations","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonsteinhaeuser%2Fproject-beta-automations/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonsteinhaeuser%2Fproject-beta-automations/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonsteinhaeuser%2Fproject-beta-automations/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leonsteinhaeuser","download_url":"https://codeload.github.com/leonsteinhaeuser/project-beta-automations/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonsteinhaeuser%2Fproject-beta-automations/sbom","scorecard":{"id":585190,"data":{"date":"2025-08-11","repo":{"name":"github.com/leonsteinhaeuser/project-beta-automations","commit":"939000fb1900c9fc4f7b5058a09d9f833ebc6859"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":2,"reason":"Found 8/30 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/pr_size.yml:9","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pr_size.yml:31","Warn: no topLevel permission defined: .github/workflows/pr_size.yml:1","Warn: no topLevel permission defined: .github/workflows/project_automations.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr_size.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/leonsteinhaeuser/project-beta-automations/pr_size.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr_size.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/leonsteinhaeuser/project-beta-automations/pr_size.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/project_automations.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/leonsteinhaeuser/project-beta-automations/project_automations.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/project_automations.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/leonsteinhaeuser/project-beta-automations/project_automations.yml/main?enable=pin","Info:   0 out of   4 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 16 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T20:16:45.056Z","repository_id":42047447,"created_at":"2025-08-20T20:16:45.056Z","updated_at":"2025-08-20T20:16:45.056Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":277149974,"owners_count":25769492,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-26T02:00:09.010Z","response_time":78,"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":["automation","beta","github","github-action","github-actions","github-beta-issue","github-beta-project","issue","issue-automation","issues","project","project-automation","project-management","pull-request","pull-request-automation","pull-requests","utils"],"created_at":"2025-09-26T21:58:18.115Z","updated_at":"2025-09-26T21:58:19.310Z","avatar_url":"https://github.com/leonsteinhaeuser.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# project-beta-automations\n\n[![latest release](https://img.shields.io/github/v/release/leonsteinhaeuser/project-beta-automations)](https://img.shields.io/github/v/release/leonsteinhaeuser/project-beta-automations)\n[![release date](https://img.shields.io/github/release-date/leonsteinhaeuser/project-beta-automations)](https://img.shields.io/github/release-date/leonsteinhaeuser/project-beta-automations)\n[![commits since release](https://img.shields.io/github/commits-since/leonsteinhaeuser/project-beta-automations/latest)](https://img.shields.io/github/commits-since/leonsteinhaeuser/project-beta-automations/latest)\n[![open: bugs](https://img.shields.io/github/issues/leonsteinhaeuser/project-beta-automations/bug)](https://img.shields.io/github/issues/leonsteinhaeuser/project-beta-automations/bug)\n[![open: feature requests](https://img.shields.io/github/issues/leonsteinhaeuser/project-beta-automations/feature%20request)](https://img.shields.io/github/issues/leonsteinhaeuser/project-beta-automations/feature%20request)\n[![issues closed](https://img.shields.io/github/issues-closed/leonsteinhaeuser/project-beta-automations)](https://img.shields.io/github/issues-closed/leonsteinhaeuser/project-beta-automations)\n[![license](https://img.shields.io/github/license/leonsteinhaeuser/project-beta-automations)](https://img.shields.io/github/license/leonsteinhaeuser/project-beta-automations)\n\nThis automation provides the ability to automate issues and pull requests related to [Github Projects (Beta)](https://docs.github.com/en/issues/trying-out-the-new-projects-experience/about-projects).\nIf the issue or pull request is not attached to a project, it is automatically added to the project and its desired column.\nIn addition to status automation, this automation also supports custom field management.\n\nNote: GITHUB_TOKEN does not have the necessary scopes to access projects (beta).\nYou must create a token with ***org:write*** scope and save it as a secret in your repository or organization.\nFor more information, see [Creating a personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token).\n\n\u003e :warning: The GitHub API change of 2022-02-23 results in an error message requiring an upgrade to a new version.\n\u003e\n\u003e What is the problem?\n\u003e\n\u003e As of 2022-02-23 , the GitHub API requires that the value of a single select/iteration field be a string instead of an ID!\n\u003e\n\u003e This causes the automation to throw an error message.\n\u003e\n\u003e https://github.blog/changelog/2022-02-23-the-new-github-issues-february-23rd-update/\n\n## V1 vs V2\n\nIn June 2022, [GitHub announced a breaking change to the Projects API](https://github.blog/changelog/2022-06-23-the-new-github-issues-june-23rd-update/). Therefore, the @v1 tag of this action will stop working on October 1, 2022. You can switch to the @v2 tag at any time (by updating the reference in your workflow file).\n\n## Project board\n\nSince the issues and pull requests from this repository are also managed by this automation, you can take an example from the public project board to see what it looks like.\n\n[Project board](https://github.com/users/leonsteinhaeuser/projects/6).\n\n## Variables\n\n| Variable                 | Required | Description                                                                                                                                                                                                                                  |\n|--------------------------| -------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `gh_host`                | false    | The GitHub hostname of the enterpise installation to use for the automation. For App instructions refer to [GH App Auth](#GH-App-Auth).                                                                                                      |\n| `gh_token`               | false    | The GitHub token to use for the automation. For App instructions refer to [GH App Auth](#GH-App-Auth). (`gh_token` or `gh_app_*` must be defined)                                                                                            |\n| `gh_app_ID`              | false    | The GitHub App ID used for App authentication. For App instructions refer to [GH App Auth](#GH-App-Auth). (`gh_token` or `gh_app_*` must be defined)                                                                                         |\n| `gh_app_installation_ID` | false    | The Github App installation ID binding the App to the target org. For App instructions refer to [GH App Auth](#GH-App-Auth). (`gh_token` or `gh_app_*` must be defined)                                                                      |\n| `gh_app_secret_key`      | false    | The Github App Secret key used to sign App JWT tokens. For App instructions refer to [GH App Auth](#GH-App-Auth). (`gh_token` or `gh_app_*` must be defined)                                                                                 |\n| `user`                   | false    | The GitHub username that owns the projectboard. Either a user or an organization must be specified.                                                                                                                                          |\n| `organization`           | false    | The GitHub organization that owns the projectboard. Either a user or an organization must be specified.                                                                                                                                      |\n| `project_id`             | true     | The projectboard id.                                                                                                                                                                                                                         |\n| `resource_node_id`       | true     | The id of the resource node.                                                                                                                                                                                                                 |\n| `status_value`           | false    | The status value to set. Must be one of the values defined in your project board **Status field settings**. If left unspecified, new items are added without an explicit status, and existing items are left alone.                          |\n| `operation_mode`         | false    | The operation mode to use. Must be one of `custom_field`, `status`. Defaults to: `status`                                                                                                                                                    |\n| `custom_field_values`    | false    | Provides the possibility to change custom fields. To be applied the **operation_mode** must be set to `custom_field`. For the json definition refer to [JSON-Definition](#JSON-Definition)                                                   |\n| `move_related_issues`    | false | If set to `true` and the operation mode is set to `status`, the automation will also move related issues to the same column. This is useful if you want to move an issue to the same column as its related pull request. Defaults to: `false` |\n\n## Getting started\n\nThe following example assumes that you have a project board with the following columns:\n\n- **Todo**\n- **In Progress**\n- **Done**\n\nBefore we start to automate the project board, we need to decide whether we want to manage the **Status** field using this action or the workflow definition of the project board. Keep in mind that until now there is no way to automatically add issues or pull requests to the project board using the provided workflow functionality by GitHub. The next example assumes that you decided to use this action to manage the **Status** field.\n\n| Current Status | Target Status   | Event name  | GitHub event  | Description |\n| -------------- | --------------- | ----- | ------------- | ----------- |\n| **any**        | **Todo**        | issues | `github.event.action == 'opened'`, `github.event.action == 'reopened'` | Define an automation that moves an issue to the *Todo* column. |\n| **any**        | **In Progress** | pull_request    | `github.event.action == 'opened'`, `github.event.action == 'reopened'`, `github.event.action == 'review_requested'` | Define an automation that moves a pull request to the *In Progress* column. |\n| **any**        | **Closed**      | issues, pull_request | `github.event.action == 'closed'` | Define an automation that moves an issue or pull request to the *Done* column. |\n\nThe resulting workflow file is defined as follows:\n\n```yaml\nname: Project automations\non:\n  issues:\n    types:\n      - opened\n      - reopened\n      - closed\n  pull_request:\n    types:\n      - opened\n      - reopened\n      - review_requested\n      - closed\n\n# map fields with customized labels\nenv:\n  todo: Todo ✏️\n  done: Done ✅\n  in_progress: In Progress 🚧\n\njobs:\n  issue_opened_or_reopened:\n    name: issue_opened_or_reopened\n    runs-on: ubuntu-latest\n    if: github.event_name == 'issues' \u0026\u0026 (github.event.action == 'opened' || github.event.action == 'reopened')\n    steps:\n      - name: Move issue to ${{ env.todo }}\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        with:\n          gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n          user: sample-user\n          # organization: sample-org\n          project_id: 1\n          resource_node_id: ${{ github.event.issue.node_id }}\n          status_value: ${{ env.todo }} # Target status\n  issue_closed:\n    name: issue_closed\n    runs-on: ubuntu-latest\n    if: github.event_name == 'issues' \u0026\u0026 github.event.action == 'closed'\n    steps:\n      - name: Moved issue to ${{ env.done }}\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        with:\n          gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n          user: sample-user\n          # organization: sample-org\n          project_id: 1\n          resource_node_id: ${{ github.event.issue.node_id }}\n          status_value: ${{ env.done }} # Target status\n  pr_opened_or_reopened_or_reviewrequested:\n    name: pr_opened_or_reopened_or_reviewrequested\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request' \u0026\u0026 (github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'review_requested')\n    steps:\n      - name: Move PR to ${{ env.in_progress }}\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        with:\n          gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n          user: sample-user\n          # organization: sample-org\n          project_id: 1\n          resource_node_id: ${{ github.event.pull_request.node_id }}\n          status_value: ${{ env.in_progress }} # Target status\n  pr_closed:\n    name: pr_closed\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request' \u0026\u0026 github.event.action == 'closed'\n    steps:\n      - name: Move PR to ${{ env.done }}\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        with:\n          gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n          user: sample-user\n          # organization: sample-org\n          project_id: 1\n          resource_node_id: ${{ github.event.pull_request.node_id }}\n          status_value: ${{ env.done }} # Target status\n```\n\n### Allowing the workflow to run on PR's coming from forks\n\nTo allow PR from a fork to run the workflow use `pull_request_target` instead of `pull_request` like the example below.\n\n```yaml\nname: Project automations\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - closed\n\n# map fields with customized labels\nenv:\n  done: Done ✅\n  in_progress: In Progress 🚧\n\njobs:\n  pr_opened:\n    name: pr_opened\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request_target' \u0026\u0026 github.event.action == 'opened'\n    steps:\n      - name: Move PR to ${{ env.in_progress }}\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        with:\n          gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n          user: sample-user\n          # organization: sample-org\n          project_id: 1\n          resource_node_id: ${{ github.event.pull_request.node_id }}\n          status_value: ${{ env.in_progress }} # Target status\n  pr_closed:\n    name: pr_closed\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request_target' \u0026\u0026 github.event.action == 'closed'\n    steps:\n      - name: Move PR to ${{ env.done }}\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        with:\n          gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n          user: sample-user\n          # organization: sample-org\n          project_id: 1\n          resource_node_id: ${{ github.event.pull_request.node_id }}\n          status_value: ${{ env.done }} # Target status\n```\n\nWithout replacing `pull_request` by `pull_request_target` the workflow will fail with `No GH Auth method configured, provide PAT or App ID/Key`.\n\n```\ngh cli is installed.\nRun echo \"No GH Auth method configured, provide PAT or App ID/Key\"; exit 1\n  echo \"No GH Auth method configured, provide PAT or App ID/Key\"; exit 1\n  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}\n  env:\n    in_review: In Review\nNo GH Auth method configured, provide PAT or App ID/Key\nError: Process completed with exit code 1.\n```\n\n\u003e :warning: Warning\n\u003e\n\u003e For workflows that are triggered by the `pull_request_target` event, the `GITHUB_TOKEN` is granted read/write repository permission unless the `permissions` key is specified and the workflow can access secrets, even when it is triggered from a fork. Although the workflow runs in the context of the base of the pull request, you should make sure that you do not check out, build, or run untrusted code from the pull request with this event. Additionally, any caches share the same scope as the base branch. To help prevent cache poisoning, you should not save the cache if there is a possibility that the cache contents were altered.\n\n## GH App Auth\n\nTo leverage the App authentication with this action the following steps are needed:\n\n- Create a GitHub App under your user or organisation as described in the [GitHub documentation](https://docs.github.com/en/developers/apps/building-github-apps/creating-a-github-app), note the App ID\n- Set the needed GitHub App permissions in order for the newly create App to access and manage Org Project, as described in the [GitHub documentation](https://docs.github.com/en/developers/apps/managing-github-apps/editing-a-github-apps-permissions). The minimum required permissions are:\n  - Repo: Actions: RW\n  - Repo: Checks: RO\n  - Repo: Contents: RO\n  - Repo: Environments: RO\n  - Repo: Issues: RW\n  - Repo: Metadata: RO\n  - Repo: PR: RW\n  - Repo: Commit statuses: RO\n  - Org: Members: RO\n  - Org: Projects: RW\n- Create a private key to authenticate the newly created GitHub App as described in the [GitHub documentation](https://docs.github.com/en/developers/apps/building-github-apps/authenticating-with-github-apps), treat the downloaded key as sensitive material, store it in a GitHub secret accessible by this action.\n- Install the app in the target organisation, note the installation ID\n- Configure this action with\n  - `gh_app_secret_key` containing the aforementioned private key\n  - `gh_app_ID` containing the app ID, auto-generated by GitHub in the first step\n  - `gh_app_installation_ID` containing the installation ID, auto-generated by GitHub in the previous step. Binging the App to the Org\n\n## JSON-Definition\n\nA single json object is defined as follows:\n\n```json\n{\n  \"name\": \"Sample Text Field\", # defines the name of the custom field\n  \"type\": \"text\", # can be one of: text, number, date, single_select, iteration\n  \"value\": \"High\" # defines the value to set (string)\n}\n```\n\nThe json definition that must be passed to the `custom_field_values` argument looks like:\n\n```json\n[\n  {\n    \"name\": \"Priority\",\n    \"type\": \"single_select\",\n    \"value\": \"High\"\n  }\n  {\n    \"name\": \"Context\",\n    \"type\": \"text\",\n    \"value\": \"Just a random text\"\n  }\n]\n```\n\nA detailed example can be found inside the [test.sh](test.sh) file. Note that json definition must be enclosed in an array and escaped with double quotes and backslashes.\n\nExample:\n\n```yaml\n'[{\\\"name\\\": \\\"Priority\\\",\\\"type\\\": \\\"text\\\",\\\"value\\\": \\\"uuid1\\\"},{\\\"name\\\": \\\"Number\\\",\\\"type\\\": \\\"number\\\",\\\"value\\\": \\\"100\\\"},{\\\"name\\\": \\\"Date\\\",\\\"type\\\": \\\"date\\\",\\\"value\\\": \\\"2022-01-28T20:02:27.306+01:00\\\"},{\\\"name\\\": \\\"Single Select\\\",\\\"type\\\": \\\"single_select\\\",\\\"value\\\": \\\"Option 1\\\"},{\\\"name\\\": \\\"Iteration\\\",\\\"type\\\": \\\"iteration\\\",\\\"value\\\": \\\"Iteration 1\\\"}]'\n```\n\nThe following example assumes that your project has the following fields defined:\n\n- `Priority`: As *text* field\n- `Number`: As *number* field\n- `Date`: As *date* field\n- `Single Select`: As *single_select* field with options:\n  - `Option 1`\n  - `Option 2`\n  - `Option 3`\n- `Iteration`: As *iteration* field with iterations:\n  - `Iteration 1`\n  - `Iteration 2`\n  - `Iteration 3`\n\n```yaml\nname: Project automations (organization)\n\non:\n  issues:\n  pull_request:\n\nenv:\n  gh_project_token: ${{ secrets.PAC_TOKEN }}\n  project_id: 1\n  gh_organization: sample-org\n  status_todo: \"Todo\"\n  status_in_progress: \"In Progress\"\n  custom_field_values: '[{\\\"name\\\": \\\"Priority\\\",\\\"type\\\": \\\"text\\\",\\\"value\\\": \\\"uuid1\\\"},{\\\"name\\\": \\\"Number\\\",\\\"type\\\": \\\"number\\\",\\\"value\\\": \\\"100\\\"},{\\\"name\\\": \\\"Date\\\",\\\"type\\\": \\\"date\\\",\\\"value\\\": \\\"2022-01-28T20:02:27.306+01:00\\\"},{\\\"name\\\": \\\"Single Select\\\",\\\"type\\\": \\\"single_select\\\",\\\"value\\\": \\\"Option 1\\\"},{\\\"name\\\": \\\"Iteration\\\",\\\"type\\\": \\\"iteration\\\",\\\"value\\\": \\\"Iteration 1\\\"}]'\n\njobs:\n  issue_opened_or_reopened:\n    name: issue_opened_or_reopened\n    runs-on: ubuntu-latest\n    if: github.event_name == 'issues' \u0026\u0026 (github.event.action == 'opened' || github.event.action == 'reopened')\n    steps:\n      - name: 'Move issue to ${{ env.status_todo }}'\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        env:\n          DEBUG_LOG: \"true\"\n        with:\n          gh_token: ${{ env.gh_project_token }}\n          organization: ${{ env.gh_organization }}\n          project_id: ${{ env.project_id }}\n          resource_node_id: ${{ github.event.issue.node_id }}\n          status_value: ${{ env.status_todo }}\n\n  issue_project_custom_field_update:\n    name: issue_opened_or_reopened\n    runs-on: ubuntu-latest\n    if: github.event_name == 'issues'\n    needs:\n      - issue_opened_or_reopened\n    steps:\n      - name: 'Modify custom fields'\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        env:\n          DEBUG_LOG: \"true\"\n        with:\n          gh_token: ${{ env.gh_project_token }}\n          organization: ${{ env.gh_organization }}\n          project_id: ${{ env.project_id }}\n          resource_node_id: ${{ github.event.issue.node_id }}\n          operation_mode: custom_field\n          custom_field_values: ${{ env.custom_field_values }}\n\n  pr_opened_or_reopened:\n    name: pr_opened_or_reopened\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request' \u0026\u0026 (github.event.action == 'opened' || github.event.action == 'reopened')\n    steps:\n      - name: 'Move PR to ${{ env.status_in_progress }}'\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        env:\n          DEBUG_LOG: \"true\"\n        with:\n          gh_token: ${{ env.gh_project_token }}\n          organization: ${{ env.gh_organization }}\n          project_id: ${{ env.project_id }}\n          resource_node_id: ${{ github.event.pull_request.node_id }}\n          status_value: ${{ env.status_in_progress }}\n\n  pr_custom_field_update_1:\n    name: pr_custom_field_update_1 from env\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request'\n    needs:\n      - pr_opened_or_reopened\n    steps:\n      - name: 'Modify custom fields'\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        env:\n          DEBUG_LOG: \"true\"\n        with:\n          gh_token: ${{ env.gh_project_token }}\n          organization: ${{ env.gh_organization }}\n          project_id: ${{ env.project_id }}\n          resource_node_id: ${{ github.event.pull_request.node_id }}\n          operation_mode: custom_field\n          custom_field_values: ${{ env.custom_field_values }}\n```\n\nSince version 1.3.0 the iteration field also supports the following values:\n\n- @current: the current iteration\n- @next: the next iteration\n\nBoth of these values are provided by the `project-beta-automations` package. The following json provides an example of how to use these values:\n\nNext iteration:\n\n```yaml\n'[{\\\"name\\\": \\\"Iteration\\\",\\\"type\\\": \\\"iteration\\\",\\\"value\\\": \\\"@next\\\"}]'\n```\n\nCurrent iteration:\n\n```yaml\n'[{\\\"name\\\": \\\"Iteration\\\",\\\"type\\\": \\\"iteration\\\",\\\"value\\\": \\\"@current\\\"}]'\n```\n\n## Detailed example\n\nSince this repository is also covered by this automation, you can take a look at the definition within the [project-automation.yml](.github/workflows/project_automations.yml) file to check how it is defined here.\n\n## Debugging\n\nSince debugging is key when tracing a bug, we decided to provide a two step debugging process. To enable the different debugging outputs, you can set the following environment variables:\n\n| Variable         | Option | Default behaviour | Description |\n| ---------------- | -------| ----------------- | -------------------------------------------------- |\n| `DEBUG_COMMANDS` | `true` | Do nothing        | Enables the stacktrace for command executions.     |\n| `DEBUG_LOG`      | `true` | Do nothing        | Prints out the responses produced by the commands. |\n\nExample workflow definition:\n\n```yaml\nenv:\n  todo: Todo ✏️\n  gh_project_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n  user: sample-user\n  project_id: 1\n\njobs:\n  issue_opened:\n    name: issue_opened\n    runs-on: ubuntu-latest\n    if: github.event_name == 'issues' \u0026\u0026 github.event.action == 'opened'\n    steps:\n      - name: Move issue to ${{ env.todo }}\n        uses: leonsteinhaeuser/project-beta-automations@v2.1.0\n        env:\n          DEBUG_COMMANDS: true\n          DEBUG_LOG: true\n        with:\n          gh_token: ${{ env.gh_project_token }}\n          user: ${{ env.user }}\n          # organization: sample-org\n          project_id: ${{ env.project_id }}\n          resource_node_id: ${{ github.event.issue.node_id }}\n          status_value: ${{ env.todo }}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonsteinhaeuser%2Fproject-beta-automations","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleonsteinhaeuser%2Fproject-beta-automations","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonsteinhaeuser%2Fproject-beta-automations/lists"}