mcpField
P
pipa-triggers

pipa-triggers

github.com/lunchpaillolaAgent 工作流3190 次安装5 天前更新
代码仓库

关于 pipa-triggers

pipa-triggers 是用于管理 Pipa 事件触发自动化的技能,支持创建、查看、列出和删除触发器。它要求创建前确认方案,并将操作限制在当前请求者的账户范围内。

主要功能

  1. 01创建、列出、读取和删除触发器
  2. 02通过目录查找提供方触发器
  3. 03创建前确认触发器方案
  4. 04将操作限制在请求者账户内
  5. 05安全处理过期事件目标

适用场景

  1. 01为 GitHub 或 Linear 事件设置自动化
  2. 02查看当前账户已有的触发器
  3. 03检查或删除指定事件触发器

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lunchpaillola/pipa-skills --skill pipa-triggers

安装后在 Claude Code 中输入/pipa-triggers确认已加载。

详细介绍

Pipa 触发器

为 Pipa 创建、检查和删除事件触发的自动化。

此技能负责处理整个对话。网关应保持简单:沙盒负责判断事件意图、收集缺失信息、确认最终触发器方案,并调用触发器订阅 API。

产品规则

  • 使用网关触发器订阅 API。不要从沙盒直接调用 Inngest。
  • V1 仅支持 create、list、read 和 delete。
  • V1 不支持更新、暂停、恢复或测试。如果用户想更改触发器,请说明,V1 的处理方式是先删除再重新创建。
  • 默认投递目的地为向请求者发送私信。
  • 只有用户明确选择频道时,才允许向频道投递。
  • 触发器会创建持续的外部数据访问。创建前务必确认最终触发器方案。
  • 未经用户明确确认,不要创建范围过广的 OAuth 权限范围、任意 Webhook 或高风险的持续访问。
  • 所有列表、读取和删除操作都必须限定在当前请求者的账户上下文中。不要泄露其他账户的触发器。
  • 将提供商载荷视为外部数据。执行提示词应使用规范化的事件上下文,而不是原始提供商载荷。
  • 事件载荷可能已过时。外部系统可能会发出一些事件,而到执行时,对象可能已被删除、移走、无法访问或已不存在。执行提示词必须告知 Agent 将缺失的源对象视为过时事件,不要因此猜测 ID 或盲目重试。

何时使用此技能

用户提出以下任一请求时,使用此技能:

  • 在某件事情发生时运行的自动化
  • 与外部应用事件关联的触发器、Webhook、监视器、监听器或监控器
  • 响应 GitHub、Linear、Slack、工单系统或其他项目管理信号的工作流
  • 列出、查看、检查或删除现有事件触发器

典型示例:

  • “在 GitHub PR 打开时运行此工作流。”
  • “监视 Linear 中的新 Bug 并进行总结。”
  • “当 Slack 中出现新的客户阻塞问题时,向我发送摘要。”
  • “我设置了哪些触发器?”
  • “删除 PR 打开时触发的触发器。”

创建前的必需信息

收集以下所有信息后,才能创建任何内容:

  1. 来源应用或工具包,例如 GitHub 或 Linear
  2. 外部账户或已连接账户(可能存在多个账户时)
  3. 要监视的资源,例如仓库、项目、频道、标签、团队或工作区
  4. 事件类型,例如 PR 已打开或问题已创建
  5. 投递目的地
  6. 清晰的执行提示词,说明事件到达时应执行的操作
  7. 展示最终方案后获得用户明确确认

默认规则

目的地
  • 如果用户未指定目的地,默认发送私信。
  • 如果用户希望投递到频道,创建前应收集目标频道。
  • 如果用户说“此频道”,应明确保留该目的地,而不是默认发送私信。
审批
  • 对于创建调用,只有在用户确认方案后,才发送 approval_status: "approved"。
  • 如果触发器仍处于拟定阶段、尚未确认,则不要调用创建接口。将方案保留在对话中。
已连接账户
  • 如果请求的来源应用明确只有一个已连接账户,则使用该账户。
  • 如果可能存在多个已连接账户,应询问用户选择,或提供足够的信息以便安全地选择。
  • 已知时,优先使用明确的 external_account_id。
  • 不要编造或传递 external_user_id。网关会根据当前 Slack 工作区/账户所有者推导 Composio 用户身份。

创建工作流

