ci: add go-licenses check + Conventional Commits PR title gate #166

Merged
goern merged 0 commits from refs/pull/166/head into main 2026-05-26 13:30:13 +00:00
goern commented 2026-05-26 13:17:08 +00:00 (Migrated from codeberg.org)

What

Two CI gates added to the PR pipeline:

1. go-licenses check (license-check step in go-ci task)

  • go-licenses v1.6.0 baked into release-tools image
  • Fails build if any module in the dependency closure carries a forbidden (GPL/AGPL) or restricted (LGPL/MPL/EPL) license
  • Current dep tree passes (golang.org/x/* packages are Apache-2.0/BSD)
  • --ignore=codeberg.org/goern/forgejo-mcp skips the repo root module itself

2. Conventional Commits PR title + commit check (commit-title-check task)

  • New commit-title-check Tekton task runs in parallel with build-and-test
  • Validates PR title via PAC dynamic var {{ body.pull_request.title }}
  • Validates each non-merge commit on the PR branch (origin/$BASE_REF..HEAD)
  • Fails early so malformed titles are caught before semantic-release silently drops them post-merge
  • Regex: ^(feat|fix|docs|style|refactor|perf|test|ci|chore|build|revert)(\([^)]+\))?!?: .+
  • Breaking change (!) and scope (scope) both accepted

Why

semantic-release reads individual commit titles post-merge to decide version bump. A malformed title does not error — it just gets silently skipped. This gate catches the problem before merge, not after.

Verification

  • Regex tested against 39 recent commits — all pass
  • go-licenses check exits 0 on current dep tree
  • YAML parses clean

Files changed

File Change
.tekton/tasks/commit-title-check.yaml New task
.tekton/on-pull-request.yaml Wire task + add pr_title/base_ref params
.tekton/tasks/go-ci.yaml Add license-check step
image/release-tools/Containerfile Add go-licenses install + smoke check
image/release-tools/VERSIONS.md Document go-licenses v1.6.0
## What Two CI gates added to the PR pipeline: ### 1. `go-licenses` check (license-check step in go-ci task) - `go-licenses v1.6.0` baked into release-tools image - Fails build if any module in the dependency closure carries a **forbidden** (GPL/AGPL) or **restricted** (LGPL/MPL/EPL) license - Current dep tree passes (`golang.org/x/*` packages are Apache-2.0/BSD) - `--ignore=codeberg.org/goern/forgejo-mcp` skips the repo root module itself ### 2. Conventional Commits PR title + commit check (commit-title-check task) - New `commit-title-check` Tekton task runs **in parallel** with `build-and-test` - Validates PR title via PAC dynamic var `{{ body.pull_request.title }}` - Validates **each non-merge commit** on the PR branch (`origin/$BASE_REF..HEAD`) - Fails early so malformed titles are caught before `semantic-release` silently drops them post-merge - Regex: `^(feat|fix|docs|style|refactor|perf|test|ci|chore|build|revert)(\([^)]+\))?!?: .+` - Breaking change (`!`) and scope `(scope)` both accepted ## Why `semantic-release` reads individual commit titles post-merge to decide version bump. A malformed title does not error — it just gets silently skipped. This gate catches the problem before merge, not after. ## Verification - Regex tested against 39 recent commits — all pass - `go-licenses check` exits 0 on current dep tree - YAML parses clean ## Files changed | File | Change | |------|--------| | `.tekton/tasks/commit-title-check.yaml` | New task | | `.tekton/on-pull-request.yaml` | Wire task + add `pr_title`/`base_ref` params | | `.tekton/tasks/go-ci.yaml` | Add `license-check` step | | `image/release-tools/Containerfile` | Add `go-licenses` install + smoke check | | `image/release-tools/VERSIONS.md` | Document `go-licenses v1.6.0` |
op1st-gitops commented 2026-05-26 13:17:50 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/code-scans-fc4bt is running.

Starting Pipelinerun code-scans-fc4bt in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines code-scans-fc4bt -f

op1st Pipelines as Code/code-scans-fc4bt is running. Starting Pipelinerun <b>[code-scans-fc4bt](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-fc4bt)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-fc4bt) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines code-scans-fc4bt -f</code>
op1st-gitops commented 2026-05-26 13:17:50 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-5j5zv is running.

Starting Pipelinerun on-pull-request-5j5zv in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-5j5zv -f

op1st Pipelines as Code/on-pull-request-5j5zv is running. Starting Pipelinerun <b>[on-pull-request-5j5zv](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-5j5zv)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-5j5zv) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-5j5zv -f</code>
op1st-gitops commented 2026-05-26 13:18:12 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/code-scans-fc4bt has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 13 seconds

fetch-source

Succeeded 7 seconds

gitleaks-version

Succeeded 8 seconds

gitleaks

op1st Pipelines as Code/code-scans-fc4bt has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-fc4bt">code-scans-fc4bt</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>13 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-fc4bt/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>7 seconds</td><td> [gitleaks-version](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-fc4bt/logs/gitleaks-version) </td></tr> <tr> <td>Succeeded</td> <td>8 seconds</td><td> [gitleaks](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-fc4bt/logs/gitleaks) </td></tr> </table>
op1st-gitops commented 2026-05-26 13:18:50 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/code-scans-7ph9b is running.

Starting Pipelinerun code-scans-7ph9b in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines code-scans-7ph9b -f

op1st Pipelines as Code/code-scans-7ph9b is running. Starting Pipelinerun <b>[code-scans-7ph9b](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-7ph9b)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-7ph9b) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines code-scans-7ph9b -f</code>
op1st-gitops commented 2026-05-26 13:18:50 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-2rb8x is running.

Starting Pipelinerun on-pull-request-2rb8x in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-2rb8x -f

op1st Pipelines as Code/on-pull-request-2rb8x is running. Starting Pipelinerun <b>[on-pull-request-2rb8x](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-2rb8x)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-2rb8x) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-2rb8x -f</code>
op1st-gitops commented 2026-05-26 13:18:54 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-5j5zv


Task Statuses:

StatusDurationName
Succeeded 11 seconds

fetch-source

Failed 53 seconds

build-and-test

Succeeded 16 seconds

commit-title-check


Failure snippet:

task build-and-test has the status "TaskRunCancelled":
TaskRun "on-pull-request-5j5zv-build-and-test" was cancelled. TaskRun cancelled as the PipelineRun it belongs to has been cancelled.
op1st Pipelines as Code/on-pull-request-5j5zv <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-5j5zv">on-pull-request-5j5zv</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>11 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-5j5zv/logs/fetch-source) </td></tr> <tr> <td>Failed</td> <td>53 seconds</td><td> [build-and-test](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-5j5zv/logs/build-and-test) </td></tr> <tr> <td>Succeeded</td> <td>16 seconds</td><td> [commit-title-check](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-5j5zv/logs/commit-title-check) </td></tr> </table> <hr> <h4>Failure snippet:</h4> task <b>build-and-test</b> has the status <b>"TaskRunCancelled"</b>: <pre>TaskRun "on-pull-request-5j5zv-build-and-test" was cancelled. TaskRun cancelled as the PipelineRun it belongs to has been cancelled.</pre>
op1st-gitops commented 2026-05-26 13:19:21 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/code-scans-7ph9b has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 19 seconds

fetch-source

Succeeded 13 seconds

gitleaks-version

Succeeded 10 seconds

gitleaks

op1st Pipelines as Code/code-scans-7ph9b has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-7ph9b">code-scans-7ph9b</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>19 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-7ph9b/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>13 seconds</td><td> [gitleaks-version](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-7ph9b/logs/gitleaks-version) </td></tr> <tr> <td>Succeeded</td> <td>10 seconds</td><td> [gitleaks](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-7ph9b/logs/gitleaks) </td></tr> </table>
op1st-gitops commented 2026-05-26 13:20:30 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-2rb8x has failed.


Task Statuses:

StatusDurationName
Succeeded 21 seconds

fetch-source

Failed 1 minute

build-and-test

Succeeded 14 seconds

commit-title-check


Failure snippet:

task build-and-test has the status "Failed":
/tekton/scripts/script-7-6nksj: line 7: go-licenses: command not found
op1st Pipelines as Code/on-pull-request-2rb8x has <b>failed</b>. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-2rb8x">on-pull-request-2rb8x</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>21 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-2rb8x/logs/fetch-source) </td></tr> <tr> <td>Failed</td> <td>1 minute</td><td> [build-and-test](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-2rb8x/logs/build-and-test) </td></tr> <tr> <td>Succeeded</td> <td>14 seconds</td><td> [commit-title-check](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-2rb8x/logs/commit-title-check) </td></tr> </table> <hr> <h4>Failure snippet:</h4> task <b>build-and-test</b> has the status <b>"Failed"</b>: <pre>/tekton/scripts/script-7-6nksj: line 7: go-licenses: command not found</pre>
op1st-gitops commented 2026-05-26 13:26:17 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-mnxlm is running.

Starting Pipelinerun on-pull-request-mnxlm in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-mnxlm -f

op1st Pipelines as Code/on-pull-request-mnxlm is running. Starting Pipelinerun <b>[on-pull-request-mnxlm](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-mnxlm)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-mnxlm) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-mnxlm -f</code>
op1st-gitops commented 2026-05-26 13:26:17 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/code-scans-qsjws is running.

Starting Pipelinerun code-scans-qsjws in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines code-scans-qsjws -f

op1st Pipelines as Code/code-scans-qsjws is running. Starting Pipelinerun <b>[code-scans-qsjws](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-qsjws)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-qsjws) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines code-scans-qsjws -f</code>
op1st-gitops commented 2026-05-26 13:26:41 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/code-scans-qsjws has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 13 seconds

fetch-source

Succeeded 7 seconds

gitleaks-version

Succeeded 10 seconds

gitleaks

op1st Pipelines as Code/code-scans-qsjws has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-qsjws">code-scans-qsjws</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>13 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-qsjws/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>7 seconds</td><td> [gitleaks-version](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-qsjws/logs/gitleaks-version) </td></tr> <tr> <td>Succeeded</td> <td>10 seconds</td><td> [gitleaks](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/code-scans-qsjws/logs/gitleaks) </td></tr> </table>
op1st-gitops commented 2026-05-26 13:27:59 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-mnxlm has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 13 seconds

fetch-source

Succeeded 1 minute

build-and-test

Succeeded 13 seconds

commit-title-check

op1st Pipelines as Code/on-pull-request-mnxlm has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-mnxlm">on-pull-request-mnxlm</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>13 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-mnxlm/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>1 minute</td><td> [build-and-test](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-mnxlm/logs/build-and-test) </td></tr> <tr> <td>Succeeded</td> <td>13 seconds</td><td> [commit-title-check](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1~PipelineRun/on-pull-request-mnxlm/logs/commit-title-check) </td></tr> </table>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
agentic-forges/forgejo-mcp!166
No description provided.