{"_id":"@alvinahmad/blueprin-sdk","_rev":"2-48d2fda55bbe63dde022751bd60bf76d","name":"@alvinahmad/blueprin-sdk","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@alvinahmad/blueprin-sdk","version":"1.0.0","keywords":["blueprin","sdk","plugin","connector","construction","budgeting","rab","material","marketplace"],"author":{"name":"qalvinahmad"},"license":"MIT","_id":"@alvinahmad/blueprin-sdk@1.0.0","maintainers":[{"name":"qalvinahmad","email":"qalvinahmad@gmail.com"}],"homepage":"https://github.com/qalvinahmad/blueprin-sdk#readme","bugs":{"url":"https://github.com/qalvinahmad/blueprin-sdk/issues"},"dist":{"shasum":"ec474c0d9d0f7fd5191955881102968a994bbafc","tarball":"https://registry.npmjs.org/@alvinahmad/blueprin-sdk/-/blueprin-sdk-1.0.0.tgz","fileCount":95,"integrity":"sha512-JAdd4t/F10S+isylmd1RclAbg7Cm7l/tZKq2Ecrp384lXr7GEzxVsGK53VSM+mUseTyac9Ge4nL/j4DYHqnBUw==","signatures":[{"sig":"MEQCIHXuz0pz4VAkPjw7YvpjfF9SL2MsbAiIq1AGvchvzLLoAiBvrxWPQRyAKw9HEuDZvIAQAu/9aFmAbj480a/gWZNPVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":815552},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.mjs","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.mjs","require":"./lib/index.js"},"./ui":{"types":"./lib/ui/index.d.ts","import":"./lib/ui/index.mjs","require":"./lib/ui/index.js"},"./rab":{"types":"./lib/rab/index.d.ts","import":"./lib/rab/index.mjs","require":"./lib/rab/index.js"},"./core":{"types":"./lib/core/index.d.ts","import":"./lib/core/index.mjs","require":"./lib/core/index.js"},"./hooks":{"types":"./lib/hooks/index.d.ts","import":"./lib/hooks/index.mjs","require":"./lib/hooks/index.js"},"./events":{"types":"./lib/events/index.d.ts","import":"./lib/events/index.mjs","require":"./lib/events/index.js"},"./project":{"types":"./lib/project/index.d.ts","import":"./lib/project/index.mjs","require":"./lib/project/index.js"},"./storage":{"types":"./lib/storage/index.d.ts","import":"./lib/storage/index.mjs","require":"./lib/storage/index.js"},"./material":{"types":"./lib/material/index.d.ts","import":"./lib/material/index.mjs","require":"./lib/material/index.js"},"./schedule":{"types":"./lib/schedule/index.d.ts","import":"./lib/schedule/index.mjs","require":"./lib/schedule/index.js"},"./connector":{"types":"./lib/connector/index.d.ts","import":"./lib/connector/index.mjs","require":"./lib/connector/index.js"},"./marketplace":{"types":"./lib/marketplace/index.d.ts","import":"./lib/marketplace/index.mjs","require":"./lib/marketplace/index.js"}},"gitHead":"fb94ba924b3bd094768c24980d03a2a09a9ee3d0","scripts":{"lint":"eslint lib/","test":"vitest run","build":"node scripts/build.js","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"qalvinahmad","email":"qalvinahmad@gmail.com"},"repository":{"url":"git+https://github.com/qalvinahmad/blueprin-sdk.git","type":"git"},"_npmVersion":"10.9.0","description":"Official SDK for building plugins, connectors, extensions and integrations for Blueprin","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","esbuild":"^0.25.0","typescript":"^5.8.3"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/blueprin-sdk_1.0.0_1785644426709_0.7226667729663518","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@alvinahmad/blueprin-sdk","version":"1.0.2","description":"Official SDK for building plugins, connectors, extensions and integrations for Blueprin","main":"lib/index.js","module":"lib/index.mjs","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.mjs","require":"./lib/index.js"},"./core":{"types":"./lib/core/index.d.ts","import":"./lib/core/index.mjs","require":"./lib/core/index.js"},"./hooks":{"types":"./lib/hooks/index.d.ts","import":"./lib/hooks/index.mjs","require":"./lib/hooks/index.js"},"./events":{"types":"./lib/events/index.d.ts","import":"./lib/events/index.mjs","require":"./lib/events/index.js"},"./ui":{"types":"./lib/ui/index.d.ts","import":"./lib/ui/index.mjs","require":"./lib/ui/index.js"},"./connector":{"types":"./lib/connector/index.d.ts","import":"./lib/connector/index.mjs","require":"./lib/connector/index.js"},"./storage":{"types":"./lib/storage/index.d.ts","import":"./lib/storage/index.mjs","require":"./lib/storage/index.js"},"./project":{"types":"./lib/project/index.d.ts","import":"./lib/project/index.mjs","require":"./lib/project/index.js"},"./material":{"types":"./lib/material/index.d.ts","import":"./lib/material/index.mjs","require":"./lib/material/index.js"},"./rab":{"types":"./lib/rab/index.d.ts","import":"./lib/rab/index.mjs","require":"./lib/rab/index.js"},"./schedule":{"types":"./lib/schedule/index.d.ts","import":"./lib/schedule/index.mjs","require":"./lib/schedule/index.js"},"./marketplace":{"types":"./lib/marketplace/index.d.ts","import":"./lib/marketplace/index.mjs","require":"./lib/marketplace/index.js"},"./report":{"types":"./lib/report/index.d.ts","import":"./lib/report/index.mjs","require":"./lib/report/index.js"},"./workforce":{"types":"./lib/workforce/index.d.ts","import":"./lib/workforce/index.mjs","require":"./lib/workforce/index.js"},"./telemetry":{"types":"./lib/telemetry/index.d.ts","import":"./lib/telemetry/index.mjs","require":"./lib/telemetry/index.js"},"./client":{"types":"./lib/client/index.d.ts","import":"./lib/client/index.mjs","require":"./lib/client/index.js"},"./webhook":{"types":"./lib/webhook/index.d.ts","import":"./lib/webhook/index.mjs","require":"./lib/webhook/index.js"},"./openrouter":{"types":"./lib/openrouter/index.d.ts","import":"./lib/openrouter/index.mjs","require":"./lib/openrouter/index.js"},"./takeoff":{"types":"./lib/takeoff/index.d.ts","import":"./lib/takeoff/index.mjs","require":"./lib/takeoff/index.js"},"./bim":{"types":"./lib/bim/index.d.ts","import":"./lib/bim/index.mjs","require":"./lib/bim/index.js"},"./collab":{"types":"./lib/collab/index.d.ts","import":"./lib/collab/index.mjs","require":"./lib/collab/index.js"},"./field":{"types":"./lib/field/index.d.ts","import":"./lib/field/index.mjs","require":"./lib/field/index.js"},"./ikk":{"types":"./lib/ikk/index.d.ts","import":"./lib/ikk/index.mjs","require":"./lib/ikk/index.js"},"./license":{"types":"./lib/license/index.d.ts","import":"./lib/license/index.mjs","require":"./lib/license/index.js"},"./preferences":{"types":"./lib/preferences/index.d.ts","import":"./lib/preferences/index.mjs","require":"./lib/preferences/index.js"}},"engines":{"node":">=18.0.0"},"scripts":{"build":"node scripts/build.js","pretest":"npm run build","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","typecheck":"tsc --noEmit","lint":"tsc --noEmit","prepublishOnly":"npm run build"},"keywords":["blueprin","sdk","plugin","connector","construction","budgeting","rab","material","marketplace"],"author":{"name":"qalvinahmad"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/qalvinahmad/blueprin-sdk.git"},"homepage":"https://github.com/qalvinahmad/blueprin-sdk#readme","bugs":{"url":"https://github.com/qalvinahmad/blueprin-sdk/issues"},"devDependencies":{"@types/node":"^20.17.0","@types/react":"^18.3.18","@types/react-dom":"^18.3.5","@vitest/coverage-v8":"^3.2.7","esbuild":"^0.25.0","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.8.3","vitest":"^3.2.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"dependencies":{"glob":"^13.0.6"},"_id":"@alvinahmad/blueprin-sdk@1.0.2","gitHead":"871605bb84d18607ec9ccc9477857b7777c9469b","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-ZucCenfgmNreqO+pKxDNQA3fxF9uIkxpata86qW2i0QxxEOEGESbT8uOpDXK+2AYoz33Y4CKBOlZ7R6M8sTewg==","shasum":"fd9fa36caf8af0c2b789e0477ef8695ce4685db5","tarball":"https://registry.npmjs.org/@alvinahmad/blueprin-sdk/-/blueprin-sdk-1.0.2.tgz","fileCount":291,"unpackedSize":6060543,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCFDcRDfnNSdk/hPcDIEI2R8peVVdUJPUlt+QQn6fLcXwIgPmkzN3SwAM9eDgv+sQHw1O1iMHs1dGTjwX+W7hEh9Ic="}]},"_npmUser":{"name":"qalvinahmad","email":"qalvinahmad@gmail.com"},"directories":{},"maintainers":[{"name":"qalvinahmad","email":"qalvinahmad@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/blueprin-sdk_1.0.2_1787661358499_0.2685121115839679"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-02T04:20:26.563Z","modified":"2026-08-25T12:35:58.912Z","1.0.0":"2026-08-02T04:20:26.878Z","1.0.2":"2026-08-25T12:35:58.735Z"},"bugs":{"url":"https://github.com/qalvinahmad/blueprin-sdk/issues"},"author":{"name":"qalvinahmad"},"license":"MIT","homepage":"https://github.com/qalvinahmad/blueprin-sdk#readme","keywords":["blueprin","sdk","plugin","connector","construction","budgeting","rab","material","marketplace"],"repository":{"type":"git","url":"git+https://github.com/qalvinahmad/blueprin-sdk.git"},"description":"Official SDK for building plugins, connectors, extensions and integrations for Blueprin","maintainers":[{"name":"qalvinahmad","email":"qalvinahmad@gmail.com"}],"readme":"<div align=\"center\">\n\n# Blueprin SDK\n\n[![CI Build & Test](https://github.com/qalvinahmad/blueprin-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/qalvinahmad/blueprin-sdk/actions/workflows/ci.yml)\n[![Latest Release](https://img.shields.io/github/v/release/qalvinahmad/blueprin-sdk)](https://github.com/qalvinahmad/blueprin-sdk/releases)\n[![npm downloads](https://img.shields.io/npm/dm/@alvinahmad/blueprin-sdk.svg)](https://www.npmjs.com/package/@alvinahmad/blueprin-sdk)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n[![Last Commit](https://img.shields.io/github/last-commit/qalvinahmad/blueprin-sdk?date=iso&color=blue)](https://github.com/qalvinahmad/blueprin-sdk/commits/main)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n**Languages:**\n[![English](https://img.shields.io/badge/English-0052CC?style=flat)](README.md) [![Bahasa Indonesia](https://img.shields.io/badge/Bahasa_Indonesia-FF0000?style=flat)](README.id.md) [![Arabic](https://img.shields.io/badge/Arabic-000000?style=flat)](README.ar.md) [![日本語](https://img.shields.io/badge/日本語-BC002D?style=flat)](README.ja.md) [![한국어](https://img.shields.io/badge/한국어-003478?style=flat)](README.ko.md) [![中文](https://img.shields.io/badge/中文-DE2910?style=flat&label=You%20are%20here)](README.zh.md) [![Français](https://img.shields.io/badge/Fran%C3%A7ais-0052CC?style=flat)](README.fr.md) [![Español](https://img.shields.io/badge/Espa%C3%B1ol-D80027?style=flat)](README.es.md) [![Deutsch](https://img.shields.io/badge/Deutsch-000000?style=flat)](README.de.md) [![Português](https://img.shields.io/badge/Portugu%C3%AAs-009B3A?style=flat)](README.pt.md) [![Русский](https://img.shields.io/badge/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9-0039A6?style=flat)](README.ru.md)\n\n</div>\n\n<br/>\n<div align=\"center\">\n  <img src=\"https://drive.google.com/uc?export=view&id=1YLatzwU4xCGc8E2QWaXgQgJWFqOH3GOZ\" alt=\"Blueprin Logo\" width=\"250\" />\n  <br/><br/>\n\n  [![codecov](https://codecov.io/gh/qalvinahmad/blueprin-sdk/graph/badge.svg?token=dcf0d4cb-2c2d-4b9c-bd27-842a79e81966)](https://codecov.io/gh/qalvinahmad/blueprin-sdk)\n  [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/qalvinahmad/blueprin-sdk/badge)](https://securityscorecards.dev/details/?repo=github.com/qalvinahmad/blueprin-sdk)\n  [![OpenSSF Criticality](https://img.shields.io/badge/Criticality%20Score-0.37%2F1-blue?label=criticality%20score&style=flat)](https://github.com/ossf/criticality_score#criticality-score) <!-- Updated: 2026-08-14 -->\n  [![Code Quality](https://img.shields.io/codefactor/grade/github/qalvinahmad/blueprin-sdk?logo=codefactor&logoColor=white)](https://www.codefactor.io/repository/github/qalvinahmad/blueprin-sdk/overview/main)\n  [![Security Policy](https://img.shields.io/badge/Security-Security%20Policy-blue)](SECURITY.md)\n  [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org/)\n  [![Code Style](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?logo=prettier&logoColor=white)](https://github.com/prettier/prettier)\n  [![Contributors](https://img.shields.io/github/contributors/qalvinahmad/blueprin-sdk?color=green)](https://github.com/qalvinahmad/blueprin-sdk/graphs/contributors)\n  [![Discussions](https://img.shields.io/github/discussions/qalvinahmad/blueprin-sdk?logo=github&logoColor=white)](https://github.com/qalvinahmad/blueprin-sdk/discussions)\n\n  <br/>\n\n  **Runtime:**\n  ![Node.js](https://img.shields.io/badge/Node.js-%3E%3D18.0.0-339933?style=flat&logo=node.js&logoColor=white) ![Browser](https://img.shields.io/badge/Browser-Chrome%20%7C%20Firefox%20%7C%20Safari%20%7C%20Edge-4285F4?style=flat&logo=googlechrome&logoColor=white) ![React](https://img.shields.io/badge/React-%3E%3D18.0.0-61DAFB?style=flat&logo=react&logoColor=white)\n\n  **Package:**\n  ![npm](https://img.shields.io/npm/v/@alvinahmad/blueprin-sdk?style=flat&logo=npm&logoColor=white) ![TypeScript](https://img.shields.io/badge/TypeScript-5.8+-3178C6?style=flat&logo=typescript&logoColor=white) ![Module](https://img.shields.io/badge/Module-ESM%20%2B%20CJS-blueviolet?style=flat) ![Node](https://img.shields.io/badge/Node-%3E%3D18-339933?style=flat&logo=node.js&logoColor=white)\n\n</div>\n<br/>\n\n用于构建 [Blueprin](blueprin-app.vercel.app) 的 **插件**、**连接器**、**扩展** 和 **集成** 的官方 SDK — 印度尼西亚专业的建筑预算平台。\n\n## 为什么选择 Blueprin SDK？\n\n无需重新实现核心基础设施即可为 Blueprin 构建生产就绪的扩展。\n\n- **插件系统** — 无需修改宿主应用即可扩展 Blueprin\n- **钩子和事件** — 响应生命周期事件并自定义行为\n- **连接器** — 集成外部服务和供应商\n- **公式引擎** — 使用自定义业务规则扩展 RAB 计算\n- **UI 组件** — 构建原生外观的插件界面\n- **沙盒运行时** — 控制插件执行和网络访问\n- **TypeScript 优先** — 完整的类型定义和 ESM/CJS 支持\n\n## 架构\n\n```\n                    +---------------------+\n                    |    Blueprin Host    |\n                    |       App           |\n                    +----------+----------+\n                               |\n                     +---------v---------+\n                     |   Blueprin SDK    |\n                     +---------+---------+\n                               |\n        +----------+-----------+-----------+----------+\n        v          v           v           v          v\n     Plugins    Events       Hooks      Storage   Connectors\n        |          |           |           |          |\n        +----------+-----------+-----------+----------+\n                               |\n                    +----------v----------+\n                    | Domain Clients      |\n                    +---------------------+\n                    | Project             |\n                    | Material            |\n                    | RAB                 |\n                    | Schedule            |\n                    | Marketplace         |\n                    | Workforce           |\n                    +---------------------+\n```\n\n## 安装\n\n```bash\nnpm install @alvinahmad/blueprin-sdk\n# 或\npnpm add @alvinahmad/blueprin-sdk\n# 或\nyarn add @alvinahmad/blueprin-sdk\n```\n\n## 快速开始\n\n```javascript\nimport { BlueprinSDK } from '@alvinahmad/blueprin-sdk';\n\nconst sdk = new BlueprinSDK({\n  appId: 'my-app',\n  supabaseUrl: process.env.SUPABASE_URL,\n  supabaseKey: process.env.SUPABASE_ANON_KEY,\n  debug: true,\n});\n\nawait sdk.init();\n\nconsole.log(sdk.getInfo());\n// { version: '1.0.1', plugins: 0, hooks: 0, events: 0, initialized: true }\n```\n\n## 创建你的第一个插件\n\n```javascript\nimport { definePlugin } from '@alvinahmad/blueprin-sdk';\n\nexport default definePlugin({\n  id: 'my-first-plugin',\n  name: 'My First Plugin',\n  version: '1.0.0',\n  description: 'My first Blueprin plugin',\n\n  activate(ctx) {\n    ctx.events.on('blueprin:project:created', (data) => {\n      console.log('Project created:', data.project.name);\n    });\n\n    ctx.hooks.register('blueprin:after:rab:calculate', (data) => {\n      console.log('RAB total:', data.result.total);\n      return data;\n    });\n\n    return {\n      api: {\n        getVersion: () => '1.0.0',\n      },\n    };\n  },\n\n  deactivate(instance) {\n    console.log('Plugin deactivated');\n  },\n});\n```\n\n或使用官方 CLI 脚手架创建新插件:\n\n```bash\nnpx create-blueprin-plugin my-plugin\ncd my-plugin\nnpm install\nnpm run dev\n```\n\n## 包含内容\n\n```\n@alvinahmad/blueprin-sdk\n│\n├── Core\n│   ├── BlueprinSDK        @alvinahmad/blueprin-sdk\n│   ├── PluginManager      @alvinahmad/blueprin-sdk/core\n│   ├── EventBus           @alvinahmad/blueprin-sdk/events\n│   ├── HookRegistry       @alvinahmad/blueprin-sdk/hooks\n│   └── StorageAdapter     @alvinahmad/blueprin-sdk/storage\n│\n├── Domain Clients\n│   ├── ProjectClient      @alvinahmad/blueprin-sdk/project\n│   ├── MaterialClient     @alvinahmad/blueprin-sdk/material\n│   ├── RabClient          @alvinahmad/blueprin-sdk/rab\n│   ├── ScheduleClient     @alvinahmad/blueprin-sdk/schedule\n│   ├── MarketplaceClient  @alvinahmad/blueprin-sdk/marketplace\n│   └── WorkforceClient    @alvinahmad/blueprin-sdk/workforce\n│\n├── Integrations\n│   ├── BaseConnector      @alvinahmad/blueprin-sdk/connector\n│   └── Reports            @alvinahmad/blueprin-sdk/report\n│\n└── UI\n    └── BlueprintButton, BlueprintCard, ...  @alvinahmad/blueprin-sdk/ui\n```\n\n所有模块支持 tree-shaking，可通过子路径导入:\n\n```javascript\nimport { BlueprinSDK } from '@alvinahmad/blueprin-sdk';\nimport { definePlugin } from '@alvinahmad/blueprin-sdk/core';\nimport { ProjectClient } from '@alvinahmad/blueprin-sdk/project';\n```\n\n## 功能特性\n\n- **插件系统** — 使用生命周期钩子注册、激活、停用和管理插件\n- **事件总线** — 用于插件间通信的 pub/sub 系统\n- **钩子注册表** — 用于扩展功能的前后生命周期钩子\n- **存储适配器** — 带 SSR 保护的 localStorage + Supabase 混合存储\n- **域客户端** — Project、Material、RAB、Schedule、Marketplace 和 Workforce 模块\n- **UI 组件** — 用于构建插件界面的 React 组件\n- **连接器 SDK** — 与外部服务构建集成\n- **TypeScript 支持** — 包含完整的类型定义\n\n## 安全模型\n\nBlueprin 插件在宿主控制的权限下运行。\n\n| 能力 | 默认值 | 宿主控制 |\n|---|---|---|\n| 插件执行 | 已启用 | 生命周期控制（激活/停用） |\n| 外部网络 | **已禁用** | 需要通过清单权限添加白名单 |\n| 钩子 | 已启用 | 每次钩子执行 200ms 超时 |\n| 存储 | 受限 | 适配器控制（localStorage 或 Supabase） |\n| UI 渲染 | 已启用 | React 沙盒，无法直接访问 DOM |\n\n插件**无法**访问外部网络，除非宿主应用明确将其加入白名单。所有钩子执行都有 200ms 硬超时，以防止无限循环或 UI 阻塞。\n\n有关漏洞报告，请参阅 [安全政策](SECURITY.md)。\n\n## 示例\n\n| 示例 | 描述 |\n|---------|------|\n| [Hello Plugin](example/hello_plugin/) | 最简单的插件 |\n| [RAB Generator](example/rab_generator/) | AI 驱动的 RAB 生成 |\n| [WhatsApp Sync](example/whatsapp_sync/) | WhatsApp 通知 |\n| [Material Connector](example/material_connector/) | 供应商同步 |\n| [Custom Report](example/custom_report/) | 报告生成 |\n\n## 文档\n\n- [完整文档](https://blueprin-docs.vercel.app)\n- [快速入门](docs/getting-started/)\n- [插件开发](docs/plugin-development/)\n- [钩子和事件](docs/hooks/)\n- [UI 组件](docs/ui-components/)\n- [存储](docs/storage/)\n- [连接器](docs/connectors/)\n- [测试](docs/testing/)\n- [发布](docs/publishing/)\n\n## API 参考\n\n完整的 API 文档请访问 [blueprin-docs.vercel.app/api](https://blueprin-docs.vercel.app/api):\n\n- [BlueprinSDK](https://blueprin-docs.vercel.app/api/sdk) — 主入口点\n- [PluginManager](https://blueprin-docs.vercel.app/api/plugin-manager) — 插件生命周期\n- [EventBus](https://blueprin-docs.vercel.app/api/events) — pub/sub 事件\n- [HookRegistry](https://blueprin-docs.vercel.app/api/hooks) — 生命周期钩子\n- [Domain Clients](https://blueprin-docs.vercel.app/api/domain-clients) — Project、Material、RAB 等\n\n## 贡献\n\n我们欢迎贡献！详情请参阅 [贡献指南](CONTRIBUTING.md)。\n\n## 社区\n\n- [GitHub Discussions](https://github.com/qalvinahmad/blueprin-sdk/discussions) — 提问、分享想法、与其他开发者交流\n- [Issue Tracker](https://github.com/qalvinahmad/blueprin-sdk/issues) — 报告错误和功能请求\n\n## 许可证\n\nMIT © [qalvinahmad](https://github.com/qalvinahmad)\n\n---\n\n> 翻译可能滞后于英文文档。英文 README 是权威来源。\n","readmeFilename":"README.zh.md"}