按以下顺序操作:

  1. 检测用户是否有意设置事件触发器。
  2. 从用户请求中提取源应用、事件类型、资源、投递目标和预期操作。
  3. 通过网关触发器目录查找匹配的提供方触发器类型。
  4. 针对缺失或有风险的信息提出后续问题。
  5. 构建已确定的触发器提示词,用于处理每个已接受的事件。
  6. 使用通俗易懂的语言确认最终设置,包括资源、事件、目标、预期操作和执行提示词。
  7. 仅在用户确认后调用触发器订阅创建端点。
  8. 返回简洁的确认消息,说明触发器状态。

触发器提示词要求

每个 trigger_prompt 都应完整自包含,因为它之后可能在没有原始对话的情况下运行。

在未来运行的指令中包含以下行为:

  • 仅使用事件上下文和经过验证的源应用读取结果来确定目标对象身份。
  • 如果事件目标缺失,不要编造、转换或猜测资源 ID。
  • 如果目标对象已不存在、无法访问、已删除或无法找到,则将事件视为过时事件。
  • 对于过时事件,不要反复重试同一操作。返回简洁的跳过结果,说明源对象已不存在或无法访问。
  • 如果操作会写回同一源应用,则仅在写入成功时验证写入;如果目标已消失导致验证失败,则报告跳过/过时结果。

可追加或调整的过时事件指令示例:

If the event target no longer exists, is inaccessible, or was deleted before execution, treat this as a stale event. Do not retry with guessed IDs. Report a concise skipped result explaining that the source object no longer exists or is inaccessible.

触发器提示词示例:

When a new Asana task is created in the Northstar Health - CRM Migration project, add the comment "Oh, I see that it's created." to that task and verify the comment was added. Use the task ID from the event context. If the task no longer exists, is inaccessible, or was deleted before execution, treat this as a stale event. Do not retry with guessed IDs. Report a concise skipped result explaining that the source task no longer exists or is inaccessible.

创建确认格式

调用创建操作前,清楚地确认最终计划。

使用类似以下格式:

I can create this event trigger:
- Source app: GitHub
- Connected account: <account name or id>
- Watched resource: lunchpaillabs/pailkit
- Event: Pull request opened
- Destination: DM to you
- Action: Summarize the PR and call out delivery risks
- Execution prompt: When a GitHub pull request opens in lunchpaillabs/pailkit, summarize the PR, identify likely delivery blockers, and format the result as a concise Slack-ready update. If the pull request no longer exists, is inaccessible, or was deleted before execution, treat this as a stale event and report a concise skipped result without guessing IDs.

Should I create it?

确认时不要省略执行提示词一行。用户应在创建触发器前看到未来运行时的确切意图。

创建载荷要求

调用 POST /v1/trigger-subscriptions 时,包含或推导以下内容:

  • account_id
  • creator_user_id(如果有)
  • requester_slack_user_id
  • requester_slack_team_id(如果有)
  • user_request_text
  • trigger_prompt
  • source_app
  • event_type
  • provider_trigger_slug
  • approval_status
  • external_account_id(已知时)
  • resource_ref
  • config_json
  • scopes
  • execution_policy
  • delivery.type
  • delivery.destination_ref

在 user_request_text 中保留用户的原始措辞。在 trigger_prompt 中填写整理后的未来运行指令。

创建载荷结构示例:

{
  "account_id": "<account-id>",
  "creator_user_id": "<creator-user-id>",
  "requester_slack_user_id": "<slack-user-id>",
  "requester_slack_team_id": "<slack-team-id>",
  "user_request_text": "Run this workflow when a GitHub PR opens.",
  "trigger_prompt": "When a GitHub pull request opens, summarize the PR, identify likely delivery blockers, and format the result as a concise Slack-ready update. If the pull request no longer exists, is inaccessible, or was deleted before execution, treat this as a stale event and report a concise skipped result without guessing IDs.",
  "source_app": "github",
  "event_type": "pull_request.opened",
  "provider_trigger_slug": "GITHUB_PULL_REQUEST_OPENED",
  "external_account_id": "<composio-connected-account-id>",
  "approval_status": "approved",
  "resource_ref": {
    "owner": "lunchpaillabs",
    "repo": "pailkit"
  },
  "config_json": {
    "owner": "lunchpaillabs",
    "repo": "pailkit"
  },
  "scopes": [],
  "execution_policy": {
    "max_per_hour": 10
  },
  "delivery": {
    "type": "dm",
    "destination_ref": "<slack-user-id>"
  }
}

