@useconductor/conductor 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/README.md +374 -7
- package/.github/workflows/ci.yml +3 -1
- package/.github/workflows/claude-code-review.yml +1 -15
- package/.github/workflows/publish.yml +43 -0
- package/README.md +290 -121
- package/dist/cli/commands/audit.d.ts +40 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +272 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/circuit.d.ts +13 -0
- package/dist/cli/commands/circuit.d.ts.map +1 -0
- package/dist/cli/commands/circuit.js +53 -0
- package/dist/cli/commands/circuit.js.map +1 -0
- package/dist/cli/commands/config.d.ts +31 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +152 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/init.d.ts +5 -8
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +86 -123
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/marketplace.js +1 -1
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/onboard.js +33 -11
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/release.d.ts.map +1 -1
- package/dist/cli/commands/release.js +1 -1
- package/dist/cli/commands/release.js.map +1 -1
- package/dist/cli/index.js +146 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/core/audit.d.ts.map +1 -1
- package/dist/core/audit.js +5 -2
- package/dist/core/audit.js.map +1 -1
- package/dist/core/conductor.d.ts.map +1 -1
- package/dist/core/conductor.js +12 -0
- package/dist/core/conductor.js.map +1 -1
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +46 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/database.d.ts +3 -0
- package/dist/core/database.d.ts.map +1 -1
- package/dist/core/database.js +26 -0
- package/dist/core/database.js.map +1 -1
- package/dist/core/encryption.d.ts +34 -0
- package/dist/core/encryption.d.ts.map +1 -0
- package/dist/core/encryption.js +96 -0
- package/dist/core/encryption.js.map +1 -0
- package/dist/core/zero-config.d.ts.map +1 -1
- package/dist/core/zero-config.js +1 -4
- package/dist/core/zero-config.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +112 -16
- package/dist/dashboard/server.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +30 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/plugins/builtin/aws.d.ts +31 -0
- package/dist/plugins/builtin/aws.d.ts.map +1 -0
- package/dist/plugins/builtin/aws.js +149 -0
- package/dist/plugins/builtin/aws.js.map +1 -0
- package/dist/plugins/builtin/database.d.ts +1 -0
- package/dist/plugins/builtin/database.d.ts.map +1 -1
- package/dist/plugins/builtin/database.js +26 -1
- package/dist/plugins/builtin/database.js.map +1 -1
- package/dist/plugins/builtin/docker.d.ts +4 -0
- package/dist/plugins/builtin/docker.d.ts.map +1 -1
- package/dist/plugins/builtin/docker.js +20 -1
- package/dist/plugins/builtin/docker.js.map +1 -1
- package/dist/plugins/builtin/gcp.d.ts +28 -0
- package/dist/plugins/builtin/gcp.d.ts.map +1 -0
- package/dist/plugins/builtin/gcp.js +135 -0
- package/dist/plugins/builtin/gcp.js.map +1 -0
- package/dist/plugins/builtin/index.d.ts.map +1 -1
- package/dist/plugins/builtin/index.js +4 -0
- package/dist/plugins/builtin/index.js.map +1 -1
- package/dist/plugins/builtin/jira.d.ts.map +1 -1
- package/dist/plugins/builtin/jira.js +4 -2
- package/dist/plugins/builtin/jira.js.map +1 -1
- package/dist/plugins/builtin/linear.js +1 -1
- package/dist/plugins/builtin/linear.js.map +1 -1
- package/dist/plugins/builtin/shell.js +1 -1
- package/dist/plugins/builtin/shell.js.map +1 -1
- package/dist/plugins/builtin/slack.d.ts +1 -0
- package/dist/plugins/builtin/slack.d.ts.map +1 -1
- package/dist/plugins/builtin/slack.js +9 -1
- package/dist/plugins/builtin/slack.js.map +1 -1
- package/dist/plugins/builtin/spotify.js +1 -1
- package/dist/plugins/builtin/spotify.js.map +1 -1
- package/dist/plugins/builtin/vercel.d.ts.map +1 -1
- package/dist/plugins/builtin/vercel.js +3 -1
- package/dist/plugins/builtin/vercel.js.map +1 -1
- package/dist/security/sso.d.ts +37 -0
- package/dist/security/sso.d.ts.map +1 -0
- package/dist/security/sso.js +92 -0
- package/dist/security/sso.js.map +1 -0
- package/docs/deployment.md +201 -0
- package/docs/plugin-sdk.md +212 -0
- package/package.json +11 -8
- package/src/cli/commands/audit.ts +318 -0
- package/src/cli/commands/circuit.ts +63 -0
- package/src/cli/commands/config.ts +176 -0
- package/src/cli/commands/init.ts +87 -145
- package/src/cli/commands/marketplace.ts +1 -1
- package/src/cli/commands/onboard.ts +33 -11
- package/src/cli/commands/release.ts +13 -6
- package/src/cli/index.ts +165 -11
- package/src/core/audit.ts +5 -2
- package/src/core/conductor.ts +11 -0
- package/src/core/config.ts +47 -2
- package/src/core/database.ts +32 -0
- package/src/core/encryption.ts +110 -0
- package/src/core/zero-config.ts +1 -5
- package/src/dashboard/server.ts +135 -16
- package/src/mcp/server.ts +40 -2
- package/src/plugins/builtin/aws.ts +162 -0
- package/src/plugins/builtin/database.ts +19 -1
- package/src/plugins/builtin/docker.ts +17 -1
- package/src/plugins/builtin/gcp.ts +145 -0
- package/src/plugins/builtin/index.ts +4 -0
- package/src/plugins/builtin/jira.ts +23 -19
- package/src/plugins/builtin/linear.ts +1 -1
- package/src/plugins/builtin/shell.ts +1 -1
- package/src/plugins/builtin/slack.ts +6 -1
- package/src/plugins/builtin/spotify.ts +1 -1
- package/src/plugins/builtin/vercel.ts +3 -1
- package/src/security/sso.ts +124 -0
- package/tests/audit.test.ts +185 -0
- package/tests/circuit-breaker.test.ts +125 -0
- package/tests/docker.test.ts +244 -39
- package/tests/errors.test.ts +122 -0
- package/tests/github.test.ts.skip +392 -0
- package/tests/jira.test.ts +310 -0
- package/tests/linear.test.ts +366 -0
- package/tests/mcp.test.ts.skip +243 -0
- package/tests/notion.test.ts +257 -0
- package/tests/retry.test.ts +104 -0
- package/tests/shell.test.ts +262 -30
- package/tests/slack.test.ts +250 -0
- package/tests/stripe.test.ts +272 -0
- package/tests/validation.test.ts +173 -0
- package/tests/vercel.test.ts +368 -0
- package/tests/zero-config.test.ts +566 -0
- package/C.png +0 -0
- package/tests/mcp.test.ts +0 -14
package/README.md
CHANGED
|
@@ -1,16 +1,43 @@
|
|
|
1
1
|
# Conductor
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**One MCP server. Tools for every AI agent.**
|
|
4
4
|
|
|
5
|
-
[](https://github.com/useconductor/conductor/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.npmjs.com/package/@useconductor/conductor)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
[](./LICENSE)
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
Conductor is a single [Model Context Protocol](https://modelcontextprotocol.io) server that gives any AI agent — Claude, Cursor, Cline, Copilot, and more — access to your tools through one connection. Install once, configure once, use everywhere.
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @useconductor/conductor
|
|
14
|
+
conductor init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Why Conductor
|
|
20
|
+
|
|
21
|
+
Running one MCP server per tool means one process, one config, and one potential failure per integration. Conductor collapses all of that into a single server with a consistent security layer and one config block in your AI client.
|
|
22
|
+
|
|
23
|
+
- **Single process** — GitHub, Docker, shell, databases, and more through one connection
|
|
24
|
+
- **Encrypted credential storage** — secrets encrypted with a machine-derived AES-256-GCM key, never in plain config files
|
|
25
|
+
- **Circuit breakers + retry** on every tool call — failures don't cascade
|
|
26
|
+
- **SHA-256 chained audit log** — every action recorded, tamper-evident
|
|
27
|
+
- **One config block** in your AI client
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Quick start
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install -g @useconductor/conductor
|
|
35
|
+
conductor init
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Claude Desktop
|
|
12
39
|
|
|
13
|
-
Add
|
|
40
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
14
41
|
|
|
15
42
|
```json
|
|
16
43
|
{
|
|
@@ -23,157 +50,299 @@ Add this to your AI agent's MCP config:
|
|
|
23
50
|
}
|
|
24
51
|
```
|
|
25
52
|
|
|
26
|
-
|
|
53
|
+
Or skip the manual editing: `conductor mcp setup`
|
|
27
54
|
|
|
28
|
-
|
|
29
|
-
|----------|-------|
|
|
30
|
-
| **GitHub** | repos, issues, PRs, stars, trending, actions |
|
|
31
|
-
| **Docker** | containers, images, volumes, networks, stats, run |
|
|
32
|
-
| **Databases** | PostgreSQL, MySQL, MongoDB, Redis queries |
|
|
33
|
-
| **File System** | read, write, list, search, grep |
|
|
34
|
-
| **Shell** | safe command execution with approval workflow |
|
|
35
|
-
| **Git** | status, diff, log, branch operations |
|
|
36
|
-
| **Calculator** | math expressions, unit conversions, date math |
|
|
37
|
-
| **Web** | search, scrape, URL tools, translate |
|
|
38
|
-
| **System** | info, network, crypto, hash, colors |
|
|
39
|
-
| **Google** | Gmail, Calendar, Drive |
|
|
40
|
-
| **Productivity** | Notion, Todoist, Slack, notes, cron |
|
|
41
|
-
| **And more** | Vercel, n8n, weather, timezone, memory |
|
|
55
|
+
### Cursor / Windsurf / Cline / Continue
|
|
42
56
|
|
|
43
|
-
|
|
57
|
+
Same config block — drop it into `.cursor/mcp.json`, `.codeium/windsurf/mcp_config.json`, or your client's MCP config file.
|
|
58
|
+
|
|
59
|
+
### No global install
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"conductor": {
|
|
65
|
+
"command": "npx",
|
|
66
|
+
"args": ["-y", "@useconductor/conductor", "mcp", "start"]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Plugins
|
|
75
|
+
|
|
76
|
+
### Core (fully tested, production-ready)
|
|
77
|
+
|
|
78
|
+
| Plugin | What it does | Setup |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `shell` | Safe shell execution, file read/write/search | Enabled by default |
|
|
81
|
+
| `github` | Repos, issues, PRs, code search (23 tools) | Optional `GITHUB_TOKEN` for private repos |
|
|
82
|
+
| `docker` | Containers, images, volumes, networks (16 tools) | Docker daemon running |
|
|
83
|
+
| `database` | PostgreSQL, MySQL, MongoDB, Redis queries | Connection URL |
|
|
84
|
+
| `slack` | Messages, channels, search, DMs | `conductor slack setup` |
|
|
85
|
+
|
|
86
|
+
### Zero-config utilities (no setup required)
|
|
87
|
+
|
|
88
|
+
| Plugin | What it does |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `calculator` | Math expressions, unit conversions, date arithmetic |
|
|
91
|
+
| `colors` | Convert hex/RGB/HSL, generate palettes, WCAG contrast |
|
|
92
|
+
| `hash` | SHA-256/MD5/SHA-512, base64, UUID, passwords |
|
|
93
|
+
| `text-tools` | JSON format, word count, regex test, case transform |
|
|
94
|
+
| `timezone` | Current time in any city, timezone conversion |
|
|
95
|
+
| `weather` | Current conditions and forecast by city (Open-Meteo, no key required) |
|
|
96
|
+
| `network` | Ping, DNS lookup, port check, IP info |
|
|
97
|
+
| `url-tools` | Expand short links, check status, inspect headers |
|
|
98
|
+
| `system` | CPU, memory, disk usage |
|
|
99
|
+
| `notes` | Local markdown notes |
|
|
100
|
+
| `memory` | Persistent key-value memory across sessions |
|
|
101
|
+
| `cron` | Schedule recurring tasks |
|
|
102
|
+
| `fun` | Jokes, trivia, quotes |
|
|
103
|
+
|
|
104
|
+
### Additional (needs setup)
|
|
105
|
+
|
|
106
|
+
| Plugin | Setup |
|
|
107
|
+
|---|---|
|
|
108
|
+
| `gmail`, `gcal`, `gdrive` | `conductor google` |
|
|
109
|
+
| `notion` | API key |
|
|
110
|
+
| `linear` | API key |
|
|
111
|
+
| `jira` | Domain + API token |
|
|
112
|
+
| `stripe` | Secret key |
|
|
113
|
+
| `vercel` | API token |
|
|
114
|
+
| `n8n` | Base URL + API key |
|
|
115
|
+
| `spotify` | Client ID + secret |
|
|
116
|
+
| `x` | API credentials |
|
|
117
|
+
| `homekit` | Homebridge base URL |
|
|
118
|
+
| `todoist` | API token |
|
|
119
|
+
| `github-actions` | `GITHUB_TOKEN` |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## CLI reference
|
|
124
|
+
|
|
125
|
+
### Setup
|
|
44
126
|
|
|
45
127
|
```bash
|
|
46
|
-
|
|
128
|
+
conductor init # First-run wizard
|
|
129
|
+
conductor mcp setup # Auto-configure Claude Desktop / Cursor
|
|
130
|
+
conductor mcp start # Start MCP server (stdio)
|
|
131
|
+
conductor mcp status # Show MCP server status
|
|
132
|
+
conductor doctor # Diagnose common issues
|
|
133
|
+
conductor health # System health report
|
|
134
|
+
conductor health --json # Machine-readable health output
|
|
47
135
|
```
|
|
48
136
|
|
|
49
|
-
|
|
137
|
+
### Plugins
|
|
50
138
|
|
|
51
139
|
```bash
|
|
52
|
-
#
|
|
53
|
-
conductor
|
|
140
|
+
conductor plugins list # List all plugins (enabled/disabled)
|
|
141
|
+
conductor plugins enable <name> # Enable a plugin
|
|
142
|
+
conductor plugins disable <name> # Disable a plugin
|
|
143
|
+
conductor onboard # Interactive TUI plugin picker
|
|
144
|
+
conductor install <plugin> # Install from marketplace
|
|
145
|
+
conductor marketplace # Browse marketplace
|
|
146
|
+
conductor marketplace info <plugin> # Plugin details
|
|
147
|
+
conductor plugins create <name> # Scaffold a new plugin with tests
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Authentication
|
|
54
151
|
|
|
55
|
-
|
|
56
|
-
conductor
|
|
57
|
-
conductor
|
|
58
|
-
conductor
|
|
152
|
+
```bash
|
|
153
|
+
conductor google # Browser-based Google OAuth (Gmail, Calendar, Drive)
|
|
154
|
+
conductor slack setup # Configure Slack bot token
|
|
155
|
+
conductor slack start # Start the Slack bot
|
|
156
|
+
conductor telegram setup # Configure Telegram bot token
|
|
157
|
+
conductor telegram start # Start the Telegram bot
|
|
158
|
+
conductor ai setup # Configure AI provider
|
|
159
|
+
conductor ai test # Test current AI provider
|
|
160
|
+
```
|
|
59
161
|
|
|
60
|
-
|
|
61
|
-
conductor config set github.token ghp_your_token_here
|
|
162
|
+
### Configuration
|
|
62
163
|
|
|
63
|
-
|
|
64
|
-
conductor
|
|
164
|
+
```bash
|
|
165
|
+
conductor config list # Show all config keys and values
|
|
166
|
+
conductor config get <key> # Get a specific key (e.g. ai.provider)
|
|
167
|
+
conductor config set <key> <value> # Set a key (JSON or string)
|
|
168
|
+
conductor config path # Print config file path
|
|
169
|
+
conductor config export # Dump config as JSON
|
|
170
|
+
conductor config validate # Check config structure
|
|
171
|
+
conductor config reset # Reset to defaults
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Audit log
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
conductor audit list # List recent entries
|
|
178
|
+
conductor audit list --actor user1 # Filter by actor
|
|
179
|
+
conductor audit list --result failure # Filter by result
|
|
180
|
+
conductor audit verify # Verify SHA-256 chain integrity
|
|
181
|
+
conductor audit tail # Stream in real time
|
|
182
|
+
conductor audit stats # Summary statistics
|
|
183
|
+
conductor audit export -o out.json # Export to file
|
|
184
|
+
conductor audit rotate # Manually rotate log file
|
|
65
185
|
```
|
|
66
186
|
|
|
67
|
-
|
|
187
|
+
### Circuit breakers
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
conductor circuit list # Show state of all circuit breakers
|
|
191
|
+
conductor circuit reset <tool> # Reset a specific circuit to closed
|
|
192
|
+
```
|
|
68
193
|
|
|
69
|
-
|
|
194
|
+
---
|
|
70
195
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
196
|
+
## Security model
|
|
197
|
+
|
|
198
|
+
Every tool call passes through this stack:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
Request
|
|
202
|
+
→ Zod input validation
|
|
203
|
+
→ Circuit breaker (opens after 5 failures, recovers in 30s)
|
|
204
|
+
→ Retry with exponential backoff
|
|
205
|
+
→ Handler
|
|
206
|
+
→ Audit log entry (SHA-256 chained, append-only)
|
|
207
|
+
→ Metrics
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Credentials** are encrypted with AES-256-GCM using a key derived from the machine's hardware ID (IOPlatformUUID on macOS, `/etc/machine-id` on Linux). They are stored in `~/.conductor/keychain/` as encrypted files — not in `config.json`, and never in plaintext.
|
|
211
|
+
|
|
212
|
+
**Shell commands** go through a strict allowlist (~50 standard dev tools). No `eval()`, no arbitrary execution.
|
|
213
|
+
|
|
214
|
+
**Audit log** at `~/.conductor/audit/audit.log` is JSONL with a SHA-256 chain. Each entry hashes the previous entry's hash + its own content. Verify integrity anytime with `conductor audit verify`.
|
|
215
|
+
|
|
216
|
+
**Rate limiting** on all HTTP endpoints via `express-rate-limit`.
|
|
217
|
+
|
|
218
|
+
---
|
|
77
219
|
|
|
78
220
|
## Architecture
|
|
79
221
|
|
|
80
222
|
```
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
│
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
## Security
|
|
108
|
-
|
|
109
|
-
- **Encrypted keychain** — AES-256-GCM with machine-bound key derivation
|
|
110
|
-
- **Zod validation** — every plugin input is validated before execution
|
|
111
|
-
- **Safe shell** — whitelist-based command filtering, no `eval()`, no `exec()`
|
|
112
|
-
- **Plugin sandboxing** — plugins run with minimal permissions
|
|
113
|
-
- **Approval workflow** — dangerous operations require explicit user approval
|
|
114
|
-
- **Rate limiting** — all endpoints protected against abuse
|
|
115
|
-
|
|
116
|
-
## Plugin System
|
|
117
|
-
|
|
118
|
-
Build your own plugins. Drop a `.js` file in `~/.conductor/plugins/` and it's available via MCP.
|
|
223
|
+
src/
|
|
224
|
+
├── cli/ Commander CLI
|
|
225
|
+
│ └── commands/ init, mcp, plugins, audit, config, circuit, auth, ...
|
|
226
|
+
├── core/ Conductor orchestrator, config, database, audit, retry, circuit-breaker
|
|
227
|
+
├── mcp/ MCP server — stdio + HTTP/SSE transports
|
|
228
|
+
├── plugins/ Plugin manager, validation, 35 builtin plugins
|
|
229
|
+
│ └── builtin/ shell, github, docker, database, slack, calculator, ...
|
|
230
|
+
├── ai/ Multi-provider AI (Claude, OpenAI, Gemini, Ollama)
|
|
231
|
+
├── bot/ Telegram + Slack bot runtimes
|
|
232
|
+
├── dashboard/ Express web dashboard + REST API
|
|
233
|
+
└── security/ Credential storage, auth
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Config storage at `~/.conductor/`:
|
|
237
|
+
|
|
238
|
+
| Path | Contents |
|
|
239
|
+
|---|---|
|
|
240
|
+
| `config.json` | Non-secret settings |
|
|
241
|
+
| `conductor.db` | SQLite activity log and history |
|
|
242
|
+
| `audit/audit.log` | Tamper-evident audit chain (JSONL) |
|
|
243
|
+
| `keychain/` | AES-256-GCM encrypted credentials |
|
|
244
|
+
| `plugins/` | External plugin `.js` files |
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Writing plugins
|
|
119
249
|
|
|
120
250
|
```typescript
|
|
121
|
-
import { Plugin, PluginTool } from '@
|
|
251
|
+
import type { Plugin, PluginTool } from '@useconductor/sdk';
|
|
122
252
|
|
|
123
|
-
|
|
253
|
+
class MyPlugin implements Plugin {
|
|
124
254
|
name = 'my-plugin';
|
|
125
|
-
description = '
|
|
255
|
+
description = 'Does something useful';
|
|
126
256
|
version = '1.0.0';
|
|
127
257
|
|
|
128
|
-
async initialize() {}
|
|
129
|
-
isConfigured() { return true; }
|
|
258
|
+
async initialize(): Promise<void> {}
|
|
259
|
+
isConfigured(): boolean { return true; }
|
|
130
260
|
|
|
131
261
|
getTools(): PluginTool[] {
|
|
132
|
-
return [
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
262
|
+
return [
|
|
263
|
+
{
|
|
264
|
+
name: 'my_tool',
|
|
265
|
+
description: 'Explain what this does in one sentence',
|
|
266
|
+
inputSchema: {
|
|
267
|
+
type: 'object',
|
|
268
|
+
properties: {
|
|
269
|
+
query: { type: 'string', description: 'The query to process' },
|
|
270
|
+
},
|
|
271
|
+
required: ['query'],
|
|
272
|
+
},
|
|
273
|
+
handler: async ({ query }) => {
|
|
274
|
+
return { result: `Processed: ${query}` };
|
|
139
275
|
},
|
|
140
|
-
required: ['input'],
|
|
141
|
-
},
|
|
142
|
-
handler: async (input: { input: string }) => {
|
|
143
|
-
return { result: `You said: ${input.input}` };
|
|
144
276
|
},
|
|
145
|
-
|
|
277
|
+
];
|
|
146
278
|
}
|
|
147
279
|
}
|
|
280
|
+
|
|
281
|
+
export default new MyPlugin();
|
|
148
282
|
```
|
|
149
283
|
|
|
150
|
-
|
|
284
|
+
Place compiled output at `~/.conductor/plugins/my-plugin.js`. Scaffold with tests:
|
|
151
285
|
|
|
152
286
|
```bash
|
|
153
|
-
|
|
287
|
+
conductor plugins create my-plugin
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
For plugins needing credentials, add a `configSchema` with `secret: true` fields — they get encrypted and stored automatically.
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Programmatic use
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
import { ConductorClient } from '@useconductor/sdk';
|
|
298
|
+
|
|
299
|
+
// stdio (local)
|
|
300
|
+
const client = new ConductorClient({ transport: 'stdio' });
|
|
301
|
+
await client.connect();
|
|
302
|
+
const result = await client.callText('calc_math', { expression: 'sqrt(144) + 8' });
|
|
303
|
+
console.log(result); // "20"
|
|
304
|
+
await client.disconnect();
|
|
305
|
+
|
|
306
|
+
// HTTP/SSE (remote)
|
|
307
|
+
const remote = new ConductorClient({
|
|
308
|
+
transport: 'http',
|
|
309
|
+
url: 'http://your-conductor-host:3000',
|
|
310
|
+
});
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Supported clients
|
|
316
|
+
|
|
317
|
+
- [Claude Desktop](https://claude.ai/download)
|
|
318
|
+
- [Cursor](https://cursor.com)
|
|
319
|
+
- [Cline (VS Code)](https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev)
|
|
320
|
+
- [Windsurf](https://codeium.com/windsurf)
|
|
321
|
+
- [Continue.dev](https://continue.dev)
|
|
322
|
+
- [Zed](https://zed.dev)
|
|
323
|
+
- [Aider](https://aider.chat)
|
|
324
|
+
- [Roo Code](https://roocode.com)
|
|
325
|
+
- VS Code (GitHub Copilot)
|
|
326
|
+
- Any client supporting MCP stdio transport
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Contributing
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
git clone https://github.com/useconductor/conductor
|
|
154
334
|
cd conductor
|
|
155
335
|
npm install
|
|
156
|
-
npm run
|
|
157
|
-
npm
|
|
158
|
-
npm
|
|
159
|
-
npm run
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
| Command | Description |
|
|
167
|
-
|---------|-------------|
|
|
168
|
-
| `conductor mcp start` | Start MCP server (stdio) |
|
|
169
|
-
| `conductor mcp setup` | Configure for Claude Desktop |
|
|
170
|
-
| `conductor mcp status` | Show MCP status |
|
|
171
|
-
| `conductor plugins list` | List all plugins |
|
|
172
|
-
| `conductor plugins enable <name>` | Enable a plugin |
|
|
173
|
-
| `conductor plugins disable <name>` | Disable a plugin |
|
|
174
|
-
| `conductor ai setup` | Configure AI providers |
|
|
175
|
-
| `conductor ai test` | Test AI provider |
|
|
336
|
+
npm run dev # Watch mode
|
|
337
|
+
npm test # Run tests (Vitest)
|
|
338
|
+
npm run typecheck # Type check
|
|
339
|
+
npm run lint # ESLint
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Requirements: Node >= 20.12, npm >= 9.
|
|
343
|
+
|
|
344
|
+
---
|
|
176
345
|
|
|
177
346
|
## License
|
|
178
347
|
|
|
179
|
-
Apache
|
|
348
|
+
Apache 2.0 — see [LICENSE](./LICENSE)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* conductor audit — query and verify the tamper-evident audit log.
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* conductor audit list — filter and display log entries
|
|
6
|
+
* conductor audit verify — verify SHA-256 chain integrity
|
|
7
|
+
* conductor audit tail — stream the log in real time
|
|
8
|
+
* conductor audit export — export entries to JSON or NDJSON
|
|
9
|
+
* conductor audit stats — show summary statistics
|
|
10
|
+
* conductor audit rotate — manually rotate the current log file
|
|
11
|
+
*/
|
|
12
|
+
import type { Conductor } from '../../core/conductor.js';
|
|
13
|
+
export declare function auditList(conductor: Conductor, opts: {
|
|
14
|
+
actor?: string;
|
|
15
|
+
action?: string;
|
|
16
|
+
tool?: string;
|
|
17
|
+
result?: string;
|
|
18
|
+
since?: string;
|
|
19
|
+
until?: string;
|
|
20
|
+
limit?: string;
|
|
21
|
+
json?: boolean;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export declare function auditVerify(conductor: Conductor, opts: {
|
|
24
|
+
json?: boolean;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
export declare function auditTail(conductor: Conductor, opts: {
|
|
27
|
+
json?: boolean;
|
|
28
|
+
lines?: string;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
export declare function auditExport(conductor: Conductor, opts: {
|
|
31
|
+
output?: string;
|
|
32
|
+
format?: string;
|
|
33
|
+
since?: string;
|
|
34
|
+
until?: string;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
export declare function auditStats(conductor: Conductor, opts: {
|
|
37
|
+
json?: boolean;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
export declare function auditRotate(conductor: Conductor): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AA8CzD,wBAAsB,SAAS,CAC7B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAiCf;AAID,wBAAsB,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB/F;AAID,wBAAsB,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwE7G;AAID,wBAAsB,WAAW,CAC/B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAsBf;AAID,wBAAsB,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9F;AAID,wBAAsB,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAerE"}
|