@useconductor/conductor 1.0.0
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/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +23 -0
- package/.eslintrc.json +23 -0
- package/.gitattributes +6 -0
- package/.github/FUNDING.yml +15 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +91 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +63 -0
- package/.github/ISSUE_TEMPLATE/plugin_request.yml +71 -0
- package/.github/README.md +13 -0
- package/.github/workflows/README.md +22 -0
- package/.github/workflows/auto-release.yml +112 -0
- package/.github/workflows/ci.yml +49 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +36 -0
- package/.github/workflows/sync-install.yml +47 -0
- package/.mcp.json +9 -0
- package/.prettierrc.json +7 -0
- package/C.png +0 -0
- package/CHANGELOG.md +74 -0
- package/CLAUDE.md +118 -0
- package/CONTRIBUTING.md +231 -0
- package/LICENSE +201 -0
- package/README.md +179 -0
- package/SECURITY.md +47 -0
- package/commands/conductor-setup.md +11 -0
- package/commands/conductor-status.md +7 -0
- package/dist/ai/base.d.ts +44 -0
- package/dist/ai/base.d.ts.map +1 -0
- package/dist/ai/base.js +47 -0
- package/dist/ai/base.js.map +1 -0
- package/dist/ai/claude.d.ts +11 -0
- package/dist/ai/claude.d.ts.map +1 -0
- package/dist/ai/claude.js +149 -0
- package/dist/ai/claude.js.map +1 -0
- package/dist/ai/gemini.d.ts +15 -0
- package/dist/ai/gemini.d.ts.map +1 -0
- package/dist/ai/gemini.js +156 -0
- package/dist/ai/gemini.js.map +1 -0
- package/dist/ai/maestro.d.ts +22 -0
- package/dist/ai/maestro.d.ts.map +1 -0
- package/dist/ai/maestro.js +142 -0
- package/dist/ai/maestro.js.map +1 -0
- package/dist/ai/manager.d.ts +47 -0
- package/dist/ai/manager.d.ts.map +1 -0
- package/dist/ai/manager.js +450 -0
- package/dist/ai/manager.js.map +1 -0
- package/dist/ai/ollama.d.ts +16 -0
- package/dist/ai/ollama.d.ts.map +1 -0
- package/dist/ai/ollama.js +151 -0
- package/dist/ai/ollama.js.map +1 -0
- package/dist/ai/openai.d.ts +11 -0
- package/dist/ai/openai.d.ts.map +1 -0
- package/dist/ai/openai.js +132 -0
- package/dist/ai/openai.js.map +1 -0
- package/dist/ai/openrouter.d.ts +11 -0
- package/dist/ai/openrouter.d.ts.map +1 -0
- package/dist/ai/openrouter.js +139 -0
- package/dist/ai/openrouter.js.map +1 -0
- package/dist/bot/slack.d.ts +17 -0
- package/dist/bot/slack.d.ts.map +1 -0
- package/dist/bot/slack.js +144 -0
- package/dist/bot/slack.js.map +1 -0
- package/dist/bot/telegram.d.ts +19 -0
- package/dist/bot/telegram.d.ts.map +1 -0
- package/dist/bot/telegram.js +157 -0
- package/dist/bot/telegram.js.map +1 -0
- package/dist/cli/commands/ai.d.ts +4 -0
- package/dist/cli/commands/ai.d.ts.map +1 -0
- package/dist/cli/commands/ai.js +161 -0
- package/dist/cli/commands/ai.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +18 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +213 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +15 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +281 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +16 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +750 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/lifecycle.d.ts +4 -0
- package/dist/cli/commands/lifecycle.d.ts.map +1 -0
- package/dist/cli/commands/lifecycle.js +84 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/marketplace.d.ts +13 -0
- package/dist/cli/commands/marketplace.d.ts.map +1 -0
- package/dist/cli/commands/marketplace.js +197 -0
- package/dist/cli/commands/marketplace.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +83 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +10 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +207 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/plugin-create.d.ts +13 -0
- package/dist/cli/commands/plugin-create.d.ts.map +1 -0
- package/dist/cli/commands/plugin-create.js +122 -0
- package/dist/cli/commands/plugin-create.js.map +1 -0
- package/dist/cli/commands/plugins.d.ts +5 -0
- package/dist/cli/commands/plugins.d.ts.map +1 -0
- package/dist/cli/commands/plugins.js +30 -0
- package/dist/cli/commands/plugins.js.map +1 -0
- package/dist/cli/commands/release.d.ts +13 -0
- package/dist/cli/commands/release.d.ts.map +1 -0
- package/dist/cli/commands/release.js +243 -0
- package/dist/cli/commands/release.js.map +1 -0
- package/dist/cli/commands/telegram.d.ts +3 -0
- package/dist/cli/commands/telegram.d.ts.map +1 -0
- package/dist/cli/commands/telegram.js +20 -0
- package/dist/cli/commands/telegram.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +402 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/oauth.d.ts +8 -0
- package/dist/config/oauth.d.ts.map +1 -0
- package/dist/config/oauth.js +13 -0
- package/dist/config/oauth.js.map +1 -0
- package/dist/core/audit.d.ts +91 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +233 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/circuit-breaker.d.ts +56 -0
- package/dist/core/circuit-breaker.d.ts.map +1 -0
- package/dist/core/circuit-breaker.js +107 -0
- package/dist/core/circuit-breaker.js.map +1 -0
- package/dist/core/conductor.d.ts +44 -0
- package/dist/core/conductor.d.ts.map +1 -0
- package/dist/core/conductor.js +200 -0
- package/dist/core/conductor.js.map +1 -0
- package/dist/core/config.d.ts +66 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +86 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/database.d.ts +59 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +342 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/errors.d.ts +231 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +254 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/health.d.ts +72 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +116 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/interfaces.d.ts +62 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +8 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/core/logger.d.ts +15 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +30 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/rbac.d.ts +132 -0
- package/dist/core/rbac.d.ts.map +1 -0
- package/dist/core/rbac.js +230 -0
- package/dist/core/rbac.js.map +1 -0
- package/dist/core/retry.d.ts +22 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +41 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/webhooks.d.ts +92 -0
- package/dist/core/webhooks.d.ts.map +1 -0
- package/dist/core/webhooks.js +176 -0
- package/dist/core/webhooks.js.map +1 -0
- package/dist/core/zero-config.d.ts +22 -0
- package/dist/core/zero-config.d.ts.map +1 -0
- package/dist/core/zero-config.js +59 -0
- package/dist/core/zero-config.js.map +1 -0
- package/dist/dashboard/cli.d.ts +6 -0
- package/dist/dashboard/cli.d.ts.map +1 -0
- package/dist/dashboard/cli.js +42 -0
- package/dist/dashboard/cli.js.map +1 -0
- package/dist/dashboard/index.html +3426 -0
- package/dist/dashboard/server.d.ts +7 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +1427 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/mcp/server.d.ts +27 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +380 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/misc.d.ts +15 -0
- package/dist/mcp/tools/misc.d.ts.map +1 -0
- package/dist/mcp/tools/misc.js +49 -0
- package/dist/mcp/tools/misc.js.map +1 -0
- package/dist/plugins/builtin/calculator.d.ts +11 -0
- package/dist/plugins/builtin/calculator.d.ts.map +1 -0
- package/dist/plugins/builtin/calculator.js +166 -0
- package/dist/plugins/builtin/calculator.js.map +1 -0
- package/dist/plugins/builtin/colors.d.ts +15 -0
- package/dist/plugins/builtin/colors.d.ts.map +1 -0
- package/dist/plugins/builtin/colors.js +193 -0
- package/dist/plugins/builtin/colors.js.map +1 -0
- package/dist/plugins/builtin/cron.d.ts +40 -0
- package/dist/plugins/builtin/cron.d.ts.map +1 -0
- package/dist/plugins/builtin/cron.js +578 -0
- package/dist/plugins/builtin/cron.js.map +1 -0
- package/dist/plugins/builtin/crypto.d.ts +11 -0
- package/dist/plugins/builtin/crypto.d.ts.map +1 -0
- package/dist/plugins/builtin/crypto.js +83 -0
- package/dist/plugins/builtin/crypto.js.map +1 -0
- package/dist/plugins/builtin/database.d.ts +29 -0
- package/dist/plugins/builtin/database.d.ts.map +1 -0
- package/dist/plugins/builtin/database.js +230 -0
- package/dist/plugins/builtin/database.js.map +1 -0
- package/dist/plugins/builtin/docker.d.ts +12 -0
- package/dist/plugins/builtin/docker.d.ts.map +1 -0
- package/dist/plugins/builtin/docker.js +436 -0
- package/dist/plugins/builtin/docker.js.map +1 -0
- package/dist/plugins/builtin/fun.d.ts +11 -0
- package/dist/plugins/builtin/fun.d.ts.map +1 -0
- package/dist/plugins/builtin/fun.js +114 -0
- package/dist/plugins/builtin/fun.js.map +1 -0
- package/dist/plugins/builtin/gcal.d.ts +38 -0
- package/dist/plugins/builtin/gcal.d.ts.map +1 -0
- package/dist/plugins/builtin/gcal.js +280 -0
- package/dist/plugins/builtin/gcal.js.map +1 -0
- package/dist/plugins/builtin/gdrive.d.ts +26 -0
- package/dist/plugins/builtin/gdrive.d.ts.map +1 -0
- package/dist/plugins/builtin/gdrive.js +295 -0
- package/dist/plugins/builtin/gdrive.js.map +1 -0
- package/dist/plugins/builtin/github-actions.d.ts +38 -0
- package/dist/plugins/builtin/github-actions.d.ts.map +1 -0
- package/dist/plugins/builtin/github-actions.js +629 -0
- package/dist/plugins/builtin/github-actions.js.map +1 -0
- package/dist/plugins/builtin/github.d.ts +26 -0
- package/dist/plugins/builtin/github.d.ts.map +1 -0
- package/dist/plugins/builtin/github.js +800 -0
- package/dist/plugins/builtin/github.js.map +1 -0
- package/dist/plugins/builtin/gmail.d.ts +50 -0
- package/dist/plugins/builtin/gmail.d.ts.map +1 -0
- package/dist/plugins/builtin/gmail.js +445 -0
- package/dist/plugins/builtin/gmail.js.map +1 -0
- package/dist/plugins/builtin/hash.d.ts +11 -0
- package/dist/plugins/builtin/hash.d.ts.map +1 -0
- package/dist/plugins/builtin/hash.js +95 -0
- package/dist/plugins/builtin/hash.js.map +1 -0
- package/dist/plugins/builtin/homekit.d.ts +53 -0
- package/dist/plugins/builtin/homekit.d.ts.map +1 -0
- package/dist/plugins/builtin/homekit.js +341 -0
- package/dist/plugins/builtin/homekit.js.map +1 -0
- package/dist/plugins/builtin/index.d.ts +4 -0
- package/dist/plugins/builtin/index.d.ts.map +1 -0
- package/dist/plugins/builtin/index.js +96 -0
- package/dist/plugins/builtin/index.js.map +1 -0
- package/dist/plugins/builtin/jira.d.ts +50 -0
- package/dist/plugins/builtin/jira.d.ts.map +1 -0
- package/dist/plugins/builtin/jira.js +353 -0
- package/dist/plugins/builtin/jira.js.map +1 -0
- package/dist/plugins/builtin/linear.d.ts +35 -0
- package/dist/plugins/builtin/linear.d.ts.map +1 -0
- package/dist/plugins/builtin/linear.js +397 -0
- package/dist/plugins/builtin/linear.js.map +1 -0
- package/dist/plugins/builtin/lumen.d.ts +21 -0
- package/dist/plugins/builtin/lumen.d.ts.map +1 -0
- package/dist/plugins/builtin/lumen.js +404 -0
- package/dist/plugins/builtin/lumen.js.map +1 -0
- package/dist/plugins/builtin/memory.d.ts +22 -0
- package/dist/plugins/builtin/memory.d.ts.map +1 -0
- package/dist/plugins/builtin/memory.js +184 -0
- package/dist/plugins/builtin/memory.js.map +1 -0
- package/dist/plugins/builtin/n8n.d.ts +60 -0
- package/dist/plugins/builtin/n8n.d.ts.map +1 -0
- package/dist/plugins/builtin/n8n.js +519 -0
- package/dist/plugins/builtin/n8n.js.map +1 -0
- package/dist/plugins/builtin/network.d.ts +11 -0
- package/dist/plugins/builtin/network.d.ts.map +1 -0
- package/dist/plugins/builtin/network.js +88 -0
- package/dist/plugins/builtin/network.js.map +1 -0
- package/dist/plugins/builtin/notes.d.ts +47 -0
- package/dist/plugins/builtin/notes.d.ts.map +1 -0
- package/dist/plugins/builtin/notes.js +641 -0
- package/dist/plugins/builtin/notes.js.map +1 -0
- package/dist/plugins/builtin/notion.d.ts +47 -0
- package/dist/plugins/builtin/notion.d.ts.map +1 -0
- package/dist/plugins/builtin/notion.js +317 -0
- package/dist/plugins/builtin/notion.js.map +1 -0
- package/dist/plugins/builtin/shell.d.ts +12 -0
- package/dist/plugins/builtin/shell.d.ts.map +1 -0
- package/dist/plugins/builtin/shell.js +310 -0
- package/dist/plugins/builtin/shell.js.map +1 -0
- package/dist/plugins/builtin/slack.d.ts +31 -0
- package/dist/plugins/builtin/slack.d.ts.map +1 -0
- package/dist/plugins/builtin/slack.js +295 -0
- package/dist/plugins/builtin/slack.js.map +1 -0
- package/dist/plugins/builtin/spotify.d.ts +55 -0
- package/dist/plugins/builtin/spotify.d.ts.map +1 -0
- package/dist/plugins/builtin/spotify.js +623 -0
- package/dist/plugins/builtin/spotify.js.map +1 -0
- package/dist/plugins/builtin/stripe.d.ts +35 -0
- package/dist/plugins/builtin/stripe.d.ts.map +1 -0
- package/dist/plugins/builtin/stripe.js +376 -0
- package/dist/plugins/builtin/stripe.js.map +1 -0
- package/dist/plugins/builtin/system.d.ts +11 -0
- package/dist/plugins/builtin/system.d.ts.map +1 -0
- package/dist/plugins/builtin/system.js +91 -0
- package/dist/plugins/builtin/system.js.map +1 -0
- package/dist/plugins/builtin/text-tools.d.ts +11 -0
- package/dist/plugins/builtin/text-tools.d.ts.map +1 -0
- package/dist/plugins/builtin/text-tools.js +146 -0
- package/dist/plugins/builtin/text-tools.js.map +1 -0
- package/dist/plugins/builtin/timezone.d.ts +13 -0
- package/dist/plugins/builtin/timezone.d.ts.map +1 -0
- package/dist/plugins/builtin/timezone.js +164 -0
- package/dist/plugins/builtin/timezone.js.map +1 -0
- package/dist/plugins/builtin/todoist.d.ts +49 -0
- package/dist/plugins/builtin/todoist.d.ts.map +1 -0
- package/dist/plugins/builtin/todoist.js +540 -0
- package/dist/plugins/builtin/todoist.js.map +1 -0
- package/dist/plugins/builtin/translate.d.ts +11 -0
- package/dist/plugins/builtin/translate.d.ts.map +1 -0
- package/dist/plugins/builtin/translate.js +42 -0
- package/dist/plugins/builtin/translate.js.map +1 -0
- package/dist/plugins/builtin/url-tools.d.ts +11 -0
- package/dist/plugins/builtin/url-tools.d.ts.map +1 -0
- package/dist/plugins/builtin/url-tools.js +70 -0
- package/dist/plugins/builtin/url-tools.js.map +1 -0
- package/dist/plugins/builtin/vercel.d.ts +55 -0
- package/dist/plugins/builtin/vercel.d.ts.map +1 -0
- package/dist/plugins/builtin/vercel.js +514 -0
- package/dist/plugins/builtin/vercel.js.map +1 -0
- package/dist/plugins/builtin/weather.d.ts +13 -0
- package/dist/plugins/builtin/weather.d.ts.map +1 -0
- package/dist/plugins/builtin/weather.js +103 -0
- package/dist/plugins/builtin/weather.js.map +1 -0
- package/dist/plugins/builtin/x.d.ts +54 -0
- package/dist/plugins/builtin/x.d.ts.map +1 -0
- package/dist/plugins/builtin/x.js +402 -0
- package/dist/plugins/builtin/x.js.map +1 -0
- package/dist/plugins/manager.d.ts +77 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +141 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/validation.d.ts +18 -0
- package/dist/plugins/validation.d.ts.map +1 -0
- package/dist/plugins/validation.js +81 -0
- package/dist/plugins/validation.js.map +1 -0
- package/dist/security/auth.d.ts +23 -0
- package/dist/security/auth.d.ts.map +1 -0
- package/dist/security/auth.js +56 -0
- package/dist/security/auth.js.map +1 -0
- package/dist/security/keychain.d.ts +60 -0
- package/dist/security/keychain.d.ts.map +1 -0
- package/dist/security/keychain.js +213 -0
- package/dist/security/keychain.js.map +1 -0
- package/dist/utils/google-auth.d.ts +21 -0
- package/dist/utils/google-auth.d.ts.map +1 -0
- package/dist/utils/google-auth.js +135 -0
- package/dist/utils/google-auth.js.map +1 -0
- package/dist/utils/retry.d.ts +5 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +34 -0
- package/dist/utils/retry.js.map +1 -0
- package/docs/README.md +13 -0
- package/docs/api.md +210 -0
- package/docs/getting-started.md +100 -0
- package/docs/plugins.md +306 -0
- package/docs-site/.vitepress/config.ts +59 -0
- package/docs-site/README.md +12 -0
- package/docs-site/index.md +30 -0
- package/eslint.config.js +29 -0
- package/install.ps1 +334 -0
- package/install.sh +1119 -0
- package/local-install.sh +304 -0
- package/package.json +90 -0
- package/packages/README.md +11 -0
- package/packages/plugin-sdk/README.md +12 -0
- package/packages/plugin-sdk/package.json +22 -0
- package/packages/plugin-sdk/src/README.md +11 -0
- package/packages/plugin-sdk/src/index.ts +191 -0
- package/sdks/README.md +26 -0
- package/sdks/csharp/ConductorClient.cs +65 -0
- package/sdks/csharp/README.md +11 -0
- package/sdks/go/README.md +11 -0
- package/sdks/go/conductor.go +257 -0
- package/sdks/java/ConductorClient.java +27 -0
- package/sdks/java/README.md +11 -0
- package/sdks/php/README.md +11 -0
- package/sdks/php/src/Client.php +72 -0
- package/sdks/python/README.md +12 -0
- package/sdks/python/conductor/__init__.py +227 -0
- package/sdks/python/pyproject.toml +30 -0
- package/sdks/ruby/README.md +11 -0
- package/sdks/ruby/lib/conductor.rb +46 -0
- package/sdks/rust/Cargo.toml +14 -0
- package/sdks/rust/README.md +11 -0
- package/sdks/swift/README.md +11 -0
- package/sdks/swift/Sources/Conductor/ConductorClient.swift +65 -0
- package/skills/conductor-mcp/SKILL.md +38 -0
- package/src/README.md +20 -0
- package/src/ai/README.md +18 -0
- package/src/ai/base.ts +93 -0
- package/src/ai/claude.ts +162 -0
- package/src/ai/gemini.ts +188 -0
- package/src/ai/maestro.ts +168 -0
- package/src/ai/manager.ts +537 -0
- package/src/ai/ollama.ts +186 -0
- package/src/ai/openai.ts +147 -0
- package/src/ai/openrouter.ts +152 -0
- package/src/bot/README.md +12 -0
- package/src/bot/slack.ts +164 -0
- package/src/bot/telegram.ts +185 -0
- package/src/cli/README.md +24 -0
- package/src/cli/commands/README.md +20 -0
- package/src/cli/commands/ai.ts +170 -0
- package/src/cli/commands/doctor.ts +221 -0
- package/src/cli/commands/init.ts +348 -0
- package/src/cli/commands/install.ts +792 -0
- package/src/cli/commands/lifecycle.ts +95 -0
- package/src/cli/commands/marketplace.ts +253 -0
- package/src/cli/commands/mcp.ts +92 -0
- package/src/cli/commands/onboard.ts +248 -0
- package/src/cli/commands/plugin-create.ts +130 -0
- package/src/cli/commands/plugins.ts +36 -0
- package/src/cli/commands/release.ts +251 -0
- package/src/cli/commands/telegram.ts +25 -0
- package/src/cli/index.ts +450 -0
- package/src/config/README.md +11 -0
- package/src/config/oauth.ts +26 -0
- package/src/core/README.md +22 -0
- package/src/core/audit.ts +291 -0
- package/src/core/circuit-breaker.ts +129 -0
- package/src/core/conductor.ts +240 -0
- package/src/core/config.ts +149 -0
- package/src/core/database.ts +411 -0
- package/src/core/errors.ts +275 -0
- package/src/core/health.ts +159 -0
- package/src/core/interfaces.ts +75 -0
- package/src/core/logger.ts +33 -0
- package/src/core/rbac.ts +321 -0
- package/src/core/retry.ts +61 -0
- package/src/core/webhooks.ts +234 -0
- package/src/core/zero-config.ts +72 -0
- package/src/dashboard/README.md +15 -0
- package/src/dashboard/cli.ts +48 -0
- package/src/dashboard/index.html +3426 -0
- package/src/dashboard/server.ts +1544 -0
- package/src/mcp/README.md +20 -0
- package/src/mcp/server.ts +475 -0
- package/src/mcp/tools/README.md +11 -0
- package/src/mcp/tools/misc.ts +61 -0
- package/src/plugins/README.md +28 -0
- package/src/plugins/builtin/README.md +23 -0
- package/src/plugins/builtin/calculator.ts +178 -0
- package/src/plugins/builtin/colors.ts +201 -0
- package/src/plugins/builtin/cron.ts +649 -0
- package/src/plugins/builtin/crypto.ts +85 -0
- package/src/plugins/builtin/database.ts +235 -0
- package/src/plugins/builtin/docker.ts +426 -0
- package/src/plugins/builtin/fun.ts +118 -0
- package/src/plugins/builtin/gcal.ts +305 -0
- package/src/plugins/builtin/gdrive.ts +326 -0
- package/src/plugins/builtin/github-actions.ts +666 -0
- package/src/plugins/builtin/github.ts +912 -0
- package/src/plugins/builtin/gmail.ts +492 -0
- package/src/plugins/builtin/hash.ts +98 -0
- package/src/plugins/builtin/homekit.ts +389 -0
- package/src/plugins/builtin/index.ts +116 -0
- package/src/plugins/builtin/jira.ts +380 -0
- package/src/plugins/builtin/linear.ts +448 -0
- package/src/plugins/builtin/lumen.ts +497 -0
- package/src/plugins/builtin/memory.ts +200 -0
- package/src/plugins/builtin/n8n.ts +565 -0
- package/src/plugins/builtin/network.ts +92 -0
- package/src/plugins/builtin/notes.ts +689 -0
- package/src/plugins/builtin/notion.ts +348 -0
- package/src/plugins/builtin/shell.ts +334 -0
- package/src/plugins/builtin/slack.ts +327 -0
- package/src/plugins/builtin/spotify.ts +665 -0
- package/src/plugins/builtin/stripe.ts +388 -0
- package/src/plugins/builtin/system.ts +93 -0
- package/src/plugins/builtin/text-tools.ts +150 -0
- package/src/plugins/builtin/timezone.ts +173 -0
- package/src/plugins/builtin/todoist.ts +625 -0
- package/src/plugins/builtin/translate.ts +47 -0
- package/src/plugins/builtin/url-tools.ts +73 -0
- package/src/plugins/builtin/vercel.ts +546 -0
- package/src/plugins/builtin/weather.ts +112 -0
- package/src/plugins/builtin/x.ts +440 -0
- package/src/plugins/manager.ts +213 -0
- package/src/plugins/validation.ts +94 -0
- package/src/security/README.md +12 -0
- package/src/security/auth.ts +72 -0
- package/src/security/keychain.ts +226 -0
- package/src/utils/README.md +12 -0
- package/src/utils/google-auth.ts +159 -0
- package/src/utils/retry.ts +41 -0
- package/test-all.mjs +1256 -0
- package/test.mjs +633 -0
- package/tests/README.md +19 -0
- package/tests/calculator.test.ts +54 -0
- package/tests/docker.test.ts +42 -0
- package/tests/load.test.ts +129 -0
- package/tests/mcp.test.ts +14 -0
- package/tests/shell.test.ts +42 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,750 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Conductor Interactive Installer
|
|
4
|
+
*
|
|
5
|
+
* Step-by-step setup with plugin selection TUI.
|
|
6
|
+
* Guides users through:
|
|
7
|
+
* 1. Prerequisites check
|
|
8
|
+
* 2. AI provider setup
|
|
9
|
+
* 3. Plugin selection (interactive picker)
|
|
10
|
+
* 4. Plugin configuration (credentials)
|
|
11
|
+
* 5. MCP server setup
|
|
12
|
+
* 6. Zero-config mode enablement
|
|
13
|
+
*/
|
|
14
|
+
import { createRequire } from 'module';
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import ora from 'ora';
|
|
17
|
+
import inquirer from 'inquirer';
|
|
18
|
+
const _require = createRequire(import.meta.url);
|
|
19
|
+
const { version } = _require('../../package.json');
|
|
20
|
+
const PLUGIN_CATALOG = [
|
|
21
|
+
// Zero-config (no auth required)
|
|
22
|
+
{
|
|
23
|
+
id: 'calculator',
|
|
24
|
+
name: 'Calculator',
|
|
25
|
+
description: 'Math expressions, unit conversions, date calculations',
|
|
26
|
+
category: 'utilities',
|
|
27
|
+
requiresAuth: false,
|
|
28
|
+
tools: ['calc_math', 'calc_convert', 'calc_date'],
|
|
29
|
+
icon: 'đĸ',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'weather',
|
|
33
|
+
name: 'Weather',
|
|
34
|
+
description: 'Current weather and forecasts (free, no API key)',
|
|
35
|
+
category: 'utilities',
|
|
36
|
+
requiresAuth: false,
|
|
37
|
+
tools: ['weather_current', 'weather_forecast'],
|
|
38
|
+
icon: 'đ¤ī¸',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'crypto',
|
|
42
|
+
name: 'Crypto',
|
|
43
|
+
description: 'Cryptocurrency prices and market data',
|
|
44
|
+
category: 'utilities',
|
|
45
|
+
requiresAuth: false,
|
|
46
|
+
tools: ['crypto_price', 'crypto_search'],
|
|
47
|
+
icon: 'âŋ',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'hash',
|
|
51
|
+
name: 'Hash',
|
|
52
|
+
description: 'Hashing, base64 encoding/decoding',
|
|
53
|
+
category: 'utilities',
|
|
54
|
+
requiresAuth: false,
|
|
55
|
+
tools: ['hash_text', 'base64_encode', 'base64_decode'],
|
|
56
|
+
icon: '#ī¸âŖ',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'text-tools',
|
|
60
|
+
name: 'Text Tools',
|
|
61
|
+
description: 'JSON formatting, word count, text transformations',
|
|
62
|
+
category: 'utilities',
|
|
63
|
+
requiresAuth: false,
|
|
64
|
+
tools: ['format_json', 'word_count', 'text_transform'],
|
|
65
|
+
icon: 'đ',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 'timezone',
|
|
69
|
+
name: 'Timezone',
|
|
70
|
+
description: 'Timezone conversion and lookup',
|
|
71
|
+
category: 'utilities',
|
|
72
|
+
requiresAuth: false,
|
|
73
|
+
tools: ['timezone_convert', 'timezone_list'],
|
|
74
|
+
icon: 'đ',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'network',
|
|
78
|
+
name: 'Network',
|
|
79
|
+
description: 'DNS lookup, IP geolocation, reverse DNS',
|
|
80
|
+
category: 'utilities',
|
|
81
|
+
requiresAuth: false,
|
|
82
|
+
tools: ['dns_lookup', 'ip_info', 'reverse_dns'],
|
|
83
|
+
icon: 'đ',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'url-tools',
|
|
87
|
+
name: 'URL Tools',
|
|
88
|
+
description: 'URL expansion, QR code generation, URL parsing',
|
|
89
|
+
category: 'utilities',
|
|
90
|
+
requiresAuth: false,
|
|
91
|
+
tools: ['expand_url', 'url_parse'],
|
|
92
|
+
icon: 'đ',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'colors',
|
|
96
|
+
name: 'Colors',
|
|
97
|
+
description: 'Color format conversion, contrast checking, palette generation',
|
|
98
|
+
category: 'utilities',
|
|
99
|
+
requiresAuth: false,
|
|
100
|
+
tools: ['colors_convert', 'colors_contrast', 'colors_palette'],
|
|
101
|
+
icon: 'đ¨',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'fun',
|
|
105
|
+
name: 'Fun',
|
|
106
|
+
description: 'Random jokes and facts',
|
|
107
|
+
category: 'utilities',
|
|
108
|
+
requiresAuth: false,
|
|
109
|
+
tools: ['random_joke', 'random_fact'],
|
|
110
|
+
icon: 'đ',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'system',
|
|
114
|
+
name: 'System',
|
|
115
|
+
description: 'System stats, process management, clipboard',
|
|
116
|
+
category: 'utilities',
|
|
117
|
+
requiresAuth: false,
|
|
118
|
+
tools: ['system_info', 'list_processes', 'kill_process', 'clipboard_read', 'clipboard_write'],
|
|
119
|
+
icon: 'đĨī¸',
|
|
120
|
+
},
|
|
121
|
+
// Productivity (local only)
|
|
122
|
+
{
|
|
123
|
+
id: 'notes',
|
|
124
|
+
name: 'Notes',
|
|
125
|
+
description: 'Local markdown note management',
|
|
126
|
+
category: 'productivity',
|
|
127
|
+
requiresAuth: false,
|
|
128
|
+
tools: ['notes_create', 'notes_list', 'notes_read', 'notes_update', 'notes_delete', 'notes_search'],
|
|
129
|
+
icon: 'đ',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: 'memory',
|
|
133
|
+
name: 'Memory',
|
|
134
|
+
description: 'Long-term memory storage and recall',
|
|
135
|
+
category: 'productivity',
|
|
136
|
+
requiresAuth: false,
|
|
137
|
+
tools: ['memory_recall', 'memory_store', 'memory_forget', 'memory_list'],
|
|
138
|
+
icon: 'đ§ ',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 'cron',
|
|
142
|
+
name: 'Cron',
|
|
143
|
+
description: 'Cron expression parser and scheduler',
|
|
144
|
+
category: 'productivity',
|
|
145
|
+
requiresAuth: false,
|
|
146
|
+
tools: ['cron_parse', 'cron_next'],
|
|
147
|
+
icon: 'â°',
|
|
148
|
+
},
|
|
149
|
+
// Developer tools (require auth)
|
|
150
|
+
{
|
|
151
|
+
id: 'github',
|
|
152
|
+
name: 'GitHub',
|
|
153
|
+
description: 'Public repos, user info, trending (no auth for public data)',
|
|
154
|
+
category: 'developer',
|
|
155
|
+
requiresAuth: false,
|
|
156
|
+
tools: ['github_user', 'github_repo', 'github_repos', 'github_trending'],
|
|
157
|
+
icon: 'đ',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: 'github-actions',
|
|
161
|
+
name: 'GitHub Actions',
|
|
162
|
+
description: 'Full CI/CD, PRs, issues, releases, notifications',
|
|
163
|
+
category: 'developer',
|
|
164
|
+
requiresAuth: true,
|
|
165
|
+
authType: 'GitHub PAT',
|
|
166
|
+
tools: [
|
|
167
|
+
'gh_my_repos',
|
|
168
|
+
'gh_workflow_runs',
|
|
169
|
+
'gh_trigger_workflow',
|
|
170
|
+
'gh_list_prs',
|
|
171
|
+
'gh_create_pr',
|
|
172
|
+
'gh_list_issues',
|
|
173
|
+
'gh_create_issue',
|
|
174
|
+
'gh_releases',
|
|
175
|
+
'gh_notifications',
|
|
176
|
+
'gh_code_search',
|
|
177
|
+
],
|
|
178
|
+
icon: 'âī¸',
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: 'shell',
|
|
182
|
+
name: 'Shell',
|
|
183
|
+
description: 'Safe shell command execution with approval workflow',
|
|
184
|
+
category: 'developer',
|
|
185
|
+
requiresAuth: false,
|
|
186
|
+
tools: [
|
|
187
|
+
'shell_run',
|
|
188
|
+
'shell_read_file',
|
|
189
|
+
'shell_write_file',
|
|
190
|
+
'shell_list_dir',
|
|
191
|
+
'shell_search_files',
|
|
192
|
+
'shell_search_content',
|
|
193
|
+
],
|
|
194
|
+
icon: 'đģ',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: 'docker',
|
|
198
|
+
name: 'Docker',
|
|
199
|
+
description: 'Container, image, volume, and network management',
|
|
200
|
+
category: 'developer',
|
|
201
|
+
requiresAuth: false,
|
|
202
|
+
tools: ['docker_containers', 'docker_images', 'docker_run', 'docker_pull', 'docker_stats'],
|
|
203
|
+
icon: 'đŗ',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'database',
|
|
207
|
+
name: 'Databases',
|
|
208
|
+
description: 'Query PostgreSQL, MySQL, MongoDB, Redis',
|
|
209
|
+
category: 'developer',
|
|
210
|
+
requiresAuth: true,
|
|
211
|
+
authType: 'Database URL',
|
|
212
|
+
tools: ['db_postgres_query', 'db_mysql_query', 'db_mongo_find', 'db_redis_command'],
|
|
213
|
+
icon: 'đī¸',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: 'vercel',
|
|
217
|
+
name: 'Vercel',
|
|
218
|
+
description: 'Deploy and manage Vercel projects',
|
|
219
|
+
category: 'developer',
|
|
220
|
+
requiresAuth: true,
|
|
221
|
+
authType: 'Vercel Token',
|
|
222
|
+
tools: ['vercel_projects', 'vercel_deployments', 'vercel_deploy', 'vercel_logs', 'vercel_env_list'],
|
|
223
|
+
icon: 'â˛',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
id: 'n8n',
|
|
227
|
+
name: 'n8n',
|
|
228
|
+
description: 'Trigger and manage n8n automation workflows',
|
|
229
|
+
category: 'developer',
|
|
230
|
+
requiresAuth: true,
|
|
231
|
+
authType: 'n8n API Key + Base URL',
|
|
232
|
+
tools: ['n8n_workflows', 'n8n_trigger', 'n8n_executions', 'n8n_health'],
|
|
233
|
+
icon: 'đ',
|
|
234
|
+
},
|
|
235
|
+
// Google services
|
|
236
|
+
{
|
|
237
|
+
id: 'gmail',
|
|
238
|
+
name: 'Gmail',
|
|
239
|
+
description: 'Read, search, send, and manage Gmail',
|
|
240
|
+
category: 'google',
|
|
241
|
+
requiresAuth: true,
|
|
242
|
+
authType: 'Google OAuth',
|
|
243
|
+
tools: ['gmail_list', 'gmail_read', 'gmail_search', 'gmail_send', 'gmail_reply'],
|
|
244
|
+
icon: 'đ§',
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
id: 'gcal',
|
|
248
|
+
name: 'Google Calendar',
|
|
249
|
+
description: 'Manage calendar events',
|
|
250
|
+
category: 'google',
|
|
251
|
+
requiresAuth: true,
|
|
252
|
+
authType: 'Google OAuth',
|
|
253
|
+
tools: ['gcal_list_calendars', 'gcal_list_events', 'gcal_create_event', 'gcal_update_event'],
|
|
254
|
+
icon: 'đ
',
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
id: 'gdrive',
|
|
258
|
+
name: 'Google Drive',
|
|
259
|
+
description: 'Browse, read, create, upload files',
|
|
260
|
+
category: 'google',
|
|
261
|
+
requiresAuth: true,
|
|
262
|
+
authType: 'Google OAuth',
|
|
263
|
+
tools: ['gdrive_list', 'gdrive_search', 'gdrive_read', 'gdrive_upload_text'],
|
|
264
|
+
icon: 'đ',
|
|
265
|
+
},
|
|
266
|
+
// Third-party services
|
|
267
|
+
{
|
|
268
|
+
id: 'notion',
|
|
269
|
+
name: 'Notion',
|
|
270
|
+
description: 'Read, search, create Notion pages',
|
|
271
|
+
category: 'services',
|
|
272
|
+
requiresAuth: true,
|
|
273
|
+
authType: 'Notion Integration Token',
|
|
274
|
+
tools: ['notion_search', 'notion_get_page', 'notion_create_page', 'notion_query_database'],
|
|
275
|
+
icon: 'đ',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
id: 'slack',
|
|
279
|
+
name: 'Slack',
|
|
280
|
+
description: 'Send messages, read channels, search, manage workspace',
|
|
281
|
+
category: 'messaging',
|
|
282
|
+
requiresAuth: true,
|
|
283
|
+
authType: 'Slack Bot Token',
|
|
284
|
+
tools: ['slack_send_message', 'slack_channels', 'slack_read_channel', 'slack_search', 'slack_users'],
|
|
285
|
+
icon: 'đŦ',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: 'spotify',
|
|
289
|
+
name: 'Spotify',
|
|
290
|
+
description: 'Control playback, search music, manage playlists',
|
|
291
|
+
category: 'media',
|
|
292
|
+
requiresAuth: true,
|
|
293
|
+
authType: 'Spotify OAuth',
|
|
294
|
+
tools: ['spotify_search', 'spotify_play', 'spotify_pause', 'spotify_now_playing', 'spotify_playlists'],
|
|
295
|
+
icon: 'đĩ',
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
id: 'x',
|
|
299
|
+
name: 'X (Twitter)',
|
|
300
|
+
description: 'Post tweets, search, manage account',
|
|
301
|
+
category: 'social',
|
|
302
|
+
requiresAuth: true,
|
|
303
|
+
authType: 'X API Credentials',
|
|
304
|
+
tools: ['x_search', 'x_post_tweet', 'x_get_timeline', 'x_get_user'],
|
|
305
|
+
icon: 'đ',
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
id: 'homekit',
|
|
309
|
+
name: 'HomeKit',
|
|
310
|
+
description: 'Control HomeKit accessories via Homebridge',
|
|
311
|
+
category: 'smart-home',
|
|
312
|
+
requiresAuth: true,
|
|
313
|
+
authType: 'Homebridge URL + Credentials',
|
|
314
|
+
tools: ['homekit_status', 'homekit_accessories', 'homekit_set', 'homekit_toggle'],
|
|
315
|
+
icon: 'đ ',
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
id: 'todoist',
|
|
319
|
+
name: 'Todoist',
|
|
320
|
+
description: 'Manage tasks, projects, and comments',
|
|
321
|
+
category: 'productivity',
|
|
322
|
+
requiresAuth: true,
|
|
323
|
+
authType: 'Todoist API Token',
|
|
324
|
+
tools: ['todoist_list_tasks', 'todoist_create_task', 'todoist_complete_task', 'todoist_search_tasks'],
|
|
325
|
+
icon: 'â
',
|
|
326
|
+
},
|
|
327
|
+
];
|
|
328
|
+
const CATEGORIES = [
|
|
329
|
+
{ id: 'utilities', name: 'Utilities', icon: 'đ ī¸' },
|
|
330
|
+
{ id: 'productivity', name: 'Productivity', icon: 'đ' },
|
|
331
|
+
{ id: 'developer', name: 'Developer', icon: 'đģ' },
|
|
332
|
+
{ id: 'google', name: 'Google', icon: 'đĩ' },
|
|
333
|
+
{ id: 'services', name: 'Services', icon: 'đ§' },
|
|
334
|
+
{ id: 'messaging', name: 'Messaging', icon: 'đŦ' },
|
|
335
|
+
{ id: 'media', name: 'Media', icon: 'đĩ' },
|
|
336
|
+
{ id: 'social', name: 'Social', icon: 'đĻ' },
|
|
337
|
+
{ id: 'smart-home', name: 'Smart Home', icon: 'đ ' },
|
|
338
|
+
];
|
|
339
|
+
async function checkPrerequisites() {
|
|
340
|
+
const spinner = ora('Checking prerequisites...').start();
|
|
341
|
+
// Node.js version
|
|
342
|
+
const nodeVersion = process.version;
|
|
343
|
+
const major = parseInt(nodeVersion.slice(1).split('.')[0]);
|
|
344
|
+
if (major < 18) {
|
|
345
|
+
spinner.fail(`Node.js 18+ required (found ${nodeVersion})`);
|
|
346
|
+
console.log(chalk.red('Install Node.js: https://nodejs.org/en/download/'));
|
|
347
|
+
process.exit(1);
|
|
348
|
+
}
|
|
349
|
+
// npm
|
|
350
|
+
try {
|
|
351
|
+
const { execSync } = await import('child_process');
|
|
352
|
+
execSync('npm --version', { stdio: 'pipe' });
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
spinner.fail('npm not found');
|
|
356
|
+
console.log(chalk.red('Install Node.js: https://nodejs.org/en/download/'));
|
|
357
|
+
process.exit(1);
|
|
358
|
+
}
|
|
359
|
+
spinner.succeed(`Prerequisites OK: Node.js ${nodeVersion}, npm`);
|
|
360
|
+
}
|
|
361
|
+
async function selectPlugins() {
|
|
362
|
+
console.log('\n' + chalk.bold('đ§Š Plugin Selection'));
|
|
363
|
+
console.log(chalk.gray('Select plugins to enable (space to toggle, enter to confirm)\n'));
|
|
364
|
+
// Group plugins by category
|
|
365
|
+
const byCategory = new Map();
|
|
366
|
+
for (const plugin of PLUGIN_CATALOG) {
|
|
367
|
+
const list = byCategory.get(plugin.category) ?? [];
|
|
368
|
+
list.push(plugin);
|
|
369
|
+
byCategory.set(plugin.category, list);
|
|
370
|
+
}
|
|
371
|
+
// Print categories and plugins
|
|
372
|
+
for (const [catId, plugins] of byCategory) {
|
|
373
|
+
const cat = CATEGORIES.find((c) => c.id === catId);
|
|
374
|
+
if (!cat)
|
|
375
|
+
continue;
|
|
376
|
+
console.log(chalk.bold(`\n${cat.icon} ${cat.name}`));
|
|
377
|
+
for (const plugin of plugins) {
|
|
378
|
+
const authBadge = plugin.requiresAuth ? chalk.yellow(` [${plugin.authType}]`) : chalk.green(' [free]');
|
|
379
|
+
console.log(` ${plugin.icon} ${plugin.name}${authBadge}`);
|
|
380
|
+
console.log(` ${chalk.gray(plugin.description)}`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Ask which plugins to enable
|
|
384
|
+
const choices = PLUGIN_CATALOG.map((p) => ({
|
|
385
|
+
name: `${p.icon} ${p.name}${p.requiresAuth ? chalk.yellow(` [${p.authType}]`) : chalk.green(' [free]')}`,
|
|
386
|
+
value: p.id,
|
|
387
|
+
checked: !p.requiresAuth, // Auto-select free plugins
|
|
388
|
+
}));
|
|
389
|
+
const { selected } = await inquirer.prompt([
|
|
390
|
+
{
|
|
391
|
+
type: 'checkbox',
|
|
392
|
+
name: 'selected',
|
|
393
|
+
message: 'Select plugins to enable:',
|
|
394
|
+
choices,
|
|
395
|
+
pageSize: 30,
|
|
396
|
+
},
|
|
397
|
+
]);
|
|
398
|
+
return selected;
|
|
399
|
+
}
|
|
400
|
+
async function configurePlugins(selectedPlugins, conductor) {
|
|
401
|
+
const pluginsToConfigure = selectedPlugins.filter((id) => {
|
|
402
|
+
const plugin = PLUGIN_CATALOG.find((p) => p.id === id);
|
|
403
|
+
return plugin?.requiresAuth;
|
|
404
|
+
});
|
|
405
|
+
if (pluginsToConfigure.length === 0) {
|
|
406
|
+
console.log(chalk.green('\nâ
No plugins require configuration. All set!'));
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
console.log('\n' + chalk.bold('đ Plugin Configuration'));
|
|
410
|
+
console.log(chalk.gray('Configure credentials for selected plugins\n'));
|
|
411
|
+
for (const pluginId of pluginsToConfigure) {
|
|
412
|
+
const plugin = PLUGIN_CATALOG.find((p) => p.id === pluginId);
|
|
413
|
+
if (!plugin)
|
|
414
|
+
continue;
|
|
415
|
+
console.log(`\n${plugin.icon} ${chalk.bold(plugin.name)} (${plugin.authType})`);
|
|
416
|
+
console.log(chalk.gray(plugin.description));
|
|
417
|
+
if (pluginId === 'github-actions') {
|
|
418
|
+
const { token } = await inquirer.prompt([
|
|
419
|
+
{
|
|
420
|
+
type: 'password',
|
|
421
|
+
name: 'token',
|
|
422
|
+
message: 'GitHub PAT (https://github.com/settings/tokens):',
|
|
423
|
+
mask: '*',
|
|
424
|
+
},
|
|
425
|
+
]);
|
|
426
|
+
if (token) {
|
|
427
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
428
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
429
|
+
await keychain.set('github', 'token', token);
|
|
430
|
+
console.log(chalk.green(' â
GitHub token saved (encrypted)'));
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
else if (pluginId === 'database') {
|
|
434
|
+
const { postgresUrl } = await inquirer.prompt([
|
|
435
|
+
{
|
|
436
|
+
type: 'input',
|
|
437
|
+
name: 'postgresUrl',
|
|
438
|
+
message: 'PostgreSQL URL (postgresql://user:pass@host:5432/db):',
|
|
439
|
+
},
|
|
440
|
+
]);
|
|
441
|
+
if (postgresUrl) {
|
|
442
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
443
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
444
|
+
await keychain.set('database', 'postgres_url', postgresUrl);
|
|
445
|
+
console.log(chalk.green(' â
Database URL saved (encrypted)'));
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
else if (pluginId === 'vercel') {
|
|
449
|
+
const { token } = await inquirer.prompt([
|
|
450
|
+
{
|
|
451
|
+
type: 'password',
|
|
452
|
+
name: 'token',
|
|
453
|
+
message: 'Vercel API Token (https://vercel.com/account/tokens):',
|
|
454
|
+
mask: '*',
|
|
455
|
+
},
|
|
456
|
+
]);
|
|
457
|
+
if (token) {
|
|
458
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
459
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
460
|
+
await keychain.set('vercel', 'token', token);
|
|
461
|
+
console.log(chalk.green(' â
Vercel token saved (encrypted)'));
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
else if (pluginId === 'notion') {
|
|
465
|
+
const { apiKey } = await inquirer.prompt([
|
|
466
|
+
{
|
|
467
|
+
type: 'password',
|
|
468
|
+
name: 'apiKey',
|
|
469
|
+
message: 'Notion Integration Token (https://www.notion.so/my-integrations):',
|
|
470
|
+
mask: '*',
|
|
471
|
+
},
|
|
472
|
+
]);
|
|
473
|
+
if (apiKey) {
|
|
474
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
475
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
476
|
+
await keychain.set('notion', 'api_key', apiKey);
|
|
477
|
+
console.log(chalk.green(' â
Notion API key saved (encrypted)'));
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
else if (pluginId === 'slack') {
|
|
481
|
+
const { botToken } = await inquirer.prompt([
|
|
482
|
+
{
|
|
483
|
+
type: 'password',
|
|
484
|
+
name: 'botToken',
|
|
485
|
+
message: 'Slack Bot Token (xoxb-...):',
|
|
486
|
+
mask: '*',
|
|
487
|
+
},
|
|
488
|
+
]);
|
|
489
|
+
if (botToken) {
|
|
490
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
491
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
492
|
+
await keychain.set('slack', 'bot_token', botToken);
|
|
493
|
+
console.log(chalk.green(' â
Slack bot token saved (encrypted)'));
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
else if (pluginId === 'n8n') {
|
|
497
|
+
const { apiKey, baseUrl } = await inquirer.prompt([
|
|
498
|
+
{
|
|
499
|
+
type: 'password',
|
|
500
|
+
name: 'apiKey',
|
|
501
|
+
message: 'n8n API Key:',
|
|
502
|
+
mask: '*',
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
type: 'input',
|
|
506
|
+
name: 'baseUrl',
|
|
507
|
+
message: 'n8n Base URL (https://your-n8n.com):',
|
|
508
|
+
},
|
|
509
|
+
]);
|
|
510
|
+
if (apiKey && baseUrl) {
|
|
511
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
512
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
513
|
+
await keychain.set('n8n', 'api_key', apiKey);
|
|
514
|
+
await keychain.set('n8n', 'base_url', baseUrl);
|
|
515
|
+
console.log(chalk.green(' â
n8n credentials saved (encrypted)'));
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
else if (pluginId === 'spotify') {
|
|
519
|
+
const { clientId, clientSecret } = await inquirer.prompt([
|
|
520
|
+
{
|
|
521
|
+
type: 'input',
|
|
522
|
+
name: 'clientId',
|
|
523
|
+
message: 'Spotify Client ID:',
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
type: 'password',
|
|
527
|
+
name: 'clientSecret',
|
|
528
|
+
message: 'Spotify Client Secret:',
|
|
529
|
+
mask: '*',
|
|
530
|
+
},
|
|
531
|
+
]);
|
|
532
|
+
if (clientId && clientSecret) {
|
|
533
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
534
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
535
|
+
await keychain.set('spotify', 'client_id', clientId);
|
|
536
|
+
await keychain.set('spotify', 'client_secret', clientSecret);
|
|
537
|
+
console.log(chalk.green(' â
Spotify credentials saved (encrypted)'));
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
else if (pluginId === 'x') {
|
|
541
|
+
const { apiKey } = await inquirer.prompt([
|
|
542
|
+
{
|
|
543
|
+
type: 'password',
|
|
544
|
+
name: 'apiKey',
|
|
545
|
+
message: 'X API Bearer Token:',
|
|
546
|
+
mask: '*',
|
|
547
|
+
},
|
|
548
|
+
]);
|
|
549
|
+
if (apiKey) {
|
|
550
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
551
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
552
|
+
await keychain.set('x', 'api_key', apiKey);
|
|
553
|
+
console.log(chalk.green(' â
X API key saved (encrypted)'));
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
else if (pluginId === 'homekit') {
|
|
557
|
+
const { baseUrl, username, password } = await inquirer.prompt([
|
|
558
|
+
{
|
|
559
|
+
type: 'input',
|
|
560
|
+
name: 'baseUrl',
|
|
561
|
+
message: 'Homebridge URL (http://homebridge.local:8581):',
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
type: 'input',
|
|
565
|
+
name: 'username',
|
|
566
|
+
message: 'Username:',
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
type: 'password',
|
|
570
|
+
name: 'password',
|
|
571
|
+
message: 'Password:',
|
|
572
|
+
mask: '*',
|
|
573
|
+
},
|
|
574
|
+
]);
|
|
575
|
+
if (baseUrl && username && password) {
|
|
576
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
577
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
578
|
+
await keychain.set('homekit', 'base_url', baseUrl);
|
|
579
|
+
await keychain.set('homekit', 'username', username);
|
|
580
|
+
await keychain.set('homekit', 'password', password);
|
|
581
|
+
console.log(chalk.green(' â
HomeKit credentials saved (encrypted)'));
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
else if (pluginId === 'todoist') {
|
|
585
|
+
const { apiToken } = await inquirer.prompt([
|
|
586
|
+
{
|
|
587
|
+
type: 'password',
|
|
588
|
+
name: 'apiToken',
|
|
589
|
+
message: 'Todoist API Token:',
|
|
590
|
+
mask: '*',
|
|
591
|
+
},
|
|
592
|
+
]);
|
|
593
|
+
if (apiToken) {
|
|
594
|
+
const { Keychain } = await import('../../security/keychain.js');
|
|
595
|
+
const keychain = new Keychain(conductor.getConfig().getConfigDir());
|
|
596
|
+
await keychain.set('todoist', 'api_token', apiToken);
|
|
597
|
+
console.log(chalk.green(' â
Todoist API token saved (encrypted)'));
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
else if (pluginId === 'gmail' || pluginId === 'gcal' || pluginId === 'gdrive') {
|
|
601
|
+
console.log(chalk.yellow(' âšī¸ Google OAuth requires browser authentication.'));
|
|
602
|
+
console.log(chalk.yellow(' Run: conductor auth google'));
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
async function setupMCP(_conductor) {
|
|
607
|
+
console.log('\n' + chalk.bold('đ MCP Server Setup'));
|
|
608
|
+
console.log(chalk.gray('Configure Conductor as an MCP server for your AI agents\n'));
|
|
609
|
+
const { setupMCP } = await inquirer.prompt([
|
|
610
|
+
{
|
|
611
|
+
type: 'confirm',
|
|
612
|
+
name: 'setupMCP',
|
|
613
|
+
message: 'Set up Conductor as an MCP server for your AI agents?',
|
|
614
|
+
default: true,
|
|
615
|
+
},
|
|
616
|
+
]);
|
|
617
|
+
if (!setupMCP)
|
|
618
|
+
return;
|
|
619
|
+
const { agents } = await inquirer.prompt([
|
|
620
|
+
{
|
|
621
|
+
type: 'checkbox',
|
|
622
|
+
name: 'agents',
|
|
623
|
+
message: 'Which AI agents do you use?',
|
|
624
|
+
choices: [
|
|
625
|
+
{ name: 'Claude Desktop', value: 'claude-desktop', checked: true },
|
|
626
|
+
{ name: 'Claude Code', value: 'claude-code' },
|
|
627
|
+
{ name: 'Cursor', value: 'cursor' },
|
|
628
|
+
{ name: 'Cline', value: 'cline' },
|
|
629
|
+
{ name: 'Aider', value: 'aider' },
|
|
630
|
+
],
|
|
631
|
+
},
|
|
632
|
+
]);
|
|
633
|
+
const mcpConfig = {
|
|
634
|
+
command: 'conductor',
|
|
635
|
+
args: ['mcp', 'start'],
|
|
636
|
+
};
|
|
637
|
+
for (const agent of agents) {
|
|
638
|
+
if (agent === 'claude-desktop') {
|
|
639
|
+
try {
|
|
640
|
+
const { execSync } = await import('child_process');
|
|
641
|
+
const claudeConfigPath = process.platform === 'darwin'
|
|
642
|
+
? `${process.env.HOME}/Library/Application Support/Claude/claude_desktop_config.json`
|
|
643
|
+
: `${process.env.HOME}/.config/Claude/claude_desktop_config.json`;
|
|
644
|
+
let config = {};
|
|
645
|
+
try {
|
|
646
|
+
const content = execSync(`cat "${claudeConfigPath}"`, { encoding: 'utf-8' });
|
|
647
|
+
config = JSON.parse(content);
|
|
648
|
+
}
|
|
649
|
+
catch {
|
|
650
|
+
// Config doesn't exist yet
|
|
651
|
+
}
|
|
652
|
+
const newConfig = {
|
|
653
|
+
...config,
|
|
654
|
+
mcpServers: {
|
|
655
|
+
...(config.mcpServers || {}),
|
|
656
|
+
conductor: mcpConfig,
|
|
657
|
+
},
|
|
658
|
+
};
|
|
659
|
+
const fs = await import('fs/promises');
|
|
660
|
+
const path = await import('path');
|
|
661
|
+
await fs.mkdir(path.dirname(claudeConfigPath), { recursive: true });
|
|
662
|
+
await fs.writeFile(claudeConfigPath, JSON.stringify(newConfig, null, 2));
|
|
663
|
+
console.log(chalk.green(` â
Claude Desktop configured at ${claudeConfigPath}`));
|
|
664
|
+
}
|
|
665
|
+
catch (err) {
|
|
666
|
+
console.log(chalk.yellow(` â ī¸ Could not configure Claude Desktop: ${err instanceof Error ? err.message : String(err)}`));
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
else if (agent === 'claude-code') {
|
|
670
|
+
console.log(chalk.yellow(' âšī¸ Add to ~/.claude/settings.json:'));
|
|
671
|
+
console.log(chalk.gray(JSON.stringify({ mcpServers: { conductor: mcpConfig } }, null, 2)));
|
|
672
|
+
}
|
|
673
|
+
else if (agent === 'cursor') {
|
|
674
|
+
console.log(chalk.yellow(' âšī¸ In Cursor: Settings â MCP â Add Server â'));
|
|
675
|
+
console.log(chalk.gray(`Command: conductor\nArgs: mcp start`));
|
|
676
|
+
}
|
|
677
|
+
else if (agent === 'cline') {
|
|
678
|
+
console.log(chalk.yellow(' âšī¸ In Cline: Settings â MCP Servers â Add â'));
|
|
679
|
+
console.log(chalk.gray(`Command: conductor\nArgs: mcp start`));
|
|
680
|
+
}
|
|
681
|
+
else if (agent === 'aider') {
|
|
682
|
+
console.log(chalk.yellow(' âšī¸ In Aider: Configure as external tool with:'));
|
|
683
|
+
console.log(chalk.gray(`conductor mcp start`));
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
export async function install(conductor) {
|
|
688
|
+
console.log('\n' + chalk.bold.blue('đĩ Conductor v' + version + ' â The AI Tool Hub'));
|
|
689
|
+
console.log(chalk.gray('One MCP server. 100+ tools. Every AI agent.\n'));
|
|
690
|
+
// Step 1: Prerequisites
|
|
691
|
+
await checkPrerequisites();
|
|
692
|
+
// Step 2: AI Provider Setup
|
|
693
|
+
console.log('\n' + chalk.bold('đ¤ AI Provider Setup'));
|
|
694
|
+
const { aiProvider } = await inquirer.prompt([
|
|
695
|
+
{
|
|
696
|
+
type: 'list',
|
|
697
|
+
name: 'aiProvider',
|
|
698
|
+
message: 'Which AI provider do you want to use?',
|
|
699
|
+
choices: [
|
|
700
|
+
{ name: 'Anthropic Claude', value: 'claude' },
|
|
701
|
+
{ name: 'OpenAI', value: 'openai' },
|
|
702
|
+
{ name: 'Google Gemini', value: 'gemini' },
|
|
703
|
+
{ name: 'OpenRouter', value: 'openrouter' },
|
|
704
|
+
{ name: 'Ollama (local)', value: 'ollama' },
|
|
705
|
+
{ name: 'Skip (configure later)', value: 'skip' },
|
|
706
|
+
],
|
|
707
|
+
},
|
|
708
|
+
]);
|
|
709
|
+
if (aiProvider !== 'skip') {
|
|
710
|
+
const { apiKey } = await inquirer.prompt([
|
|
711
|
+
{
|
|
712
|
+
type: 'password',
|
|
713
|
+
name: 'apiKey',
|
|
714
|
+
message: `${aiProvider.charAt(0).toUpperCase() + aiProvider.slice(1)} API Key:`,
|
|
715
|
+
mask: '*',
|
|
716
|
+
},
|
|
717
|
+
]);
|
|
718
|
+
if (apiKey) {
|
|
719
|
+
await conductor.getConfig().set('ai.provider', aiProvider);
|
|
720
|
+
await conductor.getConfig().set('ai.apiKey', apiKey);
|
|
721
|
+
console.log(chalk.green(' â
AI provider configured'));
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
// Step 3: Plugin Selection
|
|
725
|
+
const selectedPlugins = await selectPlugins();
|
|
726
|
+
// Step 4: Enable Plugins
|
|
727
|
+
const spinner = ora('Enabling plugins...').start();
|
|
728
|
+
await conductor.getConfig().set('plugins.enabled', selectedPlugins);
|
|
729
|
+
spinner.succeed(`Enabled ${selectedPlugins.length} plugins`);
|
|
730
|
+
// Step 5: Configure Plugins
|
|
731
|
+
await configurePlugins(selectedPlugins, conductor);
|
|
732
|
+
// Step 6: MCP Setup
|
|
733
|
+
await setupMCP(conductor);
|
|
734
|
+
// Step 7: Summary
|
|
735
|
+
console.log('\n' + chalk.bold.green('đ Installation Complete!'));
|
|
736
|
+
console.log(chalk.gray('\nYour AI agent can now access these tools:\n'));
|
|
737
|
+
const enabledPlugins = selectedPlugins.map((id) => {
|
|
738
|
+
const plugin = PLUGIN_CATALOG.find((p) => p.id === id);
|
|
739
|
+
return plugin ? `${plugin.icon} ${plugin.name}` : id;
|
|
740
|
+
});
|
|
741
|
+
console.log(enabledPlugins.join('\n'));
|
|
742
|
+
console.log(chalk.gray('\nTo start the MCP server:'));
|
|
743
|
+
console.log(chalk.bold(' conductor mcp start'));
|
|
744
|
+
console.log(chalk.gray('\nTo add more plugins later:'));
|
|
745
|
+
console.log(chalk.bold(' conductor plugin install'));
|
|
746
|
+
console.log(chalk.gray('\nTo check system health:'));
|
|
747
|
+
console.log(chalk.bold(' conductor doctor'));
|
|
748
|
+
console.log('');
|
|
749
|
+
}
|
|
750
|
+
//# sourceMappingURL=install.js.map
|