# @alessandro-afloarei/integrations 中文文档

规范地址：https://npmcn.com/package/%40alessandro-afloarei/integrations/

版本：0\.8\.1
npm 元数据更新时间：2026-11-03T12:32:39.522Z
中文译文更新时间：2026-11-08T11:25:45.465Z
软件包许可：UNLICENSED

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40alessandro-afloarei/integrations
原文对照：https://npmcn.com/package/%40alessandro-afloarei/integrations/?lang=original
项目主页：https://github.com/alessandro-afloarei/integrations#readme
源码仓库：https://github.com/alessandro-afloarei/integrations

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：179 kB，66 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=22
- 运行依赖：3 个
- 首次发布：2026-10-31T16:55:02.883Z
- 最新版本发布：2026-11-03T12:32:39.335Z
- 近 30 天下载量：1789（2026-10-06 至 2026-11-04，npm 官方下载统计）
- 已发布版本数：9（近 12 个月 9 个）

## 中文简介

一个用于节点22及后期的服务器端连接层. 仅限无害环境管理;安装于 `pnpm add @alessandro-afloarei/integrations@0.3.0`。通过它的子路径导入模块。 没有根管子。 TypeScript声明是API的参考.

## 安装

```sh
npm install @alessandro-afloarei/integrations
```

也可以使用：`pnpm add @alessandro-afloarei/integrations`、`yarn add @alessandro-afloarei/integrations`、`bun add @alessandro-afloarei/integrations`

## README

# @alessandro-afloarei/ 融入

一个用于节点22及后期的服务器端连接层. 仅限无害环境管理;安装于 `pnpm add @alessandro-afloarei/integrations@0.3.0`。 。 。 . 通过它的子路径导入您需要的模块 。 没有根管子。 TypeScript声明是API的参考.

`errors` 提供编码错误, 如 `ProviderHttpError` 财务报告和审定财务报表 `GrantRevoked`. Apps将其代码映射到自己的 消息和再连接行为;库错误从来不包括提供者响应机构或秘密. `ProviderHttpError.retryAfterMs` 最后反应的诊断等待数以毫秒为单位,或 `null` 缺席时或 无效。 一个有效的 `Retry-After` 标题( 秒或 HTTP- 日期) 战胜 Breakcold 的延迟或萤火虫的时代 时间戳;过去的日期产生零分和分数的身体延迟。 字段不更改重试计数或 等待盖,一个应用程序必须仍然决定一个呼叫是否安全可以重试. HubSpot被录取 `MISSING_SCOPES` 财务报告和审定财务报表 `VALIDATION_ERROR` 类别出现在 `detail`;其他类别省略。 错误代码和信件保持不变.

`providers` 持有HubSpot,Slack,萤火虫,Granola,Breakcold,Unipile,Firecrawl和Exa等定义. 通过一个条目 例如 `hubspot` 到 OAuth 或 HTTP 呼叫 。 提供者模块拥有范围;工作空间特定基址仍然是应用配置.

`vault` 任意的 JSON 用 `createVault({ tenantKeys, keys })`调用 `seal` 财务报告和审定财务报表 `open` 与租户 连接ID。 它打开了gaja的现有格式1并写入了密钥源所选择的格式;格式2增加了AAD. 使用 `rewrapTenantKey` 将租户的数据密钥移动到目前的KEK或格式,而不重写其秘密.

`oauth` 构建同意 URL 与 `authorizeUrl` 处理 `exchangeCode`, (中文(简体) ), `refreshGrant` 财务报告和审定财务报表 `revokeGrant` 打开 `oauth4webapi`。 。 。 . `pkcePair` 支持的 PKCE。 在每个网络呼叫中导入抓取; 应用程序拥有状态 无. `exchangeCode` 只返回提供者的符号回答字段 `extras` 名字,从没有其他的.