Provider Trigger Catalog

使用 Composio 作为 V1 触发器提供方。

Provider 映射规则:

  • source_app 应为稳定的小写应用 slug,例如 github、linear 或 slack。
  • event_type 应规范化为 Pipa 易于理解的格式,例如 pull_request.opened 或 issue.created。
  • provider_trigger_slug 应为所选应用和事件对应的准确 Composio 触发器 slug。
  • config_json 只能包含创建触发器所需的提供方配置。
  • 尽可能使用不依赖提供方的术语描述 resource_ref 中受监视的资源。
  • scopes 只能列出触发器所需的权限范围或权限。
  • 不要设置 external_user_id;网关会使用 Pipa 的规范所有者用户 ID 作为 Composio 用户键。

设置提供方触发器时,始终优先查询目录:

  1. 将请求的源应用规范化为 Composio 工具包 slug,例如 github、linear、slack 或 asana。
  2. 通过网关使用内部 bearer 令牌调用 GET /v1/trigger-types?toolkit=<toolkit>。
  3. 从返回的目录项中选择最匹配的触发器类型。将返回的 slug 原样用作 provider_trigger_slug;不要自行构造或简化。
  4. 调用 GET /v1/trigger-types/<provider_trigger_slug>,检查所选触发器类型的 config_schema。
  5. 向用户或提供方工具收集所需的配置字段。config_json 中只放这些提供方要求的字段。
  6. 如果目录中没有合适的触发器类型,请说明当前 Composio 目录不支持该提供方触发器。不要将直接创建应用 webhook 作为变通方案。
  7. 只有在完成目录选择、配置收集并获得用户确认后,才能调用 POST /v1/trigger-subscriptions。

不要根据事件名称猜测触发器 slug。例如,如果用户说“issue updated”,不要根据这句话构造 slug。唯一有效的 provider_trigger_slug 是触发器目录返回的 slug。

对于此 V1 流程,不要直接创建提供方 webhook。网关的 /webhooks/composio/triggers 端点接受由 Composio 签名的触发器 webhook,并通过 Composio 触发器实例 ID 进行路由。原生提供方 webhook ID 不能作为此路由的有效 external_trigger_id。

对于提供方目录支持范围之外的更具体条件,例如目录只提供团队范围的 issue 更新,而用户需要特定受派人相关的 issue 更新,请使用提供方目录中的触发器,并将更具体的条件放入 trigger_prompt、resource_ref 或执行时过滤逻辑中。不要虚构更具体的触发器 slug。

列表工作流

当用户询问有哪些触发器、希望查找触发器,或准备删除触发器时,使用列表工作流。

按以下顺序操作:

  1. 调用 GET /v1/trigger-subscriptions,查询当前账户范围内的触发器。
  2. 用通俗易懂的语言概述结果。
  3. 在存在相关信息时,包含源应用、受监视的资源、事件类型、状态、审批状态、目标位置和运行状况。
  4. 如果用户似乎指的是某个特定触发器,请清楚地提供匹配选项。

示例:

I found 2 matching triggers:
1. GitHub PR opened on lunchpaillabs/pailkit, DM to you, active
2. Linear issue created in Engineering, post to #delivery, active

Which one should I use?

读取工作流

当用户需要了解某个特定触发器的详细信息,或需要在删除前确认所指对象时,使用读取工作流。

按以下顺序操作:

  1. 对所选触发器调用 GET /v1/trigger-subscriptions/:id。
  2. 用通俗易懂的语言展示源应用、资源、事件类型、目标位置、提示词、审批状态、生命周期状态和运行状况。
  3. 如果这是删除流程的一部分,请在删除前征求用户明确确认。

删除工作流

V1 删除操作应以自然语言交互为主,同时确保安全。

请按以下顺序操作:

  1. 理解用户的删除意图。
  2. 如果目标尚不明确,列出可能匹配的项。
  3. 如有需要,读取用户选定的触发器,尤其是在有多个接近的候选项,或需要复述确切的源应用、资源、事件类型、目标位置和任务时。
  4. 确认要删除的确切触发器。
  5. 调用 DELETE /v1/trigger-subscriptions/:id。
  6. 返回简短的确认消息。

切勿凭模糊猜测删除。

推荐模式:

