mcpField
S
sending-notifications

sending-notifications

github.com/posthog開発40.5k171 回インストール今日更新
リポジトリ

sending-notifications について

PostHog の機能開発者向けに、リアルタイム通知の実装方法を説明するスキルです。共通ファサードでの作成、宛先と優先度の設定、アクセス権による絞り込み、配信経路を扱います。

主な機能

  1. 01共通ファサード経由で通知を作成
  2. 02宛先、リソース、優先度の設定
  3. 03リソース権限による宛先の絞り込み
  4. 04リアルタイム配信経路の説明
  5. 05通知タイプ追加手順の案内

活用シーン

  1. 01コメントでのメンションを通知
  2. 02閾値超過を関係者に通知
  3. 03承認依頼や結果をユーザーに通知
  4. 04データパイプラインの失敗を報告

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/posthog/posthog --skill sending-notifications

インストール後、Claude Code で/sending-notificationsを入力して読み込まれたか確認します。

詳細

リアルタイム通知の送信

使用する場面

PostHog の機能に通知サポートを追加する場合 — たとえば、コメントでメンションされたとき、アラートが発火したとき、承認がリクエストされたときにユーザーへ通知する場合です。

ファサード API

通知の作成はすべて単一の関数を通じて行います。内部モジュールからではなく、ファサードからインポートしてください:

from products.notifications.backend.facade.api import (
    create_notification,
    NotificationData,
    NotificationType,
    Priority,
    TargetType,
)

NotificationData を構築し、create_notification を呼び出します:

event = create_notification(
    NotificationData(
        team_id=team.id,
        notification_type=NotificationType.ALERT_FIRING,
        priority=Priority.CRITICAL,
        title="Event ingestion latency > 30s",
        body="Events are queuing up. Ingestion pipeline is degraded.",
        target_type=TargetType.USER,
        target_id=str(user.id),
        resource_type="dashboard",
        resource_id="42",
        source_url="/dashboard/42",
    )
)

成功時は NotificationEvent を返し、フィーチャーフラグが無効である場合、受信者が解決されなかった場合、またはチームが存在しない場合は None を返します。どのようなコンテキストでも安全に呼び出せます。

NotificationData のフィールド

必須:

フィールド型説明
team_idintチームコンテキスト — 組織の参照とフィーチャーフラグの確認に使用されます
notification_typeNotificationTypeUI のアイコンを決定します
titlestr通知の見出し (約100文字を推奨)
bodystr展開時に表示される長い説明。空文字列にできます
target_typeTargetType受信者: user、team、organization、または role
target_idstrターゲットの ID (ユーザー ID、チーム ID、組織 UUID、またはロール UUID を文字列として指定)

任意:

フィールド型デフォルト説明
resource_typeNotificationResourceType | NoneNoneアクセス制御された型 (例: "dashboard") は、閲覧権限のない受信者を自動的に除外します
resource_idstr""リンク用のリソースの ID
source_urlstr""相対 URL パス (例: /dashboard/42)。UI ではリンクアイコンとして表示されます
priorityPriorityNORMALnormal = ポップオーバーのみ、critical = ポップオーバー + 永続的なトースト
archivableboolFalse受信者ごとの「アーカイブ」(削除) アクションを有効にし、通知を受信者のアーカイブタブに移動します。False の場合、受信者は既読/未読のマークのみ可能です (デフォルトのパターン)
resolverRecipientsResolver | NoneNoneカスタムの受信者リゾルバー。デフォルトではユーザー/チーム/組織/ロールのターゲティングを処理します

パラメータの選択

通知タイプ
タイプ使用する場面
comment_mentionユーザーがコメントやディスカッションで @メンションされた
alert_firing監視アラートのしきい値が超過した
approval_requested変更にユーザーの承認が必要になった
approval_resolvedユーザーが要求した承認が解決された
pipeline_failureデータパイプラインまたはバッチエクスポートが失敗した
issue_assignedエラー追跡のイシューがユーザーに割り当てられた
優先度

critical の扱いには十分注意してください。 critical は、ユーザーの画面に重なって表示され、手動で閉じる必要がある永続的なトーストポップアップをトリガーします。これは意図的に邪魔になるように設計されています。停止、セキュリティアラート、SLA 違反など、真の緊急事態に限定して使用してください。critical を乱用すると、ユーザーは通知を完全に無視するように学習してしまいます。迷ったときは normal を使用してください。

ターゲットタイプ
ターゲットtarget_id の値受信者
userユーザー IDそのユーザーのみ
teamチーム IDチームの組織の全メンバー
organization組織 ID組織の全メンバー
roleロール IDその RBAC ロールを持つ全ユーザー
リソースタイプとアクセス制御

resource_type がアクセス制御されたリソース(ダッシュボード、feature_flag、experiment など)と一致する場合、viewer アクセスを持たない受信者は自動的に除外されます。通知専用のタイプ(pipeline、approval、comment)では、AC フィルタリングは適用されません。

配信パイプライン

Django (create_notification)
  → Postgres (NotificationEvent row)
  → Kafka (notification_events topic, on transaction commit)
  → Go livestream service (Kafka consumer)
  → Redis SPUBLISH (sharded pub/sub, keyed by org ID)
  → SSE (/notifications endpoint)
  → Browser (popover + optional toast)

Kafka へのパブリッシュは transaction.on_commit で行われます。トランザクションがロールバックされると実行されません。

新しい通知タイプの追加

  1. products/notifications/backend/facade/enums.py に列挙値を追加する
  2. frontend/src/lib/components/NotificationsMenu/notificationToasts.tsx(NOTIFICATION_TYPE_ICONS)にアイコンマッピングを追加する — これは単一のアイコンソースであり、getNotificationIcon によって読み取られ、それを呼び出すのは NotificationRow のみです。サイドパネルはその行をレンダリングすることでアイコンを取得します
  3. frontend/src/lib/components/NotificationsMenu/NotificationRow.tsx(REALTIME_NOTIFICATION_TYPE_META)にラベル + 説明のエントリを追加する — これはタイプごとの通知設定 UI を制御します
  4. python manage.py makemigrations notifications を実行する

テスト

テストではフィーチャーフラグをモックします:

from unittest.mock import patch

with patch("posthoganalytics.feature_enabled", side_effect=lambda flag, *a, **kw: flag == "real-time-notifications"):
    event = create_notification(data)

コメント