`connect` 用品 `startConnect(provider, options)` 财务报告和审定财务报表 `finishConnect(provider, input)`开始返回方向, 秘密字段表或主机URL。 OAuth 完成 交换代码, 识别账户, 并撤销新代码 身份失败时给予最佳效果; 所需的 `onRevokeFailed(error)` 输入报告清理失败 。 每个 OAuth 模块 提供其吊销回调; 提供者在重新同意时返回相同的活的令牌, 在使用此流前需要适配器 . 该应用程序拥有非ce验证, 注册重定向 URI, 验证器存储并封存返回的秘密 . **永远不要发送 `ConnectStart` 转到浏览器 :** 保留 `codeVerifier` 在服务器上并重定向到 `url` 一个人 空白的OAuth状态和缺失的必要核查人被拒绝.

`slack` 出口 `slackConnect`, (中文(简体) ), `SLACK_SCOPES` 财务报告和审定财务报表 `slackClient({ token, fetch })`。客户站一次,列出最多 5页的200个频道`{ items, skipped, channelsCut }`),并撤销赠款. `channelsCut` 说还有更多页子. OAuth和Web API的答覆是 `GrantRevoked`,与 提供者代码在 `detail`; 已经失去的标志是成功的撤销。 那个假的 `slack/fake` 需要注册 绝对 `redirectUri`,拒绝其他目的地,并发布与授权客户绑定的单一用途代码 调用。 在交换假代码之前,测试必须授权.

`credentials` 用品 `readSecret` aPI 密钥和 `accessToken` 用于OAuth赠款。 通过商店,金库,锁和 刷新函数 。 刷新默认使用15分钟的比值,即提供者现有的30秒锁键,以及 相较而取取之. 拒绝的刷新允许同时编剧保存5秒,每500毫秒读取一次. 忙碌的锁可以提供仍然有效的信号; `RefreshBusy` 请应用程序稍后重试 .

`http` 创建认证客户端 `createClient({ provider, token, fetch })`调用 `json` 分类 JSON的答复或 `request` 用于原始状态、页眉和解析数据。 托肯被再用,直到401人要求续作. 客户端应用超时,节奏和封顶429等;只获取和明确化能调用重试,a 呼叫器的信号禁用重试等待 。 仅在同一来源(307/308或301-303)进行重新定向 最多5个跳 就连证书都找不到另一个主机了 传回被监视的软件 保存固定装置 和生产检查.

`webhooks` 验证 HMAC 签名 `verifyWebhook(provider.webhook, request, secret)` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}在原生的身体上 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}在原生的身体上 字节。 使用 `readCappedBody(request, maxBytes)` 在核查之前。 运行、重放保护、去dupe和收件箱 留在应用程序中.

`exa`, (中文(简体) ), `firecrawl` 财务报告和审定财务报表 `unipile` 是提供者模块 : `exaClient`, (中文(简体) ), `firecrawlClient` 财务报告和审定财务报表 `unipileClient` 拿着钥匙 和该应用程序的取回和回打的电话,所以该应用程序从不构建一个提供者请求或读取提供者的答案. 图书馆用Zod检查每个答案,没有公共类型名称,所以一个app自己的Zod版本从来没有遇到过; 错误形状的答案是 `ProviderHttpError` 有代码 `invalid_response`。Firecrawl 不发送浏览器动作 并读取一个页面. `unipileOrigin` (单位:千美元) `providers`,所以一个靴子检查负载 没有客户端)读取Unipile仪表板显示的工作空间地址,并且 `parseAccountNotification` 阅读主机签名通知; 检查其 `name` 是应用程序的.

`unipileConnect({client, link, signal?})` 组成现有的 V1 主机登录 `startConnect` 财务报告和审定财务报表 `finishConnect`。 。 。 . 开始返回 `{kind:'hosted', url}`; 结束 `{secret:accountId}` 并返回该 id 作为秘密和账户 名称/编号,加 `{createdAt}` 细节。 可选的信号将账户搜索绑定 . `authLink` 拒绝空白状态; 非认证、账户所有权、接受的创建年龄和持久性都留在应用程序中.

`granola` 财务报告和审定财务报表 `breakcold` 是 API 源代码模块。 他们的客户返回提供者自己的字段名称,因为 一个应用程序存储他们读到的, 并回答列表一 `Page` 一次: `{ items, skipped, cursor }`时 `skipped` 保存客户端无法读取的条目的id `cursor` 在最后一页是无效的. `paginate(load)` 走着走着 页面并拒绝重复光标; 应用程序在它自己的预算表明时停止 。 断线是 `invalid_response` 与 没有状态和图书馆自己的 `detail` (单位:千美元)`cursor_repeated`, (中文(简体) ), `cursor_missing`)),所以它从不读作提供者的代码. `createClient`是因为 `beforeRequest(url)` 一旦每通电话运行 任何信息发送之前, 一个应用的计量, 和拒绝 `ProviderHttpError.detail` 携带 提供商自己的代码,目录读取一个(Breakcold's `usage_limit`) (中文(简体) ).

`hubspot` 提供 `hubspotClient` 搜索对象、批次读取、交易关联、门户身份、阶段和 拥有者. `changedRecords` 按上升对象编号顺序行走已更改的记录,从 `afterId` 而不是一个 搜索偏移, 因此没有查询页面 超过 HubSpot 的 1万个结果上限 。 该应用程序提供访问端函数和 获取, 当扫描预算用完时可以停止 .

`hubspotConnect` 从 `hubspot` 编曲: `startConnect` 财务报告和审定财务报表 `finishConnect`,请求 OAuth 并读取访问 公司、联系人、交易和所有者。 身份用符号回答 `hub_id` 首先,否则账户-信息,并返回 `account: { id: portalId, name: "Portal <portalId>" }`, (中文(简体) ), `details: { portalId }`,以及 `secret: grant`两种身份来源 需要正整数或字符串匹配 `^[1-9]\d*$`; 畸形的符号身份失败而不会倒回. 这个秘密是保密的 `Grant` 形状. `HUBSPOT_SCOPES` 导出相同的命令范围列表 `hubspotConnect`. HubSpot可在重新同意时还原门户现有的刷新令牌,因此连接合同的 `reusesGrant: true` 跳过失败的识别清理。 孤儿补助金在下次同意后退还;取消 可以结束一个直播连接。 应用程序在放弃赠款前必须检查所有者。 仍然明确撤销 取消刷新令牌;仅限访问的赠款自然失效.

`fakeHubSpot({ client: { clientId, clientSecret }, redirectUri, ...portalData })` 从 `hubspot/fake` 要求 注册客户端和绝对的HTTP(S)调用,无需用户信息或片段。 注册确切的召回 两者均使用 `startConnect` 财务报告和审定财务报表 `finishConnect`。将真实授权的 URL 输入到假的,然后提取其重定向 单用 `code`;静态固定码被拒绝. 授权需要注册客户ID和每个 `HUBSPOT_SCOPES` 范围。 交换、刷新和撤销需要匹配 `client_id` 财务报告和审定财务报表 `client_secret`无效 证书返回 401 `invalid_client` 而不花费有效的代码。 交换将代码绑定到确切的回调 并仅接受 `authorization_code` 或者说 `refresh_token` 补助金类型.

一个注册客户/门户网站拥有一个经过同意的新鲜信号。 它的最初形状是 `fixture-refresh-<sha256(JSON.stringify([clientId, hubId]))>`; 在撤销后, 下次同意会添加 UUID 后缀 并发行了一个新的符号。 如果在征得任何同意之前继续更换或恢复遗留物,就成为 {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你说什么? 如果已经存在生活补助,则更新作为该补助持有人的持久象征物 并返回当前犬形标志;随后同意继续返回。 撤销任何一条小道具 或任何被接受的别名取消该赠款的所有持有人。 已知被吊销的持有人仍然被拒绝,并重复 取消不能终止以后的新赠款。 这种别名的卡通化是一种合成固定行为 生产 `Grant` 合同不变。 撤销后真正的 HubSpot 行为尚未被探测; 新建 发布是固定裁决。 代码和访问符保持了 per-intance UUID 命名空间,因此 stale codes不能交叉实例. 刷新只接受客户端/门户网站的固定符号形状和遗产 `fixture-refresh` 种子,包括 重新启动后持续有效符号。 代码,访问令牌,任意字符串和真实令牌无法刷新.

保留 **每个进程一个假实例** 跨授权,交换,刷新和撤销。 仅接受撤销 在此情况下,发出或恢复的刷新令牌会屡次成功,并防止进一步刷新. 身份不明的吊销额仍为400 `invalid_token`; 真正的HubSpot的响应没有被印出. 撤销历史 **本地进程**:其他进程看不到它,重启就会忘记它. 坚持的标志必须首先恢复 或经同意后返回,然后才能撤销。 这些都是合成的固定限制,不是 生产撤销担保。 该应用程序在完成前仍会消耗并验证回调状态.

```ts
import { startConnect, finishConnect } from '@alessandro-afloarei/integrations/connect';
import { hubspotConnect } from '@alessandro-afloarei/integrations/hubspot';
import { fakeHubSpot } from '@alessandro-afloarei/integrations/hubspot/fake';
import { fakeFetch } from '@alessandro-afloarei/integrations/testing';

const redirectUri = 'https://app.test/api/integrations/hubspot/callback';
const http = fakeFetch(fakeHubSpot({ ...portalData, client, redirectUri }));
const begun = await startConnect(hubspotConnect, { clientId: client.clientId, redirectUri, state });
if (begun.kind !== 'redirect') throw new Error('expected_redirect');
const consent = await http.fetch(begun.url, { redirect: 'manual' });
const back = new URL(consent.headers.get('location') ?? '');
if (back.searchParams.get('state') !== state) throw new Error('state_mismatch');
const code = back.searchParams.get('code');
if (!code) throw new Error('missing_code');
const connected = await finishConnect(hubspotConnect, {
  client, code, redirectUri, fetch: http.fetch, onRevokeFailed,
});
```

这个例子使用应用软件 `portalData`缩写 `client`,新存储 `state`,则 `onRevokeFailed` 观察员. 在应用中, 消耗和验证该状态一次; 在服务器上保留返回的秘密 .

`testing` 提供脚本 `fakeFetch` 路径,重复 `sequence` 答复, `memoryStores`, (中文(简体) ), `memoryLock` 财务报告和审定财务报表 `openLock`。每个供应商模块旁边有一个假的(`exa/fake`, (中文(简体) ), `firecrawl/fake`, (中文(简体) ), `unipile/fake`, (中文(简体) ), `granola/fake`, (中文(简体) ), `breakcold/fake`, (中文(简体) ), `hubspot/fake`: `fakeExa`, (中文(简体) ), `fakeFirecrawl`, (中文(简体) ), `fakeUnipile`, (中文(简体) ), `fakeGranola`, (中文(简体) ), `fakeBreakcold` 财务报告和审定财务报表 `fakeHubSpot` 从应用程序通过的数据中返回接听客户通话的路径 (每个客户自己的测试 支持其确切的要求; `fakeGranola` 内入每张笔录,所以它从来没有回答413. `respondFrom(routes)` 回答路径请求或返回无效, 是一个应用的固定模式. `fakeBreakcold` 接受可选 `readable: {notes?, meetings?}` 编号必须可用的固定装置的集合 不输入摄入列表。 常规 `notes` 财务报告和审定财务报表 `meetings` 仍然提供这些名单,并优先考虑 重复编号。 失踪的身份证仍为404;只有直接会议使用现有的 `segments` 收集笔录. `fakeUnipile` 可选择接受 `hostedConsent: {consentUrl, successUrl, failureUrl, notifyUrl, notify, accountId}`。 。 。 . 注册绝对的 HTTP( S) URL 不使用用户信息或片段 。 此模式取代遗留 `authLink` 回调 : 真实客户端的认证链接请求必须与这些目的地相匹配,并生成一个过期的单一用途同意URL. 从假货的路线取来 贴出V1 `CREATION_SUCCESS` 通知约束国和提供应用程序 账户编号。 接受的通知重定向到注册成功 URL; 失败或重定向的通知 转到失败的 URL。 从未遵循通知重定向,浏览器参数不能覆盖绑定. 捆绑是实例本地的:固定适配器应在同一请求中获取并消耗新的认证链接, 因此,重新启动dev服务器不会丢失较早的浏览器请求绑定. 生产主机签入时没有 图书馆-地方州。 该应用程序仍然提供账户固定 `createdAt` 重视并执行其非ce政策. 运行 `checkCredentialStore` 针对应用程序数据库测试层中每个真正的商店适配器,使用一个 孤立现有的连接固定器和一个没有密钥的租户;它恢复了连接最初被封存的秘密.

Apps 执行四个接合;库中没有数据库或 Redis 客户端:

```text
SecretStore: read a connection secret and replace it only at the expected version.
TenantKeyStore: read, insert the winning tenant key, and replace at the expected version.
KeySource: expose current KEK version, write format, and get(version).
WithLock: run work under a named lock, or return "busy".
```

运行 `pnpm install --frozen-lockfile`,则 `pnpm check` 用于类型检查,带有零警告的 ESLint, knip 和 Vitest. 运行 `pnpm build` 无害环境管理和申报,或 `pnpm pack` 用于本地安装。 图书馆测试使用假提供者和 内存储,不需要服务器或数据库.

释放标记必须匹配软件包版本. 检查和合并后,维护者推出 `v*` 标记; CI 重复 并使用存储器公开发布 `NPM_TOKEN` 暗号 Apps Pin准确的版本.

### 萤火虫

`firefliesClient({ apiKey, fetch, signal? })` 读取密钥所有者(`user`),笔录(`transcript`, (中文(简体) ), 关键字匹配( e)`search`页:1`transcripts`) (中文(简体) ). `identify(client)` 是 API- key 证明 . `changedTranscripts(client, { userId, fromDate, toDate, cursor? })` 输出页面通过 `paginate`窗口 文本创建日期的过滤器, 而非修改日期 : 一旦创建到外部, 将不会重新生成编辑 窗户。 Windows必须重叠(gaja使用三天). 萤火虫没有命令保证; 应用本身的分解 和页数预算。 打破重复以强制您自己的运行预算.

光标是 JSON 字符串,将偏移绑定在用户、日期窗口和固定的50个记录的页面大小上 `null` 在结尾。 只用相同的查询恢复; 一个新窗口开始时没有光标 。 光标不正确或错配 掷出 `TypeError('cursor_invalid')`。无效的日期和搜索限制 `TypeError('date_invalid')` 财务报告和审定财务报表 `TypeError('limit_invalid')`; 搜索接受从1到50的整数限制. `skipped` 无法读取的报告列表 条目,计算为平方。 Apps根据自己的存储合同验证记录. 无法正常 详细记录抛出 `FirefliesTranscriptError` 从 `fireflies/errors`页:1 `ProviderHttpError` 有代码 `invalid_response`, (中文(简体) ), `detail: 'transcript_invalid'` 和消毒的 `path` 仅包含字段名称和索引. 它不同于一个缺失的记录,它返回 `null`。 。 。 .

`fireflies/fake` 出口 `fakeFireflies({ account: apiKey => ({ user, transcripts }) })`; 返回时 `null` 拒绝 键。 传出路线 `fakeFetch` 或者说 `respondFrom` 从 `testing`包括身份、呼号、记录 和关键词搜索与呼叫者拥有的固定数据.

在验证原始请求后 `verifyWebhook`萤火虫 `parseWebhook(body)` 读取V2事件, `meeting_id` 和时间戳(数字,或遗留字符串)。 未知字段被省略; 错误的事件返回为无效 . 断了 `parseWebhook(headers)` 读取 `x-webhook-delivery-id`. Apps 自身分解并保留原字节.

### HubSpot 舞台历史

`hubspotClient(...).dealStageHistory(ids)` 返回 a `Map<string, HubSpotStageRevision[]>`,每次修订 形状为 `{ value: stageId, timestamp, sourceType? }`先订出最老的 时间戳保存得准确; 等于乘以印章保留提供商的命令。 一个没有历史地图的回归交易 `[]`缺少一个交易. 该方法使用单独的50ID历史限制来读取相继分批提供的所有ID(说明为100分)。 失败的批次拒绝 带有通常的 sanitized 提供者错误的呼叫, 包括提供者的批量限制 400; 它从不返回部分地图 .

历史意味着 **仍然保留每个修订版HubSpot**。 。 [每个交易财产最多20个修订](https://knowledge.hubspot.com/properties/export-property-history?product=marketing), (中文(简体) ), 没有日历保留窗口,也没有记录处理阶段的例外。 图书馆归还所有供应和 从不合成缺失的修改。 历史读取使用50个输入上限,基于供应商的批次历史400 报告年份 [接发式HQ/接发式8462](https://github.com/PipedreamHQ/pipedream/pull/8462)。报告的目的是 联系人; 我们对交易适用相同的财产历史上限。 枢纽点 [发售 OpenAPI](https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Deals/Rollouts/424/v3/deals.json) 警告请求历史会降低每个请求的最大,而不命名数字. 这个 [发牌指南](https://developers.hubspot.com/docs/api-reference/legacy/crm/objects/deals/guide) 文档 `propertiesWithHistory: ["dealstage"]`。没有文件记录的历史光标可以恢复被磨损的订正. 这个 [官方 OpenAPI 计划](https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Deals/Rollouts/424/v3/deals.json) 将时间戳描述为属性更新时间,但并不能明确保证其不可更改性贯穿读取. 限制来自所观察到的供应商错误和官方文件;我们没有运行一个真正的门户探测器.

`fakeHubSpot(data)` 还接受 `fakeHubSpot(() => data)`。回调一次在建设时运行,必须返回 有效数据。 它每提供一次当前门户内容 (c) 在施工时进行OAuth注册(客户、重定向URI、chubId),并授予状态 在内容变化中存活下来。 可选 `dealStageHistory` 用于已知同步和分组交易的映射处理 ID 到修订版数组. 可选 `dealContacts` 地图同步处理 ID 以联系 ID 阵列, 缺席时返回组图 ; 一个明确的空数组覆盖了组。 暗示这些领域保留了现有的行为. `dealCompanies` 将交易映射到一个公司ID,或 `{ id, primary? }[]` 服务于HubSpot的协会类型.

`dealCompanies(ids)` 返回每个交易的初级公司(HubSpot) `HUBSPOT_DEFINED` 第5类),否则其最低值 因为HubSpot没有命令交易协会.

假的回报了超过50个输入量的历史批次的400个,所以固定后置的消费者行使相同的限制.

## 常见问题

### @alessandro-afloarei/integrations 是什么？

一个用于节点22及后期的服务器端连接层\. 仅限无害环境管理;安装于 pnpm add @alessandro-afloarei/integrations@0\.3\.0。通过它的子路径导入模块。 没有根管子。 TypeScript声明是API的参考\.

### 如何安装 @alessandro-afloarei/integrations？

在项目目录运行 npm install @alessandro-afloarei/integrations，或使用 pnpm add / yarn add / bun add。

### @alessandro-afloarei/integrations 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @alessandro-afloarei/integrations 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @alessandro-afloarei/integrations 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=22。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @alessandro-afloarei/integrations 可以商用吗？

@alessandro-afloarei/integrations 使用 UNLICENSED 许可。作者声明为 UNLICENSED，即不授予公开使用许可（与公共领域的 Unlicense 不同）。使用前需获得作者授权。以上为概括，不构成法律意见，请以许可原文为准。

### @alessandro-afloarei/integrations 的下载量有多少？

根据 npm 官方下载统计，@alessandro-afloarei/integrations 在 2026/10/06 – 2026/11/04 这 30 天内被下载 1,789 次，日均约 60 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @alessandro-afloarei/integrations 还在维护吗？

最新版本 0\.8\.1 发布于 2026/11/03（5 天前）；至今共发布 9 个版本，其中过去 12 个月发布了 9 个；首次发布于 2026/11/01。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

