onlymcp 0.7.2 → 0.8.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.
@@ -15,6 +15,16 @@ export type AgentListItem = {
15
15
  tools: string[];
16
16
  updatedAt: string;
17
17
  };
18
+ export type SkillFileMeta = {
19
+ path: string;
20
+ encoding: FileEncoding;
21
+ size: number;
22
+ updatedAt: string;
23
+ };
24
+ export type SkillFile = SkillFileMeta & {
25
+ content: string;
26
+ };
27
+ export type FileEncoding = 'utf8' | 'base64';
18
28
  export type MemoryFile = {
19
29
  path: string;
20
30
  content: string;
@@ -36,6 +46,13 @@ export declare class ApiClient {
36
46
  private readonly token;
37
47
  constructor(baseUrl: string, token: () => string | null);
38
48
  private call;
49
+ getMe(): Promise<{
50
+ id: string;
51
+ email: string;
52
+ plan: {
53
+ name: string;
54
+ };
55
+ }>;
39
56
  listSkills(): Promise<{
40
57
  skills: SkillListItem[];
41
58
  }>;
@@ -43,10 +60,31 @@ export declare class ApiClient {
43
60
  name: string;
44
61
  body: string;
45
62
  updatedAt: string;
63
+ files: SkillFileMeta[];
64
+ }>;
65
+ putSkill(name: string, body: string): Promise<{
66
+ name: string;
67
+ updatedAt: string;
68
+ }>;
69
+ private skillFileUrl;
70
+ getSkillFile(name: string, path: string): Promise<SkillFile>;
71
+ putSkillFile(name: string, path: string, content: string, encoding?: FileEncoding): Promise<{
72
+ path: string;
73
+ size: number;
74
+ updatedAt: string;
46
75
  }>;
47
76
  listAgents(): Promise<{
48
77
  agents: AgentListItem[];
49
78
  }>;
79
+ putAgent(name: string, a: {
80
+ description: string;
81
+ model?: string;
82
+ tools: string[];
83
+ body: string;
84
+ }): Promise<{
85
+ name: string;
86
+ updatedAt: string;
87
+ }>;
50
88
  getAgent(name: string): Promise<AgentListItem & {
51
89
  body: string;
52
90
  }>;
package/dist/apiClient.js CHANGED
@@ -37,15 +37,38 @@ export class ApiClient {
37
37
  }
38
38
  return body;
39
39
  }
40
+ getMe() {
41
+ return this.call('/api/me');
42
+ }
40
43
  listSkills() {
41
44
  return this.call('/api/skills');
42
45
  }
43
46
  getSkill(name) {
44
47
  return this.call(`/api/skills/${encodeURIComponent(name)}`);
45
48
  }
49
+ putSkill(name, body) {
50
+ return this.call(`/api/skills/${encodeURIComponent(name)}`, { method: 'PUT', body: JSON.stringify({ body }) });
51
+ }
52
+ // Der Pfad wird Segment fuer Segment kodiert, genau wie bei readMemory:
53
+ // encodeURIComponent ueber die ganze Zeichenkette machte aus jedem
54
+ // Trennzeichen ein %2F, und die Platzhalter-Route saehe ein einziges langes
55
+ // Segment statt eines Pfades.
56
+ skillFileUrl(name, path) {
57
+ const tail = path.split('/').map(encodeURIComponent).join('/');
58
+ return `/api/skills/${encodeURIComponent(name)}/files/${tail}`;
59
+ }
60
+ getSkillFile(name, path) {
61
+ return this.call(this.skillFileUrl(name, path));
62
+ }
63
+ putSkillFile(name, path, content, encoding = 'utf8') {
64
+ return this.call(this.skillFileUrl(name, path), { method: 'PUT', body: JSON.stringify({ content, encoding }) });
65
+ }
46
66
  listAgents() {
47
67
  return this.call('/api/agents');
48
68
  }
69
+ putAgent(name, a) {
70
+ return this.call(`/api/agents/${encodeURIComponent(name)}`, { method: 'PUT', body: JSON.stringify(a) });
71
+ }
49
72
  getAgent(name) {
50
73
  return this.call(`/api/agents/${encodeURIComponent(name)}`);
51
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IACA;IACA;IAHX,YACW,IAAY,EACZ,SAAkC,EAAE,EACpC,SAAS,CAAC;QAEnB,KAAK,CAAC,IAAI,CAAC,CAAC;QAJH,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAA8B;QACpC,WAAM,GAAN,MAAM,CAAI;QAGnB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAwBD,MAAM,OAAO,SAAS;IAED;IACA;IAFnB,YACmB,OAAe,EACf,KAA0B;QAD1B,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAqB;IAC1C,CAAC;IAEI,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,OAAoB,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBACvB,aAAa,EAAE,UAAU,GAAG,EAAE;gBAC9B,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,gBAAgB,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAA8B,aAAa,CAAC,CAAC;IAC/D,CAAC;IACD,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC1C,CAAC;IACJ,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAA8B,aAAa,CAAC,CAAC;IAC/D,CAAC;IACD,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC1C,CAAC;IACJ,CAAC;IACD,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,IAAI,CAAa,eAAe,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE,WAAoB;QAC7D,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAClE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IACA;IACA;IAHX,YACW,IAAY,EACZ,SAAkC,EAAE,EACpC,SAAS,CAAC;QAEnB,KAAK,CAAC,IAAI,CAAC,CAAC;QAJH,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAA8B;QACpC,WAAM,GAAN,MAAM,CAAI;QAGnB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAgCD,MAAM,OAAO,SAAS;IAED;IACA;IAFnB,YACmB,OAAe,EACf,KAA0B;QAD1B,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAqB;IAC1C,CAAC;IAEI,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,OAAoB,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBACvB,aAAa,EAAE,UAAU,GAAG,EAAE;gBAC9B,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,gBAAgB,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAwD,SAAS,CAAC,CAAC;IACrF,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAA8B,aAAa,CAAC,CAAC;IAC/D,CAAC;IACD,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC1C,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,IAAY,EAAE,IAAY;QACjC,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACzC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAClD,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,mEAAmE;IACnE,4EAA4E;IAC5E,8BAA8B;IACtB,YAAY,CAAC,IAAY,EAAE,IAAY;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,OAAO,eAAe,kBAAkB,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACjE,CAAC;IACD,YAAY,CAAC,IAAY,EAAE,IAAY;QACrC,OAAO,IAAI,CAAC,IAAI,CAAY,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,WAAyB,MAAM;QACvF,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,EAC7B,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAC/D,CAAC;IACJ,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAA8B,aAAa,CAAC,CAAC;IAC/D,CAAC;IACD,QAAQ,CAAC,IAAY,EAAE,CAAyE;QAC9F,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACzC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAC3C,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC1C,CAAC;IACJ,CAAC;IACD,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,IAAI,CAAa,eAAe,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE,WAAoB;QAC7D,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAClE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;CACF"}
package/dist/bin/cli.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { intro, log, outro, spinner } from '@clack/prompts';
2
+ import { cancel, confirm, intro, isCancel, log, multiselect, outro, spinner } from '@clack/prompts';
3
3
  import { Command } from 'commander';
4
4
  import open from 'open';
5
5
  import QRCode from 'qrcode';
6
6
  import { createRequire } from 'node:module';
7
7
  import { homedir } from 'node:os';
8
8
  import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
9
- import { dirname } from 'node:path';
9
+ import { dirname, join } from 'node:path';
10
10
  import { ApiClient } from '../apiClient.js';
11
11
  import { Keyring } from '../auth/keyring.js';
12
12
  import { pollForToken } from '../auth/deviceLogin.js';
@@ -14,6 +14,9 @@ import { TtlCache } from '../cache.js';
14
14
  import { targets } from '../install.js';
15
15
  import { stubDirs } from '../paths.js';
16
16
  import { writeStubs } from '../stubs.js';
17
+ import { collect } from '../import/collect.js';
18
+ import { buildImportPlan } from '../import/plan.js';
19
+ import { countPlan, runUpload } from '../import/upload.js';
17
20
  const baseUrl = process.env.ONLYMCP_API_URL ?? 'https://only-mcp.com';
18
21
  // Die Version kommt aus der package.json und steht nicht ein zweites Mal hier
19
22
  // als Literal: sonst meldet `onlymcp --version` nach der ersten
@@ -80,10 +83,10 @@ program
80
83
  Keyring.save(token);
81
84
  s.stop('Verbunden');
82
85
  const api = new ApiClient(baseUrl, () => Keyring.read());
83
- let counts = { skills: 0, agents: 0 };
86
+ let counts = { skills: 0, agents: 0, files: 0 };
84
87
  for (const dir of stubDirs())
85
88
  counts = await writeStubs(api, dir);
86
- outro(`${counts.skills} Skills, ${counts.agents} Agents bereit`);
89
+ outro(`${counts.skills} Skills, ${counts.agents} Agents, ${counts.files} Dateien bereit`);
87
90
  });
