@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/.github/README.md
CHANGED
|
@@ -1,13 +1,380 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Conductor
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**One MCP server. 100+ tools. Every AI agent.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://github.com/useconductor/conductor/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.npmjs.com/package/@useconductor/conductor)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
[](./LICENSE)
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
Conductor is a single [Model Context Protocol](https://modelcontextprotocol.io) server that gives any AI agent — Claude, Cursor, Cline, Copilot, and more — instant access to your entire toolkit through one connection. Install once, configure once, use everywhere.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @useconductor/conductor
|
|
14
|
+
conductor init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Why Conductor
|
|
20
|
+
|
|
21
|
+
Most MCP setups mean one server per tool — one for GitHub, one for Slack, one for your database. That's a dozen processes, a dozen configs, and a dozen things to break.
|
|
22
|
+
|
|
23
|
+
Conductor collapses all of that into a single server with a plugin system, security built in from the start, and a CLI that actually works.
|
|
24
|
+
|
|
25
|
+
- **100+ tools** across 35+ plugins, all in one process
|
|
26
|
+
- **Zero-config plugins** work instantly — no API keys, no setup
|
|
27
|
+
- **Secrets in the OS keychain** — never stored in config files
|
|
28
|
+
- **Circuit breakers + retry** on every tool call — failures don't cascade
|
|
29
|
+
- **SHA-256 chained audit log** — every action recorded, tamper-evident
|
|
30
|
+
- **One config block** in your AI client — that's the whole integration
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Quick start
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Install
|
|
38
|
+
npm install -g @useconductor/conductor
|
|
39
|
+
|
|
40
|
+
# First-run wizard — AI provider, plugins, client config
|
|
41
|
+
conductor init
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Claude Desktop
|
|
45
|
+
|
|
46
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"mcpServers": {
|
|
51
|
+
"conductor": {
|
|
52
|
+
"command": "conductor",
|
|
53
|
+
"args": ["mcp", "start"]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Or skip the manual editing: `conductor mcp setup`
|
|
60
|
+
|
|
61
|
+
### Cursor / Windsurf / Cline / Continue
|
|
62
|
+
|
|
63
|
+
Same config block — drop it in `.cursor/mcp.json`, `.codeium/windsurf/mcp_config.json`, or your client's MCP config file.
|
|
64
|
+
|
|
65
|
+
### No global install
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"mcpServers": {
|
|
70
|
+
"conductor": {
|
|
71
|
+
"command": "npx",
|
|
72
|
+
"args": ["-y", "@useconductor/conductor", "mcp", "start"]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Plugins
|
|
81
|
+
|
|
82
|
+
### Needs setup
|
|
83
|
+
|
|
84
|
+
| Plugin | What it does | Setup |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| `github` | Repos, issues, PRs, code search (20 tools) | `GITHUB_TOKEN` env var |
|
|
87
|
+
| `gmail` | Read, compose, send, search, label email | `conductor google` |
|
|
88
|
+
| `gcal` | Events, availability, scheduling | `conductor google` |
|
|
89
|
+
| `gdrive` | Search, read, upload files | `conductor google` |
|
|
90
|
+
| `notion` | Pages, databases, blocks, search | API key |
|
|
91
|
+
| `slack` | Messages, channels, search | `conductor slack setup` |
|
|
92
|
+
| `linear` | Issues, projects, cycles | API key |
|
|
93
|
+
| `jira` | Issues, projects, sprints | Domain + API token |
|
|
94
|
+
| `stripe` | Payments, customers, invoices | Secret key |
|
|
95
|
+
| `docker` | Containers, images, volumes, networks | Local Docker socket |
|
|
96
|
+
| `database` | Postgres, MySQL queries | Connection URL |
|
|
97
|
+
| `github-actions` | Trigger and monitor CI workflows | `GITHUB_TOKEN` |
|
|
98
|
+
| `vercel` | Deployments, logs, projects | API token |
|
|
99
|
+
| `n8n` | Trigger workflows, list executions | Base URL + API key |
|
|
100
|
+
| `spotify` | Playback, search, playlists | Client ID + secret |
|
|
101
|
+
| `x` | Post, search, timeline | API credentials |
|
|
102
|
+
| `homekit` | Lights, locks, thermostats via Homebridge | Base URL |
|
|
103
|
+
| `lumen` | Smart lighting control | Local setup |
|
|
104
|
+
| `todoist` | Tasks, projects, labels | API token |
|
|
105
|
+
| `shell` | Run allowlisted shell commands | Enabled by default |
|
|
106
|
+
|
|
107
|
+
### Zero-config (works instantly)
|
|
108
|
+
|
|
109
|
+
| Plugin | What it does |
|
|
110
|
+
|---|---|
|
|
111
|
+
| `calculator` | Math expressions, unit conversions, date arithmetic |
|
|
112
|
+
| `colors` | Convert hex/RGB/HSL, generate palettes, WCAG contrast |
|
|
113
|
+
| `crypto` | Encrypt, decrypt, sign, verify |
|
|
114
|
+
| `hash` | SHA-256/MD5/SHA-512, base64, UUID, passwords |
|
|
115
|
+
| `text-tools` | JSON format, word count, regex test, case transform |
|
|
116
|
+
| `timezone` | Current time in any city, timezone conversion |
|
|
117
|
+
| `url-tools` | Expand short links, check status, inspect headers |
|
|
118
|
+
| `network` | Ping, DNS lookup, port check, IP info |
|
|
119
|
+
| `system` | CPU, memory, disk usage |
|
|
120
|
+
| `weather` | Current conditions and forecast by city |
|
|
121
|
+
| `translate` | Translate text between languages |
|
|
122
|
+
| `fun` | Jokes, trivia, quotes |
|
|
123
|
+
| `notes` | Local markdown notes |
|
|
124
|
+
| `memory` | Persistent key-value memory across sessions |
|
|
125
|
+
| `cron` | Schedule recurring tasks |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## CLI reference
|
|
130
|
+
|
|
131
|
+
### Setup
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
conductor init # First-run wizard
|
|
135
|
+
conductor mcp setup # Auto-configure Claude Desktop / Cursor
|
|
136
|
+
conductor mcp start # Start MCP server (stdio)
|
|
137
|
+
conductor mcp status # Show MCP server status
|
|
138
|
+
conductor doctor # Diagnose common issues
|
|
139
|
+
conductor health # System health report
|
|
140
|
+
conductor health --json # Machine-readable health output
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Plugins
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
conductor plugins list # List all plugins (enabled/disabled)
|
|
147
|
+
conductor plugins enable <name> # Enable a plugin
|
|
148
|
+
conductor plugins disable <name> # Disable a plugin
|
|
149
|
+
conductor onboard # Interactive TUI plugin picker
|
|
150
|
+
conductor install <plugin> # Install from marketplace
|
|
151
|
+
conductor marketplace # Browse marketplace
|
|
152
|
+
conductor marketplace info <plugin> # Plugin details
|
|
153
|
+
conductor plugin create <name> # Scaffold a new plugin with tests
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Authentication
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
conductor google # Browser-based Google OAuth (Gmail, Calendar, Drive)
|
|
160
|
+
conductor slack setup # Configure Slack bot + app tokens
|
|
161
|
+
conductor slack start # Start the Slack bot
|
|
162
|
+
conductor telegram setup # Configure Telegram bot token
|
|
163
|
+
conductor telegram start # Start the Telegram bot
|
|
164
|
+
conductor ai setup # Configure AI provider
|
|
165
|
+
conductor ai test # Test current AI provider
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Configuration
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
conductor config list # Show all config keys and values
|
|
172
|
+
conductor config get <key> # Get a specific key (e.g. ai.provider)
|
|
173
|
+
conductor config set <key> <value> # Set a key (JSON or string)
|
|
174
|
+
conductor config path # Print config file path
|
|
175
|
+
conductor config export # Dump config as JSON
|
|
176
|
+
conductor config validate # Check config structure
|
|
177
|
+
conductor config reset # Reset to defaults
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Audit log
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
conductor audit list # List recent entries
|
|
184
|
+
conductor audit list --actor user1 # Filter by actor
|
|
185
|
+
conductor audit list --result failure # Filter by result
|
|
186
|
+
conductor audit verify # Verify SHA-256 chain integrity
|
|
187
|
+
conductor audit tail # Stream in real time
|
|
188
|
+
conductor audit stats # Summary statistics
|
|
189
|
+
conductor audit export -o out.json # Export to file
|
|
190
|
+
conductor audit rotate # Manually rotate log file
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Circuit breakers
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
conductor circuit list # Show state of all circuit breakers
|
|
197
|
+
conductor circuit reset <tool> # Reset a specific circuit to closed
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Autonomous + other
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
conductor proactive start # Start autonomous reasoning loop
|
|
204
|
+
conductor dashboard # Open web dashboard (--port <n>)
|
|
205
|
+
conductor release # Bump version and publish to npm
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Security model
|
|
211
|
+
|
|
212
|
+
Every tool call passes through a stack before reaching the handler:
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
Request
|
|
216
|
+
→ Zod input validation (schema-level type safety)
|
|
217
|
+
→ RBAC permission check (role-based access control)
|
|
218
|
+
→ Circuit breaker (opens after 5 failures, recovers in 30s)
|
|
219
|
+
→ Retry with exponential backoff
|
|
220
|
+
→ Handler
|
|
221
|
+
→ Audit log entry (SHA-256 chained, append-only)
|
|
222
|
+
→ Metrics
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Secrets** are stored in the OS keychain (macOS Keychain, Linux Secret Service, Windows Credential Manager) via `@useconductor/conductor`'s keychain module — never in `config.json`.
|
|
226
|
+
|
|
227
|
+
**Shell commands** go through a strict allowlist. No `eval()`, no `exec()` with arbitrary input, no wildcards. The list covers standard dev tools: git, docker, node, npm, curl, psql, and ~50 others.
|
|
228
|
+
|
|
229
|
+
**Destructive tools** set `requiresApproval: true` — the AI agent must explicitly confirm before execution.
|
|
230
|
+
|
|
231
|
+
**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`.
|
|
232
|
+
|
|
233
|
+
**Rate limiting** on all HTTP endpoints via `express-rate-limit`.
|
|
234
|
+
|
|
235
|
+
---
|
|
10
236
|
|
|
11
237
|
## Architecture
|
|
12
238
|
|
|
13
|
-
|
|
239
|
+
```
|
|
240
|
+
src/
|
|
241
|
+
├── cli/ Commander CLI — commands in src/cli/commands/
|
|
242
|
+
│ └── commands/ init, mcp, plugins, audit, config, circuit, auth, ...
|
|
243
|
+
├── core/ Conductor orchestrator, config, database, audit, retry, circuit-breaker
|
|
244
|
+
├── mcp/ MCP server — stdio + HTTP/SSE transports
|
|
245
|
+
├── plugins/ Plugin manager, validation, 35 builtin plugins
|
|
246
|
+
│ └── builtin/ calculator, github, slack, gmail, docker, shell, ...
|
|
247
|
+
├── ai/ Multi-provider AI (Claude, OpenAI, Gemini, Ollama, OpenRouter)
|
|
248
|
+
├── bot/ Telegram + Slack bot runtimes
|
|
249
|
+
├── dashboard/ Express web dashboard + REST API
|
|
250
|
+
└── security/ Keychain, RBAC, auth
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Config storage at `~/.conductor/`:
|
|
254
|
+
|
|
255
|
+
| Path | Contents |
|
|
256
|
+
|---|---|
|
|
257
|
+
| `config.json` | Non-secret settings |
|
|
258
|
+
| `conductor.db` | SQLite history + activity log |
|
|
259
|
+
| `audit/audit.log` | Tamper-evident audit chain (JSONL) |
|
|
260
|
+
| `plugins/` | External plugin `.js` files |
|
|
261
|
+
| `.key` | Machine-bound AES-256-GCM encryption key |
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Writing plugins
|
|
266
|
+
|
|
267
|
+
Install the SDK for types:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
npm install @useconductor/sdk
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
import type { Plugin, PluginTool } from '@useconductor/sdk';
|
|
275
|
+
|
|
276
|
+
class MyPlugin implements Plugin {
|
|
277
|
+
name = 'my-plugin';
|
|
278
|
+
description = 'Does something useful';
|
|
279
|
+
version = '1.0.0';
|
|
280
|
+
|
|
281
|
+
async initialize(): Promise<void> {}
|
|
282
|
+
isConfigured(): boolean { return true; }
|
|
283
|
+
|
|
284
|
+
getTools(): PluginTool[] {
|
|
285
|
+
return [
|
|
286
|
+
{
|
|
287
|
+
name: 'my_tool',
|
|
288
|
+
description: 'Explain what this does in one sentence',
|
|
289
|
+
inputSchema: {
|
|
290
|
+
type: 'object',
|
|
291
|
+
properties: {
|
|
292
|
+
query: { type: 'string', description: 'The query to process' },
|
|
293
|
+
},
|
|
294
|
+
required: ['query'],
|
|
295
|
+
},
|
|
296
|
+
handler: async ({ query }) => {
|
|
297
|
+
return { result: `Processed: ${query}` };
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
];
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export default new MyPlugin();
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Compile to `~/.conductor/plugins/my-plugin.js` and it's immediately available.
|
|
308
|
+
|
|
309
|
+
Scaffold with tests:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
conductor plugin create my-plugin
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
For plugins needing secrets, add a `configSchema` with `secret: true` fields — they get stored in the OS keychain automatically.
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Programmatic use
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
import { ConductorClient } from '@useconductor/sdk';
|
|
323
|
+
|
|
324
|
+
// stdio (local)
|
|
325
|
+
const client = new ConductorClient({ transport: 'stdio' });
|
|
326
|
+
await client.connect();
|
|
327
|
+
|
|
328
|
+
const tools = await client.listTools();
|
|
329
|
+
const result = await client.callText('calc_math', { expression: 'sqrt(144) + 8' });
|
|
330
|
+
console.log(result); // "20"
|
|
331
|
+
|
|
332
|
+
await client.disconnect();
|
|
333
|
+
|
|
334
|
+
// HTTP/SSE (remote)
|
|
335
|
+
const remote = new ConductorClient({
|
|
336
|
+
transport: 'http',
|
|
337
|
+
url: 'http://your-conductor-host:3000',
|
|
338
|
+
});
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Supported clients
|
|
344
|
+
|
|
345
|
+
Works with any MCP-compatible client:
|
|
346
|
+
|
|
347
|
+
- [Claude Desktop](https://claude.ai/download)
|
|
348
|
+
- [Cursor](https://cursor.com)
|
|
349
|
+
- [Cline (VS Code)](https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev)
|
|
350
|
+
- [Windsurf](https://codeium.com/windsurf)
|
|
351
|
+
- [Continue.dev](https://continue.dev)
|
|
352
|
+
- [Zed](https://zed.dev)
|
|
353
|
+
- [Aider](https://aider.chat)
|
|
354
|
+
- [Roo Code](https://roocode.com)
|
|
355
|
+
- VS Code (GitHub Copilot)
|
|
356
|
+
- Any client supporting MCP stdio transport
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Contributing
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
git clone https://github.com/useconductor/conductor
|
|
364
|
+
cd conductor
|
|
365
|
+
npm install
|
|
366
|
+
npm run dev # Watch mode
|
|
367
|
+
npm test # Run tests (Vitest)
|
|
368
|
+
npm run typecheck # Type check
|
|
369
|
+
npm run lint # ESLint (requires Node >= 20.12)
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Requirements: Node >= 20.12, npm >= 9.
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
## License
|
|
377
|
+
|
|
378
|
+
Apache 2.0 — see [LICENSE](./LICENSE)
|
|
379
|
+
|
|
380
|
+
Built by [Alexander Wondwossen](https://github.com/thealxlabs) and contributors.
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -12,7 +12,9 @@ jobs:
|
|
|
12
12
|
|
|
13
13
|
strategy:
|
|
14
14
|
matrix:
|
|
15
|
-
|
|
15
|
+
# Node 18 reached EOL April 2025. ESLint 10 and Vitest/rolldown require
|
|
16
|
+
# util.styleText which was added in Node 20.12. Min supported: Node 20.
|
|
17
|
+
node-version: [20, 22]
|
|
16
18
|
|
|
17
19
|
steps:
|
|
18
20
|
- uses: actions/checkout@v4
|
|
@@ -3,22 +3,11 @@ name: Claude Code Review
|
|
|
3
3
|
on:
|
|
4
4
|
pull_request:
|
|
5
5
|
types: [opened, synchronize, ready_for_review, reopened]
|
|
6
|
-
# Optional: Only run on specific file changes
|
|
7
|
-
# paths:
|
|
8
|
-
# - "src/**/*.ts"
|
|
9
|
-
# - "src/**/*.tsx"
|
|
10
|
-
# - "src/**/*.js"
|
|
11
|
-
# - "src/**/*.jsx"
|
|
12
6
|
|
|
13
7
|
jobs:
|
|
14
8
|
claude-review:
|
|
15
|
-
# Optional: Filter by PR author
|
|
16
|
-
# if: |
|
|
17
|
-
# github.event.pull_request.user.login == 'external-contributor' ||
|
|
18
|
-
# github.event.pull_request.user.login == 'new-developer' ||
|
|
19
|
-
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
|
|
20
|
-
|
|
21
9
|
runs-on: ubuntu-latest
|
|
10
|
+
continue-on-error: true
|
|
22
11
|
permissions:
|
|
23
12
|
contents: read
|
|
24
13
|
pull-requests: read
|
|
@@ -39,6 +28,3 @@ jobs:
|
|
|
39
28
|
plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
|
|
40
29
|
plugins: 'code-review@claude-code-plugins'
|
|
41
30
|
prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
|
|
42
|
-
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
|
|
43
|
-
# or https://code.claude.com/docs/en/cli-reference for available options
|
|
44
|
-
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Publish to npm
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
release:
|
|
8
|
+
types: [published]
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
publish:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
id-token: write # for npm provenance
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Setup Node.js
|
|
21
|
+
uses: actions/setup-node@v4
|
|
22
|
+
with:
|
|
23
|
+
node-version: '20'
|
|
24
|
+
cache: 'npm'
|
|
25
|
+
registry-url: 'https://registry.npmjs.org'
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: npm ci
|
|
29
|
+
|
|
30
|
+
- name: Type check
|
|
31
|
+
run: npm run typecheck
|
|
32
|
+
|
|
33
|
+
- name: Run tests
|
|
34
|
+
run: npm test
|
|
35
|
+
|
|
36
|
+
- name: Build
|
|
37
|
+
run: npm run build
|
|
38
|
+
|
|
39
|
+
- name: Configure npm auth
|
|
40
|
+
run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc
|
|
41
|
+
|
|
42
|
+
- name: Publish to npm
|
|
43
|
+
run: npm publish --access public --ignore-scripts
|