onlymcp 0.9.1 → 0.11.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/README.md +14 -11
- package/dist/apiClient.d.ts +129 -7
- package/dist/apiClient.js +98 -4
- package/dist/apiClient.js.map +1 -1
- package/dist/auth/deviceLogin.js +5 -1
- package/dist/auth/deviceLogin.js.map +1 -1
- package/dist/bin/cli.js +349 -131
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/mcp.js +16 -2
- package/dist/bin/mcp.js.map +1 -1
- package/dist/export/unpack.d.ts +33 -0
- package/dist/export/unpack.js +54 -0
- package/dist/export/unpack.js.map +1 -0
- package/dist/identity.d.ts +25 -0
- package/dist/identity.js +106 -0
- package/dist/identity.js.map +1 -0
- package/dist/import/collect.d.ts +14 -1
- package/dist/import/collect.js +25 -3
- package/dist/import/collect.js.map +1 -1
- package/dist/import/frontmatter.d.ts +31 -5
- package/dist/import/frontmatter.js +64 -22
- package/dist/import/frontmatter.js.map +1 -1
- package/dist/import/plan.d.ts +22 -1
- package/dist/import/plan.js +66 -19
- package/dist/import/plan.js.map +1 -1
- package/dist/import/prune.d.ts +46 -0
- package/dist/import/prune.js +61 -0
- package/dist/import/prune.js.map +1 -0
- package/dist/import/secrets.js +1 -1
- package/dist/import/secrets.js.map +1 -1
- package/dist/import/upload.js +17 -2
- package/dist/import/upload.js.map +1 -1
- package/dist/install.d.ts +67 -6
- package/dist/install.js +137 -59
- package/dist/install.js.map +1 -1
- package/dist/instructions.d.ts +3 -1
- package/dist/instructions.js +19 -2
- package/dist/instructions.js.map +1 -1
- package/dist/memorySync.d.ts +28 -0
- package/dist/memorySync.js +56 -0
- package/dist/memorySync.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +34 -8
- package/dist/paths.js.map +1 -1
- package/dist/registry/caveats.d.ts +17 -0
- package/dist/registry/caveats.js +50 -0
- package/dist/registry/caveats.js.map +1 -0
- package/dist/registry/clients.d.ts +11 -0
- package/dist/registry/clients.js +327 -0
- package/dist/registry/clients.js.map +1 -0
- package/dist/registry/index.d.ts +4 -0
- package/dist/registry/index.js +5 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/servers.d.ts +50 -0
- package/dist/registry/servers.js +225 -0
- package/dist/registry/servers.js.map +1 -0
- package/dist/registry/types.d.ts +54 -0
- package/dist/registry/types.js +6 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/stubs.d.ts +1 -0
- package/dist/stubs.js +85 -13
- package/dist/stubs.js.map +1 -1
- package/dist/tools/getAgentDefinition.js +5 -2
- package/dist/tools/getAgentDefinition.js.map +1 -1
- package/dist/tools/getSkill.js +1 -1
- package/dist/tools/getSkill.js.map +1 -1
- package/dist/tools/getSkillFile.js +3 -3
- package/dist/tools/getSkillFile.js.map +1 -1
- package/dist/tools/memoryGraph.d.ts +69 -0
- package/dist/tools/memoryGraph.js +128 -0
- package/dist/tools/memoryGraph.js.map +1 -0
- package/dist/tools/memoryRead.js +1 -1
- package/dist/tools/memoryRead.js.map +1 -1
- package/dist/tools/memoryWrite.js +1 -1
- package/dist/tools/memoryWrite.js.map +1 -1
- package/package.json +5 -4
|
@@ -1,33 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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.
|
|
2
|
+
* Der rohe YAML-Kopf, ohne die beiden `---`-Zeilen. `null`, wenn die Datei
|
|
3
|
+
* keinen hat.
|
|
10
4
|
*/
|
|
11
|
-
export function
|
|
5
|
+
export function headerOf(text) {
|
|
12
6
|
if (!text.startsWith('---\n'))
|
|
13
7
|
return null;
|
|
14
8
|
const end = text.indexOf('\n---', 3);
|
|
15
9
|
if (end < 0)
|
|
16
10
|
return null;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
11
|
+
return text.slice(4, end);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Ein einzelnes Feld aus einem Kopf.
|
|
15
|
+
*
|
|
16
|
+
* Bewusst kein YAML-Parser: gebraucht werden eine Handvoll Felder aus einem
|
|
17
|
+
* Kopf, den ein Werkzeug erzeugt hat, und eine Abhaengigkeit dafuer in die
|
|
18
|
+
* CLI zu ziehen ist mehr Angriffsflaeche als Nutzen.
|
|
19
|
+
*/
|
|
20
|
+
export function headerField(head, key) {
|
|
21
|
+
// Der Schluessel wird in den Ausdruck eingesetzt, also darf nur stehen, was
|
|
22
|
+
// dort nichts bedeutet. Alle Aufrufer geben Literale, die Pruefung faengt
|
|
23
|
+
// den Tag ab, an dem einer davon aus einer Eingabe kommt.
|
|
24
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(key))
|
|
25
|
+
return undefined;
|
|
26
|
+
const m = new RegExp(`^${key}:[ \\t]*(.*)$`, 'm').exec(head);
|
|
27
|
+
if (!m)
|
|
28
|
+
return undefined;
|
|
29
|
+
const raw = m[1].trim();
|
|
30
|
+
// Anfuehrungszeichen sind im Bestand optional und tragen keine Bedeutung.
|
|
31
|
+
const unquoted = raw.replace(/^(['"])(.*)\1$/, '$2').trim();
|
|
32
|
+
return unquoted.length > 0 ? unquoted : undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Liest den YAML-Kopf einer Agent-Datei - denselben Kopf, den
|
|
36
|
+
* `agency-agents-normalize.py` schreibt.
|
|
37
|
+
*
|
|
38
|
+
* Alles, was nicht dieser Form entspricht, gibt `null` und die Datei wird
|
|
39
|
+
* uebersprungen - nicht mit einer erfundenen Beschreibung hochgeladen.
|
|
40
|
+
*/
|
|
41
|
+
export function parseAgentHeader(text) {
|
|
42
|
+
const head = headerOf(text);
|
|
43
|
+
if (head === null)
|
|
44
|
+
return null;
|
|
45
|
+
const description = headerField(head, 'description');
|
|
28
46
|
if (!description)
|
|
29
47
|
return null;
|
|
30
|
-
const toolsRaw =
|
|
48
|
+
const toolsRaw = headerField(head, 'tools');
|
|
31
49
|
const tools = toolsRaw
|
|
32
50
|
? toolsRaw
|
|
33
51
|
.replace(/^\[(.*)\]$/, '$1')
|
|
@@ -35,9 +53,33 @@ export function parseAgentHeader(text) {
|
|
|
35
53
|
.map((t) => t.trim())
|
|
36
54
|
.filter((t) => t.length > 0)
|
|
37
55
|
: [];
|
|
38
|
-
const model =
|
|
56
|
+
const model = headerField(head, 'model');
|
|
39
57
|
return model ? { description, model, tools } : { description, tools };
|
|
40
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Die Beschreibung aus einem SKILL.md-Kopf, oder `''`.
|
|
61
|
+
*
|
|
62
|
+
* Anders als beim Agent ist ihr Fehlen kein Grund, die Datei wegzulassen: ein
|
|
63
|
+
* Skill ohne Beschreibung ist ein vollstaendiger Skill, nur einer, den die
|
|
64
|
+
* Liste schlechter zeigen kann. Er wird gemeldet, nicht uebersprungen.
|
|
65
|
+
*/
|
|
66
|
+
export function descriptionOf(text) {
|
|
67
|
+
const head = headerOf(text);
|
|
68
|
+
return (head === null ? undefined : headerField(head, 'description')) ?? '';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Das Merkmal, das `writeStubs` in jede erzeugte SKILL.md schreibt.
|
|
72
|
+
*
|
|
73
|
+
* Ohne dieses Merkmal laedt der naechste `import` die Stubs als Skills hoch
|
|
74
|
+
* und ersetzt damit jeden echten Skill durch seinen eigenen Platzhalter -
|
|
75
|
+
* Stubs liegen seit Aufgabe 12 in genau den Ordnern, die der Import liest.
|
|
76
|
+
*/
|
|
77
|
+
export function isStub(text) {
|
|
78
|
+
const head = headerOf(text);
|
|
79
|
+
if (head === null)
|
|
80
|
+
return false;
|
|
81
|
+
return headerField(head, 'x-onlymcp-stub') === 'true';
|
|
82
|
+
}
|
|
41
83
|
/** Der Teil unter dem Kopf. Ohne Kopf ist die ganze Datei der Inhalt. */
|
|
42
84
|
export function bodyBelowHeader(text) {
|
|
43
85
|
if (!text.startsWith('---\n'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/import/frontmatter.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/import/frontmatter.ts"],"names":[],"mappings":"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"}
|
package/dist/import/plan.d.ts
CHANGED
|
@@ -5,10 +5,24 @@ export type PlannedFile = {
|
|
|
5
5
|
bytes: number;
|
|
6
6
|
binary: boolean;
|
|
7
7
|
};
|
|
8
|
+
/** Herkunft eines Skills, so wie `PUT /api/skills/:name` sie entgegennimmt. */
|
|
9
|
+
export type PlannedCollection = {
|
|
10
|
+
key: string;
|
|
11
|
+
kind: 'plugin' | 'directory';
|
|
12
|
+
label: string;
|
|
13
|
+
};
|
|
8
14
|
/** `source` ist der absolute Pfad der SKILL.md. Gelesen wird erst beim Hochladen. */
|
|
9
15
|
export type SkillPlan = {
|
|
10
16
|
name: string;
|
|
11
17
|
source: string;
|
|
18
|
+
/**
|
|
19
|
+
* Der Pfad der SKILL.md RELATIV zur Import-Wurzel. Der absolute Pfad ginge
|
|
20
|
+
* als Herkunft mit hoch und traegt den Benutzernamen des Geraets mit sich;
|
|
21
|
+
* der relative sagt dasselbe ueber die Ablage und nichts ueber die Person.
|
|
22
|
+
*/
|
|
23
|
+
sourcePath: string;
|
|
24
|
+
description: string;
|
|
25
|
+
collection: PlannedCollection | null;
|
|
12
26
|
bytes: number;
|
|
13
27
|
files: PlannedFile[];
|
|
14
28
|
};
|
|
@@ -33,10 +47,15 @@ export type ImportPlan = {
|
|
|
33
47
|
/** Funde von scanForSecrets. Ausgeschlossen, aber nicht verschwiegen. */
|
|
34
48
|
flagged: Candidate[];
|
|
35
49
|
skipped: Skipped[];
|
|
50
|
+
/** Skills ohne `description` im Kopf. Sie gehen hoch, aber gemeldet. */
|
|
51
|
+
noDescription: string[];
|
|
36
52
|
};
|
|
37
|
-
export declare function planSkills(items: Candidate[]
|
|
53
|
+
export declare function planSkills(items: Candidate[], opts?: {
|
|
54
|
+
root?: string;
|
|
55
|
+
}): {
|
|
38
56
|
plans: SkillPlan[];
|
|
39
57
|
skipped: Skipped[];
|
|
58
|
+
noDescription: string[];
|
|
40
59
|
};
|
|
41
60
|
export declare function planAgents(items: Candidate[]): {
|
|
42
61
|
plans: AgentPlan[];
|
|
@@ -50,4 +69,6 @@ export declare function buildImportPlan(sources: {
|
|
|
50
69
|
skills?: Candidate[];
|
|
51
70
|
agents?: Candidate[];
|
|
52
71
|
memory?: Candidate[];
|
|
72
|
+
}, opts?: {
|
|
73
|
+
skillsRoot?: string;
|
|
53
74
|
}): ImportPlan;
|
package/dist/import/plan.js
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
|
+
import { basename } from 'node:path';
|
|
1
2
|
import { isSafeMemoryPath } from '../memoryPath.js';
|
|
2
3
|
import { isSafeSkillFilePath } from '../skillFilePath.js';
|
|
3
4
|
// Die Namensregel ist die des Servers (packages/api/src/http/names.ts), hier
|
|
4
5
|
// noch einmal geprueft, damit der Bericht "uebersprungen, ungueltiger Name"
|
|
5
6
|
// sagen kann, statt dass jemand 40 Uploads zuschaut und dann eine 400 sieht.
|
|
6
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
|
+
}
|
|
7
30
|
/**
|
|
8
31
|
* Eine markierte Datei faellt aus dem Plan, nicht aus dem Bericht. Der
|
|
9
32
|
* Benutzer sieht sie unter "zurueckgehalten" mit Regel und Zeile und kann sie
|
|
@@ -16,42 +39,49 @@ function usable(c) {
|
|
|
16
39
|
function reasonOf(c) {
|
|
17
40
|
return c.skip ?? (c.hits.length > 0 ? 'flagged' : 'unusable');
|
|
18
41
|
}
|
|
19
|
-
export function planSkills(items) {
|
|
42
|
+
export function planSkills(items, opts = {}) {
|
|
20
43
|
const plans = [];
|
|
21
44
|
const skipped = [];
|
|
45
|
+
const noDescription = [];
|
|
22
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;
|
|
23
54
|
for (const c of items) {
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
// Eine Datei direkt in der Wurzel gehoert zu keinem Skill.
|
|
55
|
+
const at = locate(c.relative);
|
|
56
|
+
if (!at) {
|
|
27
57
|
skipped.push({ relative: c.relative, reason: 'not-in-a-skill-folder' });
|
|
28
58
|
continue;
|
|
29
59
|
}
|
|
30
|
-
const
|
|
31
|
-
const bucket = folders.get(name);
|
|
60
|
+
const bucket = folders.get(at.prefix);
|
|
32
61
|
if (bucket)
|
|
33
|
-
bucket.push(c);
|
|
62
|
+
bucket.entries.push(c);
|
|
34
63
|
else
|
|
35
|
-
folders.set(
|
|
64
|
+
folders.set(at.prefix, { at, entries: [c] });
|
|
36
65
|
}
|
|
37
|
-
for (const [
|
|
38
|
-
|
|
39
|
-
|
|
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' });
|
|
40
70
|
continue;
|
|
41
71
|
}
|
|
42
|
-
const skillMd = entries.find((c) => c.relative === `${
|
|
72
|
+
const skillMd = entries.find((c) => c.relative === `${prefix}/SKILL.md`);
|
|
43
73
|
if (!skillMd) {
|
|
44
74
|
// Ein Ordner ohne SKILL.md ist kein Skill. Seine Streudateien unter
|
|
45
75
|
// einem erfundenen Namen hochzuladen legte etwas ins Konto, das auch
|
|
46
76
|
// auf der Platte nie ein Skill war.
|
|
47
|
-
skipped.push({ relative:
|
|
77
|
+
skipped.push({ relative: prefix, reason: 'no-skill-md' });
|
|
48
78
|
continue;
|
|
49
79
|
}
|
|
50
80
|
if (!usable(skillMd)) {
|
|
51
81
|
// Ohne seinen eigenen Text ist der Skill nichts. Nur die Begleitdateien
|
|
52
82
|
// hochzuladen ergaebe einen Skill, der auf einen Inhalt verweist, den es
|
|
53
83
|
// im Konto nicht gibt.
|
|
54
|
-
skipped.push({ relative: `${
|
|
84
|
+
skipped.push({ relative: `${prefix}/SKILL.md`, reason: reasonOf(skillMd) });
|
|
55
85
|
continue;
|
|
56
86
|
}
|
|
57
87
|
const files = [];
|
|
@@ -62,7 +92,7 @@ export function planSkills(items) {
|
|
|
62
92
|
skipped.push({ relative: c.relative, reason: reasonOf(c) });
|
|
63
93
|
continue;
|
|
64
94
|
}
|
|
65
|
-
const path = c.relative.slice(
|
|
95
|
+
const path = c.relative.slice(prefix.length + 1);
|
|
66
96
|
if (!isSafeSkillFilePath(path)) {
|
|
67
97
|
// Dieselbe Ueberlegung wie beim Skill-Namen: was der Server ablehnt,
|
|
68
98
|
// gehoert in den Bericht und nicht in den Upload.
|
|
@@ -77,10 +107,26 @@ export function planSkills(items) {
|
|
|
77
107
|
});
|
|
78
108
|
}
|
|
79
109
|
files.sort((a, b) => a.path.localeCompare(b.path));
|
|
80
|
-
|
|
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
|
+
});
|
|
81
126
|
}
|
|
82
127
|
plans.sort((a, b) => a.name.localeCompare(b.name));
|
|
83
|
-
|
|
128
|
+
noDescription.sort();
|
|
129
|
+
return { plans, skipped, noDescription };
|
|
84
130
|
}
|
|
85
131
|
export function planAgents(items) {
|
|
86
132
|
const plans = [];
|
|
@@ -127,8 +173,8 @@ export function planMemory(items) {
|
|
|
127
173
|
plans.sort((a, b) => a.path.localeCompare(b.path));
|
|
128
174
|
return { plans, skipped };
|
|
129
175
|
}
|
|
130
|
-
export function buildImportPlan(sources) {
|
|
131
|
-
const s = planSkills(sources.skills ?? []);
|
|
176
|
+
export function buildImportPlan(sources, opts = {}) {
|
|
177
|
+
const s = planSkills(sources.skills ?? [], { root: opts.skillsRoot });
|
|
132
178
|
const a = planAgents(sources.agents ?? []);
|
|
133
179
|
const m = planMemory(sources.memory ?? []);
|
|
134
180
|
const all = [...(sources.skills ?? []), ...(sources.agents ?? []), ...(sources.memory ?? [])];
|
|
@@ -138,6 +184,7 @@ export function buildImportPlan(sources) {
|
|
|
138
184
|
memory: m.plans,
|
|
139
185
|
flagged: all.filter((c) => c.skip === null && c.hits.length > 0),
|
|
140
186
|
skipped: [...s.skipped, ...a.skipped, ...m.skipped],
|
|
187
|
+
noDescription: s.noDescription,
|
|
141
188
|
};
|
|
142
189
|
}
|
|
143
190
|
//# sourceMappingURL=plan.js.map
|
package/dist/import/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/import/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,MAAM,SAAS,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/import/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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>;
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/import/prune.ts"],"names":[],"mappings":"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"}
|
package/dist/import/secrets.js
CHANGED
|
@@ -57,7 +57,7 @@ const RULES = [
|
|
|
57
57
|
function excerpt(line, match) {
|
|
58
58
|
const at = line.indexOf(match);
|
|
59
59
|
const before = line.slice(Math.max(0, at - 24), at);
|
|
60
|
-
return `${before}…${match.slice(0, 4)}… (${match.length}
|
|
60
|
+
return `${before}…${match.slice(0, 4)}… (${match.length} characters)`;
|
|
61
61
|
}
|
|
62
62
|
export function scanForSecrets(text) {
|
|
63
63
|
const hits = [];
|
|
@@ -1 +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,
|
|
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.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { hostname } from 'node:os';
|
|
2
3
|
import { ApiError } from '../apiClient.js';
|
|
3
4
|
import { bodyBelowHeader, parseAgentHeader } from './frontmatter.js';
|
|
4
5
|
function codeOf(e) {
|
|
@@ -25,7 +26,16 @@ export async function runUpload(api, plan, onProgress) {
|
|
|
25
26
|
const step = (label) => onProgress((done += 1), total, label);
|
|
26
27
|
for (const s of plan.skills) {
|
|
27
28
|
try {
|
|
28
|
-
|
|
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
|
+
});
|
|
29
39
|
result.skills += 1;
|
|
30
40
|
}
|
|
31
41
|
catch (e) {
|
|
@@ -69,9 +79,14 @@ export async function runUpload(api, plan, onProgress) {
|
|
|
69
79
|
}
|
|
70
80
|
step(a.name);
|
|
71
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();
|
|
72
87
|
for (const m of plan.memory) {
|
|
73
88
|
try {
|
|
74
|
-
await api.writeMemory(m.path, await readFile(m.source, 'utf8'));
|
|
89
|
+
await api.writeMemory(m.path, await readFile(m.source, 'utf8'), device);
|
|
75
90
|
result.memory += 1;
|
|
76
91
|
}
|
|
77
92
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/import/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAkB,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAYrE,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,YAAY,QAAQ;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACzC,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,MAAM;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,MAAM;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,CACnB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAc,EACd,IAAgB,EAChB,UAAoB;IAEpB,MAAM,MAAM,GAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9F,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAEtE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/import/upload.ts"],"names":[],"mappings":"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"}
|
package/dist/install.d.ts
CHANGED
|
@@ -1,12 +1,73 @@
|
|
|
1
|
-
|
|
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
|
+
/** Resolves an alias or a registry id to a registry id; undefined if neither. */
|
|
5
|
+
export declare function resolveClientId(id: string): ClientId | undefined;
|
|
2
6
|
export interface InstallTarget {
|
|
3
7
|
id: ClientId;
|
|
4
|
-
|
|
8
|
+
name: string;
|
|
5
9
|
configPath: string;
|
|
6
|
-
|
|
10
|
+
format: 'json' | 'toml';
|
|
7
11
|
stubDir: string | null;
|
|
12
|
+
/** Only set alongside `stubDir`, and only so a test can tell the two apart. */
|
|
13
|
+
stubRoot: string | null;
|
|
8
14
|
snippet: string;
|
|
9
15
|
}
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Every client the registry can write a config for, resolved against `home`.
|
|
18
|
+
*
|
|
19
|
+
* `home` is a parameter and not `homedir()` so every test runs against a
|
|
20
|
+
* throwaway directory: the guardrail from spec §13 sits in the type itself,
|
|
21
|
+
* not merely in intent.
|
|
22
|
+
*/
|
|
23
|
+
export declare function installTargets(home: string): InstallTarget[];
|
|
24
|
+
/**
|
|
25
|
+
* Merges one MCP server entry into an existing JSON config, without
|
|
26
|
+
* touching anything else already in the file.
|
|
27
|
+
*
|
|
28
|
+
* `writeFileSync` alone would replace the whole file (e.g. `~/.claude.json`
|
|
29
|
+
* or `~/.gemini/settings.json`), throwing away every other setting stored
|
|
30
|
+
* there. An existing but broken file is never silently overwritten either:
|
|
31
|
+
* better an error than quiet data loss.
|
|
32
|
+
*/
|
|
33
|
+
export declare function mergeJsonServer(path: string, key: string, value: unknown): void;
|
|
34
|
+
/**
|
|
35
|
+
* Appends the TOML snippet, unless it is already there.
|
|
36
|
+
*
|
|
37
|
+
* Appended, not replaced: a second run would otherwise add a second
|
|
38
|
+
* `[mcp_servers.onlymcp]` table, and two identical tables make the file
|
|
39
|
+
* invalid for most TOML parsers.
|
|
40
|
+
*/
|
|
41
|
+
export declare function appendTomlServer(path: string, snippet: string): 'written' | 'already-present';
|
|
42
|
+
/**
|
|
43
|
+
* What `onlymcp install` decided to do, given `--client`/`--all` and the
|
|
44
|
+
* files that exist on this machine. Kept apart from `cli.ts`'s logging and
|
|
45
|
+
* exit codes so the decision itself is testable without spawning the built
|
|
46
|
+
* CLI or depending on Commander at all.
|
|
47
|
+
*/
|
|
48
|
+
export type InstallOutcome = {
|
|
49
|
+
kind: 'conflicting-options';
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'missing-client';
|
|
52
|
+
targets: InstallTarget[];
|
|
53
|
+
} | {
|
|
54
|
+
kind: 'unknown-client';
|
|
55
|
+
targets: InstallTarget[];
|
|
56
|
+
} | {
|
|
57
|
+
kind: 'none-present-for-all';
|
|
58
|
+
targets: InstallTarget[];
|
|
59
|
+
} | {
|
|
60
|
+
kind: 'single';
|
|
61
|
+
target: InstallTarget;
|
|
62
|
+
} | {
|
|
63
|
+
kind: 'all';
|
|
64
|
+
present: InstallTarget[];
|
|
65
|
+
skipped: InstallTarget[];
|
|
66
|
+
};
|
|
67
|
+
/** Pure given the filesystem: same inputs, same decision, every time. */
|
|
68
|
+
export declare function planInstall(home: string, opts: {
|
|
69
|
+
client?: string;
|
|
70
|
+
all?: boolean;
|
|
71
|
+
}): InstallOutcome;
|
|
72
|
+
/** Writes one target's snippet into its config file, creating directories as needed. */
|
|
73
|
+
export declare function writeInstallTarget(target: InstallTarget): 'written' | 'already-present';
|