agent-config-sync 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 +174 -0
- package/dist/catalog.d.ts +65 -0
- package/dist/catalog.js +328 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli-catalog.d.ts +70 -0
- package/dist/cli-catalog.js +433 -0
- package/dist/cli-catalog.js.map +1 -0
- package/dist/cli-diagnostics.d.ts +14 -0
- package/dist/cli-diagnostics.js +177 -0
- package/dist/cli-diagnostics.js.map +1 -0
- package/dist/cli-mcp.d.ts +38 -0
- package/dist/cli-mcp.js +179 -0
- package/dist/cli-mcp.js.map +1 -0
- package/dist/cli-skill.d.ts +51 -0
- package/dist/cli-skill.js +239 -0
- package/dist/cli-skill.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +733 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-adapters.d.ts +32 -0
- package/dist/config-adapters.js +409 -0
- package/dist/config-adapters.js.map +1 -0
- package/dist/fs.d.ts +2 -0
- package/dist/fs.js +20 -0
- package/dist/fs.js.map +1 -0
- package/dist/project-discovery.d.ts +24 -0
- package/dist/project-discovery.js +129 -0
- package/dist/project-discovery.js.map +1 -0
- package/dist/registry.d.ts +49 -0
- package/dist/registry.js +121 -0
- package/dist/registry.js.map +1 -0
- package/dist/skill-adapters.d.ts +53 -0
- package/dist/skill-adapters.js +183 -0
- package/dist/skill-adapters.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Daisuke Yamashiki
|
|
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
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# agent-config-sync
|
|
2
|
+
|
|
3
|
+
`acsync` is a cross-agent configuration manager for MCP servers and skills. Unlike manifest-based tools, `acsync` directly edits native config files in your project—no intermediate manifest, no "sync" step.
|
|
4
|
+
|
|
5
|
+
## Design Principles
|
|
6
|
+
|
|
7
|
+
> **`acsync` is a config manager, not a renderer.**
|
|
8
|
+
|
|
9
|
+
- **Native config files are the source of truth** — `.mcp.json`, `.codex/config.toml`, etc.
|
|
10
|
+
- **No project-side `acsync` files** — all tool state lives in `~/.acsync/`
|
|
11
|
+
- **Direct editing** — commands mutate native configs atomically
|
|
12
|
+
- **Works from any directory** — project discovery via Git root or native config files
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# Install
|
|
18
|
+
npm install -g agent-config-sync
|
|
19
|
+
|
|
20
|
+
# Add an MCP server to your project
|
|
21
|
+
acsync mcp add @modelcontextprotocol/server-github --targets claude
|
|
22
|
+
|
|
23
|
+
# Add a skill from GitHub
|
|
24
|
+
acsync skill install https://github.com/anthropics/skills/tree/main/skill-creator
|
|
25
|
+
|
|
26
|
+
# See what's configured
|
|
27
|
+
acsync mcp
|
|
28
|
+
acsync skill
|
|
29
|
+
|
|
30
|
+
# List catalog entries
|
|
31
|
+
acsync catalog mcp list
|
|
32
|
+
acsync catalog skill list
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Commands
|
|
36
|
+
|
|
37
|
+
### `acsync mcp`
|
|
38
|
+
|
|
39
|
+
Manage MCP servers for the current project.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Show status (default)
|
|
43
|
+
acsync mcp
|
|
44
|
+
|
|
45
|
+
# Add a server
|
|
46
|
+
acsync mcp add @modelcontextprotocol/server-github --targets claude,codex
|
|
47
|
+
|
|
48
|
+
# Remove a server
|
|
49
|
+
acsync mcp remove @modelcontextprotocol/server-github
|
|
50
|
+
|
|
51
|
+
# Enable/disable for specific targets
|
|
52
|
+
acsync mcp disable github --targets claude
|
|
53
|
+
acsync mcp enable github --targets codex
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### `acsync skill`
|
|
57
|
+
|
|
58
|
+
Manage skills for the current project.
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Show status (default)
|
|
62
|
+
acsync skill
|
|
63
|
+
|
|
64
|
+
# Add a skill from catalog
|
|
65
|
+
acsync skill add skill-creator --targets claude,codex
|
|
66
|
+
|
|
67
|
+
# Install a skill from GitHub
|
|
68
|
+
acsync skill install https://github.com/anthropics/skills/tree/main/frontend-design
|
|
69
|
+
|
|
70
|
+
# Remove a skill
|
|
71
|
+
acsync skill remove frontend-design
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### `acsync catalog mcp`
|
|
75
|
+
|
|
76
|
+
Manage reusable MCP definitions in your local catalog (`~/.acsync/`).
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# List all catalog entries
|
|
80
|
+
acsync catalog mcp list
|
|
81
|
+
|
|
82
|
+
# Show details
|
|
83
|
+
acsync catalog mcp show @modelcontextprotocol/server-github
|
|
84
|
+
|
|
85
|
+
# Add to catalog
|
|
86
|
+
acsync catalog mcp add @modelcontextprotocol/server-github
|
|
87
|
+
|
|
88
|
+
# Remove from catalog
|
|
89
|
+
acsync catalog mcp remove @modelcontextprotocol/server-github
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### `acsync catalog skill`
|
|
93
|
+
|
|
94
|
+
Manage reusable skill definitions in your local catalog.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# List all catalog entries
|
|
98
|
+
acsync catalog skill list
|
|
99
|
+
|
|
100
|
+
# Show details
|
|
101
|
+
acsync catalog skill show skill-creator
|
|
102
|
+
|
|
103
|
+
# Add to catalog from file
|
|
104
|
+
acsync catalog skill add my-skill --file ./skills/my-skill/SKILL.md
|
|
105
|
+
|
|
106
|
+
# Import from local directory
|
|
107
|
+
acsync catalog skill import ~/.claude/skills/frontend-design
|
|
108
|
+
|
|
109
|
+
# Install from GitHub
|
|
110
|
+
acsync skill install https://github.com/anthropics/skills --name frontend-design
|
|
111
|
+
|
|
112
|
+
# Search skills.directory registry
|
|
113
|
+
acsync catalog skill search typescript
|
|
114
|
+
|
|
115
|
+
# Remove from catalog
|
|
116
|
+
acsync catalog skill remove skill-creator
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### `acsync validate`
|
|
120
|
+
|
|
121
|
+
Validate project configuration without making changes.
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
acsync validate # Warnings allowed
|
|
125
|
+
acsync validate --strict # Fail on warnings
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### `acsync doctor`
|
|
129
|
+
|
|
130
|
+
Run diagnostics and health checks.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
acsync doctor # Check only
|
|
134
|
+
acsync doctor --fix # Attempt auto-fix
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Supported Targets
|
|
138
|
+
|
|
139
|
+
| Target | Config File | MCP | Skills |
|
|
140
|
+
|--------|-------------|-----|--------|
|
|
141
|
+
| Claude Code | `.mcp.json` | ✓ | ✓ |
|
|
142
|
+
| Codex | `.codex/config.toml` | ✓ | ✓ |
|
|
143
|
+
| Gemini CLI | `.gemini/settings.json` | ✓ | ✓ |
|
|
144
|
+
|
|
145
|
+
## Architecture
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
~/.acsync/ # User-level catalog
|
|
149
|
+
├── catalog.json # Reusable MCP and skill definitions
|
|
150
|
+
├── catalog-schema.json # Schema versioning
|
|
151
|
+
└── catalog.lock # Concurrent access safety
|
|
152
|
+
|
|
153
|
+
my-project/ # Your project
|
|
154
|
+
├── .git/
|
|
155
|
+
├── .mcp.json # Claude Code MCP config (edited directly)
|
|
156
|
+
├── .claude/skills/ # Claude Code skills
|
|
157
|
+
│ └── <name>/SKILL.md
|
|
158
|
+
├── .codex/config.toml # Codex config (edited directly)
|
|
159
|
+
├── .codex/skills/ # Codex skills
|
|
160
|
+
│ └── <name>/SKILL.md
|
|
161
|
+
└── .gemini/settings.json # Gemini CLI config (edited directly)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Benefits
|
|
165
|
+
|
|
166
|
+
- **No extra files in projects** — git diff shows actual config changes
|
|
167
|
+
- **Easy to explain** — "edits `.mcp.json`" vs "generates from manifest"
|
|
168
|
+
- **Tool-agnostic** — remove `acsync` and your project still works
|
|
169
|
+
- **CI-friendly** — `acsync validate` for checking, no drift detection needed
|
|
170
|
+
- **Cross-agent** — manage MCP and skills across Claude Code, Codex, and Gemini CLI
|
|
171
|
+
|
|
172
|
+
## License
|
|
173
|
+
|
|
174
|
+
MIT
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { CatalogFile, McpCatalogEntry, SkillCatalogEntry } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get the catalog directory path for the current platform.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getCatalogDir(): string;
|
|
6
|
+
/**
|
|
7
|
+
* Get the catalog file path.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getCatalogPath(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Get the catalog schema file path.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getCatalogSchemaPath(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Get the catalog lock file path.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getCatalogLockPath(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize an empty catalog if it doesn't exist.
|
|
20
|
+
*/
|
|
21
|
+
export declare function initCatalog(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Load the catalog from disk.
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadCatalog(): Promise<CatalogFile>;
|
|
26
|
+
/**
|
|
27
|
+
* List all MCP entries in the catalog.
|
|
28
|
+
*/
|
|
29
|
+
export declare function listMcps(): Promise<McpCatalogEntry[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get a specific MCP entry by ID.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getMcp(id: string): Promise<McpCatalogEntry | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Add or update an MCP entry in the catalog.
|
|
36
|
+
*/
|
|
37
|
+
export declare function addMcp(entry: McpCatalogEntry): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Remove an MCP entry from the catalog.
|
|
40
|
+
*/
|
|
41
|
+
export declare function removeMcp(id: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Normalize an MCP package identifier into a catalog entry.
|
|
44
|
+
*/
|
|
45
|
+
export declare function normalizeMcpPackage(packageId: string, catalogEntry?: Partial<McpCatalogEntry>): McpCatalogEntry;
|
|
46
|
+
/**
|
|
47
|
+
* List all skill entries in the catalog.
|
|
48
|
+
*/
|
|
49
|
+
export declare function listSkills(): Promise<SkillCatalogEntry[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Get a specific skill entry by ID.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getSkill(id: string): Promise<SkillCatalogEntry | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Add or update a skill entry in the catalog.
|
|
56
|
+
*/
|
|
57
|
+
export declare function addSkill(entry: SkillCatalogEntry): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Remove a skill entry from the catalog.
|
|
60
|
+
*/
|
|
61
|
+
export declare function removeSkill(id: string): Promise<boolean>;
|
|
62
|
+
/**
|
|
63
|
+
* Normalize a skill identifier into a catalog entry.
|
|
64
|
+
*/
|
|
65
|
+
export declare function normalizeSkillPackage(packageId: string, content: string, catalogEntry?: Partial<SkillCatalogEntry>): SkillCatalogEntry;
|
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { CATALOG_VERSION } from './types.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Constants
|
|
7
|
+
// ============================================================================
|
|
8
|
+
/** Catalog directory name in user's home directory */
|
|
9
|
+
const CATALOG_DIR = '.acsync';
|
|
10
|
+
/** Maximum catalog file size (10MB) */
|
|
11
|
+
const MAX_CATALOG_SIZE = 10 * 1024 * 1024;
|
|
12
|
+
/** Catalog filename */
|
|
13
|
+
const CATALOG_FILE = 'catalog.json';
|
|
14
|
+
/** Catalog schema filename */
|
|
15
|
+
const CATALOG_SCHEMA_FILE = 'catalog-schema.json';
|
|
16
|
+
/** Catalog lock filename */
|
|
17
|
+
const CATALOG_LOCK_FILE = 'catalog.lock';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Path Resolution
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Get the catalog directory path for the current platform.
|
|
23
|
+
*/
|
|
24
|
+
export function getCatalogDir() {
|
|
25
|
+
const home = os.homedir();
|
|
26
|
+
return path.join(home, CATALOG_DIR);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the catalog file path.
|
|
30
|
+
*/
|
|
31
|
+
export function getCatalogPath() {
|
|
32
|
+
return path.join(getCatalogDir(), CATALOG_FILE);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the catalog schema file path.
|
|
36
|
+
*/
|
|
37
|
+
export function getCatalogSchemaPath() {
|
|
38
|
+
return path.join(getCatalogDir(), CATALOG_SCHEMA_FILE);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the catalog lock file path.
|
|
42
|
+
*/
|
|
43
|
+
export function getCatalogLockPath() {
|
|
44
|
+
return path.join(getCatalogDir(), CATALOG_LOCK_FILE);
|
|
45
|
+
}
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Catalog CRUD Operations
|
|
48
|
+
// ============================================================================
|
|
49
|
+
/**
|
|
50
|
+
* Initialize an empty catalog if it doesn't exist.
|
|
51
|
+
*/
|
|
52
|
+
export async function initCatalog() {
|
|
53
|
+
const catalogDir = getCatalogDir();
|
|
54
|
+
const catalogPath = getCatalogPath();
|
|
55
|
+
try {
|
|
56
|
+
await fs.access(catalogPath);
|
|
57
|
+
return; // Already exists
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Create catalog directory and file
|
|
61
|
+
}
|
|
62
|
+
await fs.mkdir(catalogDir, { recursive: true });
|
|
63
|
+
const emptyCatalog = {
|
|
64
|
+
$schema: `./${CATALOG_SCHEMA_FILE}`,
|
|
65
|
+
version: CATALOG_VERSION,
|
|
66
|
+
mcps: {},
|
|
67
|
+
skills: {},
|
|
68
|
+
};
|
|
69
|
+
await writeCatalogAtomic(emptyCatalog);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Load the catalog from disk.
|
|
73
|
+
*/
|
|
74
|
+
export async function loadCatalog() {
|
|
75
|
+
const catalogPath = getCatalogPath();
|
|
76
|
+
try {
|
|
77
|
+
await fs.access(catalogPath);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Initialize if doesn't exist
|
|
81
|
+
await initCatalog();
|
|
82
|
+
}
|
|
83
|
+
const raw = await fs.readFile(catalogPath, 'utf8');
|
|
84
|
+
// Check file size
|
|
85
|
+
if (raw.length > MAX_CATALOG_SIZE) {
|
|
86
|
+
throw new Error('Catalog file too large. Please clean up the catalog.');
|
|
87
|
+
}
|
|
88
|
+
const parsed = JSON.parse(raw);
|
|
89
|
+
// Validate version
|
|
90
|
+
if (parsed.version !== CATALOG_VERSION) {
|
|
91
|
+
throw new Error(`Unsupported catalog version: ${parsed.version}. Expected: ${CATALOG_VERSION}`);
|
|
92
|
+
}
|
|
93
|
+
// Ensure skills field exists (for backward compatibility)
|
|
94
|
+
if (!parsed.skills) {
|
|
95
|
+
parsed.skills = {};
|
|
96
|
+
}
|
|
97
|
+
return parsed;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Write the catalog to disk atomically.
|
|
101
|
+
*/
|
|
102
|
+
async function writeCatalogAtomic(catalog) {
|
|
103
|
+
const catalogPath = getCatalogPath();
|
|
104
|
+
const tempPath = `${catalogPath}.tmp`;
|
|
105
|
+
await fs.writeFile(tempPath, JSON.stringify(catalog, null, 2), 'utf8');
|
|
106
|
+
await fs.rename(tempPath, catalogPath);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* List all MCP entries in the catalog.
|
|
110
|
+
*/
|
|
111
|
+
export async function listMcps() {
|
|
112
|
+
const catalog = await loadCatalog();
|
|
113
|
+
return Object.values(catalog.mcps);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get a specific MCP entry by ID.
|
|
117
|
+
*/
|
|
118
|
+
export async function getMcp(id) {
|
|
119
|
+
const catalog = await loadCatalog();
|
|
120
|
+
return catalog.mcps[id] ?? null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Add or update an MCP entry in the catalog.
|
|
124
|
+
*/
|
|
125
|
+
export async function addMcp(entry) {
|
|
126
|
+
const catalog = await loadCatalog();
|
|
127
|
+
catalog.mcps[entry.id] = entry;
|
|
128
|
+
await writeCatalogAtomic(catalog);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Remove an MCP entry from the catalog.
|
|
132
|
+
*/
|
|
133
|
+
export async function removeMcp(id) {
|
|
134
|
+
const catalog = await loadCatalog();
|
|
135
|
+
if (!catalog.mcps[id]) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
delete catalog.mcps[id];
|
|
139
|
+
await writeCatalogAtomic(catalog);
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Normalize an MCP package identifier into a catalog entry.
|
|
144
|
+
*/
|
|
145
|
+
export function normalizeMcpPackage(packageId, catalogEntry) {
|
|
146
|
+
const now = new Date().toISOString();
|
|
147
|
+
// Build recipe from catalog entry or use default npx recipe
|
|
148
|
+
const recipe = catalogEntry?.recipe ?? {};
|
|
149
|
+
if (!recipe.url && !recipe.command) {
|
|
150
|
+
// Default: use npx for npm packages
|
|
151
|
+
recipe.command = 'npx';
|
|
152
|
+
recipe.args = ['-y', packageId];
|
|
153
|
+
recipe.transport = 'stdio';
|
|
154
|
+
}
|
|
155
|
+
else if (recipe.url && !recipe.transport) {
|
|
156
|
+
recipe.transport = 'http';
|
|
157
|
+
}
|
|
158
|
+
else if (!recipe.transport) {
|
|
159
|
+
recipe.transport = 'stdio';
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
id: packageId,
|
|
163
|
+
displayName: catalogEntry?.displayName ?? extractDisplayName(packageId),
|
|
164
|
+
description: catalogEntry?.description ?? `MCP server: ${packageId}`,
|
|
165
|
+
recipe,
|
|
166
|
+
addedAt: catalogEntry?.addedAt ?? now,
|
|
167
|
+
tags: catalogEntry?.tags ?? [],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extract a display name from a package ID.
|
|
172
|
+
*/
|
|
173
|
+
function extractDisplayName(packageId) {
|
|
174
|
+
// @modelcontextprotocol/server-github -> GitHub
|
|
175
|
+
// @upstash/context7-mcp -> Context7 MCP
|
|
176
|
+
const parts = packageId.split('/');
|
|
177
|
+
const lastPart = parts[parts.length - 1] ?? packageId;
|
|
178
|
+
// Remove common prefixes
|
|
179
|
+
const cleaned = lastPart
|
|
180
|
+
.replace(/^server-/, '')
|
|
181
|
+
.replace(/-mcp$/, '');
|
|
182
|
+
// Convert kebab-case to Title Case
|
|
183
|
+
return cleaned
|
|
184
|
+
.split('-')
|
|
185
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
186
|
+
.join(' ');
|
|
187
|
+
}
|
|
188
|
+
// ============================================================================
|
|
189
|
+
// Skill Catalog Operations
|
|
190
|
+
// ============================================================================
|
|
191
|
+
/**
|
|
192
|
+
* List all skill entries in the catalog.
|
|
193
|
+
*/
|
|
194
|
+
export async function listSkills() {
|
|
195
|
+
const catalog = await loadCatalog();
|
|
196
|
+
return Object.values(catalog.skills);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get a specific skill entry by ID.
|
|
200
|
+
*/
|
|
201
|
+
export async function getSkill(id) {
|
|
202
|
+
const catalog = await loadCatalog();
|
|
203
|
+
return catalog.skills[id] ?? null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Add or update a skill entry in the catalog.
|
|
207
|
+
*/
|
|
208
|
+
export async function addSkill(entry) {
|
|
209
|
+
const catalog = await loadCatalog();
|
|
210
|
+
catalog.skills[entry.id] = entry;
|
|
211
|
+
await writeCatalogAtomic(catalog);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Remove a skill entry from the catalog.
|
|
215
|
+
*/
|
|
216
|
+
export async function removeSkill(id) {
|
|
217
|
+
const catalog = await loadCatalog();
|
|
218
|
+
if (!catalog.skills[id]) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
delete catalog.skills[id];
|
|
222
|
+
await writeCatalogAtomic(catalog);
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Normalize a skill identifier into a catalog entry.
|
|
227
|
+
*/
|
|
228
|
+
export function normalizeSkillPackage(packageId, content, catalogEntry) {
|
|
229
|
+
const now = new Date().toISOString();
|
|
230
|
+
// Parse YAML frontmatter to extract name and description
|
|
231
|
+
const recipe = parseSkillFrontmatter(content);
|
|
232
|
+
return {
|
|
233
|
+
id: packageId,
|
|
234
|
+
displayName: catalogEntry?.displayName ?? recipe.name,
|
|
235
|
+
description: catalogEntry?.description ?? recipe.description,
|
|
236
|
+
recipe: {
|
|
237
|
+
...recipe,
|
|
238
|
+
content,
|
|
239
|
+
},
|
|
240
|
+
addedAt: catalogEntry?.addedAt ?? now,
|
|
241
|
+
tags: catalogEntry?.tags ?? [],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Parse YAML frontmatter from skill content.
|
|
246
|
+
*/
|
|
247
|
+
function parseSkillFrontmatter(content) {
|
|
248
|
+
const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/;
|
|
249
|
+
const match = content.match(frontmatterRegex);
|
|
250
|
+
if (!match) {
|
|
251
|
+
// No frontmatter found, return basic recipe
|
|
252
|
+
return {
|
|
253
|
+
name: 'unknown',
|
|
254
|
+
description: 'No description',
|
|
255
|
+
content,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
const yamlText = match[1];
|
|
259
|
+
const body = match[2];
|
|
260
|
+
const recipe = {
|
|
261
|
+
name: 'unknown',
|
|
262
|
+
description: '',
|
|
263
|
+
content,
|
|
264
|
+
};
|
|
265
|
+
// Parse YAML frontmatter with improved handling
|
|
266
|
+
const lines = yamlText.split(/\r?\n/);
|
|
267
|
+
let inMultiline = false;
|
|
268
|
+
let multilineKey = '';
|
|
269
|
+
let multilineValues = [];
|
|
270
|
+
for (const line of lines) {
|
|
271
|
+
// Skip empty lines and comments
|
|
272
|
+
if (!line.trim() || line.trim().startsWith('#')) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
// Handle multiline values
|
|
276
|
+
if (inMultiline) {
|
|
277
|
+
if (line.startsWith(' ') || line.startsWith('\t')) {
|
|
278
|
+
multilineValues.push(line.trim());
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
inMultiline = false;
|
|
283
|
+
// Store the accumulated multiline value
|
|
284
|
+
if (multilineKey === 'description') {
|
|
285
|
+
recipe.description = multilineValues.join(' ').replace(/^["']|["']$/g, '');
|
|
286
|
+
}
|
|
287
|
+
multilineValues = [];
|
|
288
|
+
multilineKey = '';
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const colonIndex = line.indexOf(':');
|
|
292
|
+
if (colonIndex === -1)
|
|
293
|
+
continue;
|
|
294
|
+
const key = line.slice(0, colonIndex).trim();
|
|
295
|
+
const value = line.slice(colonIndex + 1).trim();
|
|
296
|
+
// Handle empty values (start of multiline)
|
|
297
|
+
if (!value && (key === 'description' || key === 'name')) {
|
|
298
|
+
inMultiline = true;
|
|
299
|
+
multilineKey = key;
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
// Sanitize values: remove quotes and limit length
|
|
303
|
+
const sanitizedValue = value.replace(/^["']|["']$/g, '').slice(0, 500);
|
|
304
|
+
switch (key) {
|
|
305
|
+
case 'name':
|
|
306
|
+
recipe.name = sanitizedValue || 'unknown';
|
|
307
|
+
break;
|
|
308
|
+
case 'description':
|
|
309
|
+
recipe.description = sanitizedValue || '';
|
|
310
|
+
break;
|
|
311
|
+
case 'license':
|
|
312
|
+
recipe.license = sanitizedValue;
|
|
313
|
+
break;
|
|
314
|
+
case 'metadata':
|
|
315
|
+
// Skip metadata for now (would need YAML parser)
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Handle trailing multiline value
|
|
320
|
+
if (inMultiline && multilineKey === 'description' && multilineValues.length > 0) {
|
|
321
|
+
recipe.description = multilineValues.join(' ').replace(/^["']|["']$/g, '');
|
|
322
|
+
}
|
|
323
|
+
// Sanitize name to prevent injection
|
|
324
|
+
recipe.name = recipe.name.replace(/[^\w\s-]/g, '').trim().slice(0, 100) || 'unknown';
|
|
325
|
+
recipe.description = recipe.description.slice(0, 500);
|
|
326
|
+
return recipe;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List all MCP entries in the catalog.
|
|
3
|
+
*/
|
|
4
|
+
export declare function catalogMcpList(): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Show details of a specific catalog entry.
|
|
7
|
+
*/
|
|
8
|
+
export declare function catalogMcpShow(id: string): Promise<void>;
|
|
9
|
+
export interface CatalogMcpAddOptions {
|
|
10
|
+
packageId: string;
|
|
11
|
+
displayName?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
command?: string;
|
|
14
|
+
args?: string[];
|
|
15
|
+
url?: string;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
env?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Add an MCP entry to the catalog.
|
|
21
|
+
*/
|
|
22
|
+
export declare function catalogMcpAdd(options: CatalogMcpAddOptions): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Remove an MCP entry from the catalog.
|
|
25
|
+
*/
|
|
26
|
+
export declare function catalogMcpRemove(id: string): Promise<void>;
|
|
27
|
+
export interface CatalogSkillInstallOptions {
|
|
28
|
+
skillId: string;
|
|
29
|
+
force?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Install a skill from the skills.directory registry into the catalog.
|
|
33
|
+
*/
|
|
34
|
+
export declare function catalogSkillInstall(options: CatalogSkillInstallOptions): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Search the skills.directory registry for skills.
|
|
37
|
+
*/
|
|
38
|
+
export declare function catalogSkillSearch(query: string): Promise<void>;
|
|
39
|
+
export interface CatalogSkillImportOptions {
|
|
40
|
+
path: string;
|
|
41
|
+
skillId?: string;
|
|
42
|
+
displayName?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Import a skill from a local path into the catalog.
|
|
47
|
+
*/
|
|
48
|
+
export declare function catalogSkillImport(options: CatalogSkillImportOptions): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* List all skill entries in the catalog.
|
|
51
|
+
*/
|
|
52
|
+
export declare function catalogSkillList(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Show details of a specific skill catalog entry.
|
|
55
|
+
*/
|
|
56
|
+
export declare function catalogSkillShow(id: string): Promise<void>;
|
|
57
|
+
export interface CatalogSkillAddOptions {
|
|
58
|
+
skillId: string;
|
|
59
|
+
file?: string;
|
|
60
|
+
displayName?: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Add a skill entry to the catalog.
|
|
65
|
+
*/
|
|
66
|
+
export declare function catalogSkillAdd(options: CatalogSkillAddOptions): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Remove a skill entry from the catalog.
|
|
69
|
+
*/
|
|
70
|
+
export declare function catalogSkillRemove(id: string): Promise<void>;
|