@bettercallclaude/marketplace
v0.1.0
Published
Core plugin engine for Better Call Claude marketplace - runtime, loader, registry
Maintainers
Readme
@bettercallclaude/marketplace
Core plugin engine for Better Call Claude marketplace - runtime, loader, and registry.
Features
- PluginRegistry: Manages installed plugins in
~/.bcc/plugins.json - PluginLoader: Loads and validates plugins from
~/.bcc/plugins/ - PluginValidator: Validates plugin manifests and checks compatibility
- HookRouter: Routes pre/post-tool-use hooks to plugins in priority order
- ConfigManager: Manages plugin configurations in
~/.bcc/config/
Installation
npm install @bettercallclaude/marketplaceUsage
Load All Enabled Plugins
import { PluginLoader } from '@bettercallclaude/marketplace'
const loader = new PluginLoader()
const plugins = await loader.loadAll()
console.log(`Loaded ${plugins.length} plugins`)Manage Plugin Registry
import { PluginRegistry } from '@bettercallclaude/marketplace'
const registry = new PluginRegistry()
// Add a plugin
await registry.addPlugin({
id: 'plugin-anonymize',
name: '@bettercallclaude/plugin-anonymize',
version: '1.0.0',
enabled: true,
installedAt: new Date().toISOString(),
capabilities: ['hooks', 'patterns'],
path: '/path/to/plugin',
})
// Get all enabled plugins
const enabled = await registry.getEnabledPlugins()
// Enable/disable a plugin
await registry.disablePlugin('plugin-anonymize')
await registry.enablePlugin('plugin-anonymize')Validate Plugin Manifest
import { PluginValidator } from '@bettercallclaude/marketplace'
const validator = new PluginValidator()
// Validate from file
const manifest = await validator.validateManifestFile('/path/to/plugin.yaml')
// Check compatibility
const compat = validator.checkCompatibility(manifest)
if (!compat.compatible) {
console.error(compat.reason)
}
// Validate structure
const structure = await validator.validatePluginStructure('/path/to/plugin', manifest)
if (!structure.valid) {
console.error('Structure errors:', structure.errors)
}Route Hooks
import { HookRouter } from '@bettercallclaude/marketplace'
const router = new HookRouter()
await router.initialize()
// Execute pre-tool-use hooks
const result = await router.executePreToolUse({
toolName: 'Read',
parameters: { file_path: '/path/to/file.txt' },
})
// Check if blocked
if (result.blocked) {
console.error('Hook blocked:', result.blockReason)
}Manage Plugin Config
import { ConfigManager } from '@bettercallclaude/marketplace'
const config = new ConfigManager()
// Get plugin config
const pluginConfig = await config.getConfig('plugin-anonymize')
// Set config
await config.setConfig('plugin-anonymize', {
enabled: true,
detectors: ['email', 'phone'],
})
// Update config
await config.updateConfig('plugin-anonymize', {
detectors: ['email', 'phone', 'ssn'],
})Directory Structure
~/.bcc/
├── plugins/ # Installed plugins
│ ├── plugin-anonymize/
│ │ ├── plugin.yaml # Plugin manifest
│ │ ├── dist/ # Compiled plugin code
│ │ └── ...
│ └── plugin-security/
├── plugins.json # Plugin registry
├── config/ # Plugin configurations
│ ├── plugin-anonymize.yaml
│ └── plugin-security.yaml
└── data/ # Plugin data
└── plugin-anonymize/License
GPL-3.0
