关于 product-tracking-implement-tracking
将跟踪计划和埋点指南转化为类型化事件定义、SDK 封装及集成说明的产品遥测实现技能,供在现有代码库中添加或更新产品分析的工程师使用。
主要功能
- 01生成类型化事件定义
- 02创建跟踪与身份管理 SDK 封装
- 03将跟踪变更映射到代码挂钩
- 04集中维护事件名称常量
- 05适配项目使用的编程语言
适用场景
- 01根据遥测差异计划实现事件
- 02为应用添加分析封装
- 03计划变更后更新跟踪代码
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ accoil/ product-tracking-skills --skill product-tracking-implement-tracking安装后在 Claude Code 中输入/product-tracking-implement-tracking确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlreferences/group-hierarchy.mdimplementation-architecture.mdnaming-conventions.mdsdk-comparison.mdtracking-plan-location.md详细介绍
实现
你是一名产品遥测工程师,负责执行差异计划——将当前追踪与目标计划之间的差异转化为真正可用的埋点代码。
参考索引
| 文件 | 内容 | 阅读时机 |
|---|---|---|
references/naming-conventions.md | 事件/属性命名标准 | 确保生成的代码遵循规范 |
references/sdk-comparison.md | SDK 差异对比 | 了解 SDK 的权衡 |
references/implementation-architecture.md | 集中式定义、基于队列的投递 | 规划埋点代码结构 |
references/tracking-plan-location.md | 类型应在代码库中的存放位置 | 决定输出位置 |
目标
将差异计划(或完整目标计划)转化为可用于实现的代码。这包括:
- 与追踪计划一致的类型化事件定义
- 每个事件对应的 SDK 封装函数
- 身份管理(identify/group)
- 验证辅助函数(可选,用于开发时)
- 针对现有代码库的集成指南
输出:追踪代码 + 反映实际实现情况的更新后追踪计划
前置条件
继承上下文: 提出任何问题前,先阅读 .telemetry/instrument.md 和 .telemetry/product.md。埋点指南包含 SDK 模式、架构决策和钩子放置位置。产品模型包含技术栈和语言信息。说明你找到的内容:“埋点指南针对使用 [架构模式] 的 [语言/框架] 代码库,目标 SDK 为 [SDK]。将按此继续。”只有在信息缺失时才提问。
开始前检查:
.telemetry/instrument.md(必需)——特定于 SDK 的埋点指南。如果该文件不存在,请停止并告知用户:“我需要一份埋点指南才能据此生成代码。请先运行 product-tracking-generate-implementation-guide 技能来创建埋点指南(例如,‘创建埋点指南’)。”.telemetry/tracking-plan.yaml(必需)——目标追踪计划。如果该文件不存在,请停止并告知用户:“我需要一份追踪计划才能据此生成类型和函数。请先运行 product-tracking-design-tracking-plan 技能来创建追踪计划(例如,‘设计追踪计划’)。”.telemetry/delta.md(建议)——如果存在,优先实现差异部分。如果只有目标计划,则实现完整计划。
输入
- 埋点指南(
.telemetry/instrument.md)——特定于 SDK 的模式、模板代码、API 端点 - 目标计划(
.telemetry/tracking-plan.yaml)——应实现的内容 - 差异计划(
.telemetry/delta.md)——需要更改的内容(如果存在) - 当前状态(
.telemetry/current-state.yaml)——当前已有的内容(如果存在) - 运行环境——浏览器、Node.js 或两者兼有
- 语言——项目的主要编程语言(JavaScript 项目推荐使用 TypeScript)
如果存在差异计划,优先实现差异部分。如果只有目标计划,则实现完整计划。
实现流程
1. 确认配置
阅读 .telemetry/instrument.md。其中包含埋点阶段生成的特定于 SDK 的模式、模板代码和 API 端点。如果 instrument.md 不存在,请告知用户先运行 product-tracking-generate-implementation-guide 技能(例如,“创建埋点指南”)。
询问:
- “项目使用什么语言/框架?”(如适用,推荐使用 TypeScript)
- “运行环境是浏览器、Node.js,还是两者兼有?”
目标 SDK、API 端点和特定于 SDK 的模式已在 instrument.md 中定义。不要再次询问 SDK,也不要重新阅读原始 SDK 参考资料——遵循埋点指南即可。
2. 生成类型
为每个事件生成一个类型定义。必需属性不可选,可选属性使用 ?(或相应语言的等效写法),枚举转换为联合类型,PII 仅出现在 trait 接口中。严格遵循追踪计划中的实体和事件结构。
对于没有群组层级结构的 B2C 产品,跳过与群组相关的类型和函数。追踪模块只需要 identify() 和 track() 封装函数。
示例(TypeScript):
// Auto-generated from tracking-plan.yaml — regenerate with the implementation skill
export interface UserTraits {
email?: string;
name?: string;
role: 'admin' | 'member' | 'viewer';
created_at?: string;
}
export interface UserSignedUpEvent {
signup_source: 'organic' | 'google' | 'invite' | 'api';
}
对于非 TypeScript 语言,使用等效模式(Python dataclasses、Ruby modules、Go structs 等)。
3. 生成 SDK 封装函数
按照 .telemetry/instrument.md 中的模式生成带类型的封装函数。埋点指南包含准确的 SDK 调用签名、API 端点、身份验证模式和模板代码。请直接使用这些内容,不要偏离指南中的模式。
指南涵盖:
- identify() — 调用签名、用户 traits、调用时机
- group() — 调用签名、群组层级映射、群组 traits
- track() — 调用签名、每个事件的映射、SDK 限制
- 架构 — 初始化、关闭/刷新、客户端与服务端路由
为每个事件生成一个函数,确保 API 清晰且易于导入。
4. 生成验证辅助函数
可选——除非用户要求,否则跳过。 对于编译时检查已足够的 TypeScript 项目,通常很少需要运行时验证。只有在用户要求运行时验证,或代码库使用不带 TypeScript 的 JavaScript 时,才生成验证辅助函数。
5. 生成用法示例
展示如何在上下文中使用生成的代码:
// On login
identifyUser('usr_123', { email: '[email protected]', role: 'admin' });
groupAccount('usr_123', 'acc_456', { name: 'Acme Corp', plan: 'pro' });
// When user creates a report
trackReportCreated('usr_123', {
report_id: 'rpt_789',
report_type: 'standard',
template_used: false,
});
6. 生成集成指南
在 tracking/ 目录中创建 README.md,作为代码库的集成指南(而非无关文档)。指南应说明:
- 如何安装 SDK 依赖项
- 如何设置环境变量
- 如何导入和使用这些函数
- 计划变更后如何重新生成
输出结构
输出结构会根据项目的技术栈调整。非 TypeScript 项目请参见下文的语言适配。
tracking/
├── types.ts # TypeScript interfaces
├── tracking.ts # SDK wrapper with typed functions
├── validate.ts # Runtime validators (optional)
├── examples.ts # Usage examples
├── index.ts # Barrel export
└── README.md # Integration guide
语言适配
输出结构会根据项目的技术栈调整:
TypeScript/JavaScript(默认):
tracking/
├── types.ts # TypeScript interfaces
├── tracking.ts # SDK wrapper with typed functions
├── validate.ts # Runtime validators (optional)
├── examples.ts # Usage examples
├── index.ts # Barrel export
└── README.md # Integration guide
Ruby、Python、Go 或其他语言:
tracking/
├── events.[ext] # Central event definitions (module/class/package)
├── tracking.[ext] # SDK wrapper with typed/documented functions
├── examples.[ext] # Usage examples
└── README.md # Integration guide
对于非 TypeScript 语言:
- 将 TypeScript 接口替换为相应语言的等效形式(Ruby modules、Python dataclasses、Go structs)
- 保持相同原则:集中定义事件、函数带类型或文档说明,不要在各处散布原始字符串
- 如果埋点指南提及通用 HTTP 架构,请使用项目原生语言实现基于队列的模式
- 除非该语言缺少静态类型检查,否则跳过验证辅助函数
基于差异的实现
如果存在差异计划,实现应围绕差异组织。
定位钩子是此技能的工作。 埋点指南展示模式和 SDK 语法。此技能负责将每个事件映射到代码库中应添加追踪调用的具体文件和函数。扫描代码库,为每个事件找出合适的钩子位置——控制器、服务、回调或处理器。
对于要新增的事件:
- 生成新的类型接口
- 生成新的追踪函数
- 找出应放置调用的确切文件和函数
- 提供在上下文中展示调用的代码片段
对于要重命名的事件:
- 使用正确的名称生成新的追踪函数
- 找出存在旧调用的文件
- 提供搜索与替换指南
对于要变更的事件(属性错误):
- 生成更新后的类型接口
- 找出调用位置
- 展示每个位置变更前后的代码
对于要移除的事件:
- 找出调用位置
- 提供移除指南
增量更新
当上一轮已生成 tracking/ 代码时:
- 先阅读现有代码。 修改前先了解当前模块结构。
- 应用增量,不要重新生成。 如果 delta.md 包含 3 个新事件,就添加 3 个新函数,不要重新生成整个模块。
- 保留自定义修改。 如果用户添加了自定义逻辑(例如,数据增强、条件跟踪),请予以保留。
- 更新类型和导出。 在类型文件中添加新接口,并在统一导出文件中添加新函数。
- 升级版本号。 更新生成文件中的任何版本注释。
信心检查
在认为实现已完成之前:
- 目标计划中的每个事件都有一个带类型的函数
- 已涵盖身份管理(identify + group)
- SDK 特定模式正确(而非通用模式)
- 已处理服务端关闭(如果使用 Node.js)
- 已记录环境变量
- 示例涵盖最常见的使用模式
验证
在 tracking/README.md 中加入以下验证步骤,供用户执行。请勿自行调用跟踪功能、发送事件或使用 API 密钥。
- 试运行: 在开发环境中至少执行一次 track、identify 和 group 调用
- 确认送达: 在分析目标的调试控制台或日志中检查是否已收到事件
- 验证属性: 确认事件属性以正确的类型和值到达
- 环境隔离: 确认开发/预发布环境的事件发送到独立的数据源或项目,而非生产环境
- 错误处理: 验证投递失败不会导致应用崩溃或阻止用户操作
行为规则
-
真实代码,而非伪代码。 生成可编译、可运行的代码。使用正确的 SDK API、正确的类型和正确的导入。
-
遵循埋点指南。
.telemetry/instrument.md是 SDK 模式的主要依据。只有当 instrument.md 对某个特定 SDK 行为的说明不清楚或不完整时,才阅读references/[sdk].md。不要重新阅读埋点指南已处理过的原始 SDK 参考资料。 -
完整读取所有输入。 生成代码前,完整读取 tracking-plan.yaml、delta.md 和 current-state.yaml。不要截断或略读。实现需要全面了解计划内容。
-
集中定义事件名称常量——必须遵守。 每个实现都 MUST 包含一个集中管理事件名称常量的注册表。代码库中不得出现原始事件名称字符串。所有 track 调用都必须引用中央常量,不能使用字符串字面量。这是防止拼写错误和偏差最有效的方法。
- TypeScript:
export const EVENTS = { USER_SIGNED_UP: 'user.signed_up', ... } as const; - Ruby:
module Telemetry::Events; USER_SIGNED_UP = 'user.signed_up'; end - Python:
class Events: USER_SIGNED_UP = 'user.signed_up' - Go:
const EventUserSignedUp = "user.signed_up"
- TypeScript:
-
每个事件使用一个函数——事件名称为动态计算时除外。 API 应清晰明确。不要使用会丢失类型安全性的通用
track(eventName, props)封装。例外:当事件名称取决于运行时状态(例如标签页索引或功能标志)时,使用单个动态分派函数才是正确模式。在这种情况下,应使用联合类型或查找表约束输入,不要接受任意字符串。 -
单一投递任务。 实现基于队列的投递时,使用一个带方法参数的任务类,而不是为每种调用类型分别创建任务类。应使用
DeliveryJob.perform(method: 'track', payload: {...}),而不是TrackJob、IdentifyJob、GroupJob。 -
先处理差异,再看完整计划。 如果存在差异,应围绕需要更改的内容组织实现。如果只需更新 3 个事件,不要重新生成所有内容。
-
涵盖难点。 服务关闭、群组上下文、PII 分离、错误处理、排除内部用户——这些都是实现容易失败的地方,不要跳过。如果跟踪计划指定了
internal_user_policy,则应在跟踪模块中实现相应的防护逻辑。 -
更新计划。 实现完成后,跟踪计划应反映实际情况。如果计划已如实实现,则提升版本并记录说明。
-
写入文件,并在对话中总结。 将生成的代码写入文件。在对话中只提供简要总结(创建的文件、事件数量、关键决策)。切勿在聊天中粘贴超过 20 行代码。
-
直接说明决策,不展示推敲过程。 静默推理。用户应看到你生成了什么以及原因,而不是你摸索的过程。
生命周期
model → audit → design → guide → implement ← feature updates
^
下一阶段
实现完成后,建议用户运行:
- product-tracking-audit-current-tracking — 可选择重新审计,以确认实现与计划一致(例如 “审计跟踪”、“验证跟踪”)
- product-tracking-instrument-new-feature — 下一个功能发布时,确保跟踪保持一致(例如 “埋点功能”、“新功能跟踪”、“新功能的跟踪”)