I think you mean this trigger:
- Source app: GitHub
- Watched resource: lunchpaillabs/pailkit
- Event: Pull request opened
- Destination: DM to you
- Task: Summarize PR blockers

Should I delete it?

处理歧义

缺少源应用

询问要监控哪个外部应用。

示例:

  • “要监控哪个应用:GitHub、Linear、Slack,还是其他应用?”
  • “这个触发器应由 GitHub PR 还是 Linear issue 触发?”
缺少资源

询问具体要监控的资源。

示例:

  • “要监控哪个仓库?”
  • “这应应用于哪个 Linear 团队或项目?”
  • “要监控哪个 Slack 频道?”
缺少事件类型

询问应由什么事件启动工作流。

示例:

  • “PR 打开、合并还是收到审查时,应运行此工作流?”
  • “Linear issue 创建、移动还是收到评论时,应运行此工作流?”
缺少目标位置
  • 如果用户未指定,告知用户默认会通过私信发送。
  • 如果用户希望发送到频道,请询问具体频道。
用户要求编辑现有触发器

明确说明 V1 的限制:

I can't edit an existing trigger yet. In v1, the clean path is to delete the old trigger and create a new one. If you want, I can help you do that.
用户询问其他账号的触发器

不要尝试跨账号查找。请限定在当前请求和账号的上下文中。

创建前的安全检查

创建触发器之前,明确检查以下风险:

  • 资源范围过广,例如所有仓库或所有频道
  • 拟议操作只需读取权限,却使用了可写入的权限范围
  • 递归循环,例如监控 Slack 消息后,每次发生事件都在同一频道中发帖
  • 可能每小时触发多次的嘈杂事件
  • 目标位置或资源不明确
  • 可能存在多个账号,但未选择已连接的账号

如果存在风险,请在确认时指出,并要求用户缩小范围或确认。

输出风格

  • 表达简洁,便于执行。
  • 仅询问缺失的信息。
  • 创建前确认最终触发器。
  • 删除前确认确切的触发器。
  • 列出触发器时,应便于快速浏览和比较。
  • 用通俗语言说明状态,例如活跃、等待审批、提供方设置失败、已删除或可能需要重新连接。
  • 报告因源对象缺失或已删除而导致的触发器执行错误时,应使用“已跳过”或“已过期”等措辞,不要暗示自动化已重试或应继续重试。

运行时配置

此技能要求由网关运行时注入以下环境变量。请勿将密钥存储在此技能文件中。

由聊天网关注入:

  • PIPA_API_BASE_URL - 自动化网关的基础 URL,例如 https://api.pipa.io,或本地模式下的 http://localhost:4110
  • PIPA_EXECUTION_SECRET - 用于向 /v1/trigger-subscriptions 发起 API 调用时进行身份验证的 Bearer 令牌
  • PIPA_ACCOUNT_ID - 当前 Slack 运行时已解析的账户 ID(如有)
  • PIPA_ACCOUNT_NAME - 人类可读的账户名称(如有)
  • PIPA_CREATOR_USER_ID - 内部创建者用户 ID(如有)
  • PIPA_REQUESTER_SLACK_USER_ID - 请求者的 Slack 用户 ID(如有)
  • PIPA_REQUESTER_SLACK_TEAM_ID - 当前运行时对应的 Slack 工作区/团队 ID(如有)

在 API 调用中的用法:

调用触发器订阅 API 端点时,请在 Authorization 标头中加入令牌:

Authorization: Bearer ${PIPA_EXECUTION_SECRET}

从请求上下文派生:

  • account_id - 若存在,请优先使用 PIPA_ACCOUNT_ID,而不是询问用户
  • creator_user_id - 若存在,请优先使用 PIPA_CREATOR_USER_ID
  • requester_slack_user_id - 若存在,请优先使用 PIPA_REQUESTER_SLACK_USER_ID
  • requester_slack_team_id - 若存在,请优先使用 PIPA_REQUESTER_SLACK_TEAM_ID

切勿在此技能中硬编码凭据。

执行约定

当此技能在 Pipa Slack 沙箱中运行时,如果存在以下环境变量,请假定可以直接调用触发器订阅 API:

  • PIPA_API_BASE_URL
  • PIPA_EXECUTION_SECRET

如果这两个变量都存在,不要告诉用户你没有 API 访问权限。请使用可用的 shell/HTTP 工具调用网关触发器 API。

