# Plugin API Development Guide

## For Plugin Developers

### Installation

```bash
npm install @super-productivity/plugin-api
```

### TypeScript Setup

Create a `tsconfig.json` in your plugin project:

```json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "lib": ["ES2020", "DOM"],
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}
```

### Basic Plugin Structure

```
my-plugin/
├── src/
│   └── plugin.ts
├── dist/
│   └── plugin.js
├── manifest.json
├── index.html (optional)
├── icon.svg (optional)
├── package.json
└── tsconfig.json
```

### Development Workflow

1. **Write TypeScript code** with full type safety
2. **Compile to JavaScript** for Super Productivity
3. **Test in Super Productivity** plugin system

### Example Build Script

Add to your `package.json`:

```json
{
  "scripts": {
    "build": "tsc",
    "build:watch": "tsc --watch",
    "dev": "tsc --watch"
  },
  "devDependencies": {
    "@super-productivity/plugin-api": "^1.0.0",
    "typescript": "^5.0.0"
  }
}
```

### Plugin Template

See `example/my-plugin.ts` for a complete TypeScript plugin example.

## For Core Developers

### Updating the API

When adding new features to the plugin system:

1. **Update `src/types.ts`** with new interfaces/types
2. **Update `src/index.ts`** to export new types
3. **Update `README.md`** with usage examples
4. **Version bump** the package
5. **Rebuild and test**
6. **Publish to npm**

### Syncing with Main Project

The main Super Productivity project should eventually import types from this package instead of maintaining local definitions:

```typescript
// Before:
import { PluginManifest } from './plugin-api.model';

// After:
import type { PluginManifest } from '@super-productivity/plugin-api';
```

### Testing Changes

1. Build the package: `npm run build`
2. Test locally: `npm link` in this directory
3. In test project: `npm link @super-productivity/plugin-api`
4. Verify types work correctly

### Release Process

1. Update version: `npm version patch|minor|major`
2. Build: `npm run build`
3. Test: `npm pack --dry-run`
4. Publish: `npm publish --access public`

## Available Types Reference

### Core Interfaces

- `PluginAPI` - Main API interface
- `PluginManifest` - Plugin configuration
- `PluginBaseCfg` - Runtime configuration

### Hook Types

- `PluginHooks` - Available hook events
- `PluginHookHandler` - Hook function signature

### Data Types

- `TaskData` - Task information
- `ProjectData` - Project information
- `TagData` - Tag information
- `PluginCreateTaskData` - Task creation data

### UI Types

- `DialogCfg` - Dialog configuration
- `DialogButtonCfg` - Dialog button configuration
- `SnackCfg` - Notification configuration
- `NotifyCfg` - System notification configuration
- `PluginMenuEntryCfg` - Menu entry configuration
- `PluginShortcutCfg` - Keyboard shortcut configuration
- `PluginHeaderBtnCfg` - Header button configuration

## Best Practices

1. **Always use TypeScript** for plugin development
2. **Import types only** to avoid runtime dependencies
3. **Follow semantic versioning** for plugin releases
4. **Test thoroughly** before publishing
5. **Document your plugins** for other developers
