内容
# StepStitch
[](https://www.npmjs.com/package/@stepstitch/tracker)
[](https://github.com/CyKiller/stepstitch/actions/workflows/ci.yml)
[](https://github.com/CyKiller/stepstitch/actions/workflows/codeql.yml)
[](https://github.com/CyKiller/stepstitch/releases)
[](LICENSE)
[](https://stepstitch.vercel.app)
**问题重现基础设施 — 而非会话重放。** 当用户报告问题时,
StepStitch 将该报告转化为已净化的事件时间线、结构化前端诊断、
重现性评分和可复制的 **Playwright 重现脚本** — 无需捕获屏幕、
输入值、页面文本或原始 URL。**零运行时依赖。**
为需要自托管的受监管和注重质量的团队而设计。
此处存在刻意的楔形设计。会话重放/可观察性工具(Sentry、LogRocket、
FullStory、Datadog)已经在销售“观察每种会话”。大多数工程团队并不
需要另一个录音来观察 — 他们需要一个用户报告的错误,可以变成一个
**回归测试**。StepStitch 强调隐私安全的**调试证据和重现性**,
而非分析。
| | 会话重放/可观察性 | **StepStitch** |
|---|---|---|
| 记录用户屏幕/会话 | 是 | **否,绝不** |
| 捕获输入值、页面文本、个人身份信息 | 默认情况下(可以配置以减少) | **否 — 仅结构化证据** |
| 输出内容 | 会话记录 | **可运行的 Playwright 回归测试** |
| 自托管,数据保留在您的边界内 | 各不相同 / 大多是 SaaS | **是 — Apache-2.0,可自托管** |
| SDK 运行时依赖 | 几个 | **零** |
| 面向受监管/个人身份信息敏感团队的姿态 | 隐私是一个可选配置 | **隐私是默认设置,边界是代码** |
> 查看演示:[从红到绿的演示](https://stepstitch.vercel.app/demo) — 一个真实的错误
> 变成一个失败的 Playwright 测试,当修复后变成绿色。
## 隐私立场
借鉴了该类别中最强大的隐私模型(Sentry 会话重放的“默认私有”)—
但 StepStitch 捕获**结构以用于重现**,而非观察记录:
- 默认情况下屏蔽**所有**文本;通过 `data-stepstitch-unmask` 选项启用取消屏蔽。
- 绝不捕获输入值;硬跳过密码/信用卡/ `[data-sensitive]`。
- 阻止媒体;将 URL 简化为路由模板(`/accounts/:id`)。
- 捕获在 `grantConsent()` 之前关闭,并遵循 GPC/Do-Not-Track。
- `disable()` 终止开关,用于事件响应。
`tests/redaction-proof.test.ts` 中证明了数据清洗保证 — 提交给安全审查的工件。
## 企业证据层(服务端)
浏览器 SDK 在页面中进行了数据清洗,但后端**绝不信任客户端**。
`stepstitch_service` 包(参见 `service/`)将报告的会话转换为隐私安全的
支持工程证据:
- **服务端清洗器** — 每个摄入数据在存储前都会进行清洗,独立于 SDK。
SSN、卡号/账号、电话、电子邮件、日期、长 ID 和原始 URL 从自由文本中删除;
路由被重新模板化;元数据被严格允许; forbidden keys(请求/响应正文、控制台、标头、cookie、截图、DOM)
被丢弃。 手工构造的恶意 POST 不能持久保存 NPI。每个跟踪的清洗报告在摄入时返回并存储在 `trace_metadata._scrub` 中作为合规证明。
- **重现性评分** — 每个跟踪都有一个确定性的 0-1 评分 + 等级 +
警告,以便支持团队知道工程团队是否可以实际重现它。 编译的 Playwright 重现脚本以该标头开头。
- **净化的前端诊断** — API 失败和前端异常可以携带
有用的结构(状态、方法、端点模板、异常类型、源路径、行、
构建/发布元数据),而原始日志、原始消息、堆栈、标头、cookie、正文、
截图、页面文本、输入值和完整 URL 仍在跟踪之外。
- **部署配置文件** — `financial-services-enterprise`(默认)、`healthcare-strict`
(自由文本删除,forbidden keys 拒绝 422)、`internal-enterprise`、
`open-source-default`。 配置文件可能只**加强** NPI 边界。
- **金融服务支持包** — 平面、净化的 ServiceNow 事件、Salesforce
工单和 Genesys 支持上下文草稿从结构派生的 `TraceSummary`
(绝非原始步骤、解释或用户 ID)。 直接系统记录写入
在主机治理后面。
- **Copilot 安全界面** — 只读/草稿端点 + OpenAPI 工具包
(`copilot/`) 用于 Microsoft Copilot Studio 代理。 暴露没有删除、保留、
关闭、原始读取或直接写入。 **StepStitch 是核心;支持系统
(ServiceNow、Salesforce、Genesys 工作流)通过代理的 _原生_
Copilot 连接器或受管辖的 Power Platform 流到达,** 由 StepStitch 的净化
平面草稿提供。 StepStitch 不持有系统记录凭证,不构建 outbound
CRM/联系中心发送层。 参见 `copilot/SETUP.md`。
- **合规证据** — `COMPLIANCE-EVIDENCE.md` 从实时清洗策略生成(`npm run evidence`);
漂移防护保持其与代码的等价性。
每个都通过测试套件证明 — 服务、主机和 SDK 测试门控需要绿色。
参见 `contracts/stepstitch.md` 以获取冻结的合约和 `COMPLIANCE-EVIDENCE.md`
以获取审查包。
## 通用代理连接器(MCP)
StepStitch 是一个能力**提供者**,而非代理编排器 — 它感知、评分、
编译 Playwright 重现脚本并**草拟**,但绝不自主规划或行动。 其
通用连接器是一个 **MCP 服务器**(`service/stepstitch_service/mcp_server.py`,
通过 `mcp_cli.py` 运行):十三项只读/草稿操作(包括组合
**安全代理包** (`get_agent_packet`,一次调用而不是五次)—
可供**任何** MCP 客户端使用 — Microsoft Copilot Studio、OpenAI、Google Vertex、LangGraph、AWS Bedrock、Claude。
一个服务器,每个代理网络;自主权保留在客户的堆栈中。 导入时运行无破坏性防护,
工具集针对 OpenAPI 包和实时路由进行漂移防护(`service/tests/test_mcp_surface.py`)。
参见 `copilot/MCP-SETUP.md` 和 `docs/DEPLOY.md`。
## 完全开放(Apache-2.0)
此存储库中的所有内容都是 Apache-2.0 — SDK、隐私/重现引擎、MCP
连接器,**和** 具体的 ServiceNow / Salesforce / Genesys 适配器。
适配器**框架**(`integrations/base.py`:`TraceSummary`、`DraftAdapter`、`assert_flat`) 是
单一的、公开的扩展缝隙:主机通过 `create_stepstitch_router(draft_adapters=...)` 注入适配器,
任何人都可以以相同的方式添加自己的适配器(Jira、Zendesk、...)。
**架构边界**仍然强制执行,以便设计保持清洁 — 核心绝不
导入**具体**适配器,适配器只能看到净化的 `TraceSummary`。 这是一个分层规则(而非许可规则),
通过 `service/tests/test_open_core_boundary.py` 和 `.importlinter` 合约证明。
未来的商业许可版本可能会**添加**单独许可的适配器或合规包 —
仅限附加;当前 Apache-2.0 的内容不会被关闭。 参见
`COMMERCIAL.md`、`docs/PRODUCT-PLAN.md` 和 `docs/DEPLOY.md`。
## 用法
```ts
import { StepStitchTracker } from "@stepstitch/tracker"
const tracker = new StepStitchTracker({
appId: "your-app",
ingestEndpoint: "/api/stepstitch/v1/session", // 仅限同一租户
})
// 在您的同意管理器确认加入后:
tracker.grantConsent("v1")
// 从您自己的 API 客户端(SDK 不会修补 fetch):
if (!res.ok) tracker.recordApiError(res.status, res.url, "POST")
// 从您自己的前端错误边界(无原始消息或堆栈):
tracker.recordFrontendException("ChunkLoadError", "/static/app-abc123.js", 41, 2)
// 从“报告错误”控件:
const { traceId } = await tracker.submitTrace("Pay button did nothing", projectId)
// SPA 路由钩子:
tracker.recordNavigation()
// 拆除 / 关闭开关:
tracker.destroy()
tracker.disable()
```
## 开发
```bash
npm install
npm run type-check
npm test # 包括 redaction-proof 门控
npm run build
```
参见 `contracts/stepstitch.md` 以获取冻结的线路合约和 `INCIDENT-RESPONSE.md`
以获取自托管事件响应说明。
## 文档
- **开始使用** — [`docs/getting-started.md`](docs/getting-started.md) (安装 → 摄入主机 → 第一个重现)
- **0.6 功能** — [`docs/fix-memory.md`](docs/fix-memory.md) (将错误与已验证的修复结果进行匹配),
[`docs/evidence-attestation.md`](docs/evidence-attestation.md) (签名、独立验证的证据),
[`docs/fragility-radar.md`](docs/fragility-radar.md) (预测内容并最小化重现)
- **贡献和治理** — `CONTRIBUTING.md`、`GOVERNANCE.md`、`SECURITY.md`
- **构建连接器** — `docs/connectors.md` (公共 `DraftAdapter` SDK + 一致性工具包)
- **代理网络** — `docs/AGENTS.md` (MCP、Hermes/OpenAI 的函数规格、重现→PR 环路)
- **系统记录集成** — `docs/integrations/servicenow.md`、
`docs/integrations/salesforce.md` (包括可选的受管辖的直接写入)
- **部署和发布** — `docs/DEPLOY.md`、`RELEASE.md` (通过 release-please + publish-on-tag 自动执行)
- **试点** — `docs/targets/financial-services-pilot.md`;状态账本 `docs/STATUS.md`;计划 `docs/PRODUCT-PLAN.md`
- **产品站点和买家页面** — [stepstitch.vercel.app](https://stepstitch.vercel.app):
[从红到绿的演示](https://stepstitch.vercel.app/demo) (由 `demo/README.md` → `npm run demo` 生成),
[快速入门](https://stepstitch.vercel.app/quickstart)、
[金融服务试点](https://stepstitch.vercel.app/financial-services-pilot)、
[隐私 vs. 重放](https://stepstitch.vercel.app/privacy-vs-replay) 和
[代理 & MCP](https://stepstitch.vercel.app/agents)