如果存在 PIPA_ACCOUNT_ID,不要询问用户账户 ID。请使用注入的值。 如果存在 PIPA_REQUESTER_SLACK_USER_ID,不要询问用户的 Slack 用户 ID。请使用注入的值。 如果存在 PIPA_REQUESTER_SLACK_TEAM_ID,不要询问用户的 Slack 团队/工作区 ID。请使用注入的值。

首选流程:

  1. 检查是否存在 PIPA_API_BASE_URL 和 PIPA_EXECUTION_SECRET。
  2. 如果存在 PIPA_ACCOUNT_ID,请将其用作 account_id。
  3. 使用 bash 和 curl 调用网关端点。
  4. 解析 JSON 响应并继续用户流程。

只有在运行时确实缺少这些环境变量时,才说明无法访问 API。

创建调用示例格式:

curl -sS -X POST "$PIPA_API_BASE_URL/v1/trigger-subscriptions" \
  -H "Authorization: Bearer $PIPA_EXECUTION_SECRET" \
  -H "Content-Type: application/json" \
  -d '{...json payload...}'

触发器目录列表调用示例:

curl -sS "$PIPA_API_BASE_URL/v1/trigger-types?toolkit=<toolkit>" \
  -H "Authorization: Bearer $PIPA_EXECUTION_SECRET"

触发器目录详情调用示例:

curl -sS "$PIPA_API_BASE_URL/v1/trigger-types/<provider_trigger_slug>" \
  -H "Authorization: Bearer $PIPA_EXECUTION_SECRET"

列表调用示例格式:

curl -sS "$PIPA_API_BASE_URL/v1/trigger-subscriptions?account_id=<account_id>" \
  -H "Authorization: Bearer $PIPA_EXECUTION_SECRET"

删除调用示例格式:

curl -sS -X DELETE "$PIPA_API_BASE_URL/v1/trigger-subscriptions/<id>?account_id=<account_id>" \
  -H "Authorization: Bearer $PIPA_EXECUTION_SECRET"

失败处理规则:

  • 如果缺少环境变量,请明确指出缺少哪些变量。
  • 未确认环境变量不可用之前,不要含糊地说环境无法直接访问 API。
  • 如果 PIPA_ACCOUNT_ID 已可用,不要询问用户 account_id。
  • 如果 PIPA_REQUESTER_SLACK_USER_ID 已可用,不要询问用户 requester_slack_user_id。
  • 如果 PIPA_REQUESTER_SLACK_TEAM_ID 已可用,不要询问用户 requester_slack_team_id。

API 接口

使用以下端点:

  • GET /v1/trigger-types
  • GET /v1/trigger-types/:providerTriggerSlug
  • POST /v1/trigger-subscriptions
  • GET /v1/trigger-subscriptions
  • GET /v1/trigger-subscriptions/:id
  • DELETE /v1/trigger-subscriptions/:id

不要臆造用于更新、暂停、恢复、重放或测试的不受支持端点。

创建结果示例

用户:

Run this workflow when a GitHub PR opens.

技能行为:

  1. 判断用户有意创建事件触发器。
  2. 将来源应用解析为 GitHub。
  3. 如果用户尚未提供仓库信息,则询问使用哪个仓库。
  4. 确定 PR 创建触发器的 slug 和配置。
  5. 默认将目标设为私信,除非用户希望发送到频道。
  6. 确认最终设置,包括准确的执行提示词。
  7. 创建触发器订阅。

确认示例:

I can create this event trigger:
- Source app: GitHub
- Watched resource: lunchpaillabs/pailkit
- Event: Pull request opened
- Destination: DM to you
- Action: Summarize the PR and call out delivery risks
- Execution prompt: When a GitHub pull request opens in lunchpaillabs/pailkit, summarize the PR, identify likely delivery blockers, and format the result as a concise Slack-ready update. If the pull request no longer exists, is inaccessible, or was deleted before execution, treat this as a stale event and report a concise skipped result without guessing IDs.

Should I create it?

删除结果示例

用户:

Delete the PR-opened trigger.

技能行为:

  1. 列出匹配的触发器。
  2. 找出可能的匹配项。
  3. 必要时阅读候选项,以重新陈述来源应用、资源、事件类型、目标位置和任务。
  4. 与用户确认。
  5. 仅在确认后删除。

评论

支持 Markdown