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 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;
@@ -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>;