{"_id":"@cardos/extension","_rev":"9-896bcf435b763d7149795bc078e60c9e","name":"@cardos/extension","dist-tags":{"latest":"0.2.0-beta.3"},"versions":{"0.1.0":{"name":"@cardos/extension","version":"0.1.0","_id":"@cardos/extension@0.1.0","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"f652ad387e2cf92234226854bb6486b32b43cc5f","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.0.tgz","fileCount":43,"integrity":"sha512-c3+BnE2tF1gZwAa8fAVMuL9Zq0WLyN4KkF1H5ZuHjjWMerkFivM/UjpFpt0fP9H+Wd0h6vltzn6aFE9It8LYMg==","signatures":[{"sig":"MEQCIDvcLIZqmMWSiwaD4HGJ8MONV7Ixdohgx+xjwk4FsS5JAiBSgDkuJm0F3cg+5OomBVbMAwJaTs2t33V3o6mnUk0BvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171930},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"96a9bff6ff6b10a10be15a75b7975f0dffa2ca77","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","buildAndPublish":"npm run clean && npm run build && npm publish"},"_npmUser":{"name":"peiiii","email":"1535376447@qq.com"},"_npmVersion":"10.8.2","description":"CardOS Extension System","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.0_1744193925767_0.7781645340857533","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cardos/extension","version":"0.1.1","_id":"@cardos/extension@0.1.1","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"0224d77b535ffe4d7bb99446058bd4adcf7d5aa3","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.1.tgz","fileCount":43,"integrity":"sha512-LyEuvD1gFZZdOMTKSpM0VSjvm1MwTBlKtA4+OOedrSZQrpWhyzKpBKWk82j/F2AG5SV6Bt7JNz9TQYZd16tfSw==","signatures":[{"sig":"MEQCIEXy+yfBb2ySMzutUXKwKZhhHqGuh99HDD4Soc6WlzryAiAS/eOnVZAQW5JGVLpkidBcbkJK4zte1rMwtlXwv7NkUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171951},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"96a9bff6ff6b10a10be15a75b7975f0dffa2ca77","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_npmUser":{"name":"peiiii","email":"1535376447@qq.com"},"_npmVersion":"10.8.2","description":"CardOS Extension System","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.1_1744195107793_0.8330484321878247","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@cardos/extension","version":"0.1.2","_id":"@cardos/extension@0.1.2","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"a1279150349820050bb38a9956743b06d706cf86","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.2.tgz","fileCount":43,"integrity":"sha512-onMH44cWVKXbCf9fA7mBkvnCRQIg+t76jn0U5FM/pRmk8T15t3A98kiNDaquM78EeyrGUh9CVl9wA7j4r1bZcQ==","signatures":[{"sig":"MEQCIFiofIE4TORDEJbVMaxxCFFrQbG9SJsPBMtF7sC6UXFDAiAwG2cDWXIWtLiagjdCghKxfi4sfjIHRtCcvmKp4Kb+wg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172058},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"96a9bff6ff6b10a10be15a75b7975f0dffa2ca77","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_npmUser":{"name":"peiiii","email":"1535376447@qq.com"},"_npmVersion":"10.8.2","description":"CardOS Extension System","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.2_1744195158766_0.4454959282151172","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@cardos/extension","version":"0.1.3","_id":"@cardos/extension@0.1.3","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"4411e5727c5d0ab00ab0b3de6567b5f68d975738","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.3.tgz","fileCount":55,"integrity":"sha512-MP+LHnvF7QS2+MVe1L4/e7T3TsEH3msZMn2lWJ/afiKOWbwEO9GJ1QnY7murh0H0L/JzRfAIXOBElYdZZoYB5g==","signatures":[{"sig":"MEUCIG9OZN6BCFaWPxATXHXEx6lKBVaoVm6SQMLQ4905MQe3AiEAgORJma3hK2rGTaIVZHM0HT+gI3AsO7d0Y57H4fvdzBA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187169},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"96a9bff6ff6b10a10be15a75b7975f0dffa2ca77","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_npmUser":{"name":"peiiii","email":"1535376447@qq.com"},"_npmVersion":"10.8.2","description":"CardOS Extension System","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.3_1744195324569_0.8419956006267009","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@cardos/extension","version":"0.1.4","_id":"@cardos/extension@0.1.4","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"7732cf77bba6a30b8f9cb6568b67363a16519cf4","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.4.tgz","fileCount":55,"integrity":"sha512-g1fnXWEUz8KTWgibBtqfTJ8OJ0uzfWkgL4+U3FUAytQRCkQShED9DSh2CP1AQi0CdbqFxGNMPrReNuqUYThJiw==","signatures":[{"sig":"MEYCIQD/vApDdfW8AJQvilOYL/zf+hipOBUjZ3ZCQlwCJdtn8gIhAOd4LI4SyJn73PpFpWjP2XPgU/yc+XGcpI2dpukY4qcS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182332},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"96a9bff6ff6b10a10be15a75b7975f0dffa2ca77","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_npmUser":{"name":"peiiii","email":"1535376447@qq.com"},"_npmVersion":"10.8.2","description":"CardOS Extension System","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.4_1744195698365_0.960620413608839","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@cardos/extension","version":"0.1.5","_id":"@cardos/extension@0.1.5","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"83d07096e97ffef4853d76ec90775928f6b7f25a","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.5.tgz","fileCount":37,"integrity":"sha512-jWVGDr64oLQ6AGbM+m/Tm9AfFIYInN6WrQcrKW4B0qYSKojYzRi2D+sjT4wUOa9rp79AgLq25rTb9K/Hoaj5XA==","signatures":[{"sig":"MEQCIBuE88chXMMZ3aVEJnyvAOaAOH3wW3J1ZoPuJhai2COvAiApoTYYpQwHKeOXA/zXQ7kdpnWq5uVh4Ua0uFs3vFRcdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71076},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"96a9bff6ff6b10a10be15a75b7975f0dffa2ca77","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_npmUser":{"name":"peiiii","email":"1535376447@qq.com"},"_npmVersion":"10.8.2","description":"CardOS Extension System","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.5_1744200239089_0.22949212497632354","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@cardos/extension","version":"0.1.7","_id":"@cardos/extension@0.1.7","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"117896791bac7cac109005e493f1f16489950598","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.7.tgz","fileCount":18,"integrity":"sha512-iFDiBxkEBCqjuoWs4c0pPaj2aPdERpRWqi1Tmt7T/8wUlDumIV2GUbdLBu/pWaDgMwJOXUazJSekl+e+GrhcXw==","signatures":[{"sig":"MEUCIFr+r41QDOyWS/MkQKNX4xeWmS2OJLTnkzxRnVy7mUtUAiEA4q3MaAirWPjjV5nzcthLq8Pyr/UvbWGL8nzL/gRgq+w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112854},"main":"src/index.ts","type":"module","_from":"file:cardos-extension-0.1.7.tgz","types":"src/index.ts","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","release":"bumpp && pnpm publish","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_npmUser":{"name":"peiiii","actor":{"name":"peiiii","type":"user","email":"1535376447@qq.com"},"email":"1535376447@qq.com"},"_resolved":"/private/var/folders/1g/9_97kc2s6ng4wqj672qxnn7m0000gp/T/0560c1f8ab3ec34e8a67f1fc6ff94bf5/cardos-extension-0.1.7.tgz","_integrity":"sha512-iFDiBxkEBCqjuoWs4c0pPaj2aPdERpRWqi1Tmt7T/8wUlDumIV2GUbdLBu/pWaDgMwJOXUazJSekl+e+GrhcXw==","_npmVersion":"10.8.2","description":"CardOS Extension System","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bumpp":"^10.2.0","rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.7_1750355415077_0.507829286464172","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@cardos/extension","version":"0.1.8","keywords":["extension","plugin","architecture","typescript","cardos","modular"],"author":{"name":"CardOS Team"},"license":"MIT","_id":"@cardos/extension@0.1.8","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"dist":{"shasum":"2e5897d46106fc089d033e9636c6427e72c0a20d","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.1.8.tgz","fileCount":22,"integrity":"sha512-xTtFx+fcSSTssvelxsreX3pOJ3fZ3mBsVSGGDfE0Fo8eHXynhfMVLdlfcthxHLkD5QuB+nlzmsdJYxzjIQUVkA==","signatures":[{"sig":"MEUCIHUcuNMseoQd2kN+XqcyagktH30IjtpEXCwOCxHelfnnAiEA8Lh43LCi9sO32Rh1LvYnTraqwzX3QLvUc/lccJ7dPdE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165956},"main":"src/index.ts","type":"module","_from":"file:cardos-extension-0.1.8.tgz","types":"src/index.ts","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"echo 'test'","build":"tsc","clean":"rimraf dist","release":"bumpp && pnpm publish","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_npmUser":{"name":"peiiii","actor":{"name":"peiiii","type":"user","email":"1535376447@qq.com"},"email":"1535376447@qq.com"},"_resolved":"/private/var/folders/1g/9_97kc2s6ng4wqj672qxnn7m0000gp/T/8c3862598a8163bc9a9e736081bc3329/cardos-extension-0.1.8.tgz","_integrity":"sha512-xTtFx+fcSSTssvelxsreX3pOJ3fZ3mBsVSGGDfE0Fo8eHXynhfMVLdlfcthxHLkD5QuB+nlzmsdJYxzjIQUVkA==","_npmVersion":"10.8.2","description":"CardOS Extension System - A powerful plugin architecture for building extensible applications","directories":{},"_nodeVersion":"20.18.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bumpp":"^10.2.0","rimraf":"^5.0.5"},"peerDependencies":{"rxjs":"^7.8.1"},"_npmOperationalInternal":{"tmp":"tmp/extension_0.1.8_1750355969043_0.04292717136382307","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-beta.3":{"name":"@cardos/extension","version":"0.2.0-beta.3","private":false,"description":"CardOS Extension System - A powerful plugin architecture for building extensible applications","type":"module","main":"src/index.ts","types":"src/index.ts","keywords":["extension","plugin","architecture","typescript","cardos","modular"],"author":{"name":"CardOS Team"},"license":"MIT","publishConfig":{"access":"public"},"peerDependencies":{"rxjs":"^7.8.1"},"devDependencies":{"bumpp":"^10.2.0","rimraf":"^5.0.5"},"scripts":{"release":"bumpp && pnpm publish","build":"tsc","test":"echo 'test'","lint":"eslint src --ext .ts","clean":"rimraf dist","buildAndPublish":"npm run clean && npm run build && npm version patch && npm publish"},"_id":"@cardos/extension@0.2.0-beta.3","_integrity":"sha512-iZ6bUkH/Qexn3g6StKKmrWjAwbpjteBU7+2m4HGpud+0Rf7ZekDjasyIsDg8uCZnxsYvO9Rq7D7+3lNni9PjPA==","_resolved":"/private/var/folders/gp/ls0ngf8d1qn97_g1t48670zc0000gn/T/40179e4ebac90f724eb06757c5e7c175/cardos-extension-0.2.0-beta.3.tgz","_from":"file:cardos-extension-0.2.0-beta.3.tgz","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-iZ6bUkH/Qexn3g6StKKmrWjAwbpjteBU7+2m4HGpud+0Rf7ZekDjasyIsDg8uCZnxsYvO9Rq7D7+3lNni9PjPA==","shasum":"c266818ed0a60684d04956e78ff4bcbe5ed8d381","tarball":"https://registry.npmjs.org/@cardos/extension/-/extension-0.2.0-beta.3.tgz","fileCount":23,"unpackedSize":166141,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEviYtye2xE30CTGUjN1eJuaINm7bqJR3jg9dpFkqHRHAiB7jeC+Cu0o2ZMwJuysiyYI2PSisKQjtcuNDuEt91ZG3Q=="}]},"_npmUser":{"name":"peiiii","email":"1535376447@qq.com","actor":{"name":"peiiii","email":"1535376447@qq.com","type":"user"}},"directories":{},"maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/extension_0.2.0-beta.3_1750855121491_0.17424930126807547"},"_hasShrinkwrap":false}},"time":{"created":"2025-04-09T10:18:45.674Z","modified":"2025-06-25T12:38:41.860Z","0.1.0":"2025-04-09T10:18:46.000Z","0.1.1":"2025-04-09T10:38:27.972Z","0.1.2":"2025-04-09T10:39:18.980Z","0.1.3":"2025-04-09T10:42:04.790Z","0.1.4":"2025-04-09T10:48:18.560Z","0.1.5":"2025-04-09T12:03:59.248Z","0.1.7":"2025-06-19T17:50:15.263Z","0.1.8":"2025-06-19T17:59:29.222Z","0.2.0-beta.3":"2025-06-25T12:38:41.687Z"},"author":{"name":"CardOS Team"},"license":"MIT","keywords":["extension","plugin","architecture","typescript","cardos","modular"],"description":"CardOS Extension System - A powerful plugin architecture for building extensible applications","maintainers":[{"name":"peiiii","email":"1535376447@qq.com"}],"readme":"# CardOS 扩展系统\n\nCardOS 扩展系统是一个强大的插件架构，允许开发者通过扩展来增强和定制 CardOS 应用的功能。该系统提供了完整的生命周期管理、服务注册、命令系统、事件总线等核心功能。\n\n## 📦 安装\n\n```bash\nnpm install @cardos/extension\n# 或\nyarn add @cardos/extension\n# 或\npnpm add @cardos/extension\n```\n\n## 🚀 快速开始\n\n### 1. 创建扩展管理器\n\n```typescript\nimport { ExtensionManager } from '@cardos/extension';\n\n// 创建扩展管理器实例\nconst extensionManager = new ExtensionManager();\n\n// 在应用启动时初始化\nextensionManager.activateAllExtensions();\n```\n\n### 2. 创建你的第一个扩展\n\n```typescript\nimport { ExtensionDefinition, ExtensionContext } from '@cardos/extension';\n\nconst myExtension: ExtensionDefinition = {\n  manifest: {\n    id: 'my-extension',\n    name: '我的扩展',\n    version: '1.0.0',\n    description: '一个简单的示例扩展',\n    author: '开发者',\n  },\n  \n  activate: (context: ExtensionContext) => {\n    // 扩展激活逻辑\n    context.logger.info('扩展已激活!');\n    \n    // 注册命令\n    const commandDisposable = context.commandRegistry.registerCommand(\n      'my-extension.hello',\n      (name?: string) => {\n        return `Hello, ${name || 'World'}!`;\n      }\n    );\n    \n    // 添加到订阅列表，确保扩展停用时自动清理\n    context.subscriptions.push(commandDisposable);\n  },\n  \n  deactivate: () => {\n    console.log('扩展已停用');\n  }\n};\n\n// 注册扩展\nextensionManager.registerExtension(myExtension);\n```\n\n## 📚 核心概念\n\n### 1. 扩展定义 (ExtensionDefinition)\n\n每个扩展都需要定义一个 `ExtensionDefinition` 对象，包含：\n\n- **manifest**: 扩展的元数据信息\n- **activate**: 扩展激活时调用的函数\n- **deactivate**: 扩展停用时调用的函数（可选）\n\n### 2. 扩展上下文 (ExtensionContext)\n\n扩展激活时会收到一个 `ExtensionContext` 对象，提供以下功能：\n\n- **subscriptions**: 管理需要释放的资源\n- **serviceRegistry**: 服务注册和发现\n- **commandRegistry**: 命令注册和执行\n- **eventBus**: 事件发布和订阅\n- **storage**: 数据持久化存储\n- **logger**: 结构化日志记录\n\n### 3. 生命周期管理\n\n扩展系统提供完整的生命周期管理：\n\n```typescript\n// 激活扩展\nextensionManager.activateExtension('my-extension');\n\n// 停用扩展\nextensionManager.deactivateExtension('my-extension');\n\n// 检查扩展状态\nconst isActive = extensionManager.isExtensionActive('my-extension');\n```\n\n## 🔧 核心功能\n\n### 1. 服务注册系统\n\n扩展可以注册和发现服务：\n\n```typescript\n// 注册服务\nconst serviceDisposable = context.serviceRegistry.registerService(\n  'my-service',\n  {\n    doSomething: () => 'Hello from service!'\n  }\n);\n\n// 获取服务\nconst service = context.serviceRegistry.getService('my-service');\nif (service) {\n  service.doSomething();\n}\n\n// 添加到订阅列表\ncontext.subscriptions.push(serviceDisposable);\n```\n\n### 2. 命令系统\n\n扩展可以注册和执行命令：\n\n```typescript\n// 注册命令\nconst commandDisposable = context.commandRegistry.registerCommand(\n  'my-command',\n  (arg?: string) => {\n    return `Command executed with arg: ${arg}`;\n  }\n);\n\n// 执行命令\nconst result = await context.commandRegistry.executeCommand('my-command', 'test');\n\n// 添加到订阅列表\ncontext.subscriptions.push(commandDisposable);\n```\n\n### 3. 事件系统\n\n扩展可以发布和订阅事件：\n\n```typescript\n// 订阅事件\nconst eventDisposable = context.eventBus.on('my-event', (data) => {\n  console.log('收到事件:', data);\n});\n\n// 发布事件\ncontext.eventBus.emit('my-event', { message: 'Hello from event!' });\n\n// 添加到订阅列表\ncontext.subscriptions.push(eventDisposable);\n```\n\n### 4. 存储系统\n\n扩展可以使用工作区和全局存储：\n\n```typescript\n// 工作区存储（工作区切换时会改变）\nawait context.storage.workspace.set('key', 'value');\nconst value = context.storage.workspace.get('key');\n\n// 全局存储（跨工作区保持不变）\nawait context.storage.global.set('global-key', 'global-value');\nconst globalValue = context.storage.global.get('global-key');\n```\n\n### 5. 日志系统\n\n扩展可以使用结构化日志：\n\n```typescript\ncontext.logger.debug('调试信息');\ncontext.logger.info('一般信息');\ncontext.logger.warn('警告信息');\ncontext.logger.error('错误信息');\n```\n\n## 📝 完整示例\n\n### 主题切换扩展\n\n```typescript\nimport { ExtensionDefinition, ExtensionContext, TypedKey } from '@cardos/extension';\n\n// 定义类型安全的事件键\nconst ThemeChangedEvent = new TypedKey<{ theme: string }>('theme.changed');\n\nconst themeExtension: ExtensionDefinition = {\n  manifest: {\n    id: 'theme-switcher',\n    name: '主题切换器',\n    version: '1.0.0',\n    description: '提供主题切换功能',\n    author: '开发者',\n  },\n  \n  activate: async (context: ExtensionContext) => {\n    const { logger, storage, eventBus, commandRegistry } = context;\n    \n    logger.info('主题切换扩展已激活');\n    \n    // 注册主题切换命令\n    const commandDisposable = commandRegistry.registerCommand(\n      'theme.switch',\n      async (theme?: string) => {\n        const currentTheme = await storage.global.get('current-theme', 'light');\n        const newTheme = theme || (currentTheme === 'light' ? 'dark' : 'light');\n        \n        await storage.global.set('current-theme', newTheme);\n        eventBus.emit(ThemeChangedEvent, { theme: newTheme });\n        \n        logger.info(`主题已切换到: ${newTheme}`);\n        return newTheme;\n      }\n    );\n    \n    // 订阅主题变化事件\n    const eventDisposable = eventBus.on(ThemeChangedEvent, (data) => {\n      logger.info(`主题变化事件: ${data.theme}`);\n      // 这里可以添加主题切换的UI逻辑\n    });\n    \n    // 注册主题服务\n    const themeService = {\n      getCurrentTheme: async () => {\n        return await storage.global.get('current-theme', 'light');\n      },\n      setTheme: async (theme: string) => {\n        await storage.global.set('current-theme', theme);\n        eventBus.emit(ThemeChangedEvent, { theme });\n      }\n    };\n    \n    const serviceDisposable = context.serviceRegistry.registerService(\n      'theme-service',\n      themeService\n    );\n    \n    // 添加到订阅列表\n    context.subscriptions.push(\n      commandDisposable,\n      eventDisposable,\n      serviceDisposable\n    );\n    \n    logger.info('主题切换扩展初始化完成');\n  },\n  \n  deactivate: () => {\n    console.log('主题切换扩展已停用');\n  }\n};\n```\n\n### 文件监控扩展\n\n```typescript\nimport { ExtensionDefinition, ExtensionContext } from '@cardos/extension';\n\nconst fileWatcherExtension: ExtensionDefinition = {\n  manifest: {\n    id: 'file-watcher',\n    name: '文件监控器',\n    version: '1.0.0',\n    description: '监控文件变化并触发事件',\n    author: '开发者',\n  },\n  \n  activate: (context: ExtensionContext) => {\n    const { logger, eventBus, subscriptions } = context;\n    \n    logger.info('文件监控扩展已激活');\n    \n    // 模拟文件监控\n    const intervalId = setInterval(() => {\n      eventBus.emit('file.changed', {\n        path: '/example/file.txt',\n        timestamp: new Date().toISOString()\n      });\n    }, 5000);\n    \n    // 订阅文件变化事件\n    const eventDisposable = eventBus.on('file.changed', (data) => {\n      logger.info(`文件变化: ${data.path} at ${data.timestamp}`);\n    });\n    \n    // 注册文件监控服务\n    const fileWatcherService = {\n      startWatching: (path: string) => {\n        logger.info(`开始监控文件: ${path}`);\n      },\n      stopWatching: (path: string) => {\n        logger.info(`停止监控文件: ${path}`);\n      }\n    };\n    \n    const serviceDisposable = context.serviceRegistry.registerService(\n      'file-watcher-service',\n      fileWatcherService\n    );\n    \n    // 添加到订阅列表\n    subscriptions.push(\n      eventDisposable,\n      serviceDisposable,\n      {\n        dispose: () => {\n          clearInterval(intervalId);\n          logger.info('文件监控已停止');\n        }\n      }\n    );\n  }\n};\n```\n\n## 🔄 扩展加载\n\n### 动态加载扩展\n\n```typescript\n// 从文件路径加载扩展\nconst extensionId = await extensionManager.loadExtension('./extensions/my-extension.js');\n\n// 从目录加载所有扩展\nconst extensionIds = await extensionManager.loadExtensions('./extensions/');\n```\n\n### 扩展发现\n\n```typescript\n// 获取所有已注册的扩展\nconst extensionNames = extensionManager.getExtensionNames();\n\n// 获取扩展清单\nconst manifest = extensionManager.getExtensionManifest('my-extension');\n\n// 获取扩展定义\nconst extension = extensionManager.getExtension('my-extension');\n```\n\n## 🎯 最佳实践\n\n### 1. 资源管理\n\n始终将创建的资源添加到 `context.subscriptions` 中：\n\n```typescript\nactivate: (context: ExtensionContext) => {\n  // 创建资源\n  const timer = setInterval(() => {}, 1000);\n  const eventListener = context.eventBus.on('event', () => {});\n  \n  // 添加到订阅列表\n  context.subscriptions.push(\n    { dispose: () => clearInterval(timer) },\n    eventListener\n  );\n}\n```\n\n### 2. 错误处理\n\n在扩展激活过程中妥善处理错误：\n\n```typescript\nactivate: (context: ExtensionContext) => {\n  try {\n    // 扩展逻辑\n  } catch (error) {\n    context.logger.error('扩展激活失败:', error);\n    throw error; // 重新抛出错误，让扩展管理器处理\n  }\n}\n```\n\n### 3. 类型安全\n\n使用 `TypedKey` 来创建类型安全的事件和服务：\n\n```typescript\n// 定义类型安全的事件键\nconst UserLoginEvent = new TypedKey<{ userId: string; timestamp: string }>('user.login');\n\n// 使用类型安全的事件\ncontext.eventBus.emit(UserLoginEvent, {\n  userId: '123',\n  timestamp: new Date().toISOString()\n});\n```\n\n### 4. 扩展间通信\n\n扩展可以通过服务和事件进行通信：\n\n```typescript\n// 扩展A：注册服务\ncontext.serviceRegistry.registerService('data-service', {\n  getData: () => ['item1', 'item2']\n});\n\n// 扩展B：使用服务\nconst dataService = context.serviceRegistry.getService('data-service');\nif (dataService) {\n  const data = dataService.getData();\n}\n```\n\n## 📖 API 参考\n\n### ExtensionManager\n\n扩展管理器的主要方法：\n\n- `registerExtension(definition)`: 注册扩展\n- `loadExtension(path)`: 从路径加载扩展\n- `loadExtensions(directory)`: 从目录加载扩展\n- `activateExtension(id)`: 激活扩展\n- `deactivateExtension(id)`: 停用扩展\n- `isExtensionActive(id)`: 检查扩展是否激活\n- `getExtensionNames()`: 获取所有扩展名称\n- `getExtensionManifest(id)`: 获取扩展清单\n\n### ExtensionContext\n\n扩展上下文提供的功能：\n\n- `subscriptions`: 资源订阅列表\n- `serviceRegistry`: 服务注册表\n- `commandRegistry`: 命令注册表\n- `eventBus`: 事件总线\n- `storage`: 存储API\n- `logger`: 日志API\n- `internalEvents`: 内部事件\n\n### 类型定义\n\n- `ExtensionDefinition`: 扩展定义接口\n- `ExtensionManifest`: 扩展清单接口\n- `ExtensionContext`: 扩展上下文接口\n- `IDisposable`: 可释放资源接口\n- `TypedKey<T>`: 类型安全键类\n- `RxEvent<T>`: 类型安全事件类\n\n## 🤝 贡献\n\n欢迎贡献代码和提出建议！请确保：\n\n1. 遵循现有的代码风格\n2. 添加适当的测试\n3. 更新相关文档\n4. 提交清晰的提交信息\n\n## �� 许可证\n\nMIT License ","readmeFilename":"README.zh-CN.md"}