onlymcp 0.17.0 → 0.20.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 +33 -17
- package/README.md +2 -1
- package/dist/bin/cli.js +68 -583
- package/dist/bin/mcp.js +45 -73
- package/package.json +7 -10
- package/dist/apiBaseUrl.d.ts +0 -12
- package/dist/apiBaseUrl.js +0 -28
- package/dist/apiBaseUrl.js.map +0 -1
- package/dist/apiClient.d.ts +0 -296
- package/dist/apiClient.js +0 -224
- package/dist/apiClient.js.map +0 -1
- package/dist/auth/deviceLogin.d.ts +0 -5
- package/dist/auth/deviceLogin.js +0 -40
- package/dist/auth/deviceLogin.js.map +0 -1
- package/dist/auth/keyring.d.ts +0 -16
- package/dist/auth/keyring.js +0 -33
- package/dist/auth/keyring.js.map +0 -1
- package/dist/bin/cli.d.ts +0 -2
- package/dist/bin/cli.js.map +0 -1
- package/dist/bin/mcp.d.ts +0 -2
- package/dist/bin/mcp.js.map +0 -1
- package/dist/cache.d.ts +0 -7
- package/dist/cache.js +0 -32
- package/dist/cache.js.map +0 -1
- package/dist/deviceId.d.ts +0 -2
- package/dist/deviceId.js +0 -97
- package/dist/deviceId.js.map +0 -1
- package/dist/export/unpack.d.ts +0 -33
- package/dist/export/unpack.js +0 -54
- package/dist/export/unpack.js.map +0 -1
- package/dist/identity.d.ts +0 -29
- package/dist/identity.js +0 -116
- package/dist/identity.js.map +0 -1
- package/dist/import/collect.d.ts +0 -25
- package/dist/import/collect.js +0 -101
- package/dist/import/collect.js.map +0 -1
- package/dist/import/frontmatter.d.ts +0 -44
- package/dist/import/frontmatter.js +0 -93
- package/dist/import/frontmatter.js.map +0 -1
- package/dist/import/plan.d.ts +0 -74
- package/dist/import/plan.js +0 -190
- package/dist/import/plan.js.map +0 -1
- package/dist/import/prune.d.ts +0 -46
- package/dist/import/prune.js +0 -61
- package/dist/import/prune.js.map +0 -1
- package/dist/import/secrets.d.ts +0 -7
- package/dist/import/secrets.js +0 -77
- package/dist/import/secrets.js.map +0 -1
- package/dist/import/upload.d.ts +0 -21
- package/dist/import/upload.js +0 -99
- package/dist/import/upload.js.map +0 -1
- package/dist/install.d.ts +0 -81
- package/dist/install.js +0 -168
- package/dist/install.js.map +0 -1
- package/dist/instructions.d.ts +0 -4
- package/dist/instructions.js +0 -67
- package/dist/instructions.js.map +0 -1
- package/dist/memoryPath.d.ts +0 -1
- package/dist/memoryPath.js +0 -13
- package/dist/memoryPath.js.map +0 -1
- package/dist/memorySync.d.ts +0 -28
- package/dist/memorySync.js +0 -56
- package/dist/memorySync.js.map +0 -1
- package/dist/paths.d.ts +0 -18
- package/dist/paths.js +0 -62
- package/dist/paths.js.map +0 -1
- package/dist/registry/caveats.d.ts +0 -17
- package/dist/registry/caveats.js +0 -74
- package/dist/registry/caveats.js.map +0 -1
- package/dist/registry/clients.d.ts +0 -17
- package/dist/registry/clients.js +0 -402
- package/dist/registry/clients.js.map +0 -1
- package/dist/registry/index.d.ts +0 -6
- package/dist/registry/index.js +0 -7
- package/dist/registry/index.js.map +0 -1
- package/dist/registry/serverInfo.d.ts +0 -25
- package/dist/registry/serverInfo.js +0 -33
- package/dist/registry/serverInfo.js.map +0 -1
- package/dist/registry/servers.d.ts +0 -58
- package/dist/registry/servers.js +0 -259
- package/dist/registry/servers.js.map +0 -1
- package/dist/registry/toolHints.d.ts +0 -29
- package/dist/registry/toolHints.js +0 -41
- package/dist/registry/toolHints.js.map +0 -1
- package/dist/registry/types.d.ts +0 -71
- package/dist/registry/types.js +0 -6
- package/dist/registry/types.js.map +0 -1
- package/dist/skillFilePath.d.ts +0 -1
- package/dist/skillFilePath.js +0 -29
- package/dist/skillFilePath.js.map +0 -1
- package/dist/stubIgnore.d.ts +0 -22
- package/dist/stubIgnore.js +0 -29
- package/dist/stubIgnore.js.map +0 -1
- package/dist/stubs.d.ts +0 -12
- package/dist/stubs.js +0 -188
- package/dist/stubs.js.map +0 -1
- package/dist/tools/connections.d.ts +0 -154
- package/dist/tools/connections.js +0 -164
- package/dist/tools/connections.js.map +0 -1
- package/dist/tools/getAgentDefinition.d.ts +0 -26
- package/dist/tools/getAgentDefinition.js +0 -29
- package/dist/tools/getAgentDefinition.js.map +0 -1
- package/dist/tools/getSkill.d.ts +0 -26
- package/dist/tools/getSkill.js +0 -26
- package/dist/tools/getSkill.js.map +0 -1
- package/dist/tools/getSkillFile.d.ts +0 -27
- package/dist/tools/getSkillFile.js +0 -39
- package/dist/tools/getSkillFile.js.map +0 -1
- package/dist/tools/index.d.ts +0 -263
- package/dist/tools/index.js +0 -69
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/lists.d.ts +0 -38
- package/dist/tools/lists.js +0 -39
- package/dist/tools/lists.js.map +0 -1
- package/dist/tools/memoryGraph.d.ts +0 -69
- package/dist/tools/memoryGraph.js +0 -128
- package/dist/tools/memoryGraph.js.map +0 -1
- package/dist/tools/memoryRead.d.ts +0 -25
- package/dist/tools/memoryRead.js +0 -33
- package/dist/tools/memoryRead.js.map +0 -1
- package/dist/tools/memoryWrite.d.ts +0 -27
- package/dist/tools/memoryWrite.js +0 -34
- package/dist/tools/memoryWrite.js.map +0 -1
- package/dist/tools/write.d.ts +0 -166
- package/dist/tools/write.js +0 -193
- package/dist/tools/write.js.map +0 -1
package/dist/import/plan.js
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { basename } from 'node:path';
|
|
2
|
-
import { isSafeMemoryPath } from '../memoryPath.js';
|
|
3
|
-
import { isSafeSkillFilePath } from '../skillFilePath.js';
|
|
4
|
-
// Die Namensregel ist die des Servers (packages/api/src/http/names.ts), hier
|
|
5
|
-
// noch einmal geprueft, damit der Bericht "uebersprungen, ungueltiger Name"
|
|
6
|
-
// sagen kann, statt dass jemand 40 Uploads zuschaut und dann eine 400 sieht.
|
|
7
|
-
const SAFE_NAME = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
8
|
-
// Skills duerfen seit Aufgabe 11 ein Namensraum-Segment tragen, Agents nicht.
|
|
9
|
-
const SAFE_SKILL_NAME = /^[a-z0-9]+(-[a-z0-9]+)*(:[a-z0-9]+(-[a-z0-9]+)*)?$/;
|
|
10
|
-
// Der Schluessel einer Sammlung, wie ihn `Collection` in skills/route.ts
|
|
11
|
-
// annimmt. Ein Wurzelordner, dessen Name hier durchfaellt (`.claude` etwa),
|
|
12
|
-
// liefert einfach keine Sammlung statt den ganzen Import scheitern zu lassen.
|
|
13
|
-
const SAFE_COLLECTION_KEY = /^[a-z0-9][a-z0-9._-]*$/i;
|
|
14
|
-
function locate(relative) {
|
|
15
|
-
const parts = relative.split('/');
|
|
16
|
-
const i = parts.indexOf('skills');
|
|
17
|
-
if (i >= 4 && parts[i - 4] === 'cache' && i + 1 < parts.length - 1) {
|
|
18
|
-
return {
|
|
19
|
-
prefix: parts.slice(0, i + 2).join('/'),
|
|
20
|
-
name: `${parts[i - 2]}:${parts[i + 1]}`,
|
|
21
|
-
plugin: parts[i - 2],
|
|
22
|
-
path: parts.slice(i + 2).join('/'),
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
// Eine Datei direkt in der Wurzel gehoert zu keinem Skill.
|
|
26
|
-
if (parts.length < 2)
|
|
27
|
-
return null;
|
|
28
|
-
return { prefix: parts[0], name: parts[0], plugin: null, path: parts.slice(1).join('/') };
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Eine markierte Datei faellt aus dem Plan, nicht aus dem Bericht. Der
|
|
32
|
-
* Benutzer sieht sie unter "zurueckgehalten" mit Regel und Zeile und kann sie
|
|
33
|
-
* ausdruecklich freigeben. Sie stillschweigend wegzulassen waere derselbe
|
|
34
|
-
* Fehler wie sie stillschweigend zu senden.
|
|
35
|
-
*/
|
|
36
|
-
function usable(c) {
|
|
37
|
-
return c.skip === null && c.hits.length === 0;
|
|
38
|
-
}
|
|
39
|
-
function reasonOf(c) {
|
|
40
|
-
return c.skip ?? (c.hits.length > 0 ? 'flagged' : 'unusable');
|
|
41
|
-
}
|
|
42
|
-
export function planSkills(items, opts = {}) {
|
|
43
|
-
const plans = [];
|
|
44
|
-
const skipped = [];
|
|
45
|
-
const noDescription = [];
|
|
46
|
-
const folders = new Map();
|
|
47
|
-
// Der Ordnername der Wurzel ist die Sammlung fuer alles, was nicht aus
|
|
48
|
-
// einem Plugin kommt (Spec 8.1). Ohne Wurzel - etwa im Test, der nur
|
|
49
|
-
// Kandidaten uebergibt - gibt es keine, und das ist kein Fehler.
|
|
50
|
-
const rootKey = opts.root ? basename(opts.root.replace(/[/\\]+$/, '')) : '';
|
|
51
|
-
const rootCollection = SAFE_COLLECTION_KEY.test(rootKey)
|
|
52
|
-
? { key: rootKey, kind: 'directory', label: rootKey }
|
|
53
|
-
: null;
|
|
54
|
-
for (const c of items) {
|
|
55
|
-
const at = locate(c.relative);
|
|
56
|
-
if (!at) {
|
|
57
|
-
skipped.push({ relative: c.relative, reason: 'not-in-a-skill-folder' });
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
const bucket = folders.get(at.prefix);
|
|
61
|
-
if (bucket)
|
|
62
|
-
bucket.entries.push(c);
|
|
63
|
-
else
|
|
64
|
-
folders.set(at.prefix, { at, entries: [c] });
|
|
65
|
-
}
|
|
66
|
-
for (const [prefix, { at, entries }] of folders) {
|
|
67
|
-
const name = at.name;
|
|
68
|
-
if (!SAFE_SKILL_NAME.test(name)) {
|
|
69
|
-
skipped.push({ relative: prefix, reason: 'invalid-name' });
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
const skillMd = entries.find((c) => c.relative === `${prefix}/SKILL.md`);
|
|
73
|
-
if (!skillMd) {
|
|
74
|
-
// Ein Ordner ohne SKILL.md ist kein Skill. Seine Streudateien unter
|
|
75
|
-
// einem erfundenen Namen hochzuladen legte etwas ins Konto, das auch
|
|
76
|
-
// auf der Platte nie ein Skill war.
|
|
77
|
-
skipped.push({ relative: prefix, reason: 'no-skill-md' });
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
if (!usable(skillMd)) {
|
|
81
|
-
// Ohne seinen eigenen Text ist der Skill nichts. Nur die Begleitdateien
|
|
82
|
-
// hochzuladen ergaebe einen Skill, der auf einen Inhalt verweist, den es
|
|
83
|
-
// im Konto nicht gibt.
|
|
84
|
-
skipped.push({ relative: `${prefix}/SKILL.md`, reason: reasonOf(skillMd) });
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
const files = [];
|
|
88
|
-
for (const c of entries) {
|
|
89
|
-
if (c === skillMd)
|
|
90
|
-
continue;
|
|
91
|
-
if (!usable(c)) {
|
|
92
|
-
skipped.push({ relative: c.relative, reason: reasonOf(c) });
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
const path = c.relative.slice(prefix.length + 1);
|
|
96
|
-
if (!isSafeSkillFilePath(path)) {
|
|
97
|
-
// Dieselbe Ueberlegung wie beim Skill-Namen: was der Server ablehnt,
|
|
98
|
-
// gehoert in den Bericht und nicht in den Upload.
|
|
99
|
-
skipped.push({ relative: c.relative, reason: 'invalid-path' });
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
files.push({
|
|
103
|
-
path,
|
|
104
|
-
absolute: c.absolute,
|
|
105
|
-
bytes: c.bytes,
|
|
106
|
-
binary: c.binary,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
files.sort((a, b) => a.path.localeCompare(b.path));
|
|
110
|
-
const description = skillMd.description ?? '';
|
|
111
|
-
if (!description)
|
|
112
|
-
noDescription.push(name);
|
|
113
|
-
plans.push({
|
|
114
|
-
name,
|
|
115
|
-
source: skillMd.absolute,
|
|
116
|
-
sourcePath: skillMd.relative,
|
|
117
|
-
description,
|
|
118
|
-
collection: at.plugin
|
|
119
|
-
? SAFE_COLLECTION_KEY.test(at.plugin)
|
|
120
|
-
? { key: at.plugin, kind: 'plugin', label: at.plugin }
|
|
121
|
-
: null
|
|
122
|
-
: rootCollection,
|
|
123
|
-
bytes: skillMd.bytes,
|
|
124
|
-
files,
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
plans.sort((a, b) => a.name.localeCompare(b.name));
|
|
128
|
-
noDescription.sort();
|
|
129
|
-
return { plans, skipped, noDescription };
|
|
130
|
-
}
|
|
131
|
-
export function planAgents(items) {
|
|
132
|
-
const plans = [];
|
|
133
|
-
const skipped = [];
|
|
134
|
-
for (const c of items) {
|
|
135
|
-
if (c.relative.includes('/')) {
|
|
136
|
-
skipped.push({ relative: c.relative, reason: 'not-at-top-level' });
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
|
-
if (!c.relative.endsWith('.md')) {
|
|
140
|
-
skipped.push({ relative: c.relative, reason: 'not-markdown' });
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
const name = c.relative.slice(0, -3);
|
|
144
|
-
if (!SAFE_NAME.test(name)) {
|
|
145
|
-
skipped.push({ relative: c.relative, reason: 'invalid-name' });
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
if (!usable(c)) {
|
|
149
|
-
skipped.push({ relative: c.relative, reason: reasonOf(c) });
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
plans.push({ name, source: c.absolute, bytes: c.bytes });
|
|
153
|
-
}
|
|
154
|
-
plans.sort((a, b) => a.name.localeCompare(b.name));
|
|
155
|
-
return { plans, skipped };
|
|
156
|
-
}
|
|
157
|
-
export function planMemory(items) {
|
|
158
|
-
const plans = [];
|
|
159
|
-
const skipped = [];
|
|
160
|
-
for (const c of items) {
|
|
161
|
-
// Dieselbe Regel wie in memoryPath.ts, nicht eine zweite daneben: was der
|
|
162
|
-
// Server ablehnt, soll hier gar nicht erst in den Plan geraten.
|
|
163
|
-
if (!isSafeMemoryPath(c.relative)) {
|
|
164
|
-
skipped.push({ relative: c.relative, reason: 'invalid-path' });
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
if (!usable(c)) {
|
|
168
|
-
skipped.push({ relative: c.relative, reason: reasonOf(c) });
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
plans.push({ path: c.relative, source: c.absolute, bytes: c.bytes });
|
|
172
|
-
}
|
|
173
|
-
plans.sort((a, b) => a.path.localeCompare(b.path));
|
|
174
|
-
return { plans, skipped };
|
|
175
|
-
}
|
|
176
|
-
export function buildImportPlan(sources, opts = {}) {
|
|
177
|
-
const s = planSkills(sources.skills ?? [], { root: opts.skillsRoot });
|
|
178
|
-
const a = planAgents(sources.agents ?? []);
|
|
179
|
-
const m = planMemory(sources.memory ?? []);
|
|
180
|
-
const all = [...(sources.skills ?? []), ...(sources.agents ?? []), ...(sources.memory ?? [])];
|
|
181
|
-
return {
|
|
182
|
-
skills: s.plans,
|
|
183
|
-
agents: a.plans,
|
|
184
|
-
memory: m.plans,
|
|
185
|
-
flagged: all.filter((c) => c.skip === null && c.hits.length > 0),
|
|
186
|
-
skipped: [...s.skipped, ...a.skipped, ...m.skipped],
|
|
187
|
-
noDescription: s.noDescription,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
//# sourceMappingURL=plan.js.map
|
package/dist/import/plan.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/import/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/import/prune.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { ApiClient } from '../apiClient.js';
|
|
2
|
-
import type { ImportPlan } from './plan.js';
|
|
3
|
-
/**
|
|
4
|
-
* What `--prune` would delete: entries the account holds and the source
|
|
5
|
-
* directory does not.
|
|
6
|
-
*
|
|
7
|
-
* Package 03 task 12, spec 8.4. Three rules decide what may appear here, and
|
|
8
|
-
* all three are about not deleting something the source never claimed to
|
|
9
|
-
* describe:
|
|
10
|
-
*
|
|
11
|
-
* 1. **Only a category that was read.** `onlymcp import --skills x --prune`
|
|
12
|
-
* must not touch memory: nothing was read about memory, so "not in the
|
|
13
|
-
* source" says nothing about it. Without this rule the flag would empty
|
|
14
|
-
* the memory of anyone who pruned a skill folder.
|
|
15
|
-
* 2. **Only personal rows the caller owns.** A team skill is somebody else's
|
|
16
|
-
* work sitting in a shared scope; the fact that it is missing from one
|
|
17
|
-
* member's disk is not a reason to delete it for everyone.
|
|
18
|
-
* 3. **Nothing archived.** An archived row is by definition not on disk any
|
|
19
|
-
* more. Deleting it on the next import would turn the archive into a trap.
|
|
20
|
-
*/
|
|
21
|
-
export type PruneTargets = {
|
|
22
|
-
skills: string[];
|
|
23
|
-
agents: string[];
|
|
24
|
-
memory: string[];
|
|
25
|
-
};
|
|
26
|
-
export type Covered = {
|
|
27
|
-
skills: boolean;
|
|
28
|
-
agents: boolean;
|
|
29
|
-
memory: boolean;
|
|
30
|
-
};
|
|
31
|
-
export declare function isEmpty(t: PruneTargets): boolean;
|
|
32
|
-
export declare function countTargets(t: PruneTargets): number;
|
|
33
|
-
export declare function planPrune(api: ApiClient, plan: ImportPlan, covered: Covered): Promise<PruneTargets>;
|
|
34
|
-
export type PruneResult = {
|
|
35
|
-
deleted: number;
|
|
36
|
-
failures: {
|
|
37
|
-
what: string;
|
|
38
|
-
code: string;
|
|
39
|
-
}[];
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* One by one, and a failure never stops the rest: the caller has already
|
|
43
|
-
* confirmed this exact list, so a single 404 in the middle should not leave
|
|
44
|
-
* the other entries behind in a state nobody asked for.
|
|
45
|
-
*/
|
|
46
|
-
export declare function runPrune(api: ApiClient, targets: PruneTargets): Promise<PruneResult>;
|
package/dist/import/prune.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { ApiError } from '../apiClient.js';
|
|
2
|
-
export function isEmpty(t) {
|
|
3
|
-
return t.skills.length === 0 && t.agents.length === 0 && t.memory.length === 0;
|
|
4
|
-
}
|
|
5
|
-
export function countTargets(t) {
|
|
6
|
-
return t.skills.length + t.agents.length + t.memory.length;
|
|
7
|
-
}
|
|
8
|
-
function deletable(row) {
|
|
9
|
-
return row.scope === 'personal' && row.isOwn && row.archivedAt === null;
|
|
10
|
-
}
|
|
11
|
-
export async function planPrune(api, plan, covered) {
|
|
12
|
-
const targets = { skills: [], agents: [], memory: [] };
|
|
13
|
-
if (covered.skills) {
|
|
14
|
-
const keep = new Set(plan.skills.map((s) => s.name));
|
|
15
|
-
const { skills } = await api.listSkills();
|
|
16
|
-
targets.skills = skills.filter((s) => deletable(s) && !keep.has(s.name)).map((s) => s.name);
|
|
17
|
-
}
|
|
18
|
-
if (covered.agents) {
|
|
19
|
-
const keep = new Set(plan.agents.map((a) => a.name));
|
|
20
|
-
const { agents } = await api.listAgents();
|
|
21
|
-
targets.agents = agents.filter((a) => deletable(a) && !keep.has(a.name)).map((a) => a.name);
|
|
22
|
-
}
|
|
23
|
-
if (covered.memory) {
|
|
24
|
-
const keep = new Set(plan.memory.map((m) => m.path));
|
|
25
|
-
const { files } = await api.listMemory();
|
|
26
|
-
targets.memory = files.filter((f) => deletable(f) && !keep.has(f.path)).map((f) => f.path);
|
|
27
|
-
}
|
|
28
|
-
targets.skills.sort();
|
|
29
|
-
targets.agents.sort();
|
|
30
|
-
targets.memory.sort();
|
|
31
|
-
return targets;
|
|
32
|
-
}
|
|
33
|
-
function codeOf(e) {
|
|
34
|
-
if (e instanceof ApiError)
|
|
35
|
-
return e.code;
|
|
36
|
-
return e instanceof Error ? e.message : String(e);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* One by one, and a failure never stops the rest: the caller has already
|
|
40
|
-
* confirmed this exact list, so a single 404 in the middle should not leave
|
|
41
|
-
* the other entries behind in a state nobody asked for.
|
|
42
|
-
*/
|
|
43
|
-
export async function runPrune(api, targets) {
|
|
44
|
-
const result = { deleted: 0, failures: [] };
|
|
45
|
-
const each = async (items, what, go) => {
|
|
46
|
-
for (const item of items) {
|
|
47
|
-
try {
|
|
48
|
-
await go(item);
|
|
49
|
-
result.deleted += 1;
|
|
50
|
-
}
|
|
51
|
-
catch (e) {
|
|
52
|
-
result.failures.push({ what: what(item), code: codeOf(e) });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
await each(targets.skills, (n) => `skill ${n}`, (n) => api.deleteSkill(n));
|
|
57
|
-
await each(targets.agents, (n) => `agent ${n}`, (n) => api.deleteAgent(n));
|
|
58
|
-
await each(targets.memory, (p) => p, (p) => api.deleteMemory(p));
|
|
59
|
-
return result;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=prune.js.map
|
package/dist/import/prune.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/import/prune.ts"],"names":[],"mappings":"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"}
|
package/dist/import/secrets.d.ts
DELETED
package/dist/import/secrets.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
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} characters)`;
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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,cAAc,CAAC;AACxE,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"}
|
package/dist/import/upload.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
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>;
|
package/dist/import/upload.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { hostname } from 'node:os';
|
|
3
|
-
import { ApiError } from '../apiClient.js';
|
|
4
|
-
import { bodyBelowHeader, parseAgentHeader } from './frontmatter.js';
|
|
5
|
-
function codeOf(e) {
|
|
6
|
-
if (e instanceof ApiError)
|
|
7
|
-
return e.code;
|
|
8
|
-
return e instanceof Error ? e.message : String(e);
|
|
9
|
-
}
|
|
10
|
-
export function countPlan(plan) {
|
|
11
|
-
return (plan.skills.length +
|
|
12
|
-
plan.skills.reduce((sum, s) => sum + s.files.length, 0) +
|
|
13
|
-
plan.agents.length +
|
|
14
|
-
plan.memory.length);
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Der Reihe nach, mit Absicht. Parallel waere es schneller und hiesse auch,
|
|
18
|
-
* dass ein erreichtes Stufenlimit einen verstreuten Halbimport hinterlaesst,
|
|
19
|
-
* dessen Form von der Ablaufplanung abhaengt. Einzeln bleibt er an einer
|
|
20
|
-
* vorhersagbaren Stelle stehen, und der Bericht kann sagen, an welcher.
|
|
21
|
-
*/
|
|
22
|
-
export async function runUpload(api, plan, onProgress) {
|
|
23
|
-
const result = { skills: 0, skillFiles: 0, agents: 0, memory: 0, failures: [] };
|
|
24
|
-
const total = countPlan(plan);
|
|
25
|
-
let done = 0;
|
|
26
|
-
const step = (label) => onProgress((done += 1), total, label);
|
|
27
|
-
for (const s of plan.skills) {
|
|
28
|
-
try {
|
|
29
|
-
// Die Herkunft geht mit dem Inhalt in EINEM Aufruf hoch. Ein zweiter
|
|
30
|
-
// Aufruf danach koennte scheitern und liesse einen Skill zurueck, der
|
|
31
|
-
// laut Konto aus dem Nichts kam, obwohl er eben importiert wurde.
|
|
32
|
-
await api.putSkill(s.name, await readFile(s.source, 'utf8'), {
|
|
33
|
-
// Leere Beschreibung heisst "keine gefunden" und darf die vorhandene
|
|
34
|
-
// nicht ueberschreiben (Spec 5, Regel 1).
|
|
35
|
-
...(s.description ? { description: s.description } : {}),
|
|
36
|
-
sourcePath: s.sourcePath,
|
|
37
|
-
...(s.collection ? { collection: s.collection } : {}),
|
|
38
|
-
});
|
|
39
|
-
result.skills += 1;
|
|
40
|
-
}
|
|
41
|
-
catch (e) {
|
|
42
|
-
// Ein Skill, der nicht angelegt wurde, kann keine Dateien aufnehmen:
|
|
43
|
-
// jede einzelne liefe in eine 404 und ergaebe eine Wand aus Meldungen
|
|
44
|
-
// zu einer einzigen Ursache.
|
|
45
|
-
result.failures.push({ what: `skill ${s.name}`, code: codeOf(e) });
|
|
46
|
-
done += s.files.length;
|
|
47
|
-
step(s.name);
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
step(s.name);
|
|
51
|
-
for (const f of s.files) {
|
|
52
|
-
try {
|
|
53
|
-
const buf = await readFile(f.absolute);
|
|
54
|
-
await api.putSkillFile(s.name, f.path, f.binary ? buf.toString('base64') : buf.toString('utf8'), f.binary ? 'base64' : 'utf8');
|
|
55
|
-
result.skillFiles += 1;
|
|
56
|
-
}
|
|
57
|
-
catch (e) {
|
|
58
|
-
result.failures.push({ what: `${s.name}/${f.path}`, code: codeOf(e) });
|
|
59
|
-
}
|
|
60
|
-
step(`${s.name}/${f.path}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
for (const a of plan.agents) {
|
|
64
|
-
try {
|
|
65
|
-
const text = await readFile(a.source, 'utf8');
|
|
66
|
-
const header = parseAgentHeader(text);
|
|
67
|
-
if (!header) {
|
|
68
|
-
// Ohne Kopf fehlt die Beschreibung, und eine zu erfinden hiesse, im
|
|
69
|
-
// Konto etwas anzulegen, das der Datei auf der Platte nicht entspricht.
|
|
70
|
-
result.failures.push({ what: `agent ${a.name}`, code: 'no-frontmatter' });
|
|
71
|
-
step(a.name);
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
await api.putAgent(a.name, { ...header, body: bodyBelowHeader(text) });
|
|
75
|
-
result.agents += 1;
|
|
76
|
-
}
|
|
77
|
-
catch (e) {
|
|
78
|
-
result.failures.push({ what: `agent ${a.name}`, code: codeOf(e) });
|
|
79
|
-
}
|
|
80
|
-
step(a.name);
|
|
81
|
-
}
|
|
82
|
-
// The device the API keeps with a file's last write and names in the warning a save gets seconds
|
|
83
|
-
// later from another device. Without one that warning had nothing to name. The machine's host name,
|
|
84
|
-
// as the CLI's memory_write tool sends it, so a write of either from this machine is the same
|
|
85
|
-
// device. The API shows it to the account holder only; a teammate is told their name (D1).
|
|
86
|
-
const device = hostname();
|
|
87
|
-
for (const m of plan.memory) {
|
|
88
|
-
try {
|
|
89
|
-
await api.writeMemory(m.path, await readFile(m.source, 'utf8'), device);
|
|
90
|
-
result.memory += 1;
|
|
91
|
-
}
|
|
92
|
-
catch (e) {
|
|
93
|
-
result.failures.push({ what: m.path, code: codeOf(e) });
|
|
94
|
-
}
|
|
95
|
-
step(m.path);
|
|
96
|
-
}
|
|
97
|
-
return result;
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=upload.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/import/upload.ts"],"names":[],"mappings":"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"}
|
package/dist/install.d.ts
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import type { ClientId } from './registry/index.js';
|
|
2
|
-
/** The npm package that ships both `onlymcp` and `onlymcp-mcp`. */
|
|
3
|
-
export declare const PACKAGE = "onlymcp";
|
|
4
|
-
/**
|
|
5
|
-
* The one line `onlymcp install --client claude-code` prints. Claude Code hides
|
|
6
|
-
* the claude.ai connector when a remote entry with the same URL exists, but a
|
|
7
|
-
* stdio entry never hides it, and the OnlyMCP plugin's entry has a name of its
|
|
8
|
-
* own: next to either of them the local process lists every tool twice. It
|
|
9
|
-
* only replaces an "onlymcp" entry the user added to ~/.claude.json.
|
|
10
|
-
*/
|
|
11
|
-
export declare const CLAUDE_CODE_NOTE = "With the claude.ai connector synced into Claude Code, or the OnlyMCP plugin installed, you need nothing else. This local process is only for skill files on disk: it replaces the remote \"onlymcp\" entry in ~/.claude.json, and next to the connector or the plugin it would list every tool twice.";
|
|
12
|
-
/** Resolves an alias or a registry id to a registry id; undefined if neither. */
|
|
13
|
-
export declare function resolveClientId(id: string): ClientId | undefined;
|
|
14
|
-
export interface InstallTarget {
|
|
15
|
-
id: ClientId;
|
|
16
|
-
name: string;
|
|
17
|
-
configPath: string;
|
|
18
|
-
format: 'json' | 'toml';
|
|
19
|
-
stubDir: string | null;
|
|
20
|
-
/** Only set alongside `stubDir`, and only so a test can tell the two apart. */
|
|
21
|
-
stubRoot: string | null;
|
|
22
|
-
snippet: string;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Every client the registry can write a config for, resolved against `home`.
|
|
26
|
-
*
|
|
27
|
-
* `home` is a parameter and not `homedir()` so every test runs against a
|
|
28
|
-
* throwaway directory: the guardrail from spec §13 sits in the type itself,
|
|
29
|
-
* not merely in intent.
|
|
30
|
-
*/
|
|
31
|
-
export declare function installTargets(home: string): InstallTarget[];
|
|
32
|
-
/**
|
|
33
|
-
* Merges one MCP server entry into an existing JSON config, without
|
|
34
|
-
* touching anything else already in the file.
|
|
35
|
-
*
|
|
36
|
-
* `writeFileSync` alone would replace the whole file (e.g. `~/.claude.json`
|
|
37
|
-
* or `~/.gemini/config/mcp_config.json`), throwing away every other setting stored
|
|
38
|
-
* there. An existing but broken file is never silently overwritten either:
|
|
39
|
-
* better an error than quiet data loss.
|
|
40
|
-
*/
|
|
41
|
-
export declare function mergeJsonServer(path: string, key: string, value: unknown): void;
|
|
42
|
-
/**
|
|
43
|
-
* Appends the TOML snippet, unless it is already there.
|
|
44
|
-
*
|
|
45
|
-
* Appended, not replaced: a second run would otherwise add a second
|
|
46
|
-
* `[mcp_servers.onlymcp]` table, and two identical tables make the file
|
|
47
|
-
* invalid for most TOML parsers.
|
|
48
|
-
*/
|
|
49
|
-
export declare function appendTomlServer(path: string, snippet: string): 'written' | 'already-present';
|
|
50
|
-
/**
|
|
51
|
-
* What `onlymcp install` decided to do, given `--client`/`--all` and the
|
|
52
|
-
* files that exist on this machine. Kept apart from `cli.ts`'s logging and
|
|
53
|
-
* exit codes so the decision itself is testable without spawning the built
|
|
54
|
-
* CLI or depending on Commander at all.
|
|
55
|
-
*/
|
|
56
|
-
export type InstallOutcome = {
|
|
57
|
-
kind: 'conflicting-options';
|
|
58
|
-
} | {
|
|
59
|
-
kind: 'missing-client';
|
|
60
|
-
targets: InstallTarget[];
|
|
61
|
-
} | {
|
|
62
|
-
kind: 'unknown-client';
|
|
63
|
-
targets: InstallTarget[];
|
|
64
|
-
} | {
|
|
65
|
-
kind: 'none-present-for-all';
|
|
66
|
-
targets: InstallTarget[];
|
|
67
|
-
} | {
|
|
68
|
-
kind: 'single';
|
|
69
|
-
target: InstallTarget;
|
|
70
|
-
} | {
|
|
71
|
-
kind: 'all';
|
|
72
|
-
present: InstallTarget[];
|
|
73
|
-
skipped: InstallTarget[];
|
|
74
|
-
};
|
|
75
|
-
/** Pure given the filesystem: same inputs, same decision, every time. */
|
|
76
|
-
export declare function planInstall(home: string, opts: {
|
|
77
|
-
client?: string;
|
|
78
|
-
all?: boolean;
|
|
79
|
-
}): InstallOutcome;
|
|
80
|
-
/** Writes one target's snippet into its config file, creating directories as needed. */
|
|
81
|
-
export declare function writeInstallTarget(target: InstallTarget): 'written' | 'already-present';
|