@areca-cms/skills 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +54 -2
- package/dist/agents.d.ts +53 -0
- package/dist/agents.js +302 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +326 -0
- package/dist/install.d.ts +18 -0
- package/dist/install.js +58 -0
- package/dist/mcp-config.d.ts +20 -0
- package/dist/mcp-config.js +97 -0
- package/dist/skills.d.ts +16 -0
- package/dist/skills.js +55 -0
- package/dist/zip.d.ts +6 -0
- package/dist/zip.js +51 -0
- package/package.json +51 -3
- package/skills/areca-mcp/SKILL.md +72 -0
- package/skills/areca-mcp/references/connect.md +66 -0
- package/skills/areca-mcp/references/content.md +69 -0
- package/skills/areca-mcp/references/tools.md +65 -0
- package/skills/areca-sdk/SKILL.md +148 -0
- package/skills/areca-sdk/references/api.md +68 -0
- package/skills/areca-sdk/references/production.md +88 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Areca CMS contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,55 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@areca-cms/skills`
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Agent skills that teach AI coding agents and chat apps how to work with Areca CMS:
|
|
4
|
+
|
|
5
|
+
| Skill | Teaches |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| `areca-sdk` | Connecting a website with `@areca-cms/site-sdk`: tokens and env vars, `areca.config.ts`, the `areca` CLI, reading content, rich text, SEO, preview routes, Go-live builds |
|
|
8
|
+
| `areca-mcp` | Connecting an AI to a site's MCP server and using it: OAuth and personal keys, roles, the draft/ready/live workflow, field formats, SEO, images, every tool |
|
|
9
|
+
|
|
10
|
+
The skills are plain `SKILL.md` folders in the open [Agent Skills](https://agentskills.io) format. They have no scripts and no dependencies, so they work in any project.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx @areca-cms/skills
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Pick your agents in the selector (agents found in the project are preselected), then choose the skills and project or user scope. You can optionally add the site's MCP connector URL as well. Only the URL is written, never a secret, and each agent signs in to Areca in the browser on first use.
|
|
19
|
+
|
|
20
|
+
Non-interactive:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx @areca-cms/skills add -a claude-code,codex,cursor -y
|
|
24
|
+
npx @areca-cms/skills add -a claude-code --mcp-url https://cms.example.com/api/mcp/acme-site -y
|
|
25
|
+
npx @areca-cms/skills add -a codex --global -y # user-level folders
|
|
26
|
+
npx @areca-cms/skills mcp -a cursor --url https://cms.example.com/api/mcp/acme-site
|
|
27
|
+
npx @areca-cms/skills export --out ./zips # Claude app / ChatGPT uploads
|
|
28
|
+
npx @areca-cms/skills remove -a claude-code -y
|
|
29
|
+
npx @areca-cms/skills list # agent ids and folders
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Agents that share a folder get one copy. For example, Codex, Cursor, Copilot, Gemini CLI and OpenCode all read `.agents/skills`. Re-running `add` updates the skills in place, and `remove` deletes only `areca-*` folders.
|
|
33
|
+
|
|
34
|
+
## Supported agents
|
|
35
|
+
|
|
36
|
+
**Coding agents:** Claude Code, Codex, Cursor, GitHub Copilot, OpenCode, Gemini CLI, Windsurf, Antigravity, Cline, Roo Code, Kilo Code, Kiro, Amp, Factory Droid, Goose, JetBrains Junie, Continue, Augment, Zed, Trae, Warp, OpenHands, Qwen Code, plus any other agent that reads `.agents/skills`.
|
|
37
|
+
|
|
38
|
+
**Chat apps:** the Claude app (web and desktop) and ChatGPT. Choosing one exports one `.zip` per skill:
|
|
39
|
+
|
|
40
|
+
- Claude: Customize > Skills > + > Upload a skill (code execution must be on).
|
|
41
|
+
- ChatGPT: Skills > Create > Upload from your computer.
|
|
42
|
+
|
|
43
|
+
MCP config is written to the project file for Claude Code (`.mcp.json`), Cursor, VS Code and Copilot, Codex, OpenCode, Gemini CLI, Roo Code, Kiro, Factory, Junie, Continue and Qwen Code. Agents with only a user-level config or a settings UI get the snippet printed instead.
|
|
44
|
+
|
|
45
|
+
## Other ways to install
|
|
46
|
+
|
|
47
|
+
- **Claude Code plugin:** `/plugin marketplace add ekozf/areca-cms`, then `/plugin install areca@areca-cms`.
|
|
48
|
+
- **skills CLI:** `npx skills add ekozf/areca-cms --skill areca-sdk --skill areca-mcp`.
|
|
49
|
+
- **Manually:** copy `skills/areca-*` from the repository into your agent's skills folder.
|
|
50
|
+
|
|
51
|
+
## Development
|
|
52
|
+
|
|
53
|
+
The skill source lives in the repository root under `skills/`. The build copies it into this package. `pnpm test` checks the skills against the agentskills.io spec, and also checks that every SDK export, CLI command, env var and MCP tool in the monorepo is documented, and that no removed tool still is.
|
|
54
|
+
|
|
55
|
+
Releases are automated; see [Releasing packages](../../docs/DEVELOPMENT.md#releasing-packages). The release PR bumps `version` here, in `.claude-plugin/plugin.json` and in each `SKILL.md` `metadata.version` together (the tests enforce that they match). Commits under `packages/skills/`, `skills/` and `.claude-plugin/` count towards a skills release.
|
package/dist/agents.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where each agent reads Agent Skills (SKILL.md folders) and how it registers a
|
|
3
|
+
* remote MCP server. Project paths are relative to the repo; global paths are
|
|
4
|
+
* relative to the home directory. Agents that share `.agents/skills` dedupe to
|
|
5
|
+
* one copy on install.
|
|
6
|
+
*/
|
|
7
|
+
export type McpTarget =
|
|
8
|
+
/** Merge `{ [key]: { [name]: entry } }` into a JSON file in the project. */
|
|
9
|
+
{
|
|
10
|
+
kind: 'json';
|
|
11
|
+
file: string;
|
|
12
|
+
key: string;
|
|
13
|
+
entry: (url: string) => Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/** Append `[mcp_servers.<name>]` to a TOML file in the project. */
|
|
16
|
+
| {
|
|
17
|
+
kind: 'toml';
|
|
18
|
+
file: string;
|
|
19
|
+
}
|
|
20
|
+
/** Write a standalone YAML file per server in the project. */
|
|
21
|
+
| {
|
|
22
|
+
kind: 'yaml';
|
|
23
|
+
dir: string;
|
|
24
|
+
}
|
|
25
|
+
/** No project config: print where and what to add. */
|
|
26
|
+
| {
|
|
27
|
+
kind: 'manual';
|
|
28
|
+
where: string;
|
|
29
|
+
snippet: (name: string, url: string) => string;
|
|
30
|
+
};
|
|
31
|
+
export type AgentGroup = 'popular' | 'more' | 'chat';
|
|
32
|
+
export type Agent = {
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
group: AgentGroup;
|
|
36
|
+
/** Project skills dir. Absent for chat apps (zip upload only). */
|
|
37
|
+
projectDir?: string;
|
|
38
|
+
/** User-level skills dir, relative to `~`. */
|
|
39
|
+
globalDir?: string;
|
|
40
|
+
/** Paths whose presence suggests the agent is used in this project. */
|
|
41
|
+
detect: string[];
|
|
42
|
+
/** MCP registration. Multiple entries when an agent reads several files. */
|
|
43
|
+
mcp: McpTarget[];
|
|
44
|
+
/** Shown after install, e.g. how to sign in to the MCP server. */
|
|
45
|
+
after?: string;
|
|
46
|
+
};
|
|
47
|
+
export declare const AGENTS: Agent[];
|
|
48
|
+
export declare const GROUP_LABELS: Record<AgentGroup, string>;
|
|
49
|
+
export declare function findAgent(id: string): Agent | undefined;
|
|
50
|
+
/** `areca-<slug>` from a connector URL `…/api/mcp/<slug>`, matching the CMS install buttons. */
|
|
51
|
+
export declare function mcpServerName(connectorUrl: string): string;
|
|
52
|
+
/** Accepts `https://cms/api/mcp/<slug>` (or http on localhost). Returns an error message or undefined. */
|
|
53
|
+
export declare function validateConnectorUrl(value: string): string | undefined;
|
package/dist/agents.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where each agent reads Agent Skills (SKILL.md folders) and how it registers a
|
|
3
|
+
* remote MCP server. Project paths are relative to the repo; global paths are
|
|
4
|
+
* relative to the home directory. Agents that share `.agents/skills` dedupe to
|
|
5
|
+
* one copy on install.
|
|
6
|
+
*/
|
|
7
|
+
const json = (file, key, entry) => ({
|
|
8
|
+
kind: 'json',
|
|
9
|
+
file,
|
|
10
|
+
key,
|
|
11
|
+
entry,
|
|
12
|
+
});
|
|
13
|
+
const manual = (where, snippet) => ({
|
|
14
|
+
kind: 'manual',
|
|
15
|
+
where,
|
|
16
|
+
snippet,
|
|
17
|
+
});
|
|
18
|
+
const jsonSnippet = (key, entry) => (name) => JSON.stringify({ [key]: { [name]: entry } }, null, 2);
|
|
19
|
+
const httpEntry = (url) => ({ type: 'http', url });
|
|
20
|
+
const urlEntry = (url) => ({ url });
|
|
21
|
+
const settingsUi = manual('the MCP settings screen', (name, url) => `Add a remote (Streamable HTTP) server named ${name} with URL ${url}`);
|
|
22
|
+
export const AGENTS = [
|
|
23
|
+
{
|
|
24
|
+
id: 'claude-code',
|
|
25
|
+
label: 'Claude Code',
|
|
26
|
+
group: 'popular',
|
|
27
|
+
projectDir: '.claude/skills',
|
|
28
|
+
globalDir: '.claude/skills',
|
|
29
|
+
detect: ['.claude', 'CLAUDE.md', '.mcp.json'],
|
|
30
|
+
mcp: [json('.mcp.json', 'mcpServers', httpEntry)],
|
|
31
|
+
after: 'Claude Code: run /mcp, pick the Areca server and choose Authenticate.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'codex',
|
|
35
|
+
label: 'Codex (CLI, IDE, app)',
|
|
36
|
+
group: 'popular',
|
|
37
|
+
projectDir: '.agents/skills',
|
|
38
|
+
globalDir: '.agents/skills',
|
|
39
|
+
detect: ['.codex', 'AGENTS.md'],
|
|
40
|
+
mcp: [{ kind: 'toml', file: '.codex/config.toml' }],
|
|
41
|
+
after: 'Codex: run `codex mcp login <name>` (project config needs a trusted project).',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'cursor',
|
|
45
|
+
label: 'Cursor',
|
|
46
|
+
group: 'popular',
|
|
47
|
+
projectDir: '.agents/skills',
|
|
48
|
+
globalDir: '.cursor/skills',
|
|
49
|
+
detect: ['.cursor', '.cursorrules'],
|
|
50
|
+
mcp: [json('.cursor/mcp.json', 'mcpServers', urlEntry)],
|
|
51
|
+
after: 'Cursor: enable the server in Settings > MCP and sign in when asked.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'github-copilot',
|
|
55
|
+
label: 'GitHub Copilot (VS Code, CLI)',
|
|
56
|
+
group: 'popular',
|
|
57
|
+
projectDir: '.agents/skills',
|
|
58
|
+
globalDir: '.copilot/skills',
|
|
59
|
+
detect: ['.github/copilot-instructions.md', '.github/skills', '.vscode/mcp.json'],
|
|
60
|
+
mcp: [json('.vscode/mcp.json', 'servers', httpEntry), json('.mcp.json', 'mcpServers', httpEntry)],
|
|
61
|
+
after: 'VS Code: start the server from .vscode/mcp.json and sign in when asked.',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 'opencode',
|
|
65
|
+
label: 'OpenCode',
|
|
66
|
+
group: 'popular',
|
|
67
|
+
projectDir: '.agents/skills',
|
|
68
|
+
globalDir: '.config/opencode/skills',
|
|
69
|
+
detect: ['opencode.json', 'opencode.jsonc', '.opencode'],
|
|
70
|
+
mcp: [json('opencode.json', 'mcp', (url) => ({ type: 'remote', url, enabled: true }))],
|
|
71
|
+
after: 'OpenCode: run `opencode mcp auth <name>`.',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'gemini-cli',
|
|
75
|
+
label: 'Gemini CLI',
|
|
76
|
+
group: 'popular',
|
|
77
|
+
projectDir: '.agents/skills',
|
|
78
|
+
globalDir: '.gemini/skills',
|
|
79
|
+
detect: ['.gemini', 'GEMINI.md'],
|
|
80
|
+
mcp: [json('.gemini/settings.json', 'mcpServers', (url) => ({ httpUrl: url }))],
|
|
81
|
+
after: 'Gemini CLI: run `/mcp auth <name>`.',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: 'windsurf',
|
|
85
|
+
label: 'Windsurf',
|
|
86
|
+
group: 'popular',
|
|
87
|
+
projectDir: '.windsurf/skills',
|
|
88
|
+
globalDir: '.codeium/windsurf/skills',
|
|
89
|
+
detect: ['.windsurf', '.windsurfrules'],
|
|
90
|
+
mcp: [
|
|
91
|
+
manual('~/.codeium/windsurf/mcp_config.json', (name, url) => jsonSnippet('mcpServers', { serverUrl: url })(name)),
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'antigravity',
|
|
96
|
+
label: 'Antigravity (IDE, CLI)',
|
|
97
|
+
group: 'more',
|
|
98
|
+
projectDir: '.agents/skills',
|
|
99
|
+
globalDir: '.gemini/antigravity/skills',
|
|
100
|
+
detect: [],
|
|
101
|
+
mcp: [settingsUi],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'cline',
|
|
105
|
+
label: 'Cline',
|
|
106
|
+
group: 'more',
|
|
107
|
+
projectDir: '.cline/skills',
|
|
108
|
+
globalDir: '.cline/skills',
|
|
109
|
+
detect: ['.cline', '.clinerules'],
|
|
110
|
+
mcp: [
|
|
111
|
+
manual('Cline > MCP Servers > Configure (cline_mcp_settings.json)', (name, url) => jsonSnippet('mcpServers', { type: 'streamableHttp', url })(name)),
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: 'roo',
|
|
116
|
+
label: 'Roo Code',
|
|
117
|
+
group: 'more',
|
|
118
|
+
projectDir: '.roo/skills',
|
|
119
|
+
globalDir: '.roo/skills',
|
|
120
|
+
detect: ['.roo', '.roorules'],
|
|
121
|
+
mcp: [json('.roo/mcp.json', 'mcpServers', (url) => ({ type: 'streamable-http', url }))],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: 'kilo',
|
|
125
|
+
label: 'Kilo Code',
|
|
126
|
+
group: 'more',
|
|
127
|
+
projectDir: '.agents/skills',
|
|
128
|
+
globalDir: '.kilo/skills',
|
|
129
|
+
detect: ['.kilocode'],
|
|
130
|
+
mcp: [settingsUi],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: 'kiro',
|
|
134
|
+
label: 'Kiro',
|
|
135
|
+
group: 'more',
|
|
136
|
+
projectDir: '.kiro/skills',
|
|
137
|
+
globalDir: '.kiro/skills',
|
|
138
|
+
detect: ['.kiro'],
|
|
139
|
+
mcp: [json('.kiro/settings/mcp.json', 'mcpServers', urlEntry)],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: 'amp',
|
|
143
|
+
label: 'Amp',
|
|
144
|
+
group: 'more',
|
|
145
|
+
projectDir: '.agents/skills',
|
|
146
|
+
globalDir: '.config/agents/skills',
|
|
147
|
+
detect: ['.amp'],
|
|
148
|
+
mcp: [
|
|
149
|
+
manual('.amp/settings.json or your Amp user settings', (name, url) => jsonSnippet('amp.mcpServers', { url })(name)),
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: 'factory',
|
|
154
|
+
label: 'Factory Droid',
|
|
155
|
+
group: 'more',
|
|
156
|
+
projectDir: '.factory/skills',
|
|
157
|
+
globalDir: '.factory/skills',
|
|
158
|
+
detect: ['.factory'],
|
|
159
|
+
mcp: [json('.factory/mcp.json', 'mcpServers', httpEntry)],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: 'goose',
|
|
163
|
+
label: 'Goose',
|
|
164
|
+
group: 'more',
|
|
165
|
+
projectDir: '.agents/skills',
|
|
166
|
+
globalDir: '.agents/skills',
|
|
167
|
+
detect: ['.goosehints'],
|
|
168
|
+
mcp: [
|
|
169
|
+
manual('~/.config/goose/config.yaml', (name, url) => `extensions:\n ${name}:\n name: ${name}\n type: streamable_http\n uri: ${url}\n enabled: true`),
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
id: 'junie',
|
|
174
|
+
label: 'JetBrains Junie',
|
|
175
|
+
group: 'more',
|
|
176
|
+
projectDir: '.junie/skills',
|
|
177
|
+
globalDir: '.junie/skills',
|
|
178
|
+
detect: ['.junie'],
|
|
179
|
+
mcp: [json('.junie/mcp/mcp.json', 'mcpServers', urlEntry)],
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'continue',
|
|
183
|
+
label: 'Continue',
|
|
184
|
+
group: 'more',
|
|
185
|
+
projectDir: '.continue/skills',
|
|
186
|
+
globalDir: '.continue/skills',
|
|
187
|
+
detect: ['.continue'],
|
|
188
|
+
mcp: [{ kind: 'yaml', dir: '.continue/mcpServers' }],
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: 'augment',
|
|
192
|
+
label: 'Augment (Auggie)',
|
|
193
|
+
group: 'more',
|
|
194
|
+
projectDir: '.augment/skills',
|
|
195
|
+
globalDir: '.augment/skills',
|
|
196
|
+
detect: ['.augment', '.augment-guidelines'],
|
|
197
|
+
mcp: [manual('~/.augment/settings.json', (name, url) => jsonSnippet('mcpServers', httpEntry(url))(name))],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
id: 'zed',
|
|
201
|
+
label: 'Zed',
|
|
202
|
+
group: 'more',
|
|
203
|
+
projectDir: '.agents/skills',
|
|
204
|
+
globalDir: '.agents/skills',
|
|
205
|
+
detect: ['.zed', '.rules'],
|
|
206
|
+
mcp: [manual('~/.config/zed/settings.json', (name, url) => jsonSnippet('context_servers', { url })(name))],
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: 'trae',
|
|
210
|
+
label: 'Trae',
|
|
211
|
+
group: 'more',
|
|
212
|
+
projectDir: '.trae/skills',
|
|
213
|
+
globalDir: '.trae/skills',
|
|
214
|
+
detect: ['.trae'],
|
|
215
|
+
mcp: [settingsUi],
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
id: 'warp',
|
|
219
|
+
label: 'Warp',
|
|
220
|
+
group: 'more',
|
|
221
|
+
projectDir: '.agents/skills',
|
|
222
|
+
globalDir: '.agents/skills',
|
|
223
|
+
detect: ['WARP.md'],
|
|
224
|
+
mcp: [settingsUi],
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: 'openhands',
|
|
228
|
+
label: 'OpenHands',
|
|
229
|
+
group: 'more',
|
|
230
|
+
projectDir: '.openhands/skills',
|
|
231
|
+
globalDir: '.openhands/skills',
|
|
232
|
+
detect: ['.openhands'],
|
|
233
|
+
mcp: [settingsUi],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: 'qwen-code',
|
|
237
|
+
label: 'Qwen Code',
|
|
238
|
+
group: 'more',
|
|
239
|
+
projectDir: '.qwen/skills',
|
|
240
|
+
globalDir: '.qwen/skills',
|
|
241
|
+
detect: ['.qwen', 'QWEN.md'],
|
|
242
|
+
mcp: [json('.qwen/settings.json', 'mcpServers', (url) => ({ httpUrl: url }))],
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
id: 'universal',
|
|
246
|
+
label: 'Other / generic agent (.agents/skills)',
|
|
247
|
+
group: 'more',
|
|
248
|
+
projectDir: '.agents/skills',
|
|
249
|
+
globalDir: '.agents/skills',
|
|
250
|
+
detect: [],
|
|
251
|
+
mcp: [manual('your agent\'s MCP config', (name, url) => jsonSnippet('mcpServers', { url })(name))],
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
id: 'claude-app',
|
|
255
|
+
label: 'Claude app (web, desktop)',
|
|
256
|
+
group: 'chat',
|
|
257
|
+
detect: [],
|
|
258
|
+
mcp: [],
|
|
259
|
+
after: 'Claude app: Customize > Skills > + > Upload a skill, once per zip (needs "Code execution" on). Connect the MCP under Customize > Connectors > Add custom connector.',
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
id: 'chatgpt',
|
|
263
|
+
label: 'ChatGPT',
|
|
264
|
+
group: 'chat',
|
|
265
|
+
detect: [],
|
|
266
|
+
mcp: [],
|
|
267
|
+
after: 'ChatGPT: Skills > Create > Upload from your computer, once per zip (workspace admins may need to allow skill uploads). Connect the MCP under Settings > Apps > Create (Developer mode).',
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
export const GROUP_LABELS = {
|
|
271
|
+
popular: 'Popular coding agents',
|
|
272
|
+
more: 'More coding agents',
|
|
273
|
+
chat: 'Chat apps (exports .zip to upload)',
|
|
274
|
+
};
|
|
275
|
+
export function findAgent(id) {
|
|
276
|
+
return AGENTS.find((agent) => agent.id === id);
|
|
277
|
+
}
|
|
278
|
+
/** `areca-<slug>` from a connector URL `…/api/mcp/<slug>`, matching the CMS install buttons. */
|
|
279
|
+
export function mcpServerName(connectorUrl) {
|
|
280
|
+
const slug = new URL(connectorUrl).pathname.split('/').filter(Boolean).at(-1) ?? '';
|
|
281
|
+
const clean = slug
|
|
282
|
+
.toLowerCase()
|
|
283
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
284
|
+
.replace(/^-+|-+$/g, '');
|
|
285
|
+
return `areca-${clean || 'site'}`;
|
|
286
|
+
}
|
|
287
|
+
/** Accepts `https://cms/api/mcp/<slug>` (or http on localhost). Returns an error message or undefined. */
|
|
288
|
+
export function validateConnectorUrl(value) {
|
|
289
|
+
let url;
|
|
290
|
+
try {
|
|
291
|
+
url = new URL(value);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return 'Enter a full URL, e.g. https://cms.example.com/api/mcp/acme-site';
|
|
295
|
+
}
|
|
296
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:')
|
|
297
|
+
return 'Use an http(s) URL';
|
|
298
|
+
if (!/\/api\/mcp\/[^/]+\/?$/.test(url.pathname)) {
|
|
299
|
+
return 'Use the connector URL from Connect AI: <cms>/api/mcp/<site-slug>';
|
|
300
|
+
}
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
package/dist/cli.d.ts
ADDED