Skip to content

feat(clickup): add flyteplugins-clickup - #1516

Merged
cosmicBboy merged 2 commits into
nielsb/webhooks-linearfrom
nielsb/webhooks-clickup
Sep 2, 2026
Merged

feat(clickup): add flyteplugins-clickup#1516
cosmicBboy merged 2 commits into
nielsb/webhooks-linearfrom
nielsb/webhooks-clickup

Conversation

@cosmicBboy

Copy link
Copy Markdown
Collaborator

Part of the webhook plugin stack. Requires #1512 (flyteplugins-webhooks-core), which is this PR's base — the diff here is just this package.

Receive ClickUp webhooks in Flyte.

What it implements

The Provider contract from core: which environment variable holds the secret, how to verify a delivery, how to parse one into a WebhookEvent, plus typed constants for every event ClickUp sends.

Verification: HMAC-SHA256 over the raw body (X-Clickup-Signature).

The list id sits at the top level on list-scoped events and on the nested task for task-scoped ones; the parser reads both, or a scopes allowlist cannot attribute task events at all.

Conformance

Runs the shared assert_provider_conforms, which replays this plugin's SAMPLE_DELIVERY — a real ClickUp payload — through verify and parse rather than trusting them to agree with each other. It also asserts the verifier returns False rather than raising on a hostile header, that event constants render as wire values rather than enum names, and that the sample parses to something the constants actually spell.

5 tests. make fmt, make mypy, make ty, ruff, and codespell pass.

What it does not do

Call the ClickUp API. Use httpx — ClickUp ships no Python SDK and its API is a handful of REST calls directly from your tasks — the recipes are in the examples PR at the end of this stack. This plugin owns only the part that is Flyte's: authenticating an inbound delivery and turning it into a run.

@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-linear branch from 6afc243 to 68f65cb Compare September 1, 2026 17:35
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-clickup branch from 410aa4a to d1b3007 Compare September 1, 2026 17:36
@cosmicBboy
cosmicBboy marked this pull request as ready for review September 1, 2026 17:54
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-linear branch from 68f65cb to ab7c4a9 Compare September 1, 2026 18:29
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-clickup branch from d1b3007 to 69f870c Compare September 1, 2026 18:29
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-linear branch from ab7c4a9 to 730652d Compare September 1, 2026 18:54
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-clickup branch from 69f870c to 7e85ea9 Compare September 1, 2026 18:54
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-linear branch from 730652d to 57fc28f Compare September 2, 2026 00:56
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-clickup branch from 7e85ea9 to 8e7e70f Compare September 2, 2026 00:56
@cosmicBboy cosmicBboy changed the title feat(webhooks): flyteplugins-webhooks-clickup feat(clickup): add flyteplugins-clickup Sep 2, 2026
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-linear branch from 57fc28f to 2cd0960 Compare September 2, 2026 01:03
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-clickup branch from 8e7e70f to 3ad4f51 Compare September 2, 2026 01:03
Receive ClickUp webhooks in Flyte. Exports ClickUpProvider, a Provider subclass with its
defaults pre-wired, so wiring it up reads:

    WebhookAppEnvironment(providers=[ClickUpProvider()])

The receiver itself ships with flyte, at flyte.extras.webhooks; this package
contributes only what is specific to ClickUp -- which environment variable holds
the secret, how to verify a delivery, how to parse one into a WebhookEvent, and
typed constants for every event ClickUp sends.

examples/clickup_webhooks.py runs with no ClickUp account at all: --local replays
this plugin's own SAMPLE_DELIVERY through the app. The shared conformance check
exercises that same sample.

The package is named for the product rather than for webhooks, so client
methods can land here later when they earn their place -- as review_pr does in
flyteplugins-github, where flyte.new_condition is the part no vendor SDK can
provide. Plain API passthrough belongs in the vendor's own SDK.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VKZrTNjjWVzTZUxDFbn4Nk
Signed-off-by: Niels Bantilan <niels.bantilan@gmail.com>
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-linear branch from 2cd0960 to 508f7e1 Compare September 2, 2026 01:32
@cosmicBboy
cosmicBboy force-pushed the nielsb/webhooks-clickup branch from 3ad4f51 to 42db125 Compare September 2, 2026 01:32
Part of the webhook plugin stack. Requires #1512
(`flyteplugins-webhooks-core`), which is this PR's base — the diff here
is just this package.

Receive Jira webhooks in Flyte.

## What it implements

The `Provider` contract from core: which environment variable holds the
secret, how to verify a delivery, how to parse one into a
`WebhookEvent`, plus typed constants for every event Jira sends.

**Verification:** **none** — Jira Cloud does not sign its webhooks.

Because there is no signature, this plugin authenticates with a shared
token in `X-Webhook-Token`, which something in front of the app has to
inject since Jira cannot send custom headers. `PROVIDER.signed` is
False, so the dashboard says the product does not sign rather than
implying a guarantee that is absent.

This is the plugin that made the conformance harness better: it caught
that a shared token, unlike an HMAC, is **not bound to the request
body**, so a tampered payload still verifies. That is inherent to an
unsigned webhook rather than a bug here, and `signed=False` now opts out
of that one check explicitly instead of the harness quietly passing.

## Conformance

Runs the shared `assert_provider_conforms`, which replays this plugin's
`SAMPLE_DELIVERY` — a real Jira payload — through `verify` and `parse`
rather than trusting them to agree with each other. It also asserts the
verifier returns False rather than raising on a hostile header, that
event constants render as wire values rather than enum names, and that
the sample parses to something the constants actually spell.

6 tests. `make fmt`, `make mypy`, `make ty`, ruff, and codespell pass.

## What it does not do

Call the Jira API. Use the `jira` package directly from your tasks — the
recipes are in the examples PR at the end of this stack. This plugin
owns only the part that is Flyte's: authenticating an inbound delivery
and turning it into a run.

---------

Signed-off-by: Niels Bantilan <niels.bantilan@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cosmicBboy
cosmicBboy merged commit e3395b3 into nielsb/webhooks-linear Sep 2, 2026
62 checks passed
@cosmicBboy
cosmicBboy deleted the nielsb/webhooks-clickup branch September 2, 2026 02:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant