patchstack/connect

GitHub: patchstack/connect

Patchstack 官方的 JavaScript/Node.js 依赖漏洞监控连接器,通过扫描 lockfile 并上报包清单来实现持续的依赖项漏洞匹配与预警。

Stars: 1 | Forks: 0

# @patchstack/connect 将 JavaScript / Node.js 应用连接到 [Patchstack](https://patchstack.com) 以进行持续的漏洞监控。它会扫描您的 `package-lock.json` 并报告已安装的包,以便 Patchstack 将其与自身的漏洞数据库进行匹配,并在需要修补时通知您。 关于此代码库如何融入更广泛的 Patchstack 生态系统(`saas`、`hub`、`patchstack-website`、`patchstack-connect`),请参阅 [`patchstack/saas` → `docs/ecosystem.md`](https://github.com/patchstack/saas/blob/main/docs/ecosystem.md)。 ## 安装提示词(针对 AI 编程工具) 将此提示词复制并粘贴到任何 AI 编程助手中(Cursor、v0、Bolt、Lovable、Claude Code 等): ## 快速开始(零配置) ``` npm install --save-dev @patchstack/connect npx @patchstack/connect scan ``` 这样就行了。首次 `scan`: 1. 读取您的 lockfile(参见*支持的 lockfile*)。 2. 在**没有** UUID 的情况下将包列表 POST 到 Patchstack。 3. Patchstack 会配置一个新站点并返回其 UUID。 4. 连接器将 UUID 写入 `.patchstackrc.json`,以便下一次 `scan` 针对同一站点。 5. 连接器会打印一个认领 URL —— 在浏览器中打开它即可将新站点附加到您的 Patchstack 账户。您可以随时使用 `npx @patchstack/connect status` 重新显示该 URL。 然后将其接入构建流程: ``` // package.json { "scripts": { "prebuild": "patchstack-connect scan" } } ``` ## 快速开始(现有站点) 如果您已经在 Patchstack 控制面板中创建了“Application”(应用程序)站点,请预先填充 UUID: ``` npm install --save-dev @patchstack/connect npx @patchstack/connect init npx @patchstack/connect scan ``` ## CLI ``` patchstack-connect scan [options] Scan the lockfile and POST to Patchstack. If no UUID is configured the server provisions one and the connector persists it. patchstack-connect init Optional: pre-seed .patchstackrc.json with an existing site UUID patchstack-connect status [options] Show current configuration patchstack-connect help Print help Options (for scan and status): --site-uuid Override the configured site UUID --endpoint Override the API endpoint --dry-run (scan only) Print the payload without posting ``` ## 配置 优先级(最高者优先): 1. CLI 标志(`--site-uuid`、`--endpoint`) 2. 环境变量 3. 当前目录下的 `.patchstackrc.json` 环境变量: - `PATCHSTACK_SITE_UUID` — 来自您 Patchstack 控制面板的站点 UUID - `PATCHSTACK_ENDPOINT` — 覆盖 API endpoint(默认为 `https://api.patchstack.com/monitor/pulse/manifest`) - `PATCHSTACK_TIMEOUT_MS` — 请求超时时间(以毫秒为单位,默认为 `30000`) `.patchstackrc.json` 示例: ``` { "siteUuid": "550e8400-e29b-41d4-a716-446655440000" } ``` 站点 UUID 是唯一的凭证。拥有该 UUID 即被授予为该站点提交清单的权限,因此请像对待 API token 一样处理它:不要将其放在公开的代码仓库中,并且在 CI 环境中优先使用环境变量。 ## 编程式 API ``` import { scanAndReport } from '@patchstack/connect'; const result = await scanAndReport(); console.log(result.response.stored ? 'Reported' : 'Unchanged'); ``` 同时也导出了底层的组件:`scanLockfile`、`buildWirePayload`、`postManifest`、`resolveConfig`。 ## 发送的内容 ``` { "ecosystem": "npm", "packages": [ { "name": "axios", "version": "1.6.0" }, { "name": "lodash", "version": "4.17.15" }, { "name": "lodash", "version": "4.17.21" } ] } ``` 这就是完整的 payload。不包含源代码、环境变量或文件路径 —— 仅有来自您 lockfile 的包名称和版本。具有不同版本的同名包会被保留,这样就不会遗漏传递性漏洞。 ## 支持的 lockfile - ✅ `package-lock.json` (npm v6 / v2 / v3) — 直接解析 - ✅ `pnpm-lock.yaml` (pnpm v5 / v6 / v7 / v8 / v9) — 直接解析 - ✅ `yarn.lock` (yarn classic v1 和 yarn berry v2+) — 直接解析 - ✅ `bun.lockb` (二进制) — 通过遍历 `node_modules/` 解析包列表 - ✅ `bun.lock` (文本) — 采用相同的回退机制;后续将支持直接解析 如果同时存在 Bun lockfile 和 `node_modules/`,连接器将遍历 `node_modules/` 以枚举已安装的包。请在扫描前运行 `bun install`(或 `npm install`),以便填充该目录。 ### 过期的 lockfile 每个被扫描的源都会与 `package.json` 进行验证:如果选定的 lockfile 缺少 `package.json` 中声明的依赖,它将被视为陈旧文件(例如,在由 bun 管理的项目中由一次性 `npm install` 生成的 `package-lock.json`),连接器会回退到下一个源 —— 最终遍历已安装事实的 `node_modules/` —— 并打印一条警告,指出该过期文件的名称。删除过期的 lockfile 即可消除该警告。如果不这样做,当真实的依赖集发生偏离时,清单和构建指纹将悄无声息地停止更新。 ## 开发 ``` npm install npm run typecheck npm test npm run build ``` ### Manifest endpoint 测试 要将当前的 lockfile 清单 POST 到本地的 Patchstack API endpoint 并配置新站点: ``` bun run test:manifest -- --endpoint http://localhost:8000/monitor/pulse/manifest ``` 响应应包含新的站点 UUID。要重新测试现有站点,请显式传入该 UUID: ``` bun run test:manifest -- --endpoint http://localhost:8000/monitor/pulse/manifest --site-uuid YOUR_REAL_UUID ``` 使用 `--dry-run` 可以在不进行 POST 的情况下预览 payload。 ## 发布流程 Pull request 会在 GitHub Actions 中运行类型检查、测试、构建、包验证以及生产环境依赖审计。 当发布 GitHub Release 时会触发发布流程。Release 标签必须与 `package.json` 中的包版本相匹配,并带有前缀 `v`。例如,`package.json` 版本 `0.2.0` 必须使用标签 `v0.2.0` 发布;否则工作流将在发布前失败。 要发布一个版本: 1. 提升包版本,例如 `npm version 0.2.0 --no-git-tag-version`。 2. 提交 `package.json` 和 `package-lock.json`。 3. 将版本提升合并到 `main` 分支。 4. 创建并发布标记为 `v0.2.0` 的 GitHub Release。 5. `Publish` 工作流会验证包,然后运行 `npm publish --provenance --access public`。 在首次发布之前,请为此包配置 npm trusted publishing: 1. 将 `.github/workflows/publish.yml` 合并到 `main`。 2. 在 npmjs.com 上打开 `@patchstack/connect` 包设置。 3. 在 **Trusted publishing** 中,选择 **GitHub Actions**。 4. 配置: - 组织/用户:`patchstack` - 仓库:`connect` - 工作流文件名:`publish.yml` - 环境名称:`npm` 5. 在 GitHub 仓库设置中,创建一个 `npm` 环境。可选但建议的操作:要求对该环境进行人工审批。 请勿为此工作流向 GitHub secrets 添加 npm 发布 token。Trusted publishing 使用 GitHub OIDC 短期凭证。在首次 trusted publishing 成功后,npm 建议将包发布访问权限设置为需要双重身份验证并禁用 token。 ## 许可证 MIT
标签:CMS安全, DevSecOps, GNU通用公共许可证, JavaScript, LNA, MITM代理, Node.js, 上游代理, 依赖管理, 数据可视化, 暗色界面, 漏洞监控, 自动化攻击