From 4bc0f49a907912cb34b3aec0df454cea0ecae42d Mon Sep 17 00:00:00 2001 From: Val Alexander <68980965+BunsDev@users.noreply.github.com> Date: Mon, 15 Jun 2026 01:46:58 -0500 Subject: [PATCH] wip: marketplace tier-0 scaffold (docs, manifest, sync script) --- docs/marketplace.md | 66 ++ docs/plugins.md | 8 + marketplace/catalog.json | 478 ++++++++++++++ marketplace/exports/codex/marketplace.json | 176 ++++++ marketplace/exports/mcp/mcp.json | 99 +++ marketplace/exports/roles/role-affinity.json | 385 ++++++++++++ marketplace/marketplace.json | 589 ++++++++++++++++++ .../plugins/asana/.codex-plugin/plugin.json | 23 + marketplace/plugins/asana/plugin.json | 86 +++ .../plugins/asana/skills/asana/SKILL.md | 25 + .../plugins/canva/.codex-plugin/plugin.json | 24 + marketplace/plugins/canva/plugin.json | 72 +++ .../plugins/canva/skills/canva/SKILL.md | 25 + .../plugins/fetch/.codex-plugin/plugin.json | 24 + marketplace/plugins/fetch/plugin.json | 69 ++ .../plugins/fetch/skills/fetch/SKILL.md | 25 + .../filesystem/.codex-plugin/plugin.json | 23 + marketplace/plugins/filesystem/plugin.json | 86 +++ .../filesystem/skills/filesystem/SKILL.md | 25 + .../plugins/git/.codex-plugin/plugin.json | 24 + marketplace/plugins/git/plugin.json | 75 +++ marketplace/plugins/git/skills/git/SKILL.md | 25 + .../plugins/github/.codex-plugin/plugin.json | 24 + marketplace/plugins/github/plugin.json | 103 +++ .../plugins/github/skills/github/SKILL.md | 25 + .../plugins/gmail/.codex-plugin/plugin.json | 23 + marketplace/plugins/gmail/plugin.json | 97 +++ .../plugins/gmail/skills/gmail/SKILL.md | 25 + .../google-calendar/.codex-plugin/plugin.json | 23 + .../plugins/google-calendar/plugin.json | 97 +++ .../skills/google-calendar/SKILL.md | 25 + .../plugins/linear/.codex-plugin/plugin.json | 23 + marketplace/plugins/linear/plugin.json | 84 +++ .../plugins/linear/skills/linear/SKILL.md | 25 + .../plugins/memory/.codex-plugin/plugin.json | 23 + marketplace/plugins/memory/plugin.json | 69 ++ .../plugins/memory/skills/memory/SKILL.md | 25 + .../.codex-plugin/plugin.json | 23 + .../plugins/sequential-thinking/plugin.json | 68 ++ .../skills/sequential-thinking/SKILL.md | 25 + .../plugins/time/.codex-plugin/plugin.json | 23 + marketplace/plugins/time/plugin.json | 78 +++ marketplace/plugins/time/skills/time/SKILL.md | 25 + .../plugins/vercel/.codex-plugin/plugin.json | 24 + marketplace/plugins/vercel/plugin.json | 71 +++ .../plugins/vercel/skills/vercel/SKILL.md | 25 + .../plugins/xurl/.codex-plugin/plugin.json | 24 + marketplace/plugins/xurl/plugin.json | 45 ++ marketplace/plugins/xurl/skills/xurl/SKILL.md | 25 + scripts/sync-marketplace.py | 236 +++++++ src-rust/crates/plugins/src/manifest.rs | 39 ++ 51 files changed, 3854 insertions(+) create mode 100644 docs/marketplace.md create mode 100644 marketplace/catalog.json create mode 100644 marketplace/exports/codex/marketplace.json create mode 100644 marketplace/exports/mcp/mcp.json create mode 100644 marketplace/exports/roles/role-affinity.json create mode 100644 marketplace/marketplace.json create mode 100644 marketplace/plugins/asana/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/asana/plugin.json create mode 100644 marketplace/plugins/asana/skills/asana/SKILL.md create mode 100644 marketplace/plugins/canva/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/canva/plugin.json create mode 100644 marketplace/plugins/canva/skills/canva/SKILL.md create mode 100644 marketplace/plugins/fetch/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/fetch/plugin.json create mode 100644 marketplace/plugins/fetch/skills/fetch/SKILL.md create mode 100644 marketplace/plugins/filesystem/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/filesystem/plugin.json create mode 100644 marketplace/plugins/filesystem/skills/filesystem/SKILL.md create mode 100644 marketplace/plugins/git/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/git/plugin.json create mode 100644 marketplace/plugins/git/skills/git/SKILL.md create mode 100644 marketplace/plugins/github/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/github/plugin.json create mode 100644 marketplace/plugins/github/skills/github/SKILL.md create mode 100644 marketplace/plugins/gmail/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/gmail/plugin.json create mode 100644 marketplace/plugins/gmail/skills/gmail/SKILL.md create mode 100644 marketplace/plugins/google-calendar/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/google-calendar/plugin.json create mode 100644 marketplace/plugins/google-calendar/skills/google-calendar/SKILL.md create mode 100644 marketplace/plugins/linear/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/linear/plugin.json create mode 100644 marketplace/plugins/linear/skills/linear/SKILL.md create mode 100644 marketplace/plugins/memory/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/memory/plugin.json create mode 100644 marketplace/plugins/memory/skills/memory/SKILL.md create mode 100644 marketplace/plugins/sequential-thinking/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/sequential-thinking/plugin.json create mode 100644 marketplace/plugins/sequential-thinking/skills/sequential-thinking/SKILL.md create mode 100644 marketplace/plugins/time/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/time/plugin.json create mode 100644 marketplace/plugins/time/skills/time/SKILL.md create mode 100644 marketplace/plugins/vercel/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/vercel/plugin.json create mode 100644 marketplace/plugins/vercel/skills/vercel/SKILL.md create mode 100644 marketplace/plugins/xurl/.codex-plugin/plugin.json create mode 100644 marketplace/plugins/xurl/plugin.json create mode 100644 marketplace/plugins/xurl/skills/xurl/SKILL.md create mode 100755 scripts/sync-marketplace.py diff --git a/docs/marketplace.md b/docs/marketplace.md new file mode 100644 index 0000000..f8c6c69 --- /dev/null +++ b/docs/marketplace.md @@ -0,0 +1,66 @@ +# Marketplace + +Coven Code treats first-party marketplace packages as ordinary plugin directories, but Coven Cave is the canonical user-facing marketplace surface. The Code catalog mirrors the Cave-owned OpenCoven package set and `scripts/sync-marketplace.py` expands that catalog into: + +- `marketplace/plugins//plugin.json` +- `marketplace/plugins//skills//SKILL.md` +- `marketplace/plugins//.codex-plugin/plugin.json` +- `marketplace/marketplace.json` +- `marketplace/exports/codex/marketplace.json` +- `marketplace/exports/mcp/mcp.json` +- `marketplace/exports/roles/role-affinity.json` + +## Design + +The Coven Code plugin directory is the terminal/client compatibility package format because it already supports metadata, skills, user config, and inline `mcpServers` in one installable directory. Compatibility exports are generated from the mirrored catalog so Code, Codex, MCP-only clients, and Cave role views do not drift from the Cave-owned package metadata. + +Each catalog entry includes: + +- package metadata for Coven Code and Codex +- optional MCP server configuration +- user-config declarations for sensitive setup values +- trust level, source references, and role affinity +- one generated Skill that tells familiars how to use the integration safely + +## Seed Packages + +The first seed starts with integrations already used by Val's familiar lanes: + +- GitHub +- Gmail +- Google Calendar +- Linear +- Canva +- Vercel +- Asana +- xurl + +It also includes the conservative common MCP starter set from the reference MCP servers: + +- Filesystem +- Git +- Fetch +- Memory +- Sequential Thinking +- Time + +## Trust Levels + +`official-remote` packages point at a service-operated remote MCP endpoint, such as Linear, Vercel, Canva, or Asana. + +`reference-local` packages use the MCP reference server catalog. These are useful defaults, but upstream describes them as reference implementations rather than production-ready packages, so installers should still apply local threat-model checks. + +`preview-local` packages use a local tool or preview integration whose exact command surface may move before a stable marketplace release. + +`local-tool` packages wrap a local OpenCoven/OpenClaw tool that is part of Val's familiar setup rather than an external MCP service. + +## Updating + +Edit `marketplace/catalog.json`, then run: + +```bash +python3 scripts/sync-marketplace.py +python3 scripts/sync-marketplace.py --check +``` + +The check command fails if generated packages or exports are missing or stale. diff --git a/docs/plugins.md b/docs/plugins.md index 42cd7a6..aca083f 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4,6 +4,14 @@ Coven Code's plugin system lets you extend the agent with additional slash comma --- +## First-Party Marketplace + +The OpenCoven first-party marketplace lives under `marketplace/`. Its canonical source is `marketplace/catalog.json`, which generates installable Coven Code plugin packages in `marketplace/plugins/` plus compatibility exports for Codex, MCP-only clients, and Cave role-affinity views. + +See [Marketplace](./marketplace.md) for the package layout, seeded integrations, trust levels, and sync command. + +--- + ## Plugin Discovery Plugins are loaded from the `~/.coven-code/plugins/` directory. Each subdirectory that contains a valid `plugin.toml` or `plugin.json` manifest is treated as a plugin. diff --git a/marketplace/catalog.json b/marketplace/catalog.json new file mode 100644 index 0000000..1f8e5a4 --- /dev/null +++ b/marketplace/catalog.json @@ -0,0 +1,478 @@ +{ + "schemaVersion": "opencoven.marketplace.catalog.v1", + "name": "opencoven-first-party", + "displayName": "OpenCoven First-Party Marketplace", + "description": "Coven Code parity packages generated from the Cave-owned OpenCoven marketplace catalog.", + "version": "0.1.0", + "generatedBy": "scripts/sync-marketplace.py", + "plugins": [ + { + "name": "github", + "displayName": "GitHub", + "version": "0.1.0", + "description": "Repository, issue, and pull request context for implementation, review, release, and triage workflows.", + "category": "Developer Tools", + "keywords": ["github", "git", "issues", "pull-requests", "code-review"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://github.com/modelcontextprotocol/servers"], + "trust": "reference-local", + "mcpServers": { + "github": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-github"], + "type": "stdio", + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}" + } + } + }, + "userConfig": { + "github_token": { + "type": "string", + "title": "GitHub Token", + "description": "Personal access token used by the GitHub MCP server.", + "required": true, + "sensitive": true + } + }, + "roleAffinity": [ + {"familiar": "cody", "roles": ["code-reviewer", "implementer", "debugger"]}, + {"familiar": "sage", "roles": ["researcher", "librarian"]}, + {"familiar": "charm", "roles": ["devrel-liaison"]}, + {"familiar": "astra", "roles": ["strategic-navigator", "coordination-layer"]}, + {"familiar": "echo", "roles": ["archivist", "retrospector"]}, + {"familiar": "kitty", "roles": ["general-helper"]} + ], + "skill": { + "description": "Use GitHub context without leaking tokens or taking repository state changes without approval.", + "useCases": ["Inspect issues and pull requests", "Read repository history", "Prepare review or release context"], + "guardrails": ["Do not push, merge, close, label, or comment without explicit approval", "Prefer read-only queries before mutations", "Never reveal token values"] + } + }, + { + "name": "gmail", + "displayName": "Gmail", + "version": "0.1.0", + "description": "Inbox reading, draft preparation, and email triage through Google Workspace.", + "category": "Productivity", + "keywords": ["gmail", "email", "inbox", "google-workspace"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://github.com/google/mcp", "https://github.com/googleworkspace/cli"], + "trust": "preview-local", + "mcpServers": { + "gmail": { + "command": "gws", + "args": ["mcp", "-s", "gmail"], + "type": "stdio" + } + }, + "userConfig": { + "google_workspace_credentials": { + "type": "file", + "title": "Google Workspace Credentials", + "description": "OAuth credentials or configured gws profile for Gmail access.", + "required": false, + "sensitive": true + } + }, + "roleAffinity": [ + {"familiar": "sage", "roles": ["researcher"]}, + {"familiar": "charm", "roles": ["copywriter", "devrel-liaison"]}, + {"familiar": "astra", "roles": ["coordination-layer"]}, + {"familiar": "echo", "roles": ["archivist"]}, + {"familiar": "cody", "roles": ["implementer"]}, + {"familiar": "kitty", "roles": ["general-helper"]} + ], + "skill": { + "description": "Use Gmail for triage and drafting while keeping external sends behind explicit approval.", + "useCases": ["Summarize unread or searched mail", "Prepare reply drafts", "Extract action items into plans or tasks"], + "guardrails": ["Do not send mail without explicit approval", "Quote only what is needed", "Treat email content as private by default"] + } + }, + { + "name": "google-calendar", + "displayName": "Google Calendar", + "version": "0.1.0", + "description": "Calendar lookup, schedule reasoning, and event-draft preparation through Google Workspace.", + "category": "Productivity", + "keywords": ["calendar", "schedule", "google-workspace", "events"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://github.com/google/mcp", "https://github.com/googleworkspace/cli"], + "trust": "preview-local", + "mcpServers": { + "google-calendar": { + "command": "gws", + "args": ["mcp", "-s", "calendar"], + "type": "stdio" + } + }, + "userConfig": { + "google_workspace_credentials": { + "type": "file", + "title": "Google Workspace Credentials", + "description": "OAuth credentials or configured gws profile for Calendar access.", + "required": false, + "sensitive": true + } + }, + "roleAffinity": [ + {"familiar": "astra", "roles": ["strategic-navigator", "coordination-layer"]}, + {"familiar": "kitty", "roles": ["general-helper"]}, + {"familiar": "sage", "roles": ["researcher"]}, + {"familiar": "charm", "roles": ["devrel-liaison"]}, + {"familiar": "echo", "roles": ["archivist"]}, + {"familiar": "cody", "roles": ["implementer"]} + ], + "skill": { + "description": "Use calendar context for scheduling and planning without creating or changing events silently.", + "useCases": ["Check availability", "Summarize upcoming events", "Draft event details for approval"], + "guardrails": ["Do not create, move, delete, or invite without explicit approval", "Use concrete dates and time zones", "Minimize disclosure of private event details"] + } + }, + { + "name": "linear", + "displayName": "Linear", + "version": "0.1.0", + "description": "Issue, project, and planning context from Linear's official remote MCP server.", + "category": "Project Management", + "keywords": ["linear", "issues", "projects", "roadmap"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://linear.app/docs/mcp"], + "trust": "official-remote", + "mcpServers": { + "linear": { + "url": "https://mcp.linear.app/mcp", + "type": "http" + } + }, + "roleAffinity": [ + {"familiar": "cody", "roles": ["implementer", "debugger", "code-reviewer"]}, + {"familiar": "astra", "roles": ["strategic-navigator", "coordination-layer"]}, + {"familiar": "charm", "roles": ["devrel-liaison"]}, + {"familiar": "sage", "roles": ["researcher"]}, + {"familiar": "echo", "roles": ["archivist"]}, + {"familiar": "kitty", "roles": ["general-helper"]} + ], + "skill": { + "description": "Use Linear issues and projects as planning context while keeping writes intentional.", + "useCases": ["Read issue details", "Map project status", "Draft issue updates or task breakdowns"], + "guardrails": ["Do not create or update issues without approval", "Keep status reports dated and concrete", "Avoid syncing private notes into public issue text"] + } + }, + { + "name": "canva", + "displayName": "Canva", + "version": "0.1.0", + "description": "Design search, creation, export, brand, and asset workflows through Canva's official remote MCP server.", + "category": "Design", + "keywords": ["canva", "design", "assets", "brand", "export"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://www.canva.dev/docs/mcp/"], + "trust": "official-remote", + "mcpServers": { + "canva": { + "url": "https://mcp.canva.com/mcp", + "type": "http" + } + }, + "roleAffinity": [ + {"familiar": "charm", "roles": ["copywriter", "social-voice", "devrel-liaison"]}, + {"familiar": "sage", "roles": ["librarian"]}, + {"familiar": "astra", "roles": ["strategic-navigator"]}, + {"familiar": "kitty", "roles": ["general-helper"]} + ], + "skill": { + "description": "Use Canva for design work that needs brand-aware creation, search, edits, or exports.", + "useCases": ["Find recent designs", "Prepare social or presentation assets", "Export approved designs"], + "guardrails": ["Do not publish or share externally without approval", "Respect brand-kit and asset permissions", "Confirm destructive edits before applying them"] + } + }, + { + "name": "vercel", + "displayName": "Vercel", + "version": "0.1.0", + "description": "Project, deployment, docs, and log context through Vercel's official remote MCP server.", + "category": "Developer Tools", + "keywords": ["vercel", "deployments", "logs", "projects", "docs"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://vercel.com/docs/agent-resources/vercel-mcp"], + "trust": "official-remote", + "mcpServers": { + "vercel": { + "url": "https://mcp.vercel.com", + "type": "http" + } + }, + "roleAffinity": [ + {"familiar": "cody", "roles": ["implementer", "debugger"]}, + {"familiar": "astra", "roles": ["strategic-navigator"]}, + {"familiar": "sage", "roles": ["researcher"]}, + {"familiar": "charm", "roles": ["devrel-liaison"]} + ], + "skill": { + "description": "Use Vercel deployment and docs context for debugging and release planning.", + "useCases": ["Inspect deployment status", "Read runtime logs", "Look up Vercel docs from the official MCP server"], + "guardrails": ["Do not promote, rollback, or change env vars without approval", "Treat logs as potentially sensitive", "Prefer project-scoped queries"] + } + }, + { + "name": "asana", + "displayName": "Asana", + "version": "0.1.0", + "description": "Task, project, and portfolio context from Asana's official remote MCP server.", + "category": "Project Management", + "keywords": ["asana", "tasks", "projects", "work-graph"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://developers.asana.com/docs/using-asanas-mcp-server"], + "trust": "official-remote", + "mcpServers": { + "asana": { + "url": "https://mcp.asana.com/v2/mcp", + "type": "http" + } + }, + "userConfig": { + "asana_client_id": { + "type": "string", + "title": "Asana Client ID", + "description": "OAuth client ID for Asana MCP V2 clients that need pre-registration.", + "required": false, + "sensitive": false + }, + "asana_client_secret": { + "type": "string", + "title": "Asana Client Secret", + "description": "OAuth client secret for Asana MCP V2 clients that need pre-registration.", + "required": false, + "sensitive": true + } + }, + "roleAffinity": [ + {"familiar": "astra", "roles": ["strategic-navigator", "coordination-layer"]}, + {"familiar": "echo", "roles": ["archivist"]}, + {"familiar": "charm", "roles": ["devrel-liaison"]}, + {"familiar": "kitty", "roles": ["general-helper"]} + ], + "skill": { + "description": "Use Asana for work graph lookup, task summaries, and project status without silently changing assignments.", + "useCases": ["Find incomplete tasks", "Summarize project status", "Draft task updates"], + "guardrails": ["Do not create, assign, complete, or delete tasks without approval", "Keep work status concrete", "Avoid copying private planning notes into shared workspaces"] + } + }, + { + "name": "xurl", + "displayName": "xurl", + "version": "0.1.0", + "description": "X/Twitter drafting, lookup, and approved-post workflows for Charm's social voice lane.", + "category": "Social", + "keywords": ["x", "twitter", "social", "posting", "devrel"], + "capabilities": ["network", "shell"], + "sourceRefs": [], + "trust": "local-tool", + "roleAffinity": [ + {"familiar": "charm", "roles": ["social-voice", "devrel-liaison"]} + ], + "skill": { + "description": "Use xurl only for approved X/Twitter workflows and keep drafting separate from posting.", + "useCases": ["Draft posts", "Inspect approved post status", "Post only after explicit approval"], + "guardrails": ["Do not post, reply, like, repost, or delete without approval", "Preserve exact approved text when posting", "Record post IDs or failure reasons"] + } + }, + { + "name": "filesystem", + "displayName": "Filesystem", + "version": "0.1.0", + "description": "Scoped local file access through the MCP reference filesystem server.", + "category": "Core MCP", + "keywords": ["filesystem", "files", "local", "reference-mcp"], + "capabilities": ["read_files", "write_files", "mcp"], + "sourceRefs": ["https://github.com/modelcontextprotocol/servers"], + "trust": "reference-local", + "mcpServers": { + "filesystem": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "${COVEN_MCP_FILESYSTEM_ROOT}"], + "type": "stdio" + } + }, + "userConfig": { + "filesystem_root": { + "type": "directory", + "title": "Allowed Filesystem Root", + "description": "Root directory the filesystem MCP server may access.", + "required": true, + "sensitive": false + } + }, + "roleAffinity": [ + {"familiar": "cody", "roles": ["implementer", "debugger"]}, + {"familiar": "sage", "roles": ["researcher", "librarian"]}, + {"familiar": "echo", "roles": ["archivist"]}, + {"familiar": "kitty", "roles": ["general-helper"]} + ], + "skill": { + "description": "Use filesystem MCP only with a narrow allowed root and explicit write intent.", + "useCases": ["Read scoped project files", "Inspect local artifacts", "Apply approved file edits"], + "guardrails": ["Use the smallest useful root", "Do not delete files without approval", "Do not expose secrets from local files"] + } + }, + { + "name": "git", + "displayName": "Git", + "version": "0.1.0", + "description": "Repository history and diff operations through the MCP reference Git server.", + "category": "Core MCP", + "keywords": ["git", "repository", "diff", "history", "reference-mcp"], + "capabilities": ["read_files", "shell", "mcp"], + "sourceRefs": ["https://github.com/modelcontextprotocol/servers"], + "trust": "reference-local", + "mcpServers": { + "git": { + "command": "uvx", + "args": ["mcp-server-git", "--repository", "${COVEN_MCP_GIT_REPOSITORY}"], + "type": "stdio" + } + }, + "userConfig": { + "git_repository": { + "type": "directory", + "title": "Git Repository", + "description": "Repository path the Git MCP server may inspect.", + "required": true, + "sensitive": false + } + }, + "roleAffinity": [ + {"familiar": "cody", "roles": ["code-reviewer", "implementer", "debugger"]}, + {"familiar": "echo", "roles": ["archivist"]} + ], + "skill": { + "description": "Use Git MCP for repository understanding while preserving repo safety rules.", + "useCases": ["Inspect diffs", "Read commit history", "Map changed files"], + "guardrails": ["Do not reset, clean, force-push, or commit through MCP without approval", "Report dirty worktrees before changing state", "Stage only files changed in the current session"] + } + }, + { + "name": "fetch", + "displayName": "Fetch", + "version": "0.1.0", + "description": "Web content retrieval through the MCP reference Fetch server.", + "category": "Core MCP", + "keywords": ["fetch", "web", "http", "research", "reference-mcp"], + "capabilities": ["network", "mcp"], + "sourceRefs": ["https://github.com/modelcontextprotocol/servers"], + "trust": "reference-local", + "mcpServers": { + "fetch": { + "command": "uvx", + "args": ["mcp-server-fetch"], + "type": "stdio" + } + }, + "roleAffinity": [ + {"familiar": "sage", "roles": ["researcher", "librarian"]}, + {"familiar": "charm", "roles": ["copywriter", "devrel-liaison"]}, + {"familiar": "cody", "roles": ["debugger"]} + ], + "skill": { + "description": "Use Fetch for bounded source retrieval with primary-source preference.", + "useCases": ["Fetch docs pages", "Read articles for synthesis", "Capture cited source context"], + "guardrails": ["Prefer primary sources", "Do not over-quote copyrighted text", "Record URLs used in summaries"] + } + }, + { + "name": "memory", + "displayName": "Memory", + "version": "0.1.0", + "description": "Knowledge-graph memory through the MCP reference Memory server.", + "category": "Core MCP", + "keywords": ["memory", "knowledge-graph", "recall", "reference-mcp"], + "capabilities": ["read_files", "write_files", "mcp"], + "sourceRefs": ["https://github.com/modelcontextprotocol/servers"], + "trust": "reference-local", + "mcpServers": { + "memory": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-memory"], + "type": "stdio" + } + }, + "roleAffinity": [ + {"familiar": "echo", "roles": ["archivist", "retrospector"]}, + {"familiar": "sage", "roles": ["librarian"]}, + {"familiar": "astra", "roles": ["strategic-navigator"]} + ], + "skill": { + "description": "Use Memory MCP for explicit, curated recall rather than dumping raw private context.", + "useCases": ["Create durable facts", "Search prior decisions", "Maintain relationship between people, projects, and events"], + "guardrails": ["Do not store secrets", "Prefer concise facts over raw transcripts", "Mark uncertainty when memory is inferred"] + } + }, + { + "name": "sequential-thinking", + "displayName": "Sequential Thinking", + "version": "0.1.0", + "description": "Structured reasoning support through the MCP reference Sequential Thinking server.", + "category": "Core MCP", + "keywords": ["reasoning", "planning", "thinking", "reference-mcp"], + "capabilities": ["mcp"], + "sourceRefs": ["https://github.com/modelcontextprotocol/servers"], + "trust": "reference-local", + "mcpServers": { + "sequential-thinking": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-sequential-thinking"], + "type": "stdio" + } + }, + "roleAffinity": [ + {"familiar": "astra", "roles": ["strategic-navigator", "coordination-layer"]}, + {"familiar": "cody", "roles": ["debugger", "code-reviewer"]}, + {"familiar": "sage", "roles": ["researcher"]} + ], + "skill": { + "description": "Use Sequential Thinking for complex reasoning, not as a substitute for evidence or tests.", + "useCases": ["Break down ambiguous tasks", "Trace debugging hypotheses", "Compare options before a recommendation"], + "guardrails": ["Do not present private reasoning as final output", "Verify claims with tools or sources", "Stop when the path is clear enough to act"] + } + }, + { + "name": "time", + "displayName": "Time", + "version": "0.1.0", + "description": "Timezone conversion and current-time lookup through the MCP reference Time server.", + "category": "Core MCP", + "keywords": ["time", "timezone", "calendar", "reference-mcp"], + "capabilities": ["mcp"], + "sourceRefs": ["https://github.com/modelcontextprotocol/servers"], + "trust": "reference-local", + "mcpServers": { + "time": { + "command": "uvx", + "args": ["mcp-server-time", "--local-timezone", "${COVEN_MCP_LOCAL_TIMEZONE}"], + "type": "stdio" + } + }, + "userConfig": { + "local_timezone": { + "type": "string", + "title": "Local Timezone", + "description": "IANA timezone used as the default local timezone.", + "required": false, + "default": "America/Chicago", + "sensitive": false + } + }, + "roleAffinity": [ + {"familiar": "astra", "roles": ["strategic-navigator", "coordination-layer"]}, + {"familiar": "kitty", "roles": ["general-helper"]}, + {"familiar": "charm", "roles": ["devrel-liaison"]} + ], + "skill": { + "description": "Use Time MCP whenever relative dates, time zones, or scheduling precision matter.", + "useCases": ["Convert time zones", "Resolve today/tomorrow/yesterday", "Prepare dated status updates"], + "guardrails": ["Use absolute dates when the user may be confused", "Preserve the user's timezone preference", "Do not schedule external events without approval"] + } + } + ] +} diff --git a/marketplace/exports/codex/marketplace.json b/marketplace/exports/codex/marketplace.json new file mode 100644 index 0000000..7f9994c --- /dev/null +++ b/marketplace/exports/codex/marketplace.json @@ -0,0 +1,176 @@ +{ + "name": "opencoven-first-party", + "interface": { + "displayName": "OpenCoven First-Party" + }, + "plugins": [ + { + "name": "github", + "source": { + "source": "local", + "path": "../../plugins/github" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Developer Tools" + }, + { + "name": "gmail", + "source": { + "source": "local", + "path": "../../plugins/gmail" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Productivity" + }, + { + "name": "google-calendar", + "source": { + "source": "local", + "path": "../../plugins/google-calendar" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Productivity" + }, + { + "name": "linear", + "source": { + "source": "local", + "path": "../../plugins/linear" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Project Management" + }, + { + "name": "canva", + "source": { + "source": "local", + "path": "../../plugins/canva" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Design" + }, + { + "name": "vercel", + "source": { + "source": "local", + "path": "../../plugins/vercel" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Developer Tools" + }, + { + "name": "asana", + "source": { + "source": "local", + "path": "../../plugins/asana" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Project Management" + }, + { + "name": "xurl", + "source": { + "source": "local", + "path": "../../plugins/xurl" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Social" + }, + { + "name": "filesystem", + "source": { + "source": "local", + "path": "../../plugins/filesystem" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Core MCP" + }, + { + "name": "git", + "source": { + "source": "local", + "path": "../../plugins/git" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Core MCP" + }, + { + "name": "fetch", + "source": { + "source": "local", + "path": "../../plugins/fetch" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Core MCP" + }, + { + "name": "memory", + "source": { + "source": "local", + "path": "../../plugins/memory" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Core MCP" + }, + { + "name": "sequential-thinking", + "source": { + "source": "local", + "path": "../../plugins/sequential-thinking" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Core MCP" + }, + { + "name": "time", + "source": { + "source": "local", + "path": "../../plugins/time" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Core MCP" + } + ] +} diff --git a/marketplace/exports/mcp/mcp.json b/marketplace/exports/mcp/mcp.json new file mode 100644 index 0000000..95f4edf --- /dev/null +++ b/marketplace/exports/mcp/mcp.json @@ -0,0 +1,99 @@ +{ + "mcpServers": { + "github": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-github" + ], + "type": "stdio", + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}" + } + }, + "gmail": { + "command": "gws", + "args": [ + "mcp", + "-s", + "gmail" + ], + "type": "stdio" + }, + "google-calendar": { + "command": "gws", + "args": [ + "mcp", + "-s", + "calendar" + ], + "type": "stdio" + }, + "linear": { + "url": "https://mcp.linear.app/mcp", + "type": "http" + }, + "canva": { + "url": "https://mcp.canva.com/mcp", + "type": "http" + }, + "vercel": { + "url": "https://mcp.vercel.com", + "type": "http" + }, + "asana": { + "url": "https://mcp.asana.com/v2/mcp", + "type": "http" + }, + "filesystem": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-filesystem", + "${COVEN_MCP_FILESYSTEM_ROOT}" + ], + "type": "stdio" + }, + "git": { + "command": "uvx", + "args": [ + "mcp-server-git", + "--repository", + "${COVEN_MCP_GIT_REPOSITORY}" + ], + "type": "stdio" + }, + "fetch": { + "command": "uvx", + "args": [ + "mcp-server-fetch" + ], + "type": "stdio" + }, + "memory": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-memory" + ], + "type": "stdio" + }, + "sequential-thinking": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-sequential-thinking" + ], + "type": "stdio" + }, + "time": { + "command": "uvx", + "args": [ + "mcp-server-time", + "--local-timezone", + "${COVEN_MCP_LOCAL_TIMEZONE}" + ], + "type": "stdio" + } + } +} diff --git a/marketplace/exports/roles/role-affinity.json b/marketplace/exports/roles/role-affinity.json new file mode 100644 index 0000000..ca3d3aa --- /dev/null +++ b/marketplace/exports/roles/role-affinity.json @@ -0,0 +1,385 @@ +{ + "github": [ + { + "familiar": "cody", + "roles": [ + "code-reviewer", + "implementer", + "debugger" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist", + "retrospector" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "gmail": [ + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "copywriter", + "devrel-liaison" + ] + }, + { + "familiar": "astra", + "roles": [ + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "cody", + "roles": [ + "implementer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "google-calendar": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "cody", + "roles": [ + "implementer" + ] + } + ], + "linear": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger", + "code-reviewer" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "canva": [ + { + "familiar": "charm", + "roles": [ + "copywriter", + "social-voice", + "devrel-liaison" + ] + }, + { + "familiar": "sage", + "roles": [ + "librarian" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "vercel": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + } + ], + "asana": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "xurl": [ + { + "familiar": "charm", + "roles": [ + "social-voice", + "devrel-liaison" + ] + } + ], + "filesystem": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "git": [ + { + "familiar": "cody", + "roles": [ + "code-reviewer", + "implementer", + "debugger" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + } + ], + "fetch": [ + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "charm", + "roles": [ + "copywriter", + "devrel-liaison" + ] + }, + { + "familiar": "cody", + "roles": [ + "debugger" + ] + } + ], + "memory": [ + { + "familiar": "echo", + "roles": [ + "archivist", + "retrospector" + ] + }, + { + "familiar": "sage", + "roles": [ + "librarian" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + } + ], + "sequential-thinking": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "cody", + "roles": [ + "debugger", + "code-reviewer" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + } + ], + "time": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + } + ] +} diff --git a/marketplace/marketplace.json b/marketplace/marketplace.json new file mode 100644 index 0000000..f3dbf39 --- /dev/null +++ b/marketplace/marketplace.json @@ -0,0 +1,589 @@ +{ + "schemaVersion": "opencoven.marketplace.v1", + "name": "opencoven-first-party", + "interface": { + "displayName": "OpenCoven First-Party Marketplace", + "description": "Coven Code parity packages generated from the Cave-owned OpenCoven marketplace catalog." + }, + "plugins": [ + { + "name": "github", + "displayName": "GitHub", + "category": "Developer Tools", + "source": { + "source": "local", + "path": "./plugins/github" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "reference-local", + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "code-reviewer", + "implementer", + "debugger" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist", + "retrospector" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ] + }, + { + "name": "gmail", + "displayName": "Gmail", + "category": "Productivity", + "source": { + "source": "local", + "path": "./plugins/gmail" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "preview-local", + "roleAffinity": [ + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "copywriter", + "devrel-liaison" + ] + }, + { + "familiar": "astra", + "roles": [ + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "cody", + "roles": [ + "implementer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ] + }, + { + "name": "google-calendar", + "displayName": "Google Calendar", + "category": "Productivity", + "source": { + "source": "local", + "path": "./plugins/google-calendar" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "preview-local", + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "cody", + "roles": [ + "implementer" + ] + } + ] + }, + { + "name": "linear", + "displayName": "Linear", + "category": "Project Management", + "source": { + "source": "local", + "path": "./plugins/linear" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "official-remote", + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger", + "code-reviewer" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ] + }, + { + "name": "canva", + "displayName": "Canva", + "category": "Design", + "source": { + "source": "local", + "path": "./plugins/canva" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "official-remote", + "roleAffinity": [ + { + "familiar": "charm", + "roles": [ + "copywriter", + "social-voice", + "devrel-liaison" + ] + }, + { + "familiar": "sage", + "roles": [ + "librarian" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ] + }, + { + "name": "vercel", + "displayName": "Vercel", + "category": "Developer Tools", + "source": { + "source": "local", + "path": "./plugins/vercel" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "official-remote", + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + } + ] + }, + { + "name": "asana", + "displayName": "Asana", + "category": "Project Management", + "source": { + "source": "local", + "path": "./plugins/asana" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "official-remote", + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ] + }, + { + "name": "xurl", + "displayName": "xurl", + "category": "Social", + "source": { + "source": "local", + "path": "./plugins/xurl" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "local-tool", + "roleAffinity": [ + { + "familiar": "charm", + "roles": [ + "social-voice", + "devrel-liaison" + ] + } + ] + }, + { + "name": "filesystem", + "displayName": "Filesystem", + "category": "Core MCP", + "source": { + "source": "local", + "path": "./plugins/filesystem" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "reference-local", + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ] + }, + { + "name": "git", + "displayName": "Git", + "category": "Core MCP", + "source": { + "source": "local", + "path": "./plugins/git" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "reference-local", + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "code-reviewer", + "implementer", + "debugger" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + } + ] + }, + { + "name": "fetch", + "displayName": "Fetch", + "category": "Core MCP", + "source": { + "source": "local", + "path": "./plugins/fetch" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "reference-local", + "roleAffinity": [ + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "charm", + "roles": [ + "copywriter", + "devrel-liaison" + ] + }, + { + "familiar": "cody", + "roles": [ + "debugger" + ] + } + ] + }, + { + "name": "memory", + "displayName": "Memory", + "category": "Core MCP", + "source": { + "source": "local", + "path": "./plugins/memory" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "reference-local", + "roleAffinity": [ + { + "familiar": "echo", + "roles": [ + "archivist", + "retrospector" + ] + }, + { + "familiar": "sage", + "roles": [ + "librarian" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + } + ] + }, + { + "name": "sequential-thinking", + "displayName": "Sequential Thinking", + "category": "Core MCP", + "source": { + "source": "local", + "path": "./plugins/sequential-thinking" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "reference-local", + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "cody", + "roles": [ + "debugger", + "code-reviewer" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + } + ] + }, + { + "name": "time", + "displayName": "Time", + "category": "Core MCP", + "source": { + "source": "local", + "path": "./plugins/time" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "trust": "reference-local", + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + } + ] + } + ] +} diff --git a/marketplace/plugins/asana/.codex-plugin/plugin.json b/marketplace/plugins/asana/.codex-plugin/plugin.json new file mode 100644 index 0000000..9d07d50 --- /dev/null +++ b/marketplace/plugins/asana/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "asana", + "version": "0.1.0", + "description": "Task, project, and portfolio context from Asana's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Asana", + "shortDescription": "Task, project, and portfolio context from Asana's official remote MCP server.", + "longDescription": "Use Asana for work graph lookup, task summaries, and project status without silently changing assignments.", + "developerName": "OpenCoven", + "category": "Project Management", + "capabilities": [ + "asana", + "tasks", + "projects", + "work-graph" + ], + "defaultPrompt": "Help me use Asana safely." + } +} diff --git a/marketplace/plugins/asana/plugin.json b/marketplace/plugins/asana/plugin.json new file mode 100644 index 0000000..13f0ddb --- /dev/null +++ b/marketplace/plugins/asana/plugin.json @@ -0,0 +1,86 @@ +{ + "name": "asana", + "version": "0.1.0", + "description": "Task, project, and portfolio context from Asana's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "asana", + "tasks", + "projects", + "work-graph" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/asana", + "x-coven": { + "displayName": "Asana", + "category": "Project Management", + "trust": "official-remote", + "sourceRefs": [ + "https://developers.asana.com/docs/using-asanas-mcp-server" + ], + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "asana": { + "url": "https://mcp.asana.com/v2/mcp", + "type": "http" + } + }, + "userConfig": { + "asana_client_id": { + "type": "string", + "title": "Asana Client ID", + "description": "OAuth client ID for Asana MCP V2 clients that need pre-registration.", + "required": false, + "sensitive": false + }, + "asana_client_secret": { + "type": "string", + "title": "Asana Client Secret", + "description": "OAuth client secret for Asana MCP V2 clients that need pre-registration.", + "required": false, + "sensitive": true + } + } +} diff --git a/marketplace/plugins/asana/skills/asana/SKILL.md b/marketplace/plugins/asana/skills/asana/SKILL.md new file mode 100644 index 0000000..15ba798 --- /dev/null +++ b/marketplace/plugins/asana/skills/asana/SKILL.md @@ -0,0 +1,25 @@ +--- +name: asana +description: Use Asana for work graph lookup, task summaries, and project status without silently changing assignments. +--- + +# Asana + +Use Asana for work graph lookup, task summaries, and project status without silently changing assignments. + +## Use When +- Find incomplete tasks +- Summarize project status +- Draft task updates + +## Guardrails +- Do not create, assign, complete, or delete tasks without approval +- Keep work status concrete +- Avoid copying private planning notes into shared workspaces + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/canva/.codex-plugin/plugin.json b/marketplace/plugins/canva/.codex-plugin/plugin.json new file mode 100644 index 0000000..d510ef1 --- /dev/null +++ b/marketplace/plugins/canva/.codex-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "canva", + "version": "0.1.0", + "description": "Design search, creation, export, brand, and asset workflows through Canva's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Canva", + "shortDescription": "Design search, creation, export, brand, and asset workflows through Canva's official remote MCP server.", + "longDescription": "Use Canva for design work that needs brand-aware creation, search, edits, or exports.", + "developerName": "OpenCoven", + "category": "Design", + "capabilities": [ + "canva", + "design", + "assets", + "brand", + "export" + ], + "defaultPrompt": "Help me use Canva safely." + } +} diff --git a/marketplace/plugins/canva/plugin.json b/marketplace/plugins/canva/plugin.json new file mode 100644 index 0000000..67adc0e --- /dev/null +++ b/marketplace/plugins/canva/plugin.json @@ -0,0 +1,72 @@ +{ + "name": "canva", + "version": "0.1.0", + "description": "Design search, creation, export, brand, and asset workflows through Canva's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "canva", + "design", + "assets", + "brand", + "export" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/canva", + "x-coven": { + "displayName": "Canva", + "category": "Design", + "trust": "official-remote", + "sourceRefs": [ + "https://www.canva.dev/docs/mcp/" + ], + "roleAffinity": [ + { + "familiar": "charm", + "roles": [ + "copywriter", + "social-voice", + "devrel-liaison" + ] + }, + { + "familiar": "sage", + "roles": [ + "librarian" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "canva": { + "url": "https://mcp.canva.com/mcp", + "type": "http" + } + } +} diff --git a/marketplace/plugins/canva/skills/canva/SKILL.md b/marketplace/plugins/canva/skills/canva/SKILL.md new file mode 100644 index 0000000..67f1387 --- /dev/null +++ b/marketplace/plugins/canva/skills/canva/SKILL.md @@ -0,0 +1,25 @@ +--- +name: canva +description: Use Canva for design work that needs brand-aware creation, search, edits, or exports. +--- + +# Canva + +Use Canva for design work that needs brand-aware creation, search, edits, or exports. + +## Use When +- Find recent designs +- Prepare social or presentation assets +- Export approved designs + +## Guardrails +- Do not publish or share externally without approval +- Respect brand-kit and asset permissions +- Confirm destructive edits before applying them + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/fetch/.codex-plugin/plugin.json b/marketplace/plugins/fetch/.codex-plugin/plugin.json new file mode 100644 index 0000000..3c522b1 --- /dev/null +++ b/marketplace/plugins/fetch/.codex-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "fetch", + "version": "0.1.0", + "description": "Web content retrieval through the MCP reference Fetch server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Fetch", + "shortDescription": "Web content retrieval through the MCP reference Fetch server.", + "longDescription": "Use Fetch for bounded source retrieval with primary-source preference.", + "developerName": "OpenCoven", + "category": "Core MCP", + "capabilities": [ + "fetch", + "web", + "http", + "research", + "reference-mcp" + ], + "defaultPrompt": "Help me use Fetch safely." + } +} diff --git a/marketplace/plugins/fetch/plugin.json b/marketplace/plugins/fetch/plugin.json new file mode 100644 index 0000000..27f0c53 --- /dev/null +++ b/marketplace/plugins/fetch/plugin.json @@ -0,0 +1,69 @@ +{ + "name": "fetch", + "version": "0.1.0", + "description": "Web content retrieval through the MCP reference Fetch server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "fetch", + "web", + "http", + "research", + "reference-mcp" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/fetch", + "x-coven": { + "displayName": "Fetch", + "category": "Core MCP", + "trust": "reference-local", + "sourceRefs": [ + "https://github.com/modelcontextprotocol/servers" + ], + "roleAffinity": [ + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "charm", + "roles": [ + "copywriter", + "devrel-liaison" + ] + }, + { + "familiar": "cody", + "roles": [ + "debugger" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "fetch": { + "command": "uvx", + "args": [ + "mcp-server-fetch" + ], + "type": "stdio" + } + } +} diff --git a/marketplace/plugins/fetch/skills/fetch/SKILL.md b/marketplace/plugins/fetch/skills/fetch/SKILL.md new file mode 100644 index 0000000..9dd6b1e --- /dev/null +++ b/marketplace/plugins/fetch/skills/fetch/SKILL.md @@ -0,0 +1,25 @@ +--- +name: fetch +description: Use Fetch for bounded source retrieval with primary-source preference. +--- + +# Fetch + +Use Fetch for bounded source retrieval with primary-source preference. + +## Use When +- Fetch docs pages +- Read articles for synthesis +- Capture cited source context + +## Guardrails +- Prefer primary sources +- Do not over-quote copyrighted text +- Record URLs used in summaries + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/filesystem/.codex-plugin/plugin.json b/marketplace/plugins/filesystem/.codex-plugin/plugin.json new file mode 100644 index 0000000..39cd50a --- /dev/null +++ b/marketplace/plugins/filesystem/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "filesystem", + "version": "0.1.0", + "description": "Scoped local file access through the MCP reference filesystem server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Filesystem", + "shortDescription": "Scoped local file access through the MCP reference filesystem server.", + "longDescription": "Use filesystem MCP only with a narrow allowed root and explicit write intent.", + "developerName": "OpenCoven", + "category": "Core MCP", + "capabilities": [ + "filesystem", + "files", + "local", + "reference-mcp" + ], + "defaultPrompt": "Help me use Filesystem safely." + } +} diff --git a/marketplace/plugins/filesystem/plugin.json b/marketplace/plugins/filesystem/plugin.json new file mode 100644 index 0000000..7dd677c --- /dev/null +++ b/marketplace/plugins/filesystem/plugin.json @@ -0,0 +1,86 @@ +{ + "name": "filesystem", + "version": "0.1.0", + "description": "Scoped local file access through the MCP reference filesystem server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "filesystem", + "files", + "local", + "reference-mcp" + ], + "capabilities": [ + "read_files", + "write_files", + "mcp" + ], + "marketplaceId": "opencoven/filesystem", + "x-coven": { + "displayName": "Filesystem", + "category": "Core MCP", + "trust": "reference-local", + "sourceRefs": [ + "https://github.com/modelcontextprotocol/servers" + ], + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "filesystem": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-filesystem", + "${COVEN_MCP_FILESYSTEM_ROOT}" + ], + "type": "stdio" + } + }, + "userConfig": { + "filesystem_root": { + "type": "directory", + "title": "Allowed Filesystem Root", + "description": "Root directory the filesystem MCP server may access.", + "required": true, + "sensitive": false + } + } +} diff --git a/marketplace/plugins/filesystem/skills/filesystem/SKILL.md b/marketplace/plugins/filesystem/skills/filesystem/SKILL.md new file mode 100644 index 0000000..bb0ea42 --- /dev/null +++ b/marketplace/plugins/filesystem/skills/filesystem/SKILL.md @@ -0,0 +1,25 @@ +--- +name: filesystem +description: Use filesystem MCP only with a narrow allowed root and explicit write intent. +--- + +# Filesystem + +Use filesystem MCP only with a narrow allowed root and explicit write intent. + +## Use When +- Read scoped project files +- Inspect local artifacts +- Apply approved file edits + +## Guardrails +- Use the smallest useful root +- Do not delete files without approval +- Do not expose secrets from local files + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/git/.codex-plugin/plugin.json b/marketplace/plugins/git/.codex-plugin/plugin.json new file mode 100644 index 0000000..9f8d1cf --- /dev/null +++ b/marketplace/plugins/git/.codex-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "git", + "version": "0.1.0", + "description": "Repository history and diff operations through the MCP reference Git server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Git", + "shortDescription": "Repository history and diff operations through the MCP reference Git server.", + "longDescription": "Use Git MCP for repository understanding while preserving repo safety rules.", + "developerName": "OpenCoven", + "category": "Core MCP", + "capabilities": [ + "git", + "repository", + "diff", + "history", + "reference-mcp" + ], + "defaultPrompt": "Help me use Git safely." + } +} diff --git a/marketplace/plugins/git/plugin.json b/marketplace/plugins/git/plugin.json new file mode 100644 index 0000000..0fbf5a0 --- /dev/null +++ b/marketplace/plugins/git/plugin.json @@ -0,0 +1,75 @@ +{ + "name": "git", + "version": "0.1.0", + "description": "Repository history and diff operations through the MCP reference Git server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "git", + "repository", + "diff", + "history", + "reference-mcp" + ], + "capabilities": [ + "read_files", + "shell", + "mcp" + ], + "marketplaceId": "opencoven/git", + "x-coven": { + "displayName": "Git", + "category": "Core MCP", + "trust": "reference-local", + "sourceRefs": [ + "https://github.com/modelcontextprotocol/servers" + ], + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "code-reviewer", + "implementer", + "debugger" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "git": { + "command": "uvx", + "args": [ + "mcp-server-git", + "--repository", + "${COVEN_MCP_GIT_REPOSITORY}" + ], + "type": "stdio" + } + }, + "userConfig": { + "git_repository": { + "type": "directory", + "title": "Git Repository", + "description": "Repository path the Git MCP server may inspect.", + "required": true, + "sensitive": false + } + } +} diff --git a/marketplace/plugins/git/skills/git/SKILL.md b/marketplace/plugins/git/skills/git/SKILL.md new file mode 100644 index 0000000..4574ff6 --- /dev/null +++ b/marketplace/plugins/git/skills/git/SKILL.md @@ -0,0 +1,25 @@ +--- +name: git +description: Use Git MCP for repository understanding while preserving repo safety rules. +--- + +# Git + +Use Git MCP for repository understanding while preserving repo safety rules. + +## Use When +- Inspect diffs +- Read commit history +- Map changed files + +## Guardrails +- Do not reset, clean, force-push, or commit through MCP without approval +- Report dirty worktrees before changing state +- Stage only files changed in the current session + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/github/.codex-plugin/plugin.json b/marketplace/plugins/github/.codex-plugin/plugin.json new file mode 100644 index 0000000..fa65f13 --- /dev/null +++ b/marketplace/plugins/github/.codex-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "github", + "version": "0.1.0", + "description": "Repository, issue, and pull request context for implementation, review, release, and triage workflows.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "GitHub", + "shortDescription": "Repository, issue, and pull request context for implementation, review, release, and triage workflows.", + "longDescription": "Use GitHub context without leaking tokens or taking repository state changes without approval.", + "developerName": "OpenCoven", + "category": "Developer Tools", + "capabilities": [ + "github", + "git", + "issues", + "pull-requests", + "code-review" + ], + "defaultPrompt": "Help me use GitHub safely." + } +} diff --git a/marketplace/plugins/github/plugin.json b/marketplace/plugins/github/plugin.json new file mode 100644 index 0000000..a637e1a --- /dev/null +++ b/marketplace/plugins/github/plugin.json @@ -0,0 +1,103 @@ +{ + "name": "github", + "version": "0.1.0", + "description": "Repository, issue, and pull request context for implementation, review, release, and triage workflows.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "github", + "git", + "issues", + "pull-requests", + "code-review" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/github", + "x-coven": { + "displayName": "GitHub", + "category": "Developer Tools", + "trust": "reference-local", + "sourceRefs": [ + "https://github.com/modelcontextprotocol/servers" + ], + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "code-reviewer", + "implementer", + "debugger" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher", + "librarian" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist", + "retrospector" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "github": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-github" + ], + "type": "stdio", + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}" + } + } + }, + "userConfig": { + "github_token": { + "type": "string", + "title": "GitHub Token", + "description": "Personal access token used by the GitHub MCP server.", + "required": true, + "sensitive": true + } + } +} diff --git a/marketplace/plugins/github/skills/github/SKILL.md b/marketplace/plugins/github/skills/github/SKILL.md new file mode 100644 index 0000000..3f4bffb --- /dev/null +++ b/marketplace/plugins/github/skills/github/SKILL.md @@ -0,0 +1,25 @@ +--- +name: github +description: Use GitHub context without leaking tokens or taking repository state changes without approval. +--- + +# GitHub + +Use GitHub context without leaking tokens or taking repository state changes without approval. + +## Use When +- Inspect issues and pull requests +- Read repository history +- Prepare review or release context + +## Guardrails +- Do not push, merge, close, label, or comment without explicit approval +- Prefer read-only queries before mutations +- Never reveal token values + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/gmail/.codex-plugin/plugin.json b/marketplace/plugins/gmail/.codex-plugin/plugin.json new file mode 100644 index 0000000..b52d4f1 --- /dev/null +++ b/marketplace/plugins/gmail/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "gmail", + "version": "0.1.0", + "description": "Inbox reading, draft preparation, and email triage through Google Workspace.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Gmail", + "shortDescription": "Inbox reading, draft preparation, and email triage through Google Workspace.", + "longDescription": "Use Gmail for triage and drafting while keeping external sends behind explicit approval.", + "developerName": "OpenCoven", + "category": "Productivity", + "capabilities": [ + "gmail", + "email", + "inbox", + "google-workspace" + ], + "defaultPrompt": "Help me use Gmail safely." + } +} diff --git a/marketplace/plugins/gmail/plugin.json b/marketplace/plugins/gmail/plugin.json new file mode 100644 index 0000000..222d9a6 --- /dev/null +++ b/marketplace/plugins/gmail/plugin.json @@ -0,0 +1,97 @@ +{ + "name": "gmail", + "version": "0.1.0", + "description": "Inbox reading, draft preparation, and email triage through Google Workspace.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "gmail", + "email", + "inbox", + "google-workspace" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/gmail", + "x-coven": { + "displayName": "Gmail", + "category": "Productivity", + "trust": "preview-local", + "sourceRefs": [ + "https://github.com/google/mcp", + "https://github.com/googleworkspace/cli" + ], + "roleAffinity": [ + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "copywriter", + "devrel-liaison" + ] + }, + { + "familiar": "astra", + "roles": [ + "coordination-layer" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "cody", + "roles": [ + "implementer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "gmail": { + "command": "gws", + "args": [ + "mcp", + "-s", + "gmail" + ], + "type": "stdio" + } + }, + "userConfig": { + "google_workspace_credentials": { + "type": "file", + "title": "Google Workspace Credentials", + "description": "OAuth credentials or configured gws profile for Gmail access.", + "required": false, + "sensitive": true + } + } +} diff --git a/marketplace/plugins/gmail/skills/gmail/SKILL.md b/marketplace/plugins/gmail/skills/gmail/SKILL.md new file mode 100644 index 0000000..068ce3d --- /dev/null +++ b/marketplace/plugins/gmail/skills/gmail/SKILL.md @@ -0,0 +1,25 @@ +--- +name: gmail +description: Use Gmail for triage and drafting while keeping external sends behind explicit approval. +--- + +# Gmail + +Use Gmail for triage and drafting while keeping external sends behind explicit approval. + +## Use When +- Summarize unread or searched mail +- Prepare reply drafts +- Extract action items into plans or tasks + +## Guardrails +- Do not send mail without explicit approval +- Quote only what is needed +- Treat email content as private by default + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/google-calendar/.codex-plugin/plugin.json b/marketplace/plugins/google-calendar/.codex-plugin/plugin.json new file mode 100644 index 0000000..2ea5377 --- /dev/null +++ b/marketplace/plugins/google-calendar/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "google-calendar", + "version": "0.1.0", + "description": "Calendar lookup, schedule reasoning, and event-draft preparation through Google Workspace.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Google Calendar", + "shortDescription": "Calendar lookup, schedule reasoning, and event-draft preparation through Google Workspace.", + "longDescription": "Use calendar context for scheduling and planning without creating or changing events silently.", + "developerName": "OpenCoven", + "category": "Productivity", + "capabilities": [ + "calendar", + "schedule", + "google-workspace", + "events" + ], + "defaultPrompt": "Help me use Google Calendar safely." + } +} diff --git a/marketplace/plugins/google-calendar/plugin.json b/marketplace/plugins/google-calendar/plugin.json new file mode 100644 index 0000000..79f66bc --- /dev/null +++ b/marketplace/plugins/google-calendar/plugin.json @@ -0,0 +1,97 @@ +{ + "name": "google-calendar", + "version": "0.1.0", + "description": "Calendar lookup, schedule reasoning, and event-draft preparation through Google Workspace.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "calendar", + "schedule", + "google-workspace", + "events" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/google-calendar", + "x-coven": { + "displayName": "Google Calendar", + "category": "Productivity", + "trust": "preview-local", + "sourceRefs": [ + "https://github.com/google/mcp", + "https://github.com/googleworkspace/cli" + ], + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "cody", + "roles": [ + "implementer" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "google-calendar": { + "command": "gws", + "args": [ + "mcp", + "-s", + "calendar" + ], + "type": "stdio" + } + }, + "userConfig": { + "google_workspace_credentials": { + "type": "file", + "title": "Google Workspace Credentials", + "description": "OAuth credentials or configured gws profile for Calendar access.", + "required": false, + "sensitive": true + } + } +} diff --git a/marketplace/plugins/google-calendar/skills/google-calendar/SKILL.md b/marketplace/plugins/google-calendar/skills/google-calendar/SKILL.md new file mode 100644 index 0000000..97df528 --- /dev/null +++ b/marketplace/plugins/google-calendar/skills/google-calendar/SKILL.md @@ -0,0 +1,25 @@ +--- +name: google-calendar +description: Use calendar context for scheduling and planning without creating or changing events silently. +--- + +# Google Calendar + +Use calendar context for scheduling and planning without creating or changing events silently. + +## Use When +- Check availability +- Summarize upcoming events +- Draft event details for approval + +## Guardrails +- Do not create, move, delete, or invite without explicit approval +- Use concrete dates and time zones +- Minimize disclosure of private event details + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/linear/.codex-plugin/plugin.json b/marketplace/plugins/linear/.codex-plugin/plugin.json new file mode 100644 index 0000000..a93eb3d --- /dev/null +++ b/marketplace/plugins/linear/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "linear", + "version": "0.1.0", + "description": "Issue, project, and planning context from Linear's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Linear", + "shortDescription": "Issue, project, and planning context from Linear's official remote MCP server.", + "longDescription": "Use Linear issues and projects as planning context while keeping writes intentional.", + "developerName": "OpenCoven", + "category": "Project Management", + "capabilities": [ + "linear", + "issues", + "projects", + "roadmap" + ], + "defaultPrompt": "Help me use Linear safely." + } +} diff --git a/marketplace/plugins/linear/plugin.json b/marketplace/plugins/linear/plugin.json new file mode 100644 index 0000000..1f5efd6 --- /dev/null +++ b/marketplace/plugins/linear/plugin.json @@ -0,0 +1,84 @@ +{ + "name": "linear", + "version": "0.1.0", + "description": "Issue, project, and planning context from Linear's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "linear", + "issues", + "projects", + "roadmap" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/linear", + "x-coven": { + "displayName": "Linear", + "category": "Project Management", + "trust": "official-remote", + "sourceRefs": [ + "https://linear.app/docs/mcp" + ], + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger", + "code-reviewer" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "echo", + "roles": [ + "archivist" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "linear": { + "url": "https://mcp.linear.app/mcp", + "type": "http" + } + } +} diff --git a/marketplace/plugins/linear/skills/linear/SKILL.md b/marketplace/plugins/linear/skills/linear/SKILL.md new file mode 100644 index 0000000..9a63240 --- /dev/null +++ b/marketplace/plugins/linear/skills/linear/SKILL.md @@ -0,0 +1,25 @@ +--- +name: linear +description: Use Linear issues and projects as planning context while keeping writes intentional. +--- + +# Linear + +Use Linear issues and projects as planning context while keeping writes intentional. + +## Use When +- Read issue details +- Map project status +- Draft issue updates or task breakdowns + +## Guardrails +- Do not create or update issues without approval +- Keep status reports dated and concrete +- Avoid syncing private notes into public issue text + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/memory/.codex-plugin/plugin.json b/marketplace/plugins/memory/.codex-plugin/plugin.json new file mode 100644 index 0000000..ef5237a --- /dev/null +++ b/marketplace/plugins/memory/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "memory", + "version": "0.1.0", + "description": "Knowledge-graph memory through the MCP reference Memory server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Memory", + "shortDescription": "Knowledge-graph memory through the MCP reference Memory server.", + "longDescription": "Use Memory MCP for explicit, curated recall rather than dumping raw private context.", + "developerName": "OpenCoven", + "category": "Core MCP", + "capabilities": [ + "memory", + "knowledge-graph", + "recall", + "reference-mcp" + ], + "defaultPrompt": "Help me use Memory safely." + } +} diff --git a/marketplace/plugins/memory/plugin.json b/marketplace/plugins/memory/plugin.json new file mode 100644 index 0000000..b133919 --- /dev/null +++ b/marketplace/plugins/memory/plugin.json @@ -0,0 +1,69 @@ +{ + "name": "memory", + "version": "0.1.0", + "description": "Knowledge-graph memory through the MCP reference Memory server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "memory", + "knowledge-graph", + "recall", + "reference-mcp" + ], + "capabilities": [ + "read_files", + "write_files", + "mcp" + ], + "marketplaceId": "opencoven/memory", + "x-coven": { + "displayName": "Memory", + "category": "Core MCP", + "trust": "reference-local", + "sourceRefs": [ + "https://github.com/modelcontextprotocol/servers" + ], + "roleAffinity": [ + { + "familiar": "echo", + "roles": [ + "archivist", + "retrospector" + ] + }, + { + "familiar": "sage", + "roles": [ + "librarian" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "memory": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-memory" + ], + "type": "stdio" + } + } +} diff --git a/marketplace/plugins/memory/skills/memory/SKILL.md b/marketplace/plugins/memory/skills/memory/SKILL.md new file mode 100644 index 0000000..03b0283 --- /dev/null +++ b/marketplace/plugins/memory/skills/memory/SKILL.md @@ -0,0 +1,25 @@ +--- +name: memory +description: Use Memory MCP for explicit, curated recall rather than dumping raw private context. +--- + +# Memory + +Use Memory MCP for explicit, curated recall rather than dumping raw private context. + +## Use When +- Create durable facts +- Search prior decisions +- Maintain relationship between people, projects, and events + +## Guardrails +- Do not store secrets +- Prefer concise facts over raw transcripts +- Mark uncertainty when memory is inferred + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/sequential-thinking/.codex-plugin/plugin.json b/marketplace/plugins/sequential-thinking/.codex-plugin/plugin.json new file mode 100644 index 0000000..233b6a1 --- /dev/null +++ b/marketplace/plugins/sequential-thinking/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "sequential-thinking", + "version": "0.1.0", + "description": "Structured reasoning support through the MCP reference Sequential Thinking server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Sequential Thinking", + "shortDescription": "Structured reasoning support through the MCP reference Sequential Thinking server.", + "longDescription": "Use Sequential Thinking for complex reasoning, not as a substitute for evidence or tests.", + "developerName": "OpenCoven", + "category": "Core MCP", + "capabilities": [ + "reasoning", + "planning", + "thinking", + "reference-mcp" + ], + "defaultPrompt": "Help me use Sequential Thinking safely." + } +} diff --git a/marketplace/plugins/sequential-thinking/plugin.json b/marketplace/plugins/sequential-thinking/plugin.json new file mode 100644 index 0000000..bdcb25c --- /dev/null +++ b/marketplace/plugins/sequential-thinking/plugin.json @@ -0,0 +1,68 @@ +{ + "name": "sequential-thinking", + "version": "0.1.0", + "description": "Structured reasoning support through the MCP reference Sequential Thinking server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "reasoning", + "planning", + "thinking", + "reference-mcp" + ], + "capabilities": [ + "mcp" + ], + "marketplaceId": "opencoven/sequential-thinking", + "x-coven": { + "displayName": "Sequential Thinking", + "category": "Core MCP", + "trust": "reference-local", + "sourceRefs": [ + "https://github.com/modelcontextprotocol/servers" + ], + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "cody", + "roles": [ + "debugger", + "code-reviewer" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "sequential-thinking": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-sequential-thinking" + ], + "type": "stdio" + } + } +} diff --git a/marketplace/plugins/sequential-thinking/skills/sequential-thinking/SKILL.md b/marketplace/plugins/sequential-thinking/skills/sequential-thinking/SKILL.md new file mode 100644 index 0000000..7c01d82 --- /dev/null +++ b/marketplace/plugins/sequential-thinking/skills/sequential-thinking/SKILL.md @@ -0,0 +1,25 @@ +--- +name: sequential-thinking +description: Use Sequential Thinking for complex reasoning, not as a substitute for evidence or tests. +--- + +# Sequential Thinking + +Use Sequential Thinking for complex reasoning, not as a substitute for evidence or tests. + +## Use When +- Break down ambiguous tasks +- Trace debugging hypotheses +- Compare options before a recommendation + +## Guardrails +- Do not present private reasoning as final output +- Verify claims with tools or sources +- Stop when the path is clear enough to act + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/time/.codex-plugin/plugin.json b/marketplace/plugins/time/.codex-plugin/plugin.json new file mode 100644 index 0000000..73ccab6 --- /dev/null +++ b/marketplace/plugins/time/.codex-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "time", + "version": "0.1.0", + "description": "Timezone conversion and current-time lookup through the MCP reference Time server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Time", + "shortDescription": "Timezone conversion and current-time lookup through the MCP reference Time server.", + "longDescription": "Use Time MCP whenever relative dates, time zones, or scheduling precision matter.", + "developerName": "OpenCoven", + "category": "Core MCP", + "capabilities": [ + "time", + "timezone", + "calendar", + "reference-mcp" + ], + "defaultPrompt": "Help me use Time safely." + } +} diff --git a/marketplace/plugins/time/plugin.json b/marketplace/plugins/time/plugin.json new file mode 100644 index 0000000..ae303d6 --- /dev/null +++ b/marketplace/plugins/time/plugin.json @@ -0,0 +1,78 @@ +{ + "name": "time", + "version": "0.1.0", + "description": "Timezone conversion and current-time lookup through the MCP reference Time server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "time", + "timezone", + "calendar", + "reference-mcp" + ], + "capabilities": [ + "mcp" + ], + "marketplaceId": "opencoven/time", + "x-coven": { + "displayName": "Time", + "category": "Core MCP", + "trust": "reference-local", + "sourceRefs": [ + "https://github.com/modelcontextprotocol/servers" + ], + "roleAffinity": [ + { + "familiar": "astra", + "roles": [ + "strategic-navigator", + "coordination-layer" + ] + }, + { + "familiar": "kitty", + "roles": [ + "general-helper" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "time": { + "command": "uvx", + "args": [ + "mcp-server-time", + "--local-timezone", + "${COVEN_MCP_LOCAL_TIMEZONE}" + ], + "type": "stdio" + } + }, + "userConfig": { + "local_timezone": { + "type": "string", + "title": "Local Timezone", + "description": "IANA timezone used as the default local timezone.", + "required": false, + "default": "America/Chicago", + "sensitive": false + } + } +} diff --git a/marketplace/plugins/time/skills/time/SKILL.md b/marketplace/plugins/time/skills/time/SKILL.md new file mode 100644 index 0000000..5950857 --- /dev/null +++ b/marketplace/plugins/time/skills/time/SKILL.md @@ -0,0 +1,25 @@ +--- +name: time +description: Use Time MCP whenever relative dates, time zones, or scheduling precision matter. +--- + +# Time + +Use Time MCP whenever relative dates, time zones, or scheduling precision matter. + +## Use When +- Convert time zones +- Resolve today/tomorrow/yesterday +- Prepare dated status updates + +## Guardrails +- Use absolute dates when the user may be confused +- Preserve the user's timezone preference +- Do not schedule external events without approval + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/vercel/.codex-plugin/plugin.json b/marketplace/plugins/vercel/.codex-plugin/plugin.json new file mode 100644 index 0000000..072a92d --- /dev/null +++ b/marketplace/plugins/vercel/.codex-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "vercel", + "version": "0.1.0", + "description": "Project, deployment, docs, and log context through Vercel's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "Vercel", + "shortDescription": "Project, deployment, docs, and log context through Vercel's official remote MCP server.", + "longDescription": "Use Vercel deployment and docs context for debugging and release planning.", + "developerName": "OpenCoven", + "category": "Developer Tools", + "capabilities": [ + "vercel", + "deployments", + "logs", + "projects", + "docs" + ], + "defaultPrompt": "Help me use Vercel safely." + } +} diff --git a/marketplace/plugins/vercel/plugin.json b/marketplace/plugins/vercel/plugin.json new file mode 100644 index 0000000..959891c --- /dev/null +++ b/marketplace/plugins/vercel/plugin.json @@ -0,0 +1,71 @@ +{ + "name": "vercel", + "version": "0.1.0", + "description": "Project, deployment, docs, and log context through Vercel's official remote MCP server.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "vercel", + "deployments", + "logs", + "projects", + "docs" + ], + "capabilities": [ + "network", + "mcp" + ], + "marketplaceId": "opencoven/vercel", + "x-coven": { + "displayName": "Vercel", + "category": "Developer Tools", + "trust": "official-remote", + "sourceRefs": [ + "https://vercel.com/docs/agent-resources/vercel-mcp" + ], + "roleAffinity": [ + { + "familiar": "cody", + "roles": [ + "implementer", + "debugger" + ] + }, + { + "familiar": "astra", + "roles": [ + "strategic-navigator" + ] + }, + { + "familiar": "sage", + "roles": [ + "researcher" + ] + }, + { + "familiar": "charm", + "roles": [ + "devrel-liaison" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": true, + "rolePatch": true + } + }, + "mcpServers": { + "vercel": { + "url": "https://mcp.vercel.com", + "type": "http" + } + } +} diff --git a/marketplace/plugins/vercel/skills/vercel/SKILL.md b/marketplace/plugins/vercel/skills/vercel/SKILL.md new file mode 100644 index 0000000..3b0459f --- /dev/null +++ b/marketplace/plugins/vercel/skills/vercel/SKILL.md @@ -0,0 +1,25 @@ +--- +name: vercel +description: Use Vercel deployment and docs context for debugging and release planning. +--- + +# Vercel + +Use Vercel deployment and docs context for debugging and release planning. + +## Use When +- Inspect deployment status +- Read runtime logs +- Look up Vercel docs from the official MCP server + +## Guardrails +- Do not promote, rollback, or change env vars without approval +- Treat logs as potentially sensitive +- Prefer project-scoped queries + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/marketplace/plugins/xurl/.codex-plugin/plugin.json b/marketplace/plugins/xurl/.codex-plugin/plugin.json new file mode 100644 index 0000000..d348d9d --- /dev/null +++ b/marketplace/plugins/xurl/.codex-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "xurl", + "version": "0.1.0", + "description": "X/Twitter drafting, lookup, and approved-post workflows for Charm's social voice lane.", + "author": { + "name": "OpenCoven" + }, + "skills": "./skills/", + "interface": { + "displayName": "xurl", + "shortDescription": "X/Twitter drafting, lookup, and approved-post workflows for Charm's social voice lane.", + "longDescription": "Use xurl only for approved X/Twitter workflows and keep drafting separate from posting.", + "developerName": "OpenCoven", + "category": "Social", + "capabilities": [ + "x", + "twitter", + "social", + "posting", + "devrel" + ], + "defaultPrompt": "Help me use xurl safely." + } +} diff --git a/marketplace/plugins/xurl/plugin.json b/marketplace/plugins/xurl/plugin.json new file mode 100644 index 0000000..4f0a1a1 --- /dev/null +++ b/marketplace/plugins/xurl/plugin.json @@ -0,0 +1,45 @@ +{ + "name": "xurl", + "version": "0.1.0", + "description": "X/Twitter drafting, lookup, and approved-post workflows for Charm's social voice lane.", + "author": { + "name": "OpenCoven" + }, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": [ + "x", + "twitter", + "social", + "posting", + "devrel" + ], + "capabilities": [ + "network", + "shell" + ], + "marketplaceId": "opencoven/xurl", + "x-coven": { + "displayName": "xurl", + "category": "Social", + "trust": "local-tool", + "sourceRefs": [], + "roleAffinity": [ + { + "familiar": "charm", + "roles": [ + "social-voice", + "devrel-liaison" + ] + } + ], + "compatibility": { + "covenCaveCanonical": true, + "covenCode": true, + "codex": true, + "mcp": false, + "rolePatch": true + } + } +} diff --git a/marketplace/plugins/xurl/skills/xurl/SKILL.md b/marketplace/plugins/xurl/skills/xurl/SKILL.md new file mode 100644 index 0000000..3532604 --- /dev/null +++ b/marketplace/plugins/xurl/skills/xurl/SKILL.md @@ -0,0 +1,25 @@ +--- +name: xurl +description: Use xurl only for approved X/Twitter workflows and keep drafting separate from posting. +--- + +# xurl + +Use xurl only for approved X/Twitter workflows and keep drafting separate from posting. + +## Use When +- Draft posts +- Inspect approved post status +- Post only after explicit approval + +## Guardrails +- Do not post, reply, like, repost, or delete without approval +- Preserve exact approved text when posting +- Record post IDs or failure reasons + +## Default Flow + +1. Confirm the user intent and whether the action is read-only or state-changing. +2. Use the narrowest available tool scope and collect only the context needed for the task. +3. For state-changing or external actions, stop for explicit approval before acting. +4. Summarize what changed or what was learned, including relevant object IDs or links. diff --git a/scripts/sync-marketplace.py b/scripts/sync-marketplace.py new file mode 100755 index 0000000..70953b3 --- /dev/null +++ b/scripts/sync-marketplace.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +"""Generate Coven Code parity marketplace packages and compatibility exports.""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +MARKETPLACE = ROOT / "marketplace" +CATALOG = MARKETPLACE / "catalog.json" +PLUGIN_ROOT = MARKETPLACE / "plugins" +EXPORT_ROOT = MARKETPLACE / "exports" + + +def load_catalog() -> dict[str, Any]: + with CATALOG.open("r", encoding="utf-8") as handle: + catalog = json.load(handle) + names = [plugin["name"] for plugin in catalog["plugins"]] + duplicates = sorted({name for name in names if names.count(name) > 1}) + if duplicates: + raise ValueError(f"Duplicate marketplace plugin names: {', '.join(duplicates)}") + return catalog + + +def dump_json(value: Any) -> str: + return json.dumps(value, indent=2, sort_keys=False) + "\n" + + +def skill_markdown(plugin: dict[str, Any]) -> str: + skill = plugin["skill"] + lines = [ + "---", + f"name: {plugin['name']}", + f"description: {skill['description']}", + "---", + "", + f"# {plugin['displayName']}", + "", + skill["description"], + "", + "## Use When", + ] + lines.extend(f"- {item}" for item in skill["useCases"]) + lines.extend(["", "## Guardrails"]) + lines.extend(f"- {item}" for item in skill["guardrails"]) + lines.extend( + [ + "", + "## Default Flow", + "", + "1. Confirm the user intent and whether the action is read-only or state-changing.", + "2. Use the narrowest available tool scope and collect only the context needed for the task.", + "3. For state-changing or external actions, stop for explicit approval before acting.", + "4. Summarize what changed or what was learned, including relevant object IDs or links.", + "", + ] + ) + return "\n".join(lines) + + +def coven_manifest(plugin: dict[str, Any]) -> dict[str, Any]: + manifest: dict[str, Any] = { + "name": plugin["name"], + "version": plugin["version"], + "description": plugin["description"], + "author": {"name": "OpenCoven"}, + "homepage": "https://opencoven.ai", + "repository": "https://github.com/OpenCoven/coven-code", + "license": "GPL-3.0", + "keywords": plugin.get("keywords", []), + "capabilities": plugin.get("capabilities", []), + "marketplaceId": f"opencoven/{plugin['name']}", + "x-coven": { + "displayName": plugin["displayName"], + "category": plugin["category"], + "trust": plugin["trust"], + "sourceRefs": plugin.get("sourceRefs", []), + "roleAffinity": plugin.get("roleAffinity", []), + "compatibility": { + "covenCaveCanonical": True, + "covenCode": True, + "codex": True, + "mcp": bool(plugin.get("mcpServers")), + "rolePatch": bool(plugin.get("roleAffinity")), + }, + }, + } + if plugin.get("mcpServers"): + manifest["mcpServers"] = plugin["mcpServers"] + if plugin.get("userConfig"): + manifest["userConfig"] = plugin["userConfig"] + return manifest + + +def codex_manifest(plugin: dict[str, Any]) -> dict[str, Any]: + return { + "name": plugin["name"], + "version": plugin["version"], + "description": plugin["description"], + "author": {"name": "OpenCoven"}, + "skills": "./skills/", + "interface": { + "displayName": plugin["displayName"], + "shortDescription": plugin["description"], + "longDescription": plugin["skill"]["description"], + "developerName": "OpenCoven", + "category": plugin["category"], + "capabilities": plugin.get("keywords", []), + "defaultPrompt": f"Help me use {plugin['displayName']} safely.", + }, + } + + +def package_files(catalog: dict[str, Any]) -> dict[Path, str]: + files: dict[Path, str] = {} + for plugin in catalog["plugins"]: + package_dir = PLUGIN_ROOT / plugin["name"] + files[package_dir / "plugin.json"] = dump_json(coven_manifest(plugin)) + files[package_dir / "skills" / plugin["name"] / "SKILL.md"] = skill_markdown(plugin) + files[package_dir / ".codex-plugin" / "plugin.json"] = dump_json(codex_manifest(plugin)) + return files + + +def marketplace_files(catalog: dict[str, Any]) -> dict[Path, str]: + plugins = catalog["plugins"] + root_marketplace = { + "schemaVersion": "opencoven.marketplace.v1", + "name": catalog["name"], + "interface": { + "displayName": catalog["displayName"], + "description": catalog["description"], + }, + "plugins": [ + { + "name": plugin["name"], + "displayName": plugin["displayName"], + "category": plugin["category"], + "source": {"source": "local", "path": f"./plugins/{plugin['name']}"}, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL", + }, + "trust": plugin["trust"], + "roleAffinity": plugin.get("roleAffinity", []), + } + for plugin in plugins + ], + } + codex_marketplace = { + "name": "opencoven-first-party", + "interface": {"displayName": "OpenCoven First-Party"}, + "plugins": [ + { + "name": plugin["name"], + "source": {"source": "local", "path": f"../../plugins/{plugin['name']}"}, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL", + }, + "category": plugin["category"], + } + for plugin in plugins + ], + } + mcp_servers: dict[str, Any] = {} + for plugin in plugins: + for name, server in plugin.get("mcpServers", {}).items(): + mcp_servers[name] = server + role_affinity = { + plugin["name"]: plugin.get("roleAffinity", []) + for plugin in plugins + if plugin.get("roleAffinity") + } + return { + MARKETPLACE / "marketplace.json": dump_json(root_marketplace), + EXPORT_ROOT / "codex" / "marketplace.json": dump_json(codex_marketplace), + EXPORT_ROOT / "mcp" / "mcp.json": dump_json({"mcpServers": mcp_servers}), + EXPORT_ROOT / "roles" / "role-affinity.json": dump_json(role_affinity), + } + + +def expected_files(catalog: dict[str, Any]) -> dict[Path, str]: + files = package_files(catalog) + files.update(marketplace_files(catalog)) + return files + + +def write_files(files: dict[Path, str]) -> None: + for path, content in sorted(files.items()): + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(content, encoding="utf-8") + + +def check_files(files: dict[Path, str]) -> list[str]: + problems: list[str] = [] + for path, expected in sorted(files.items()): + if not path.exists(): + problems.append(f"missing {path.relative_to(ROOT)}") + continue + actual = path.read_text(encoding="utf-8") + if actual != expected: + problems.append(f"stale {path.relative_to(ROOT)}") + return problems + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--check", action="store_true", help="verify generated marketplace files are up to date") + args = parser.parse_args() + + try: + catalog = load_catalog() + files = expected_files(catalog) + if args.check: + problems = check_files(files) + if problems: + for problem in problems: + print(problem, file=sys.stderr) + return 1 + print(f"marketplace_ok files={len(files)} plugins={len(catalog['plugins'])}") + return 0 + write_files(files) + print(f"marketplace_synced files={len(files)} plugins={len(catalog['plugins'])}") + return 0 + except Exception as exc: + print(f"marketplace_error: {exc}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src-rust/crates/plugins/src/manifest.rs b/src-rust/crates/plugins/src/manifest.rs index dce9dde..59fd044 100644 --- a/src-rust/crates/plugins/src/manifest.rs +++ b/src-rust/crates/plugins/src/manifest.rs @@ -444,3 +444,42 @@ fn normalize_manifest_json(mut v: serde_json::Value) -> serde_json::Value { serde_json::Value::Object(obj.clone()) } + +#[cfg(test)] +mod tests { + use super::PluginManifest; + use std::path::Path; + + #[test] + fn generated_marketplace_plugin_manifests_parse() { + let crate_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + let repo_root = crate_dir + .parent() + .and_then(Path::parent) + .and_then(Path::parent) + .expect("crate lives under src-rust/crates/plugins"); + let plugins_dir = repo_root.join("marketplace").join("plugins"); + let entries = + std::fs::read_dir(&plugins_dir).expect("marketplace/plugins directory exists"); + + let mut parsed = 0; + for entry in entries { + let entry = entry.expect("marketplace plugin entry is readable"); + let manifest_path = entry.path().join("plugin.json"); + if !manifest_path.is_file() { + continue; + } + let bytes = std::fs::read(&manifest_path).expect("plugin manifest is readable"); + let manifest = PluginManifest::from_json(&bytes) + .unwrap_or_else(|err| panic!("{} failed to parse: {err}", manifest_path.display())); + assert_eq!( + manifest.name, + entry.file_name().to_string_lossy(), + "manifest name should match package directory" + ); + parsed += 1; + } + + assert_eq!(parsed, 14); + } +}