88
91
  program
89
92
  .command('logout')
@@ -104,10 +107,10 @@ program
104
107
  .description('Stub-Dateien neu schreiben')
105
108
  .action(async () => {
106
109
  const api = new ApiClient(baseUrl, () => Keyring.read());
107
- let counts = { skills: 0, agents: 0 };
110
+ let counts = { skills: 0, agents: 0, files: 0 };
108
111
  for (const dir of stubDirs())
109
112
  counts = await writeStubs(api, dir);
110
- log.success(`${counts.skills} Skills, ${counts.agents} Agents`);
113
+ log.success(`${counts.skills} Skills, ${counts.agents} Agents, ${counts.files} Dateien`);
111
114
  });
112
115
  program
113
116
  .command('install')
@@ -169,5 +172,171 @@ program
169
172
  mkdirSync(t.stubDir, { recursive: true });
170
173
  log.success(`${t.label} eingerichtet: ${t.configPath}`);
171
174
  });
175
+ function formatBytes(bytes) {
176
+ if (bytes < 1024)
177
+ return `${bytes} B`;
178
+ if (bytes < 1024 * 1024)
179
+ return `${Math.round(bytes / 1024)} KB`;
180
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
181
+ }
182
+ function sumBytes(items) {
183
+ return items.reduce((total, x) => total + x.bytes, 0);
184
+ }
185
+ /** Der Plan, ausgeschrieben. Steht immer, auch bei --yes: wer zuschaut, soll sehen. */
186
+ function printPlan(plan, roots) {
187
+ const files = plan.skills.reduce((n, s) => n + s.files.length, 0);
188
+ const withFiles = plan.skills.filter((s) => s.files.length > 0).length;
189
+ const fileBytes = plan.skills.reduce((n, s) => n + sumBytes(s.files), 0);
190
+ if (roots.skills) {
191
+ log.message(`Skills ${String(plan.skills.length).padStart(4)} aus ${roots.skills}\n` +
192
+ ` ${String(files).padStart(4)} weitere Dateien in ${withFiles} Skills ` +
193
+ `${formatBytes(sumBytes(plan.skills) + fileBytes)}`);
194
+ }
195
+ if (roots.agents) {
196
+ log.message(`Agents ${String(plan.agents.length).padStart(4)} aus ${roots.agents} ${formatBytes(sumBytes(plan.agents))}`);
197
+ }
198
+ if (roots.memory) {
199
+ log.message(`Memory ${String(plan.memory.length).padStart(4)} aus ${roots.memory} ${formatBytes(sumBytes(plan.memory))}`);
200
+ }
201
+ if (plan.skipped.length > 0) {
202
+ const byReason = new Map();
203
+ for (const s of plan.skipped)
204
+ byReason.set(s.reason, (byReason.get(s.reason) ?? 0) + 1);
205
+ log.message(['Uebersprungen', ...[...byReason].map(([reason, n]) => ` ${String(n).padStart(4)} ${reason}`)].join('\n'));
206
+ }
207
+ if (plan.flagged.length > 0) {
208
+ log.warn([
209
+ 'Zurueckgehalten wegen moeglicher Zugangsdaten (nichts davon geht raus)',
210
+ ...plan.flagged.flatMap((f) => [
211
+ ` ${f.relative}`,
212
+ ...f.hits.map((h) => ` Zeile ${h.line} Regel ${h.rule} ${h.excerpt}`),
213
+ ]),
214
+ ].join('\n'));
215
+ }
216
+ }
217
+ program
218
+ .command('import')
219
+ .description('Bestehende lokale Skills, Agents und Memory nach OnlyMCP holen')
220
+ .option('--skills <dir>', 'Ordner mit Skill-Unterordnern')
221
+ .option('--agents <dir>', 'Ordner mit Agent-Dateien')
222
+ // --memory hat mit Absicht keine Vorgabe. Skills und Agents liegen an einem
223
+ // bekannten Pfad, an dem nur Skills und Agents liegen. Ein Memory-Ordner
224
+ // nicht: eine Vorgabe auf irgendjemandes Notizen zu richten und die
225
+ // hochzuladen waere das Schlimmste, was dieser Befehl tun koennte.
226
+ .option('--memory <dir>', 'Ordner mit Memory-Dateien (keine Vorgabe)')
227
+ .option('--dry-run', 'Nur zeigen, was hochginge, und beenden')
228
+ .option('--yes', 'Ohne Rueckfrage hochladen')
229
+ .action(async (opts) => {
230
+ // Dieselbe Testschleuse wie in install.ts und paths.ts.
231
+ const home = process.env.ONLYMCP_HOME ?? homedir();
232
+ const roots = {
233
+ skills: opts.skills ?? join(home, '.claude', 'skills'),
234
+ agents: opts.agents ?? join(home, '.claude', 'agents'),
235
+ memory: opts.memory,
236
+ };
237
+ intro('OnlyMCP Import');
238
+ const s = spinner();
239
+ s.start('Lese die Ordner');
240
+ let plan;
241
+ try {
242
+ const [skills, agents, memory] = await Promise.all([
243
+ existsSync(roots.skills) ? collect(roots.skills) : Promise.resolve([]),
244
+ existsSync(roots.agents) ? collect(roots.agents) : Promise.resolve([]),
245
+ roots.memory && existsSync(roots.memory) ? collect(roots.memory) : Promise.resolve([]),
246
+ ]);
247
+ plan = buildImportPlan({ skills, agents, memory });
248
+ }
249
+ catch (e) {
250
+ s.stop('Abgebrochen');
251
+ log.error(e instanceof Error ? e.message : String(e));
252
+ process.exitCode = 1;
253
+ return;
254
+ }
255
+ s.stop('Gelesen');
256
+ printPlan(plan, {
257
+ skills: existsSync(roots.skills) ? roots.skills : undefined,
258
+ agents: existsSync(roots.agents) ? roots.agents : undefined,
259
+ memory: roots.memory && existsSync(roots.memory) ? roots.memory : undefined,
260
+ });
261
+ const total = countPlan(plan);
262
+ if (total === 0) {
263
+ outro('Nichts zu tun.');
264
+ return;
265
+ }
266
+ if (opts.dryRun) {
267
+ outro('Nichts hochgeladen (--dry-run).');
268
+ return;
269
+ }
270
+ const api = new ApiClient(baseUrl, () => Keyring.read());
271
+ // Ins falsche Konto zu laden ist ein leicht gemachter und unangenehm zu
272
+ // behebender Fehler. Die Gegenmassnahme ist eine Zeile Ausgabe.
273
+ try {
274
+ const me = await api.getMe();
275
+ log.info(`Ziel ${baseUrl} als ${me.email} Stufe ${me.plan.name}`);
276
+ }
277
+ catch (e) {
278
+ log.error(`Nicht angemeldet oder Server nicht erreichbar (${e instanceof Error ? e.message : String(e)}).`);
279
+ log.info('Zuerst: onlymcp login');
280
+ process.exitCode = 1;
281
+ return;
282
+ }
283
+ if (!opts.yes) {
284
+ if (!process.stdin.isTTY) {
285
+ // Ohne Terminal gibt es keine Rueckfrage, also auch keinen Upload.
286
+ // Wer das automatisieren will, sagt --yes und hat den Plan vorher mit
287
+ // --dry-run gesehen.
288
+ log.error('Kein Terminal fuer die Rueckfrage. Erst --dry-run ansehen, dann --yes.');
289
+ process.exitCode = 1;
290
+ return;
291
+ }
292
+ const go = await confirm({ message: `${total} Eintraege hochladen?`, initialValue: false });
293
+ if (isCancel(go) || !go) {
294
+ cancel('Abgebrochen. Nichts hochgeladen.');
295
+ return;
296
+ }
297
+ if (plan.flagged.length > 0) {
298
+ const release = await multiselect({
299
+ message: 'Zurueckgehaltene Dateien trotzdem mitschicken?',
300
+ options: plan.flagged.map((f) => ({ value: f.relative, label: f.relative })),
301
+ required: false,
302
+ initialValues: [],
303
+ });
304
+ if (isCancel(release)) {
305
+ cancel('Abgebrochen. Nichts hochgeladen.');
306
+ return;
307
+ }
308
+ if (release.length > 0) {
309
+ // Freigeben heisst: die Datei noch einmal einsammeln, diesmal ohne
310
+ // ihre Funde, und den Plan daraus neu bauen. Kein zweiter Weg in den
311
+ // Upload, der die Pruefung umgehen koennte.
312
+ const freed = new Set(release);
313
+ const clear = (items) => items.map((c) => (freed.has(c.relative) ? { ...c, hits: [] } : c));
314
+ const [skills, agents, memory] = await Promise.all([
315
+ existsSync(roots.skills) ? collect(roots.skills) : Promise.resolve([]),
316
+ existsSync(roots.agents) ? collect(roots.agents) : Promise.resolve([]),
317
+ roots.memory && existsSync(roots.memory) ? collect(roots.memory) : Promise.resolve([]),
318
+ ]);
319
+ plan = buildImportPlan({
320
+ skills: clear(skills),
321
+ agents: clear(agents),
322
+ memory: clear(memory),
323
+ });
324
+ }
325
+ }
326
+ }
327
+ const up = spinner();
328
+ up.start('Lade hoch');
329
+ const result = await runUpload(api, plan, (done, all, label) => {
330
+ up.message(`${done}/${all} ${label}`);
331
+ });
332
+ up.stop('Fertig');
333
+ log.success(`${result.skills} Skills, ${result.skillFiles} Skill-Dateien, ` +
334
+ `${result.agents} Agents, ${result.memory} Memory-Dateien`);
335
+ if (result.failures.length > 0) {
336
+ log.error([`${result.failures.length} fehlgeschlagen`, ...result.failures.map((f) => ` ${f.what} ${f.code}`)].join('\n'));
337
+ process.exitCode = 1;
338
+ }
339
+ outro('Danach: onlymcp sync auf jedem Geraet.');
340
+ });
172
341
  await program.parseAsync();
