{"id":19109252,"url":"https://github.com/typo3/tailor","last_synced_at":"2025-04-05T15:06:07.380Z","repository":{"id":42003353,"uuid":"314179000","full_name":"TYPO3/tailor","owner":"TYPO3","description":"CLI Tool for maintaining public TYPO3 Extensions","archived":false,"fork":false,"pushed_at":"2024-11-16T20:56:35.000Z","size":192,"stargazers_count":28,"open_issues_count":10,"forks_count":10,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-29T14:07:48.564Z","etag":null,"topics":["cli","extension","typo3"],"latest_commit_sha":null,"homepage":"","language":"PHP","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/TYPO3.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":"2020-11-19T08:11:48.000Z","updated_at":"2024-11-16T20:56:39.000Z","dependencies_parsed_at":"2023-02-16T21:30:41.574Z","dependency_job_id":"653088b7-be60-4fd0-b973-474cbbf6e2cc","html_url":"https://github.com/TYPO3/tailor","commit_stats":{"total_commits":88,"total_committers":12,"mean_commits":7.333333333333333,"dds":0.6022727272727273,"last_synced_commit":"d43871d22e1d7812c81bf046702c5e28ca75321d"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TYPO3%2Ftailor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TYPO3%2Ftailor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TYPO3%2Ftailor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TYPO3%2Ftailor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TYPO3","download_url":"https://codeload.github.com/TYPO3/tailor/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247353732,"owners_count":20925329,"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","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":["cli","extension","typo3"],"created_at":"2024-11-09T04:19:39.865Z","updated_at":"2025-04-05T15:06:07.366Z","avatar_url":"https://github.com/TYPO3.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tailor\n\n![Tests](https://github.com/TYPO3/tailor/workflows/tests/badge.svg)\n\nTailor is a CLI application to help you maintain your extensions.\nTailor talks with the [TER REST API][rest-api] and enables you to\nregister new keys, update extension information and publish new\nversions to the [extension repository][ter].\n\n## Contents\n\n- [Prerequisites](#prerequisites)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Manage your personal access token](#manage-your-personal-access-token)\n  - [Register a new extension key](#register-a-new-extension-key)\n  - [Update the version in your extension files](#update-the-version-in-your-extension-files)\n  - [Publish a new version of an extension to TER](#publish-a-new-version-of-an-extension-to-ter)\n  - [Create a local artefact of an extension](#create-a-local-artefact-of-an-extension)\n  - [Update extension meta information](#update-extension-meta-information)\n  - [Transfer ownership of an extension to another user](#transfer-ownership-of-an-extension-to-another-user)\n  - [Delete / abandon an extension](#delete--abandon-an-extension)\n  - [Find and filter extensions on TER](#find-and-filter-extensions-on-ter)\n    - [Specific extension details](#specific-extension-details)\n    - [Specific extension version details](#specific-extension-version-details)\n    - [Details for all versions of an extension](#details-for-all-versions-of-an-extension)\n- [Publish a new version using tailor locally](#publish-a-new-version-using-tailor-locally)\n- [Publish a new version using your CI](#publish-a-new-version-using-your-ci)\n  - [Github actions workflow](#github-actions-workflow)\n  - [GitLab pipeline](#gitlab-pipeline)\n- [Exclude paths from packaging](#exclude-paths-from-packaging)\n- [Overview of all available commands](#overview-of-all-available-commands)\n  - [General options for all commands](#general-options-for-all-commands)\n- [Author \u0026 License](#author--license)\n\n## Prerequisites\n\nThe [TER REST API][rest-api] can be accessed providing a personal\naccess token. You can create such token either on\n[https://extensions.typo3.org/][ter] after you've logged in, or\ndirectly using Tailor.\n\n\u003e [!IMPORTANT]\n\u003e To create, refresh or revoke an access token with Tailor,\n\u003e you have to add your TYPO3.org credentials (see below). Even if it\n\u003e is possible to execute all commands using the TYPO3.org credentials\n\u003e for authentication, it is highly discouraged. That's why we have\n\u003e built token based authentication for the [TER][ter].\n\nProvide your credentials by either creating a `.env` file in the\nproject root folder or setting environment variables through your\nsystem to this PHP script:\n\n```bash\nTYPO3_API_TOKEN=\u003cyour-token\u003e\nTYPO3_API_USERNAME=\u003cyour-t3o-username\u003e\nTYPO3_API_PASSWORD=\u003cyour-t3o-password\u003e\n```\n\n\u003e [!NOTE]\n\u003e For an overview of all available environment variables,\n\u003e have a look at the `.env.dist` file.\n\n\u003e [!TIP]\n\u003e You can also add environment variables directly on\n\u003e executing a command. This overrides any variable, defined in\n\u003e the `.env` file.\n\nExample:\n\n```bash\nTYPO3_API_TOKEN=\"someToken\" TYPO3_EXTENSION_KEY=\"ext_key\" bin/tailor ter:details\n```\n\nThis will display the extension details for extension `ext_key` if\n`someToken` is valid (not expired/revoked and having at least the\n`extension:read` scope assigned).\n\n## Installation\n\nUse Tailor as a dev dependency via composer of your extensions:\n\n```bash\ncomposer req --dev typo3/tailor\n```\n\n## Usage\n\nAll commands, requesting the TER API, provide the `-r, --raw`\noption. If set, the raw result will be returned. This can be\nused for further processing e.g. by using some JSON processor.\n\nMost of the commands require an extension key to work with.\nThere are multiple possibilities to provide an extension key.\nThese are - in the order in which they are checked:\n\n- As argument, e.g. `./vendor/bin/tailor ter:details my_key`\n- As environment variable, `TYPO3_EXTENSION_KEY=my_key`\n- In your `composer.json`, `[extra][typo3/cms][extension-key] = 'my_key'`\n\nThis means, even if you have an extension key defined globally,\neither as environment variable or in your `composer.json`, you\ncan still run all commands for different extensions by adding\nthe desired extension key as argument to the command.\n\n\u003e [!NOTE]\n\u003e If no extension key is defined, neither as an argument,\n\u003e as environment variable, nor in your `composer.json`, commands\n\u003e which require an extension key to be set, will throw an exception.\n\n### Manage your personal access token\n\nUse the `ter:token:create` command to create a new token:\n\n```bash\n./vendor/bin/tailor ter:token:create --name=\"token for my_extension\" --extensions=my_extension\n```\n\nThe result will look like this:\n\n```text\nToken type: bearer\nAccess token: eyJ0eXAOiEJKV1QiLCJhb\nRefresh token: eyJ0eXMRxHRaF4hIVrEtu\nExpires in: 604800\nScope: extension:read,extension:write\nExtensions: my_extension\n```\n\nAs you can see, this will create an access token which is only\nvalid for the extension `my_extension`. The scopes are set to\n`extension:read,extension:write` since this is the default if\noption `--scope` is not provided. The same applies to the\nexpiration date which can be set with the option `--expires`.\n\nIf the token threatens to expire, refresh it with `ter:token:refresh`:\n\n```bash\n./vendor/bin/tailor ter:token:refresh eyJ0eXMRxHRaF4hIVrEtu\n```\n\nThis will generate new access and refresh tokens with the same\noptions, initially set on creation.\n\nTo revoke an access token irretrievably, use `ter:token:revoke`:\n\n```bash\n./vendor/bin/tailor ter:token:revoke eyJ0eXAOiEJKV1QiLCJhb\n```\n\n### Register a new extension key\n\nTo register a new extension, use `ter:register` by providing\nyour desired extension key as argument:\n\n```bash\n./vendor/bin/tailor ter:register my_extension\n```\n\nThis registers the key `my_extension` and returns following\nconfirmation:\n\n```http\nKey: my_extension\nOwner: your_username\n```\n\n### Update the version in your extension files\n\nPrior to publishing a new version, you have to update the\nversion in your extensions `ext_emconf.php` file. This can\nbe done using the `set-version` command.\n\n```bash\n./vendor/bin/tailor set-version 1.2.0\n```\n\nIf your extension also contains a `Documentation/guides.xml`\nor `Documentation/Settings.cfg` file, the command will also\nupdate the `release` and `version` information in it. You\ncan disable this feature by either using `--no-docs` or by\nsetting the environment variable `TYPO3_DISABLE_DOCS_VERSION_UPDATE=1`.\n\n\u003e [!TIP]\n\u003e It's also possible to use the `--path` option to\n\u003e specify the location of your extension. If not given, your\n\u003e current working directory is search for the `ext_emconf.php`\n\u003e file.\n\n\u003e [!NOTE]\n\u003e The version will only be updated if already present\n\u003e in your `ext_emconf.php`. It won't be added by this command.\n\n### Publish a new version of an extension to TER\n\nYou can publish a new version of your extension using the\n`ter:publish` command. Therefore, provide the extension key\nand version number as arguments followed by the path to the\nextension directory or an artefact (a zipped version of your\nextension). The latter can be either local or a remote file.\n\nUsing `--path`:\n\n```bash\n./vendor/bin/tailor ter:publish 1.2.0 my_extension --path=/path/to/my_extension\n```\n\nUsing a local `--artefact`:\n\n```bash\n./vendor/bin/tailor ter:publish 1.2.0 my_extension --artefact=/path/to/any-zip-file/my_extension.zip\n```\n\nUsing a remote `--artefact`:\n\n```bash\n./vendor/bin/tailor ter:publish 1.2.0 my_extension --artefact=https://github.com/my-name/my_extension/archive/1.2.0.zip\n```\n\nUsing the root direcotry:\n\n```bash\n./vendor/bin/tailor ter:publish 1.2.0 my_extension\n```\n\nIf the extension key is defined as environment variable or\nin your `composer.json`, it can also be skipped. So using the\ncurrent root directory the whole command simplifies to:\n\n```bash\n./vendor/bin/tailor ter:publish 1.2.0\n```\n\n\u003e [!IMPORTANT]\n\u003e A couple of directories and files are excluded from packaging\n\u003e by default. Read more about\n\u003e [excluding paths from packaging](#exclude-paths-from-packaging)\n\u003e below.\n\n\u003e [!NOTE]\n\u003e The REST API, just like the the [TER][ter], requires\n\u003e an upload comment to be set. This can be achieved using the\n\u003e `--comment` option. If not set, Tailor will automatically use\n\u003e `Updated extension to \u003cversion\u003e` as comment.\n\n### Create a local artefact of an extension\n\nYou can generate a local artefact of your extension using the\n`create-artefact` command. This will generate a zip archive\nready to be uploaded to TER (which is not covered by this\ncommand, have a look at the [`ter:publish`](#publish-a-new-version-of-an-extension-to-ter)\ncommand instead).\n\nProvide the version number and extension key as arguments\nfollowed by the path to the extension directory or an artefact\n(a zipped version of your extension). The latter can be either\nlocal or a remote file.\n\nUsing `--path`:\n\n```bash\n./vendor/bin/tailor create-artefact 1.2.0 my_extension --path=/path/to/my_extension\n```\n\nUsing a local `--artefact`:\n\n```bash\n./vendor/bin/tailor create-artefact 1.2.0 my_extension --artefact=/path/to/any-zip-file/my_extension.zip\n```\n\nUsing a remote `--artefact`:\n\n```bash\n./vendor/bin/tailor create-artefact 1.2.0 my_extension --artefact=https://github.com/my-name/my_extension/archive/1.2.0.zip\n```\n\nUsing the root directory:\n\n```bash\n./vendor/bin/tailor create-artefact 1.2.0 my_extension\n```\n\nIf the extension key is defined as environment variable or\nin your `composer.json`, it can also be skipped. So using the\ncurrent root directory the whole command simplifies to:\n\n```bash\n./vendor/bin/tailor create-artefact 1.2.0\n```\n\n\u003e [!IMPORTANT]\n\u003e A couple of directories and files are excluded from packaging\n\u003e by default. Read more about\n\u003e [excluding paths from packaging](#exclude-paths-from-packaging)\n\u003e below.\n\n### Update extension meta information\n\nYou can update the extension meta information, such as the\ncomposer name, or the associated tags with the `ter:update`\ncommand.\n\nTo update the composer name:\n\n```bash\n./vendor/bin/tailor ter:update my_extension --composer=vender/my_extension\n```\n\nTo update the tags:\n\n```bash\n./vendor/bin/tailor ter:update my_extension --tags=some-tag,another-tag\n```\n\nPlease use `./vendor/bin/tailor ter:update -h` to see the full\nlist of available options.\n\n\u003e [!IMPORTANT]\n\u003e All options set with this command will overwrite the\n\u003e existing data. Therefore, if you, for example, just want to add\n\u003e another tag, you have to add the current ones along with the new\n\u003e one. You can use `ter:details` to get the current state.\n\n### Transfer ownership of an extension to another user\n\nIt's possible to transfer one of your extensions to another user.\nTherefore, use the `ter:transfer` command providing the extension\nkey to be transferred and the TYPO3.org username of the recipient.\n\nSince you won't have any access to the extension afterwards, the\ncommand asks for your confirmation before sending the order to\nthe REST API.\n\n```bash\n./vendor/bin/tailor ter:transfer some_user my_extension\n```\n\nThis transfers the extension `my_extension`  to the user\n`some_user` and returns following confirmation:\n\n```http\nKey: my_extension\nOwner: some_user\n```\n\n\u003e [!TIP]\n\u003e For automated workflows the confirmation can be\n\u003e skipped with the ``-n, --no-interaction`` option.\n\n### Delete / abandon an extension\n\nYou can easily delete / abandon extensions with Tailor using\nthe `ter:delete` command. This either removes the extension\nentirely or just abandons it if the extension still has public\nversions.\n\nSince you won't have any access to the extension afterwards,\nthe command asks for your confirmation before sending the order\nto the REST API.\n\n```bash\n./vendor/bin/tailor ter:delete my_extension\n```\n\nThis will delete / abandon the extension `my_extension`.\n\n\u003e [!TIP]\n\u003e For automated workflows the confirmation can be\n\u003e skipped with the ``-n, --no-interaction`` option.\n\n### Find and filter extensions on TER\n\nTailor can't only be used for managing your extensions but\nalso to find others. Therefore, use `ter:find` by adding some\nfilters:\n\n```bash\n./vendor/bin/tailor ter:find\n./vendor/bin/tailor ter:find --typo3-version=9\n./vendor/bin/tailor ter:find --typo3-author=some_user\n```\n\nFirst command will find all public extensions. The second\nand third one will only return extensions which match the\nfilter. In this case being compatible with TYPO3 version\n`9` or owned by `some_user`.\n\nTo limit / paginate the result, you can use the options\n`--page` and `--per_page`:\n\n```bash\n./vendor/bin/tailor ter:find --page=3 --per_page=20\n```\n\n#### Specific extension details\n\nYou can also request more details about a specific extension\nusing the `ter:details` command:\n\n```bash\n./vendor/bin/tailor ter:details my_extension\n```\n\nThis will return details about the extension `my_extension`\nlike the current version, the author, some meta information\nand more. Similar to the extension detail page on\n[extension.typo3.org][ter].\n\n#### Specific extension version details\n\nIf you like to get details about a specific version of an\nextension, `ter:version` can be used:\n\n```bash\n./vendor/bin/tailor ter:version 1.0.0 my_extension\n```\n\nThis will return details about version `1.0.0` of extension\n`my_extension`.\n\n#### Details for all versions of an extension\n\nYou can also get the details for all versions of an extension\nwith `ter:versions`:\n\n```bash\n./vendor/bin/tailor ter:versions my_extension\n```\n\nThis will return the details for all version of the extension\n`my_extension`.\n\n## Publish a new version using tailor locally\n\n**Step 1: Update the version in your extension files**\n\n```bash\n./vendor/bin/tailor set-version 1.5.0\n```\n\n**Step 2: Commit the changes and add a tag**\n\n```bash\ngit commit -am \"[RELEASE] A new version was published\"\ngit tag -a 1.5.0\n```\n\n**Step 3: Push this to your remote repository**\n\n```bash\ngit push origin --tags\n```\n\n**Step 4: Push this version to TER**\n\n```bash\n./vendor/bin/tailor ter:publish 1.5.0\n```\n\n\u003e [!NOTE]\n\u003e Both `set-version` and `ter:publish` provide options\n\u003e to specify the location of your extension. If, like in the example\n\u003e above, non is set, Tailor automatically uses your current working\n\u003e directory.\n\n## Publish a new version using your CI\n\nYou can also integrate tailor into you GitHub workflow respectively\nyour GitLab pipeline. Therefore, **Step 1**, **Step 2** and **Step 3**\nfrom the above example are the same. **Step 4** could then be\ndone by your integration.\n\nPlease have a look at the following examples describing how\nsuch integration could look like for GitHub workflows and\nGitLab pipelines.\n\n### Github actions workflow\n\nThe workflow will only be executed when pushing a new tag.\nThis can either be done using **Step 3** from above example\nor by creating a new GitHub release which will also add a\nnew tag.\n\nThe workflow furthermore requires the GitHub secrets `TYPO3_EXTENSION_KEY`\nand `TYPO3_API_TOKEN` to be set. Add them at \"Settings -\u003e Secrets -\u003e New\nrepository secret\".\n\n\u003e [!NOTE]\n\u003e If your `composer.json` file contains the extension key at\n\u003e `[extra][typo3/cms][extension-key] = 'my_key'` (this is good practice anyway),\n\u003e the `TYPO3_EXTENSION_KEY` secret and assignment in the below GitHub action\n\u003e example is not needed, tailor will pick it up.\n\nThe version is automatically fetched from the tag and\nvalidated to match the required pattern.\n\nThe commit message from **Step 2** is used as the release\ncomment. If it's empty, a static text will be used.\n\nTo see the following workflow in action, please have a\nlook at the [tailor_ext][tailor-ext] example extension.\n\n```yaml\nname: publish\non:\n  push:\n    tags:\n      - '*'\njobs:\n  publish:\n    name: Publish new version to TER\n    # use folliwing if tags begins with `v`\n    # if: startsWith(github.ref, 'refs/tags/v')\n    if: startsWith(github.ref, 'refs/tags/')\n    runs-on: ubuntu-20.04\n    env:\n      TYPO3_EXTENSION_KEY: ${{ secrets.TYPO3_EXTENSION_KEY }}\n      TYPO3_API_TOKEN: ${{ secrets.TYPO3_API_TOKEN }}\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v3\n\n      - name: Check tag\n        run: |\n          # use ^refs/tags/v[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ when tag is prefixed with v\n          if ! [[ ${{ github.ref }} =~ ^refs/tags/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then\n            exit 1\n          fi\n\n      - name: Get version\n        id: get-version\n        run: echo \"version=${GITHUB_REF/refs\\/tags\\//}\" \u003e\u003e $GITHUB_ENV\n\n      - name: Get comment\n        id: get-comment\n        run: |\n          # If tag begins with `v` use:\n          # readonly local comment=$(git tag -l v${{ env.version }} --format '%(contents))\n          readonly local comment=$(git tag -l ${{ env.version }} --format '%(contents))\n\n          if [[ -z \"${comment// }\" ]]; then\n            echo \"comment=Released version ${{ env.version }} of ${{ env.TYPO3_EXTENSION_KEY }}\" \u003e\u003e $GITHUB_ENV\n          else\n            {\n              echo 'comment\u003c\u003cEOF'\n              echo \"$comment\"\n              echo EOF\n            } \u003e\u003e \"$GITHUB_ENV\"\n          fi\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: 7.4\n          extensions: intl, mbstring, json, zip, curl\n          tools: composer:v2\n\n      - name: Install tailor\n        run: composer global require typo3/tailor --prefer-dist --no-progress --no-suggest\n\n      - name: Publish to TER\n        run: php ~/.composer/vendor/bin/tailor ter:publish --comment \"${{ env.comment }}\" ${{ env.version }}\n```\n\n\u003e [!IMPORTANT]\n\u003e If you're using tags with a leading `v` the above example needs to be adjusted.\n\n1. The regular expression in step **Check tag** should be:\n\n```regexp\n^refs/tags/v[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$\n```\n\n2. The output format in step **Get version** should be:\n\n```bash\n${GITHUB_REF#refs/tags/v}\n```\n\n3. The variable declaration in step **Get comment** should be:\n\n```bash\n$(git tag -l v${{ env.version }} --format '%(contents))\n```\n\n#### GitHub actions from TYPO3 community\n\nAdditionally, to further simplify your workflow, you can also use the\n[typo3-uploader-ter][typo3-uploader-ter] GitHub action from TYPO3 community\nmember Tomas Norre. For more information about the usage, please refer to the\ncorresponding [README][typo3-uploader-ter-readme].\n\n### GitLab pipeline\n\nThe job will only be executed when pushing a new tag.\nThe upload comment is taken from the message in the tag.\n\nThe job furthermore requires the GitLab variables\n`TYPO3_EXTENSION_KEY` and `TYPO3_API_TOKEN` to be set.\n\n\u003e [!NOTE]\n\u003e If your `composer.json` file contains your extension\n\u003e key, you can remove the `TYPO3_EXTENSION_KEY` variable, the\n\u003e check and the assignment in the GitLab pipeline, since Tailor\n\u003e automatically fetches this key then.\n\nThe variable `CI_COMMIT_TAG` is set by GitLab automatically.\n\n```yaml\n\"Publish new version to TER\":\n  stage: release\n  image: composer:2\n  only:\n    - tags\n  before_script:\n    - composer global require typo3/tailor\n  script:\n    - \u003e\n      if [ -n \"$CI_COMMIT_TAG\" ] \u0026\u0026 [ -n \"$TYPO3_API_TOKEN\" ] \u0026\u0026 [ -n \"$TYPO3_EXTENSION_KEY\" ]; then\n        echo -e \"Preparing upload of release ${CI_COMMIT_TAG} to TER\\n\"\n        # Cleanup before we upload\n        git reset --hard HEAD \u0026\u0026 git clean -fx\n        # Upload\n        TAG_MESSAGE=`git tag -n10 -l $CI_COMMIT_TAG | sed 's/^[0-9.]*[ ]*//g'`\n        echo \"Uploading release ${CI_COMMIT_TAG} to TER\"\n        /tmp/vendor/bin/tailor ter:publish --comment \"$TAG_MESSAGE\" \"$CI_COMMIT_TAG\" \"$TYPO3_EXTENSION_KEY\"\n      fi;\n```\n\n## Exclude paths from packaging\n\nA couple of directories and files are excluded\nfrom packaging by default. You can find the configuration in\n[`conf/ExcludeFromPackaging.php`](conf/ExcludeFromPackaging.php).\n\nIf you like, you can also use a custom configuration. Just add the\npath to your custom configuration file to the environment variable\n`TYPO3_EXCLUDE_FROM_PACKAGING`. This file must return an\n`array` with the keys `directories` and `files` on root level.\n\n## Overview of all available commands\n\n| Commands              | Arguments                         | Options                                                                                               | Description                                            |\n|-----------------------|-----------------------------------|-------------------------------------------------------------------------------------------------------|--------------------------------------------------------|\n| ``set-version``       | ``version``                       | ``--path``\u003cbr/\u003e``--no-docs``                                                                          | Update the version in extension files                  |\n| ``ter:delete``        | ``extensionkey``                  |                                                                                                       | Delete an extension.                                   |\n| ``ter:details``       | ``extensionkey``                  |                                                                                                       | Fetch details about an extension.                      |\n| ``ter:find``          |                                   | ``--page``\u003cbr/\u003e``--per-page``\u003cbr/\u003e``--author``\u003cbr/\u003e``--typo3-version``                                | Fetch a list of extensions from TER.                   |\n| ``ter:publish``       | ``version``\u003cbr/\u003e``extensionkey``  | ``--path``\u003cbr/\u003e``--artefact``\u003cbr/\u003e``--comment``                                                       | Publishes a new version of an extension to TER.        |\n| ``create-artefact``   | ``version``\u003cbr/\u003e``extensionkey``  | ``--path``\u003cbr/\u003e``--artefact``                                                                         | Create an artefact file (zip archive) of an extension. |\n| ``ter:register``      | ``extensionkey``                  |                                                                                                       | Register a new extension key in TER.                   |\n| ``ter:token:create``  |                                   | ``--name``\u003cbr/\u003e``--expires``\u003cbr/\u003e``--scope``\u003cbr/\u003e``--extensions``                                     | Request an access token for the TER.                   |\n| ``ter:token:refresh`` | ``token``                         |                                                                                                       | Refresh an access token for the TER.                   |\n| ``ter:token:revoke``  | ``token``                         |                                                                                                       | Revoke an access token for the TER.                    |\n| ``ter:transfer``      | ``username``\u003cbr/\u003e``extensionkey`` |                                                                                                       | Transfer ownership of an extension key.                |\n| ``ter:update``        | ``extensionkey``                  | ``--composer``\u003cbr/\u003e``--issues``\u003cbr/\u003e``--repository``\u003cbr/\u003e``--manual``\u003cbr/\u003e``--paypal``\u003cbr/\u003e``--tags`` | Update extension meta information.                     |\n| ``ter:version``       | ``version``\u003cbr/\u003e``extensionkey``  |                                                                                                       | Fetch details about an extension version.              |\n| ``ter:versions``      | ``extensionkey``                  |                                                                                                       | Fetch details for all versions of an extension.        |\n\n### General options for all commands\n\n- ``-r, --raw`` Return result as raw object (e.g. json) - Only for commands,\n  requesting the TER API\n- ``-h, --help`` Display help message\n- ``-q, --quiet`` Do not output any message\n- ``-v, --version`` Display the CLI applications' version\n- ``-n, --no-interaction`` Do not ask any interactive question\n- ``-v|vv|vvv, --verbose`` Increase the verbosity of messages: 1 for normal output, 2\n  for more verbose output and 3 for debug\n- ``--ansi`` Force ANSI output\n- ``--no-ansi`` Disable ANSI output\n\n## Author \u0026 License\n\nCreated by Benni Mack and Oliver Bartsch.\n\nMIT License, see LICENSE\n\n[rest-api]: https://extensions.typo3.org/faq/rest-api/\n[ter]: https://extensions.typo3.org\n[tailor-ext]: https://github.com/o-ba/tailor_ext\n[typo3-uploader-ter]: https://github.com/tomasnorre/typo3-upload-ter\n[typo3-uploader-ter-readme]: https://github.com/tomasnorre/typo3-upload-ter/blob/main/README.md\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftypo3%2Ftailor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftypo3%2Ftailor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftypo3%2Ftailor/lists"}