关于 create-connections
create-connections 是用于编写 RevOS Connection YAML 文件的工作流技能,可将选定的 Source 数据流导入数据仓库。它指导数据流筛选、同步设置、用户确认,并通过 RevOS CLI 在本地验证。
主要功能
- 01发现现有连接和数据源
- 02查看可用数据流及同步模式
- 03经用户确认选择数据流
- 04设置同步模式、游标和主键
- 05编写并验证 Connection YAML
适用场景
- 01配置现有 Source 的数据导入
- 02从数据库筛选业务相关数据流
- 03应用前验证连接配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ revosai/ skills --skill create-connections安装后在 Claude Code 中输入/create-connections确认已加载。
附带文件references/mappers.md
详细介绍
创建连接
用途
在 connections/<name>.yaml 下编写一个 Connection YAML,将 Source 中选定的流摄取到组织的数据仓库中。每个连接都是一份完整、独立的文档——revos apply 会读取它并与 API 中的配置进行协调。
难点在于流的选择和同步模式的选择,而非 YAML 的格式。大多数源提供的流远多于项目实际所需;数据库尤为如此。请谨慎选择、与用户确认,然后再编写。
前置条件
- 服务器上已存在该 Source(你可以通过
revos sources list获取其id)。如果用户想从尚未创建的源摄取数据,请先停止并告知他们运行revos sources create——源配置(连接器选择器、凭据、OAuth)需在 RevOS UI 中完成。用户确认已从 UI 返回后,继续操作前请重新运行revos connections list --json和revos sources list --json——UI 可能已为新源自动创建连接。如果已存在匹配的连接,请建议用户运行revos pull拉取,而不要编写重复配置。 revos auth status显示已完成身份验证。如果没有,请让用户运行revos auth login。
用户确认点
此技能涉及两个适合明确确认的决策。不要跳过——流或同步模式选错会浪费数据仓库存储和重新加载时间。
确认点 1:选择流
发现流并询问用户的使用场景后,提出一个子集,并为每个流用一句话说明理由。等待用户确认或修改后再继续。
确认点 2:同步模式和键的选择
为每个选定的流推导出同步模式、游标和主键后,展示表格并在写入文件前确认。大多数用户会快速浏览并批准;有些用户可能会希望将某个流改为 full_refresh_overwrite,或更改游标。
工作流
阶段 1:识别 Source
首先运行 revos connections list --json,查看已有连接。如果用户刚从 Web UI 返回,重新获取数据至关重要——UI 可能已自动创建连接。如果发现符合用户所述目标的连接,请先告知用户,再继续操作,以免创建重复连接。
然后运行 revos sources list --json,并根据服务器端的 name 进行匹配(也可以运行 revos sources list 查看便于浏览的表格)。记录 Source 的 id——它需要写入 Connection YAML 的 spec.source.id 中。
如果用户没有指定 Source,请询问他们想用哪一个。没有 id 不要继续。
阶段 2:发现流
revos sources list-streams <id> --json
这会返回一个对象数组,结构如下:
{
"streamName": "customers",
"streamnamespace": "public",
"syncModes": ["full_refresh_overwrite", "incremental_deduped_history", ...],
"defaultCursorField": ["updated_at"],
"sourceDefinedCursorField": false,
"sourceDefinedPrimaryKey": [["id"]],
"propertyFields": [["id"], ["email"], ["updated_at"], ...]
}
保存完整响应——后续阶段会用到。syncModes 数组限定了该流在项目目标端支持的有效模式;建议的模式必须包含在此列表中。
需要了解该数据结构的两点:
- 数据库源通常会将
defaultCursorField留空,即使它们声明了增量模式。它们会通过propertyFields提供所有列,供你选择。对于数据库源,计划从propertyFields中选择;SaaS 源通常会预先填好合适的defaultCursorField。 - 数据库会设置
streamnamespace(例如public、dbo),而大多数 SaaS 源不会设置。只要发现响应中包含该字段,YAML 就需要namespace:行;对于没有该字段的流,请删除这一行。
阶段 3:询问使用场景
提出流建议之前,先问一个简短的问题,以明确选择依据。例如:
- “你想通过此连接分析什么?例如,每位客户的收入、支持工单趋势、营销漏斗。”
- “这里关注源数据的哪一部分——销售渠道、财务记录,还是产品使用情况?”
保持开放式;用户回答一句话就足够。目标是筛除明显无关的流(审计日志、内部队列、系统表),并优先选择业务实体。只有当用户已在初始请求中说明目标时,才跳过此问题。
阶段 4:提出流子集(检查点 1)
按以下顺序应用这些规则:
-
排除技术/系统流,除非用户的目标明确需要它们。名称匹配以下任一模式:以
pg_、information_schema、_airbyte、temp_、tmp_、audit_、system_、migration、schema_migrations开头;以_history、_log、_audit、_archive结尾。谨慎处理——不确定时就保留,并标明这一点。 -
对于数据库(postgres / mysql / mssql / mongodb 风格的数据源,可根据大量流以及
public、dbo、sales等命名空间识别):预计排除 30–80% 的流。项目用例很少需要每一张业务表。优先选择名称与用户目标相符的流(分析收入时选择orders、customers、products;支持场景则选择tickets、contacts、messages)。 -
对于 SaaS 数据源(流列表较短且扁平、没有命名空间,名称类似
companies、deals、tickets、engagements):默认包含所有核心业务实体。仅排除明显的冗余项(*_metadata、*_history、*_changelog)。 -
如实说明不确定之处。 如果仅凭名称无法判断流的用途,就直说——不要编造理由。
用便于用户浏览的表格呈现建议:
Proposed streams (12 of 47):
customers core entity — revenue analysis needs this
orders transactions table; cursor: updated_at
order_items order line items; needed to break revenue by SKU
products dimension table for orders/order_items
...
Dropped (35): pg_stat_*, _airbyte_internal_*, audit_*, schema_migrations,
user_sessions (not in scope for revenue analysis), ...
询问:“看起来合适吗?有什么要添加或删除的吗?”等待用户回复。他们可能会说“添加 users”或“删除 products,我们不需要它”——据此调整。
阶段 5:确定每个流的同步模式、游标和主键
对于每个选定的流,选择取决于源支持的内容(syncModes)以及其提供的字段。你将使用以下四种同步模式:
| 同步模式 | 要求 | 适用场景 |
|---|---|---|
incremental_deduped_history | 游标 和 主键 | 最佳默认选择。源提供游标(例如 updated_at)和主键。仅拉取新增或变更的行;按主键合并重复项。 |
incremental_append | 仅游标 | 源有游标但没有主键(事件流、仅追加日志)。行会不断累积;不去重。 |
full_refresh_overwrite_deduped | 仅主键 | 源有主键但没有可用游标。每次同步都会替换目标表,并按主键去重。适用于小型或中型表。 |
full_refresh_overwrite | 无 | 小型维度表(<10k 行),或其他方法都行不通时。每次同步都会覆盖。 |
每个流的决策算法:
- 选择源支持的最强模式,优先级如下:
incremental_deduped_history→incremental_append→full_refresh_overwrite_deduped→full_refresh_overwrite。跳过不在流的syncModes数组中的模式。 - 对于需要游标的模式:如果
defaultCursorField非空,则使用它。否则,在propertyFields中查找第一个可用的时间戳类字段(updated_at、modified_at、last_modified、_updated、timestamp)。如果没有合适的字段,则改用全量刷新模式。 - 对于需要主键的模式:如果
sourceDefinedPrimaryKey非空,则使用它。否则,在propertyFields中查找类似id的字段(id、<entity>_id、uuid、key)。如果没有合适的字段,则改用incremental_append或full_refresh_overwrite。
展示时使用简洁表示法(检查点 2):
Stream Sync mode Cursor Primary key
customers incremental_deduped_history updated_at id
orders incremental_deduped_history updated_at id
order_items incremental_append created_at —
products full_refresh_overwrite — —
询问:“同步模式看起来合适吗?需要调整吗?” 常见调整:仅当大型表实际很小或静态时,才将其改为 full_refresh_overwrite;切换游标字段。
第 6 阶段:编写 YAML
需要选择两个名称,规则各不相同:
metadata.name— 本地 IaC slug。适合用作文件名:小写字母、数字和连字符。它决定 YAML 文件路径(connections/<metadata.name>.yaml),以及其他资源如何引用此连接。根据来源和范围命名:hubspot-sales、postgres-prod-revenue、stripe-billing。spec.name— 在 RevOS UI 中显示的易读标签。简短,使用句首字母大写的格式,可以包含空格,不要使用下划线。描述此连接同步的内容,让团队成员扫一眼 UI 就能了解,无需打开详情。可用的格式示例:"HubSpot sales pipeline"、"Postgres prod → revenue tables"、"Stripe billing & subscriptions"。避免在这里重复使用 slug——hubspot-sales作为spec.name就不如HubSpot sales pipeline。
如果目标路径下已存在文件,请询问是要覆盖还是选择其他名称。
模板:
apiVersion: revos/v1
kind: Connection
metadata:
name: hubspot-sales
spec:
name: HubSpot sales pipeline
source: { id: <id from `revos sources list`> }
schedule: { units: 24, timeUnit: hours }
status: active
streams:
- name: customers
namespace: public # omit if the stream has no namespace
syncMode: incremental_deduped_history
cursorField: [updated_at]
primaryKey: [[id]]
备注:
source.id是 Source 的服务端 ID(例如src_abc123)。Sources 不属于 IaC——使用revos sources list获取 ID。primaryKey是一个列表的列表——每个内层列表都是一个主键列路径,支持嵌套键。大多数情况下使用[[id]]。cursorField是扁平的路径段列表。顶层字段为[updated_at];嵌套字段则为[meta, modified_at]。- 对于
full_refresh_overwrite,省略cursorField和primaryKey。对于full_refresh_overwrite_deduped,只省略cursorField。CLI 会在应用时拒绝缺少必填字段的配置,因此请保持配置简洁。 - 不要设置
metadata.id或spec.prefix——首次创建时,revos apply会填充这两项。
流映射器(streams[].mappers)是在数据行写入 BigQuery 前应用的服务端转换——例如,对 PII 进行哈希处理、重命名列、删除字段、筛选数据行、加密值。默认情况下,进行干净的同步,不使用映射器。出现以下任一情况时,加载 references/mappers.md:
- 用户提到遮蔽、哈希处理、PII、重命名或删除列、筛选数据行或加密。
- 所选流的
propertyFields包含明显敏感的列(email、phone、ssn、ip_address、成对的姓名字段、支付字段)。此时加载参考文档,然后主动提出映射器,并说明字段名称和理由,再询问用户确认后添加。不要悄悄插入映射器——遮蔽错误字段会破坏分析结果。
第 7 阶段:在本地验证
revos diff
CLI 会通过 zod 解析 YAML,并报告将发生的变更。请检查:
- 解析错误——架构拒绝了配置(缺少必填字段、同步模式无效)。修复后重新运行。
- 差异报告——新连接应显示为单个
create条目。
如果 revos diff 没有问题,请返回:「连接 YAML 已写入 connections/<slug>.yaml 并通过验证。运行 revos apply 即可在服务端创建连接。」
如果验证失败,请原样提供错误信息,并在宣布成功前修复。
常见问题
- 选择了来源不支持的同步模式。 始终将所选模式与第 2 阶段中流的
syncModes数组取交集。API 会在服务端验证;最好提前在本地发现问题。 - 在需要服务端 ID 的地方使用来源名称。
spec.source.id必须是服务端 ID(例如src_abc123),而不是显示名称或 slug。始终从revos sources list获取。 - 在
full_refresh_*模式下设置cursorField。 CLI 验证允许存在额外字段,但这只会造成干扰。省略不适用于所选模式的字段。 - 提出所有流。 数据库尤其如此。如果用户在看到建议后说「全部都要」,当然可以——但先提供经过筛选的列表。
- 虚构字段。 只能使用发现响应中出现的
cursorField和primaryKey值(defaultCursorField、sourceDefinedPrimaryKey或propertyFields)。