173
342
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
package/dist/bin/mcp.js CHANGED
@@ -11,6 +11,7 @@ import { buildInstructions } from '../instructions.js';
11
11
  import { stubDirs } from '../paths.js';
12
12
  import { writeStubs } from '../stubs.js';
13
13
  import { createGetAgentDefinitionTool } from '../tools/getAgentDefinition.js';
14
+ import { createGetSkillFileTool } from '../tools/getSkillFile.js';
14
15
  import { createGetSkillTool } from '../tools/getSkill.js';
15
16
  import { createListAgentsTool, createListSkillsTool } from '../tools/lists.js';
16
17
  import { createMemoryReadTool } from '../tools/memoryRead.js';
@@ -21,6 +22,7 @@ const api = new ApiClient(baseUrl, () => Keyring.read());
21
22
  const cache = new TtlCache();
22
23
  const tools = [
23
24
  createGetSkillTool(api, cache),
25
+ createGetSkillFileTool(api),
24
26
  createGetAgentDefinitionTool(api, cache),
25
27
  createListSkillsTool(api),
26
28
  createListAgentsTool(api),
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/bin/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/bin/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type SecretHit } from './secrets.js';
2
+ export type Candidate = {
3
+ absolute: string;
4
+ relative: string;
5
+ bytes: number;
6
+ binary: boolean;
7
+ hits: SecretHit[];
8
+ skip: null | 'denied-name' | 'too-large';
9
+ };
10
+ export declare function collect(root: string, opts?: {
11
+ maxBytes?: number;
12
+ }): Promise<Candidate[]>;
@@ -0,0 +1,79 @@
1
+ import { readdir, readFile, realpath, stat } from 'node:fs/promises';
2
+ import { join, relative, resolve, sep } from 'node:path';
3
+ import { isDeniedName, scanForSecrets } from './secrets.js';
4
+ /**
5
+ * Verzeichnisse, die nie hochzuladen sind und haeufig gross. Sie fallen
6
+ * stillschweigend weg statt gemeldet zu werden: ein Bericht mit 4000 Zeilen
7
+ * aus node_modules begraebt genau die Funde, auf die es ankommt.
8
+ */
9
+ const DENIED_DIRS = new Set([
10
+ '.git', 'node_modules', '__pycache__', '.venv', 'venv',
11
+ '.pytest_cache', '.mypy_cache', 'dist', 'build', '.next', '.cache',
12
+ ]);
13
+ const DEFAULT_MAX_BYTES = 2 * 1024 * 1024;
14
+ /** Ein NUL-Byte in den ersten 8 KB - dieselbe Heuristik wie bei `git` und `grep`. */
15
+ function looksBinary(buf) {
16
+ return buf.subarray(0, 8192).includes(0);
17
+ }
18
+ export async function collect(root, opts = {}) {
19
+ const maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES;
20
+ // Die echte Wurzel, einmal aufgeloest. Jeder Kandidat wird gegen sie
21
+ // geprueft und nicht gegen die Zeichenkette, die der Aufrufer uebergab:
22
+ // eine verlinkte Wurzel funktioniert damit weiterhin, ein Link aus ihr
23
+ // heraus nicht.
24
+ const base = await realpath(resolve(root));
25
+ const out = [];
26
+ async function walk(dir) {
27
+ const entries = await readdir(dir, { withFileTypes: true });
28
+ for (const entry of entries) {
29
+ const abs = join(dir, entry.name);
30
+ if (entry.isDirectory()) {
31
+ if (DENIED_DIRS.has(entry.name))
32
+ continue;
33
+ await walk(abs);
34
+ continue;
35
+ }
36
+ // Ein Symlink wird aufgeloest und danach geprueft. `isDirectory()` ist
37
+ // fuer einen Symlink falsch, also landen Links hier - und das ist die
38
+ // einzige Stelle, an der der Baum ueberhaupt verlassen werden koennte.
39
+ let real;
40
+ try {
41
+ real = await realpath(abs);
42
+ }
43
+ catch {
44
+ continue; // ins Leere zeigender Link
45
+ }
46
+ if (real !== base && !real.startsWith(base + sep))
47
+ continue;
48
+ const rel = relative(base, real).split(sep).join('/');
49
+ if (isDeniedName(entry.name)) {
50
+ // Gemeldet, aber nie geoeffnet. Genau dafuer gibt es eine Namensregel.
51
+ out.push({ absolute: real, relative: rel, bytes: 0, binary: false, hits: [], skip: 'denied-name' });
52
+ continue;
53
+ }
54
+ const info = await stat(real);
55
+ if (!info.isFile())
56
+ continue;
57
+ if (info.size > maxBytes) {
58
+ out.push({ absolute: real, relative: rel, bytes: info.size, binary: false, hits: [], skip: 'too-large' });
59
+ continue;
60
+ }
61
+ const buf = await readFile(real);
62
+ const binary = looksBinary(buf);
63
+ out.push({
64
+ absolute: real,
65
+ relative: rel,
66
+ bytes: info.size,
67
+ binary,
68
+ // Eine Binaerdatei nach Textmustern zu durchsuchen ergibt Rauschen,
69
+ // keine Funde.
70
+ hits: binary ? [] : scanForSecrets(buf.toString('utf8')),
71
+ skip: null,
72
+ });
73
+ }
74
+ }
75
+ await walk(base);
76
+ out.sort((a, b) => a.relative.localeCompare(b.relative));
77
+ return out;
78
+ }
79
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/import/collect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type AgentHeader = {
2
+ description: string;
3
+ model?: string;
4
+ tools: string[];
5
+ };
6
+ /**
7
+ * Liest den YAML-Kopf einer Agent-Datei - denselben Kopf, den
8
+ * `agency-agents-normalize.py` schreibt.
9
+ *
10
+ * Bewusst kein YAML-Parser: gebraucht werden drei Felder aus einem Kopf, den
11
+ * ein Werkzeug erzeugt hat, und eine Abhaengigkeit dafuer in die CLI zu
12
+ * ziehen ist mehr Angriffsflaeche als Nutzen. Alles, was nicht dieser Form
13
+ * entspricht, gibt `null` und die Datei wird uebersprungen - nicht mit einer
14
+ * erfundenen Beschreibung hochgeladen.
15
+ */
16
+ export declare function parseAgentHeader(text: string): AgentHeader | null;
17
+ /** Der Teil unter dem Kopf. Ohne Kopf ist die ganze Datei der Inhalt. */
18
+ export declare function bodyBelowHeader(text: string): string;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Liest den YAML-Kopf einer Agent-Datei - denselben Kopf, den
3
+ * `agency-agents-normalize.py` schreibt.
4
+ *
5
+ * Bewusst kein YAML-Parser: gebraucht werden drei Felder aus einem Kopf, den
6
+ * ein Werkzeug erzeugt hat, und eine Abhaengigkeit dafuer in die CLI zu
7
+ * ziehen ist mehr Angriffsflaeche als Nutzen. Alles, was nicht dieser Form
8
+ * entspricht, gibt `null` und die Datei wird uebersprungen - nicht mit einer
9
+ * erfundenen Beschreibung hochgeladen.
10
+ */
11
+ export function parseAgentHeader(text) {
12
+ if (!text.startsWith('---\n'))
13
+ return null;
14
+ const end = text.indexOf('\n---', 3);
15
+ if (end < 0)
16
+ return null;
17
+ const head = text.slice(4, end);
18
+ const field = (key) => {
19
+ const m = new RegExp(`^${key}:[ \\t]*(.*)$`, 'm').exec(head);
20
+ if (!m)
21
+ return undefined;
22
+ const raw = m[1].trim();
23
+ // Anfuehrungszeichen sind im Bestand optional und tragen keine Bedeutung.
24
+ const unquoted = raw.replace(/^(['"])(.*)\1$/, '$2').trim();
25
+ return unquoted.length > 0 ? unquoted : undefined;
26
+ };
27
+ const description = field('description');
28
+ if (!description)
29
+ return null;
30
+ const toolsRaw = field('tools');
31
+ const tools = toolsRaw
32
+ ? toolsRaw
33
+ .replace(/^\[(.*)\]$/, '$1')
34
+ .split(',')
35
+ .map((t) => t.trim())
36
+ .filter((t) => t.length > 0)
37
+ : [];
38
+ const model = field('model');
39
+ return model ? { description, model, tools } : { description, tools };
40
+ }
41
+ /** Der Teil unter dem Kopf. Ohne Kopf ist die ganze Datei der Inhalt. */
42
+ export function bodyBelowHeader(text) {
43
+ if (!text.startsWith('---\n'))
44
+ return text;
45
+ const end = text.indexOf('\n---', 3);
46
+ if (end < 0)
47
+ return text;
48
+ const after = text.indexOf('\n', end + 4);
49
+ return after < 0 ? '' : text.slice(after + 1);
50
+ }
51
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/import/frontmatter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAsB,EAAE;QAChD,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QACzB,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ;QACpB,CAAC,CAAC,QAAQ;aACL,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;aAC3B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACxE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { Candidate } from './collect.js';
2
+ export type PlannedFile = {
3
+ path: string;
4
+ absolute: string;
5
+ bytes: number;
6
+ binary: boolean;
7
+ };
8
+ /** `source` ist der absolute Pfad der SKILL.md. Gelesen wird erst beim Hochladen. */
9
+ export type SkillPlan = {
10
+ name: string;
11
+ source: string;
12
+ bytes: number;
13
+ files: PlannedFile[];
14
+ };
15
+ export type AgentPlan = {
16
+ name: string;
17
+ source: string;
18
+ bytes: number;
19
+ };
20
+ export type MemoryPlan = {
21
+ path: string;
22
+ source: string;
23
+ bytes: number;
24
+ };
25
+ export type Skipped = {
26
+ relative: string;
27
+ reason: string;
28
+ };
29
+ export type ImportPlan = {
30
+ skills: SkillPlan[];
31
+ agents: AgentPlan[];
32
+ memory: MemoryPlan[];
33
+ /** Funde von scanForSecrets. Ausgeschlossen, aber nicht verschwiegen. */
34
+ flagged: Candidate[];
35
+ skipped: Skipped[];
36
+ };
37
+ export declare function planSkills(items: Candidate[]): {
38
+ plans: SkillPlan[];
39
+ skipped: Skipped[];
40
+ };
41
+ export declare function planAgents(items: Candidate[]): {
42
+ plans: AgentPlan[];
43
+ skipped: Skipped[];
44
+ };
45
+ export declare function planMemory(items: Candidate[]): {
46
+ plans: MemoryPlan[];
47
+ skipped: Skipped[];
48
+ };
49
+ export declare function buildImportPlan(sources: {
50
+ skills?: Candidate[];
51
+ agents?: Candidate[];
52
+ memory?: Candidate[];
53
+ }): ImportPlan;
@@ -0,0 +1,143 @@
1
+ import { isSafeMemoryPath } from '../memoryPath.js';
2
+ import { isSafeSkillFilePath } from '../skillFilePath.js';
3
+ // Die Namensregel ist die des Servers (packages/api/src/http/names.ts), hier
4
+ // noch einmal geprueft, damit der Bericht "uebersprungen, ungueltiger Name"
5
+ // sagen kann, statt dass jemand 40 Uploads zuschaut und dann eine 400 sieht.
6
+ const SAFE_NAME = /^[a-z0-9]+(-[a-z0-9]+)*$/;
7
+ /**
8
+ * Eine markierte Datei faellt aus dem Plan, nicht aus dem Bericht. Der
9
+ * Benutzer sieht sie unter "zurueckgehalten" mit Regel und Zeile und kann sie
10
+ * ausdruecklich freigeben. Sie stillschweigend wegzulassen waere derselbe
11
+ * Fehler wie sie stillschweigend zu senden.
12
+ */
13
+ function usable(c) {
14
+ return c.skip === null && c.hits.length === 0;
15
+ }
16
+ function reasonOf(c) {
17
+ return c.skip ?? (c.hits.length > 0 ? 'flagged' : 'unusable');
18
+ }
19
+ export function planSkills(items) {
20
+ const plans = [];
21
+ const skipped = [];
22
+ const folders = new Map();
23
+ for (const c of items) {
24
+ const cut = c.relative.indexOf('/');
25
+ if (cut < 0) {
26
+ // Eine Datei direkt in der Wurzel gehoert zu keinem Skill.
27
+ skipped.push({ relative: c.relative, reason: 'not-in-a-skill-folder' });
28
+ continue;
29
+ }
30
+ const name = c.relative.slice(0, cut);
31
+ const bucket = folders.get(name);
32
+ if (bucket)
33
+ bucket.push(c);
34
+ else
35
+ folders.set(name, [c]);
36
+ }
37
+ for (const [name, entries] of folders) {
38
+ if (!SAFE_NAME.test(name)) {
39
+ skipped.push({ relative: name, reason: 'invalid-name' });
40
+ continue;
41
+ }
42
+ const skillMd = entries.find((c) => c.relative === `${name}/SKILL.md`);
43
+ if (!skillMd) {
44
+ // Ein Ordner ohne SKILL.md ist kein Skill. Seine Streudateien unter
45
+ // einem erfundenen Namen hochzuladen legte etwas ins Konto, das auch
46
+ // auf der Platte nie ein Skill war.
47
+ skipped.push({ relative: name, reason: 'no-skill-md' });
48
+ continue;
49
+ }
50
+ if (!usable(skillMd)) {
51
+ // Ohne seinen eigenen Text ist der Skill nichts. Nur die Begleitdateien
52
+ // hochzuladen ergaebe einen Skill, der auf einen Inhalt verweist, den es
53
+ // im Konto nicht gibt.
54
+ skipped.push({ relative: `${name}/SKILL.md`, reason: reasonOf(skillMd) });
55
+ continue;
56
+ }
57
+ const files = [];
58
+ for (const c of entries) {
59
+ if (c === skillMd)
60
+ continue;
61
+ if (!usable(c)) {
62
+ skipped.push({ relative: c.relative, reason: reasonOf(c) });
63
+ continue;
64
+ }
65
+ const path = c.relative.slice(name.length + 1);
66
+ if (!isSafeSkillFilePath(path)) {
67
+ // Dieselbe Ueberlegung wie beim Skill-Namen: was der Server ablehnt,
68
+ // gehoert in den Bericht und nicht in den Upload.
69
+ skipped.push({ relative: c.relative, reason: 'invalid-path' });
70
+ continue;
71
+ }
72
+ files.push({
73
+ path,
74
+ absolute: c.absolute,
75
+ bytes: c.bytes,
76
+ binary: c.binary,
77
+ });
78
+ }
79
+ files.sort((a, b) => a.path.localeCompare(b.path));
80
+ plans.push({ name, source: skillMd.absolute, bytes: skillMd.bytes, files });
81
+ }
82
+ plans.sort((a, b) => a.name.localeCompare(b.name));
83
+ return { plans, skipped };
84
+ }
85
+ export function planAgents(items) {
86
+ const plans = [];
87
+ const skipped = [];
88
+ for (const c of items) {
89
+ if (c.relative.includes('/')) {
90
+ skipped.push({ relative: c.relative, reason: 'not-at-top-level' });
91
+ continue;
92
+ }
93
+ if (!c.relative.endsWith('.md')) {
94
+ skipped.push({ relative: c.relative, reason: 'not-markdown' });
95
+ continue;
96
+ }
97
+ const name = c.relative.slice(0, -3);
98
+ if (!SAFE_NAME.test(name)) {
99
+ skipped.push({ relative: c.relative, reason: 'invalid-name' });
100
+ continue;
101
+ }
102
+ if (!usable(c)) {
103
+ skipped.push({ relative: c.relative, reason: reasonOf(c) });
104
+ continue;
105
+ }
106
+ plans.push({ name, source: c.absolute, bytes: c.bytes });
107
+ }
108
+ plans.sort((a, b) => a.name.localeCompare(b.name));
109
+ return { plans, skipped };
110
+ }
111
+ export function planMemory(items) {
112
+ const plans = [];
113
+ const skipped = [];
114
+ for (const c of items) {
115
+ // Dieselbe Regel wie in memoryPath.ts, nicht eine zweite daneben: was der
116
+ // Server ablehnt, soll hier gar nicht erst in den Plan geraten.
117
+ if (!isSafeMemoryPath(c.relative)) {
118
+ skipped.push({ relative: c.relative, reason: 'invalid-path' });
119
+ continue;
120
+ }
121
+ if (!usable(c)) {
122
+ skipped.push({ relative: c.relative, reason: reasonOf(c) });
123
+ continue;
124
+ }
125
+ plans.push({ path: c.relative, source: c.absolute, bytes: c.bytes });
126
+ }
127
+ plans.sort((a, b) => a.path.localeCompare(b.path));
128
+ return { plans, skipped };
129
+ }
130
+ export function buildImportPlan(sources) {
131
+ const s = planSkills(sources.skills ?? []);
132
+ const a = planAgents(sources.agents ?? []);
133
+ const m = planMemory(sources.memory ?? []);
134
+ const all = [...(sources.skills ?? []), ...(sources.agents ?? []), ...(sources.memory ?? [])];
135
+ return {
136
+ skills: s.plans,
137
+ agents: a.plans,
138
+ memory: m.plans,
139
+ flagged: all.filter((c) => c.skip === null && c.hits.length > 0),
140
+ skipped: [...s.skipped, ...a.skipped, ...m.skipped],
141
+ };
142
+ }
143
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/import/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type SecretHit = {
2
+ rule: string;
3
+ line: number;
4
+ excerpt: string;
5
+ };
6
+ export declare function isDeniedName(name: string): boolean;
7
+ export declare function scanForSecrets(text: string): SecretHit[];
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Namen, die nie hochgehen, egal was drinsteht.
3
+ *
4
+ * Diese Liste ist keine Vermutung. `~/.claude/.credentials.json` haelt das
5
+ * lebende Anthropic-Token und liegt ein Verzeichnis ueber `~/.claude/skills`,
6
+ * also genau ueber der Wurzel, auf die ein Benutzer diesen Befehl richten
7
+ * wird. Eine Namensregel faengt diesen Fall, bevor Inhalt gelesen wird - und
8
+ * das ist der Punkt: eine Datei, die wir per Name ablehnen, haben wir nie
9
+ * geoeffnet.
10
+ */
11
+ const DENY_NAMES = [
12
+ /^\.env(\..+)?$/i,
13
+ /^\.credentials\.json$/i,
14
+ /^id_(rsa|dsa|ecdsa|ed25519)(\.pub)?$/i,
15
+ /\.(pem|key|p12|pfx|jks|keystore)$/i,
16
+ /^\.(npmrc|netrc|pgpass|htpasswd)$/i,
17
+ /^\.git-credentials$/i,
18
+ ];
19
+ export function isDeniedName(name) {
20
+ return DENY_NAMES.some((re) => re.test(name));
21
+ }
22
+ /**
23
+ * Die Regeln stehen spezifisch zuerst. Ein GitHub-Token trifft auch die
24
+ * generische Zuweisungsregel, und "github" ist fuer den, der den Bericht
25
+ * liest, brauchbarer als "assignment".
26
+ */
27
+ const RULES = [
28
+ { rule: 'anthropic', re: /\bsk-ant-[A-Za-z0-9_-]{20,}/ },
29
+ { rule: 'openai', re: /\bsk-(?!ant-)[A-Za-z0-9_-]{20,}/ },
30
+ { rule: 'github', re: /\bgh[pousr]_[A-Za-z0-9]{36,}/ },
31
+ { rule: 'aws', re: /\bAKIA[0-9A-Z]{16}\b/ },
32
+ { rule: 'slack', re: /\bxox[baprs]-[A-Za-z0-9-]{10,}/ },
33
+ { rule: 'google', re: /\bAIza[0-9A-Za-z_-]{35}\b/ },
34
+ { rule: 'jwt', re: /\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\./ },
35
+ { rule: 'private-key', re: /-----BEGIN [A-Z ]*PRIVATE KEY-----/ },
36
+ {
37
+ rule: 'url-credentials',
38
+ // Zugangsdaten im Klartext einer URL: Git-Remotes und
39
+ // Verbindungszeichenketten. Die Regel steht hier, weil sie im echten
40
+ // Bestand etwas gefunden hat, das die anderen neun nicht sahen - eine
41
+ // Postgres-Zeile mit echtem Passwort in einer Notiz. Das Passwort muss
42
+ // mindestens sechs Zeichen haben, sonst faengt die Regel jedes
43
+ // "http://a:b@" aus einem Beispiel.
44
+ re: /\b[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:[^\s:/@]{6,}@/i,
45
+ },
46
+ {
47
+ rule: 'assignment',
48
+ // Verlangt bewusst einen zitierten Wert von echter Laenge. Ohne die
49
+ // Anfuehrungszeichen feuert die Regel auf "password: see the vault" und
50
+ // auf jeden zweiten Satz in einem Security-Skill - das ist der
51
+ // Unterschied zwischen einem Werkzeug, das benutzt wird, und einem, das
52
+ // man sich abgewoehnt zu lesen.
53
+ re: /\b(api[_-]?key|secret|passwd|password|token|credential)\b\s*[:=]\s*['"][^'"\s]{16,}['"]/i,
54
+ },
55
+ ];
56
+ /** Genug Zusammenhang, um die Zeile wiederzufinden, nie genug, um das Geheimnis zu sein. */
57
+ function excerpt(line, match) {
58
+ const at = line.indexOf(match);
59
+ const before = line.slice(Math.max(0, at - 24), at);
60
+ return `${before}…${match.slice(0, 4)}… (${match.length} Zeichen)`;
61
+ }
62
+ export function scanForSecrets(text) {
63
+ const hits = [];
64
+ const lines = text.split('\n');
65
+ for (let i = 0; i < lines.length; i += 1) {
66
+ const line = lines[i];
67
+ for (const { rule, re } of RULES) {
68
+ const m = re.exec(line);
69
+ if (m) {
70
+ hits.push({ rule, line: i + 1, excerpt: excerpt(line, m[0]) });
71
+ break; // ein Fund pro Zeile reicht, damit jemand hinschaut
72
+ }
73
+ }
74
+ }
75
+ return hits;
76
+ }
77
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/import/secrets.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,GAAa;IAC3B,iBAAiB;IACjB,wBAAwB;IACxB,uCAAuC;IACvC,oCAAoC;IACpC,oCAAoC;IACpC,sBAAsB;CACvB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,KAAK,GAAmC;IAC5C,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,6BAA6B,EAAE;IACxD,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,iCAAiC,EAAE;IACzD,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,8BAA8B,EAAE;IACtD,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,sBAAsB,EAAE;IAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,gCAAgC,EAAE;IACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,2BAA2B,EAAE;IACnD,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,kDAAkD,EAAE;IACvE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,oCAAoC,EAAE;IACjE;QACE,IAAI,EAAE,iBAAiB;QACvB,sDAAsD;QACtD,qEAAqE;QACrE,sEAAsE;QACtE,uEAAuE;QACvE,+DAA+D;QAC/D,oCAAoC;QACpC,EAAE,EAAE,kDAAkD;KACvD;IACD;QACE,IAAI,EAAE,YAAY;QAClB,oEAAoE;QACpE,wEAAwE;QACxE,+DAA+D;QAC/D,wEAAwE;QACxE,gCAAgC;QAChC,EAAE,EAAE,0FAA0F;KAC/F;CACF,CAAC;AAEF,4FAA4F;AAC5F,SAAS,OAAO,CAAC,IAAY,EAAE,KAAa;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,WAAW,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/D,MAAM,CAAC,oDAAoD;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type ApiClient } from '../apiClient.js';
2
+ import type { ImportPlan } from './plan.js';
3
+ export type Progress = (done: number, total: number, label: string) => void;
4
+ export type UploadResult = {
5
+ skills: number;
6
+ skillFiles: number;
7
+ agents: number;
8
+ memory: number;
9
+ failures: {
10
+ what: string;
11
+ code: string;
12
+ }[];
13
+ };
14
+ export declare function countPlan(plan: ImportPlan): number;
15
+ /**
16
+ * Der Reihe nach, mit Absicht. Parallel waere es schneller und hiesse auch,
17
+ * dass ein erreichtes Stufenlimit einen verstreuten Halbimport hinterlaesst,
18
+ * dessen Form von der Ablaufplanung abhaengt. Einzeln bleibt er an einer
19
+ * vorhersagbaren Stelle stehen, und der Bericht kann sagen, an welcher.
20
+ */
21
+ export declare function runUpload(api: ApiClient, plan: ImportPlan, onProgress: Progress): Promise<UploadResult>;
@@ -0,0 +1,84 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { ApiError } from '../apiClient.js';
3
+ import { bodyBelowHeader, parseAgentHeader } from './frontmatter.js';
4
+ function codeOf(e) {
5
+ if (e instanceof ApiError)
6
+ return e.code;
7
+ return e instanceof Error ? e.message : String(e);
8
+ }
9
+ export function countPlan(plan) {
10
+ return (plan.skills.length +
11
+ plan.skills.reduce((sum, s) => sum + s.files.length, 0) +
12
+ plan.agents.length +
13
+ plan.memory.length);
14
+ }
15
+ /**
16
+ * Der Reihe nach, mit Absicht. Parallel waere es schneller und hiesse auch,
17
+ * dass ein erreichtes Stufenlimit einen verstreuten Halbimport hinterlaesst,
18
+ * dessen Form von der Ablaufplanung abhaengt. Einzeln bleibt er an einer
19
+ * vorhersagbaren Stelle stehen, und der Bericht kann sagen, an welcher.
20
+ */
21
+ export async function runUpload(api, plan, onProgress) {
22
+ const result = { skills: 0, skillFiles: 0, agents: 0, memory: 0, failures: [] };
23
+ const total = countPlan(plan);
24
+ let done = 0;
25
+ const step = (label) => onProgress((done += 1), total, label);
26
+ for (const s of plan.skills) {
27
+ try {
28
+ await api.putSkill(s.name, await readFile(s.source, 'utf8'));
29
+ result.skills += 1;
30
+ }
31
+ catch (e) {
32
+ // Ein Skill, der nicht angelegt wurde, kann keine Dateien aufnehmen:
33
+ // jede einzelne liefe in eine 404 und ergaebe eine Wand aus Meldungen
34
+ // zu einer einzigen Ursache.
35
+ result.failures.push({ what: `skill ${s.name}`, code: codeOf(e) });
36
+ done += s.files.length;
37
+ step(s.name);
38
+ continue;
39
+ }
40
+ step(s.name);
41
+ for (const f of s.files) {
42
+ try {
43
+ const buf = await readFile(f.absolute);
44
+ await api.putSkillFile(s.name, f.path, f.binary ? buf.toString('base64') : buf.toString('utf8'), f.binary ? 'base64' : 'utf8');
45
+ result.skillFiles += 1;
46
+ }
47
+ catch (e) {
48
+ result.failures.push({ what: `${s.name}/${f.path}`, code: codeOf(e) });
49
+ }
50
+ step(`${s.name}/${f.path}`);
51
+ }
52
+ }
53
+ for (const a of plan.agents) {
54
+ try {
55
+ const text = await readFile(a.source, 'utf8');
56
+ const header = parseAgentHeader(text);
57
+ if (!header) {
58
+ // Ohne Kopf fehlt die Beschreibung, und eine zu erfinden hiesse, im
59
+ // Konto etwas anzulegen, das der Datei auf der Platte nicht entspricht.
60
+ result.failures.push({ what: `agent ${a.name}`, code: 'no-frontmatter' });
61
+ step(a.name);
62
+ continue;
63
+ }
64
+ await api.putAgent(a.name, { ...header, body: bodyBelowHeader(text) });
65
+ result.agents += 1;
66
+ }
67
+ catch (e) {
68
+ result.failures.push({ what: `agent ${a.name}`, code: codeOf(e) });
69
+ }
70
+ step(a.name);
71
+ }
72
+ for (const m of plan.memory) {
73
+ try {
74
+ await api.writeMemory(m.path, await readFile(m.source, 'utf8'));
75
+ result.memory += 1;
76
+ }
77
+ catch (e) {
78
+ result.failures.push({ what: m.path, code: codeOf(e) });
79
+ }
80
+ step(m.path);
81
+ }
82
+ return result;
83
+ }
84
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/import/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function isSafeSkillFilePath(path: string): boolean;
@@ -0,0 +1,29 @@
1
+ // Client-seitige Kopie der Server-Regel (packages/api/src/skills/files.ts,
2
+ // skillFilePath). Dasselbe Muster wie memoryPath.ts, und aus zwei Gruenden:
3
+ //
4
+ // Beim Schreiben (stubs.ts) ist es eine Sicherheitspruefung - aus einem Pfad,
5
+ // den der Server geschickt hat, wird ein echter Schreibvorgang auf einer
6
+ // echten Platte, und die muss auch dann halten, wenn jede andere Pruefung
7
+ // versagt hat.
8
+ //
9
+ // Beim Planen (import/plan.ts) ist es Hoeflichkeit: der Bericht soll
10
+ // "uebersprungen, ungueltiger Pfad" sagen koennen, statt dass jemand 307
11
+ // Uploads zuschaut und einen 400 am Ende. Gemessen an einem echten Setup war
12
+ // das genau eine Datei, `ui-styling/scripts/.coverage` - ein Segment darf
13
+ // nicht mit einem Punkt beginnen.
14
+ const SEGMENT = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
15
+ const MAX_SEGMENTS = 8;
16
+ const MAX_LENGTH = 200;
17
+ export function isSafeSkillFilePath(path) {
18
+ if (path.length === 0 || path.length > MAX_LENGTH)
19
+ return false;
20
+ // SKILL.md ist der Inhalt des Skills selbst und keine Begleitdatei. Der
21
+ // Server lehnt sie ab, damit es nicht zwei Orte fuer denselben Text gibt.
22
+ if (path === 'SKILL.md')
23
+ return false;
24
+ const parts = path.split('/');
25
+ if (parts.length > MAX_SEGMENTS)
26
+ return false;
27
+ return parts.every((seg) => SEGMENT.test(seg) && seg !== '..' && seg !== '.');
28
+ }
29
+ //# sourceMappingURL=skillFilePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillFilePath.js","sourceRoot":"","sources":["../src/skillFilePath.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,0EAA0E;AAC1E,eAAe;AACf,EAAE;AACF,qEAAqE;AACrE,yEAAyE;AACzE,6EAA6E;AAC7E,0EAA0E;AAC1E,kCAAkC;AAClC,MAAM,OAAO,GAAG,8BAA8B,CAAC;AAC/C,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU;QAAE,OAAO,KAAK,CAAC;IAChE,wEAAwE;IACxE,0EAA0E;IAC1E,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;AAChF,CAAC"}
package/dist/stubs.d.ts CHANGED
@@ -2,4 +2,5 @@ import type { ApiClient } from './apiClient.js';
2
2
  export declare function writeStubs(api: ApiClient, dir: string): Promise<{
3
3
  skills: number;
4
4
  agents: number;
5
+ files: number;
5
6
  }>;
package/dist/stubs.js CHANGED
@@ -1,5 +1,9 @@
1
1
  import { mkdir, writeFile } from 'node:fs/promises';
2
- import { join } from 'node:path';
2
+ import { dirname, join } from 'node:path';
3
+ // Der Client prueft den Pfad, den der Server geschickt hat, unabhaengig davon,
4
+ // dass der Server ihn beim Schreiben schon geprueft hat: hier wird aus einem
5
+ // Pfad ein echter Schreibvorgang auf einer echten Platte.
6
+ import { isSafeSkillFilePath } from './skillFilePath.js';
3
7
  // Gleiche Positivliste wie server-seitig (packages/api/src/http/names.ts,
4
8
  // skillName/agentName). Dieses Paket haengt nicht von @onlymcp/api ab, also
5
9
  // keine gemeinsame Konstante, aber ein Name, der so nie in der Datenbank
@@ -18,6 +22,7 @@ function yamlSafe(value) {
18
22
  }
19
23
  export async function writeStubs(api, dir) {
20
24
  const [{ skills }, { agents }] = await Promise.all([api.listSkills(), api.listAgents()]);
25
+ let files = 0;
21
26
  for (const s of skills) {
22
27
  if (!SAFE_NAME.test(s.name))
23
28
  continue;
@@ -30,6 +35,36 @@ description: Synchronisiert ueber OnlyMCP. Inhalt wird bei Bedarf geladen.
30
35
 
31
36
  Rufe \`get_skill({ name: "${s.name}" })\` am OnlyMCP-Server auf und befolge, was zurueckkommt.
32
37
  `, 'utf8');
38
+ // Die Begleitdateien liegen danach WIRKLICH auf der Platte, nicht hinter
39
+ // einem Werkzeug. Genau das macht das Merkmal aus: ein Skill, dessen Text
40
+ // "lies references/palette.md" sagt, funktioniert unveraendert, weil die
41
+ // Datei da ist. Nur die SKILL.md bleibt ein Stub - sie ist die einzige,
42
+ // die jeder Client ohnehin zuerst liest, und der Sparsinn des Verfahrens
43
+ // haengt an ihr.
44
+ //
45
+ // Faellt der Abruf aus, bleibt der Stub trotzdem stehen: ein Client, der
46
+ // den Server gerade nicht erreicht, soll wenigstens wissen, dass es den
47
+ // Skill gibt.
48
+ try {
49
+ const detail = await api.getSkill(s.name);
50
+ for (const meta of detail.files ?? []) {
51
+ if (!isSafeSkillFilePath(meta.path))
52
+ continue;
53
+ const file = await api.getSkillFile(s.name, meta.path);
54
+ const dest = join(target, ...meta.path.split('/'));
55
+ await mkdir(dirname(dest), { recursive: true });
56
+ if (file.encoding === 'base64') {
57
+ await writeFile(dest, Buffer.from(file.content, 'base64'));
58
+ }
59
+ else {
60
+ await writeFile(dest, file.content, 'utf8');
61
+ }
62
+ files += 1;
63
+ }
64
+ }
65
+ catch {
66
+ // absichtlich still, siehe oben
67
+ }
33
68
  }
34
69
  await mkdir(join(dir, 'agents'), { recursive: true });
35
70
  for (const a of agents) {
@@ -47,6 +82,6 @@ ${model ? `model: ${model}\n` : ''}tools: ${tools}
47
82
  Rufe \`get_agent_definition({ name: "${a.name}" })\` am OnlyMCP-Server auf und befolge, was zurueckkommt.
48
83
  `, 'utf8');
49
84
  }
50
- return { skills: skills.length, agents: agents.length };
85
+ return { skills: skills.length, agents: agents.length, files };
51
86
  }
52
87
  //# sourceMappingURL=stubs.js.map
package/dist/stubs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stubs.js","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,yEAAyE;AACzE,4EAA4E;AAC5E,2EAA2E;AAC3E,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAE7C,6EAA6E;AAC7E,6EAA6E;AAC7E,sEAAsE;AACtE,wEAAwE;AACxE,0EAA0E;AAC1E,qEAAqE;AACrE,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAc,EAAE,GAAW;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAEzF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,SAAS,CACb,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EACxB;QACE,CAAC,CAAC,IAAI;;;;4BAIc,CAAC,CAAC,IAAI;CACjC,EACK,MAAM,CACP,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,EACnC;QACE,CAAC,CAAC,IAAI;eACC,WAAW;EACxB,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK;;;uCAGV,CAAC,CAAC,IAAI;CAC5C,EACK,MAAM,CACP,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"stubs.js","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ import type { ApiClient } from '../apiClient.js';
3
+ export declare const GetSkillFileInput: z.ZodObject<{
4
+ name: z.ZodString;
5
+ path: z.ZodString;
6
+ }, z.core.$strip>;
7
+ export declare function createGetSkillFileTool(api: ApiClient): {
8
+ name: string;
9
+ description: string;
10
+ inputSchema: z.ZodObject<{
11
+ name: z.ZodString;
12
+ path: z.ZodString;
13
+ }, z.core.$strip>;
14
+ handler(args: z.infer<typeof GetSkillFileInput>): Promise<{
15
+ content: {
16
+ type: "text";
17
+ text: string;
18
+ }[];
19
+ isError: boolean;
20
+ } | {
21
+ content: {
22
+ type: "text";
23
+ text: string;
24
+ }[];
25
+ isError?: undefined;
26
+ }>;
27
+ };
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { ApiError } from '../apiClient.js';
3
+ export const GetSkillFileInput = z.object({
4
+ name: z.string().min(1).max(64),
5
+ path: z.string().min(1).max(200),
6
+ });
7
+ export function createGetSkillFileTool(api) {
8
+ return {
9
+ name: 'get_skill_file',
10
+ description: 'Liefert eine einzelne Begleitdatei eines Skills aus der OnlyMCP-Cloud, etwa references/palette.md. ' +
11
+ 'Normalerweise nicht noetig: `onlymcp sync` legt diese Dateien neben der SKILL.md ab.',
12
+ inputSchema: GetSkillFileInput,
13
+ async handler(args) {
14
+ try {
15
+ const file = await api.getSkillFile(args.name, args.path);
16
+ // Eine Binaerdatei ist als Text nie brauchbar. Das zu sagen hilft mehr,
17
+ // als 200 KB base64 zurueckzugeben, mit denen das Modell nichts
18
+ // anfangen kann ausser sie durch seinen Kontext zu schieben.
19
+ if (file.encoding === 'base64') {
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: `errors.BINARY_FILE ${file.path} (${file.size} Bytes) - mit \`onlymcp sync\` auf die Platte holen.`,
25
+ },
26
+ ],
27
+ isError: true,
28
+ };
29
+ }
30
+ return { content: [{ type: 'text', text: file.content }] };
31
+ }
32
+ catch (e) {
33
+ const code = e instanceof ApiError ? e.code : 'errors.UNKNOWN';
34
+ return { content: [{ type: 'text', text: code }], isError: true };
35
+ }
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=getSkillFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSkillFile.js","sourceRoot":"","sources":["../../src/tools/getSkillFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,GAAc;IACnD,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,qGAAqG;YACrG,sFAAsF;QACxF,WAAW,EAAE,iBAAiB;QAC9B,KAAK,CAAC,OAAO,CAAC,IAAuC;YACnD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1D,wEAAwE;gBACxE,gEAAgE;gBAChE,6DAA6D;gBAC7D,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC/B,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,sBAAsB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,sDAAsD;6BAC1G;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACtE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAC/D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onlymcp",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "Skills, Agents und Memory aus der OnlyMCP-Cloud in jedem MCP-Client. Enthaelt den stdio-MCP-Server und die CLI zum Einrichten von Claude Code, Codex und Gemini CLI.",
5
5
  "license": "MIT",
6
6
  "author": "Francesco Palazzo",