@hypertabai/mcp 0.2.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 +120 -0
- package/dist/__tests__/config-writer.test.d.ts +2 -0
- package/dist/__tests__/config-writer.test.d.ts.map +1 -0
- package/dist/__tests__/config-writer.test.js +186 -0
- package/dist/__tests__/config-writer.test.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +113 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/__tests__/install.test.d.ts +2 -0
- package/dist/__tests__/install.test.d.ts.map +1 -0
- package/dist/__tests__/install.test.js +211 -0
- package/dist/__tests__/install.test.js.map +1 -0
- package/dist/__tests__/platforms.test.d.ts +2 -0
- package/dist/__tests__/platforms.test.d.ts.map +1 -0
- package/dist/__tests__/platforms.test.js +109 -0
- package/dist/__tests__/platforms.test.js.map +1 -0
- package/dist/__tests__/uninstall.test.d.ts +2 -0
- package/dist/__tests__/uninstall.test.d.ts.map +1 -0
- package/dist/__tests__/uninstall.test.js +117 -0
- package/dist/__tests__/uninstall.test.js.map +1 -0
- package/dist/connect.d.ts +8 -0
- package/dist/connect.d.ts.map +1 -0
- package/dist/connect.js +49 -0
- package/dist/connect.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/install/config-writer.d.ts +49 -0
- package/dist/install/config-writer.d.ts.map +1 -0
- package/dist/install/config-writer.js +156 -0
- package/dist/install/config-writer.js.map +1 -0
- package/dist/install/index.d.ts +17 -0
- package/dist/install/index.d.ts.map +1 -0
- package/dist/install/index.js +94 -0
- package/dist/install/index.js.map +1 -0
- package/dist/install/platforms.d.ts +38 -0
- package/dist/install/platforms.d.ts.map +1 -0
- package/dist/install/platforms.js +162 -0
- package/dist/install/platforms.js.map +1 -0
- package/dist/install/skill-writer.d.ts +24 -0
- package/dist/install/skill-writer.d.ts.map +1 -0
- package/dist/install/skill-writer.js +86 -0
- package/dist/install/skill-writer.js.map +1 -0
- package/dist/install/uninstall.d.ts +11 -0
- package/dist/install/uninstall.d.ts.map +1 -0
- package/dist/install/uninstall.js +81 -0
- package/dist/install/uninstall.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { PlatformDef, Scope, ServerEntry } from './platforms.js';
|
|
2
|
+
export interface WriteConfigOptions {
|
|
3
|
+
platform: PlatformDef;
|
|
4
|
+
scope: Scope;
|
|
5
|
+
entry: ServerEntry;
|
|
6
|
+
}
|
|
7
|
+
export interface WriteConfigResult {
|
|
8
|
+
path: string;
|
|
9
|
+
action: 'created' | 'updated' | 'no-change';
|
|
10
|
+
backupCreated: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Strip JS-style single-line `// ...` and block `/* ... *\/` comments from
|
|
14
|
+
* a JSON source. Claude Desktop and some editors tolerate JSONC-style comments,
|
|
15
|
+
* and we must not crash when re-reading a file that has them.
|
|
16
|
+
*/
|
|
17
|
+
export declare function stripJsonComments(src: string): string;
|
|
18
|
+
export interface RemoveConfigOptions {
|
|
19
|
+
platform: PlatformDef;
|
|
20
|
+
scope: Scope;
|
|
21
|
+
}
|
|
22
|
+
export interface RemoveConfigResult {
|
|
23
|
+
path: string;
|
|
24
|
+
action: 'removed' | 'not-installed' | 'file-missing';
|
|
25
|
+
backupCreated: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Removes the Hypertab entry from a platform's MCP config file.
|
|
29
|
+
*
|
|
30
|
+
* Guarantees:
|
|
31
|
+
* - Never touches other servers in the same file.
|
|
32
|
+
* - Creates a `.bak` on first touch (once per file).
|
|
33
|
+
* - Atomic via `.tmp` + rename.
|
|
34
|
+
* - Idempotent: returns `not-installed` or `file-missing` with no disk writes.
|
|
35
|
+
* - If removing leaves an empty `mcpServers` map, leaves the empty map in
|
|
36
|
+
* place rather than deleting the key — keeps user structure predictable.
|
|
37
|
+
*/
|
|
38
|
+
export declare function removePlatformConfig(opts: RemoveConfigOptions): RemoveConfigResult;
|
|
39
|
+
/**
|
|
40
|
+
* Writes (or updates) the Hypertab entry in a platform's MCP config file.
|
|
41
|
+
*
|
|
42
|
+
* Guarantees:
|
|
43
|
+
* - Never clobbers other servers in the same file.
|
|
44
|
+
* - Creates a `.bak` on first touch (once per file).
|
|
45
|
+
* - Atomic via `.tmp` + rename.
|
|
46
|
+
* - Idempotent: returns `no-change` if the entry already matches.
|
|
47
|
+
*/
|
|
48
|
+
export declare function writePlatformConfig(opts: WriteConfigOptions): WriteConfigResult;
|
|
49
|
+
//# sourceMappingURL=config-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../src/install/config-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAErE,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,WAAW,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAA;IAC3C,aAAa,EAAE,OAAO,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoCrD;AAoBD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;CACZ;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,cAAc,CAAA;IACpD,aAAa,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CAuClF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,CAwC/E"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Strip JS-style single-line `// ...` and block `/* ... *\/` comments from
|
|
5
|
+
* a JSON source. Claude Desktop and some editors tolerate JSONC-style comments,
|
|
6
|
+
* and we must not crash when re-reading a file that has them.
|
|
7
|
+
*/
|
|
8
|
+
export function stripJsonComments(src) {
|
|
9
|
+
let result = '';
|
|
10
|
+
let i = 0;
|
|
11
|
+
let inString = false;
|
|
12
|
+
let escaped = false;
|
|
13
|
+
while (i < src.length) {
|
|
14
|
+
const ch = src[i];
|
|
15
|
+
const next = src[i + 1];
|
|
16
|
+
if (inString) {
|
|
17
|
+
result += ch;
|
|
18
|
+
if (escaped)
|
|
19
|
+
escaped = false;
|
|
20
|
+
else if (ch === '\\')
|
|
21
|
+
escaped = true;
|
|
22
|
+
else if (ch === '"')
|
|
23
|
+
inString = false;
|
|
24
|
+
i += 1;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (ch === '"') {
|
|
28
|
+
inString = true;
|
|
29
|
+
result += ch;
|
|
30
|
+
i += 1;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (ch === '/' && next === '/') {
|
|
34
|
+
while (i < src.length && src[i] !== '\n')
|
|
35
|
+
i += 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (ch === '/' && next === '*') {
|
|
39
|
+
i += 2;
|
|
40
|
+
while (i < src.length - 1 && !(src[i] === '*' && src[i + 1] === '/'))
|
|
41
|
+
i += 1;
|
|
42
|
+
i += 2;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
result += ch;
|
|
46
|
+
i += 1;
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
function readConfig(path) {
|
|
51
|
+
if (!existsSync(path))
|
|
52
|
+
return {};
|
|
53
|
+
const raw = readFileSync(path, 'utf8');
|
|
54
|
+
if (!raw.trim())
|
|
55
|
+
return {};
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(stripJsonComments(raw));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
throw new Error(`Failed to parse existing config at ${path}: ${err.message}. ` +
|
|
61
|
+
'Fix the JSON syntax manually or delete the file and re-run.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function deepEqual(a, b) {
|
|
65
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Removes the Hypertab entry from a platform's MCP config file.
|
|
69
|
+
*
|
|
70
|
+
* Guarantees:
|
|
71
|
+
* - Never touches other servers in the same file.
|
|
72
|
+
* - Creates a `.bak` on first touch (once per file).
|
|
73
|
+
* - Atomic via `.tmp` + rename.
|
|
74
|
+
* - Idempotent: returns `not-installed` or `file-missing` with no disk writes.
|
|
75
|
+
* - If removing leaves an empty `mcpServers` map, leaves the empty map in
|
|
76
|
+
* place rather than deleting the key — keeps user structure predictable.
|
|
77
|
+
*/
|
|
78
|
+
export function removePlatformConfig(opts) {
|
|
79
|
+
const { platform, scope } = opts;
|
|
80
|
+
const path = platform.configPath(scope);
|
|
81
|
+
if (!existsSync(path)) {
|
|
82
|
+
return { path, action: 'file-missing', backupCreated: false };
|
|
83
|
+
}
|
|
84
|
+
const existing = readConfig(path);
|
|
85
|
+
const servers = existing[platform.serversKey] ?? {};
|
|
86
|
+
if (!(platform.serverName in servers)) {
|
|
87
|
+
return { path, action: 'not-installed', backupCreated: false };
|
|
88
|
+
}
|
|
89
|
+
const nextServers = { ...servers };
|
|
90
|
+
delete nextServers[platform.serverName];
|
|
91
|
+
const next = {
|
|
92
|
+
...existing,
|
|
93
|
+
[platform.serversKey]: nextServers,
|
|
94
|
+
};
|
|
95
|
+
let backupCreated = false;
|
|
96
|
+
const backupPath = `${path}.bak`;
|
|
97
|
+
if (!existsSync(backupPath)) {
|
|
98
|
+
try {
|
|
99
|
+
writeFileSync(backupPath, readFileSync(path));
|
|
100
|
+
backupCreated = true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Non-fatal; continue without the backup.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const tmp = `${path}.tmp`;
|
|
107
|
+
writeFileSync(tmp, `${JSON.stringify(next, null, 2)}\n`);
|
|
108
|
+
renameSync(tmp, path);
|
|
109
|
+
return { path, action: 'removed', backupCreated };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Writes (or updates) the Hypertab entry in a platform's MCP config file.
|
|
113
|
+
*
|
|
114
|
+
* Guarantees:
|
|
115
|
+
* - Never clobbers other servers in the same file.
|
|
116
|
+
* - Creates a `.bak` on first touch (once per file).
|
|
117
|
+
* - Atomic via `.tmp` + rename.
|
|
118
|
+
* - Idempotent: returns `no-change` if the entry already matches.
|
|
119
|
+
*/
|
|
120
|
+
export function writePlatformConfig(opts) {
|
|
121
|
+
const { platform, scope, entry } = opts;
|
|
122
|
+
const path = platform.configPath(scope);
|
|
123
|
+
const existed = existsSync(path);
|
|
124
|
+
const existing = readConfig(path);
|
|
125
|
+
const servers = existing[platform.serversKey] ?? {};
|
|
126
|
+
const previousEntry = servers[platform.serverName];
|
|
127
|
+
if (existed && previousEntry && deepEqual(previousEntry, entry)) {
|
|
128
|
+
return { path, action: 'no-change', backupCreated: false };
|
|
129
|
+
}
|
|
130
|
+
const next = {
|
|
131
|
+
...existing,
|
|
132
|
+
[platform.serversKey]: {
|
|
133
|
+
...servers,
|
|
134
|
+
[platform.serverName]: entry,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
const parent = dirname(path);
|
|
138
|
+
if (!existsSync(parent))
|
|
139
|
+
mkdirSync(parent, { recursive: true });
|
|
140
|
+
let backupCreated = false;
|
|
141
|
+
const backupPath = `${path}.bak`;
|
|
142
|
+
if (existed && !existsSync(backupPath)) {
|
|
143
|
+
try {
|
|
144
|
+
writeFileSync(backupPath, readFileSync(path));
|
|
145
|
+
backupCreated = true;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Non-fatal; continue without the backup.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const tmp = `${path}.tmp`;
|
|
152
|
+
writeFileSync(tmp, `${JSON.stringify(next, null, 2)}\n`);
|
|
153
|
+
renameSync(tmp, path);
|
|
154
|
+
return { path, action: existed ? 'updated' : 'created', backupCreated };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=config-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/install/config-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAenC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC5C,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACvB,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,EAAE,CAAA;YACZ,IAAI,OAAO;gBAAE,OAAO,GAAG,KAAK,CAAA;iBACvB,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,GAAG,IAAI,CAAA;iBAC/B,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAA;YACrC,CAAC,IAAI,CAAC,CAAA;YACN,SAAQ;QACT,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAChB,QAAQ,GAAG,IAAI,CAAA;YACf,MAAM,IAAI,EAAE,CAAA;YACZ,CAAC,IAAI,CAAC,CAAA;YACN,SAAQ;QACT,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,CAAC,IAAI,CAAC,CAAA;YAChD,SAAQ;QACT,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAChC,CAAC,IAAI,CAAC,CAAA;YACN,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAA;YAC5E,CAAC,IAAI,CAAC,CAAA;YACN,SAAQ;QACT,CAAC;QACD,MAAM,IAAI,EAAE,CAAA;QACZ,CAAC,IAAI,CAAC,CAAA;IACP,CAAC;IACD,OAAO,MAAM,CAAA;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAC1B,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAA4B,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACd,sCAAsC,IAAI,KAAM,GAAa,CAAC,OAAO,IAAI;YACxE,6DAA6D,CAC9D,CAAA;IACF,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC;AAaD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAyB;IAC7D,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IAEvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;IAC9D,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,OAAO,GAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAA6C,IAAI,EAAE,CAAA;IAEhG,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;IAC/D,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,EAAE,CAAA;IAClC,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IAEvC,MAAM,IAAI,GAAG;QACZ,GAAG,QAAQ;QACX,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW;KAClC,CAAA;IAED,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,MAAM,UAAU,GAAG,GAAG,IAAI,MAAM,CAAA;IAChC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACJ,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;YAC7C,aAAa,GAAG,IAAI,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACR,0CAA0C;QAC3C,CAAC;IACF,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAA;IACzB,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;IACxD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAErB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAwB;IAC3D,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAEjC,MAAM,OAAO,GAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAA6C,IAAI,EAAE,CAAA;IAChG,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IAElD,IAAI,OAAO,IAAI,aAAa,IAAI,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG;QACZ,GAAG,QAAQ;QACX,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YACtB,GAAG,OAAO;YACV,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK;SAC5B;KACD,CAAA;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE/D,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,MAAM,UAAU,GAAG,GAAG,IAAI,MAAM,CAAA;IAChC,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC;YACJ,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;YAC7C,aAAa,GAAG,IAAI,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACR,0CAA0C;QAC3C,CAAC;IACF,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAA;IACzB,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;IACxD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAErB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,CAAA;AACxE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getPlatform, PLATFORM_IDS, type PlatformDef, type Scope } from './platforms.js';
|
|
2
|
+
export interface InstallOptions {
|
|
3
|
+
/** Resolved platform. Callers (CLI) use getPlatform() to resolve from a string id. */
|
|
4
|
+
platform: PlatformDef;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
scope?: Scope;
|
|
7
|
+
url?: string;
|
|
8
|
+
skillUrl?: string;
|
|
9
|
+
stdout?: NodeJS.WritableStream;
|
|
10
|
+
stderr?: NodeJS.WritableStream;
|
|
11
|
+
env?: NodeJS.ProcessEnv;
|
|
12
|
+
promptFn?: (question: string) => Promise<string>;
|
|
13
|
+
fetchImpl?: typeof fetch;
|
|
14
|
+
}
|
|
15
|
+
export declare function runInstall(opts: InstallOptions): Promise<number>;
|
|
16
|
+
export { getPlatform, PLATFORM_IDS };
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/install/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,WAAW,EAAoB,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAK1G,MAAM,WAAW,cAAc;IAC9B,sFAAsF;IACtF,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACxB;AA2BD,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAqEtE;AAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline';
|
|
2
|
+
import { writePlatformConfig } from './config-writer.js';
|
|
3
|
+
import { getPlatform, PLATFORM_IDS, resolveCanonical } from './platforms.js';
|
|
4
|
+
import { DEFAULT_SKILL_URL, installSkill } from './skill-writer.js';
|
|
5
|
+
const DEFAULT_URL = 'https://api.hypertab.ai/mcp';
|
|
6
|
+
function maskKey(key) {
|
|
7
|
+
if (!key)
|
|
8
|
+
return '(empty)';
|
|
9
|
+
if (key.length <= 10)
|
|
10
|
+
return `${key.slice(0, 4)}…`;
|
|
11
|
+
return `${key.slice(0, 10)}…${key.slice(-4)}`;
|
|
12
|
+
}
|
|
13
|
+
async function defaultPrompt(question) {
|
|
14
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
rl.question(question, (answer) => {
|
|
17
|
+
rl.close();
|
|
18
|
+
resolve(answer.trim());
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function resolveApiKey(opts) {
|
|
23
|
+
if (opts.apiKey)
|
|
24
|
+
return { key: opts.apiKey.trim(), source: 'flag' };
|
|
25
|
+
const env = opts.env ?? process.env;
|
|
26
|
+
if (env.HYPERTAB_API_KEY)
|
|
27
|
+
return { key: env.HYPERTAB_API_KEY.trim(), source: 'env' };
|
|
28
|
+
const prompt = opts.promptFn ?? defaultPrompt;
|
|
29
|
+
const answer = await prompt('Enter your Hypertab API key (ht_sk_...): ');
|
|
30
|
+
return { key: answer.trim(), source: 'prompt' };
|
|
31
|
+
}
|
|
32
|
+
export async function runInstall(opts) {
|
|
33
|
+
const out = opts.stdout ?? process.stdout;
|
|
34
|
+
const err = opts.stderr ?? process.stderr;
|
|
35
|
+
const platform = opts.platform;
|
|
36
|
+
const canonical = resolveCanonical(platform);
|
|
37
|
+
const desired = opts.scope ?? (canonical.supportsUserScope ? 'user' : 'project');
|
|
38
|
+
if (desired === 'project' && !canonical.supportsProjectScope) {
|
|
39
|
+
err.write(`Error: ${canonical.name} does not support project scope. Re-run with --scope user.\n`);
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
if (desired === 'user' && !canonical.supportsUserScope) {
|
|
43
|
+
err.write(`Error: ${canonical.name} does not support user scope. Re-run with --scope project.\n`);
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
const scope = desired;
|
|
47
|
+
const { key, source } = await resolveApiKey(opts);
|
|
48
|
+
if (!key.startsWith('ht_sk_')) {
|
|
49
|
+
err.write(`Error: API key must start with 'ht_sk_'. Got: ${maskKey(key)}\n`);
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
if (source === 'flag') {
|
|
53
|
+
err.write('Tip: HYPERTAB_API_KEY env var is safer than --api-key for CI and shared machines.\n');
|
|
54
|
+
}
|
|
55
|
+
const url = opts.url ?? DEFAULT_URL;
|
|
56
|
+
const entry = canonical.buildServerEntry(url, key);
|
|
57
|
+
let configResult;
|
|
58
|
+
try {
|
|
59
|
+
configResult = writePlatformConfig({ platform: canonical, scope, entry });
|
|
60
|
+
}
|
|
61
|
+
catch (writeErr) {
|
|
62
|
+
err.write(`Error writing config: ${writeErr.message}\n`);
|
|
63
|
+
return 1;
|
|
64
|
+
}
|
|
65
|
+
const skillResult = await installSkill({
|
|
66
|
+
platform: canonical,
|
|
67
|
+
scope,
|
|
68
|
+
skillUrl: opts.skillUrl ?? DEFAULT_SKILL_URL,
|
|
69
|
+
fetchImpl: opts.fetchImpl,
|
|
70
|
+
});
|
|
71
|
+
const lines = [];
|
|
72
|
+
lines.push('');
|
|
73
|
+
lines.push(`\u2713 Installed Hypertab MCP for ${platform.name}${platform.aliasOf ? ` (writes to ${canonical.name} config)` : ''}`);
|
|
74
|
+
lines.push(` Key: ${maskKey(key)}`);
|
|
75
|
+
lines.push(` Config: ${configResult.path} (${configResult.action}${configResult.backupCreated ? ', backup saved as .bak' : ''})`);
|
|
76
|
+
if (skillResult.action === 'installed' || skillResult.action === 'up-to-date') {
|
|
77
|
+
lines.push(` Skill: ${skillResult.path} (${skillResult.action})`);
|
|
78
|
+
}
|
|
79
|
+
else if (skillResult.action === 'unsupported') {
|
|
80
|
+
lines.push(` Skill: skipped (${skillResult.reason})`);
|
|
81
|
+
}
|
|
82
|
+
else if (skillResult.action === 'skipped-fetch-failed') {
|
|
83
|
+
lines.push(` Skill: FAILED — ${skillResult.reason}`);
|
|
84
|
+
}
|
|
85
|
+
if (platform.note)
|
|
86
|
+
lines.push(` Note: ${platform.note}`);
|
|
87
|
+
lines.push('');
|
|
88
|
+
lines.push(platform.restartInstruction);
|
|
89
|
+
lines.push('');
|
|
90
|
+
out.write(lines.join('\n'));
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
export { getPlatform, PLATFORM_IDS };
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/install/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type Scope = 'user' | 'project';
|
|
2
|
+
export interface ServerEntry {
|
|
3
|
+
type?: string;
|
|
4
|
+
url?: string;
|
|
5
|
+
serverUrl?: string;
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export interface PlatformDef {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
supportsUserScope: boolean;
|
|
13
|
+
supportsProjectScope: boolean;
|
|
14
|
+
/** Absolute path to the config file for a given scope. Throws if scope unsupported. */
|
|
15
|
+
configPath(scope: Scope): string;
|
|
16
|
+
/** Top-level JSON key containing the server map (e.g. 'mcpServers', 'servers'). */
|
|
17
|
+
serversKey: string;
|
|
18
|
+
/** Identifier used when adding hypertab to the server map. */
|
|
19
|
+
serverName: string;
|
|
20
|
+
/** Builds the per-platform entry shape for a given URL + API key. */
|
|
21
|
+
buildServerEntry(url: string, apiKey: string): ServerEntry;
|
|
22
|
+
/** Whether this platform supports Hypertab skills (Claude Code and aliases only today). */
|
|
23
|
+
supportsSkill: boolean;
|
|
24
|
+
/** Where to install the skill, if supported. */
|
|
25
|
+
skillPath?(scope: Scope): string;
|
|
26
|
+
/** Human-readable restart instruction printed after install. */
|
|
27
|
+
restartInstruction: string;
|
|
28
|
+
/** If set, this is a display alias that writes to the canonical platform's config. */
|
|
29
|
+
aliasOf?: string;
|
|
30
|
+
/** Optional note shown in the CLI output when installing. */
|
|
31
|
+
note?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare const PLATFORMS: Record<string, PlatformDef>;
|
|
34
|
+
export declare const PLATFORM_IDS: string[];
|
|
35
|
+
export declare function getPlatform(id: string): PlatformDef;
|
|
36
|
+
/** Resolves display aliases (vscode, cowork) to their canonical platform. */
|
|
37
|
+
export declare function resolveCanonical(platform: PlatformDef): PlatformDef;
|
|
38
|
+
//# sourceMappingURL=platforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../src/install/platforms.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;AAEtC,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,oBAAoB,EAAE,OAAO,CAAA;IAC7B,uFAAuF;IACvF,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;IAChC,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1D,2FAA2F;IAC3F,aAAa,EAAE,OAAO,CAAA;IACtB,gDAAgD;IAChD,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;IAChC,gEAAgE;IAChE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAmJD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAQjD,CAAA;AAED,eAAO,MAAM,YAAY,UAAyB,CAAA;AAElD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAMnD;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,CAGnE"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { homedir, platform as osPlatform } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
// Path helpers ----------------------------------------------------------------
|
|
4
|
+
const HOME = homedir();
|
|
5
|
+
const PLATFORM = osPlatform();
|
|
6
|
+
const IS_MAC = PLATFORM === 'darwin';
|
|
7
|
+
const IS_WIN = PLATFORM === 'win32';
|
|
8
|
+
function appDataDir() {
|
|
9
|
+
if (IS_WIN)
|
|
10
|
+
return process.env.APPDATA ?? join(HOME, 'AppData', 'Roaming');
|
|
11
|
+
return HOME;
|
|
12
|
+
}
|
|
13
|
+
function claudeDesktopConfigPath() {
|
|
14
|
+
if (IS_MAC)
|
|
15
|
+
return join(HOME, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
16
|
+
if (IS_WIN)
|
|
17
|
+
return join(appDataDir(), 'Claude', 'claude_desktop_config.json');
|
|
18
|
+
return join(HOME, '.config', 'Claude', 'claude_desktop_config.json');
|
|
19
|
+
}
|
|
20
|
+
// Per-platform server entry builders -----------------------------------------
|
|
21
|
+
function httpBearerEntry(url, apiKey) {
|
|
22
|
+
return { type: 'http', url, headers: { Authorization: `Bearer ${apiKey}` } };
|
|
23
|
+
}
|
|
24
|
+
function cursorEntry(url, apiKey) {
|
|
25
|
+
return { url, headers: { Authorization: `Bearer ${apiKey}` } };
|
|
26
|
+
}
|
|
27
|
+
function windsurfEntry(url, apiKey) {
|
|
28
|
+
return { serverUrl: url, headers: { Authorization: `Bearer ${apiKey}` } };
|
|
29
|
+
}
|
|
30
|
+
// Canonical platforms --------------------------------------------------------
|
|
31
|
+
const claudeCode = {
|
|
32
|
+
id: 'claude-code',
|
|
33
|
+
name: 'Claude Code',
|
|
34
|
+
description: "Anthropic's CLI. Also used by the VS Code and Cowork plugins.",
|
|
35
|
+
supportsUserScope: true,
|
|
36
|
+
supportsProjectScope: true,
|
|
37
|
+
configPath(scope) {
|
|
38
|
+
if (scope === 'user')
|
|
39
|
+
return join(HOME, '.claude.json');
|
|
40
|
+
return join(process.cwd(), '.mcp.json');
|
|
41
|
+
},
|
|
42
|
+
serversKey: 'mcpServers',
|
|
43
|
+
serverName: 'hypertab',
|
|
44
|
+
buildServerEntry: httpBearerEntry,
|
|
45
|
+
supportsSkill: true,
|
|
46
|
+
skillPath(scope) {
|
|
47
|
+
if (scope === 'user')
|
|
48
|
+
return join(HOME, '.claude', 'skills', 'hypertab', 'SKILL.md');
|
|
49
|
+
return join(process.cwd(), '.claude', 'skills', 'hypertab', 'SKILL.md');
|
|
50
|
+
},
|
|
51
|
+
restartInstruction: 'Restart Claude Code to load the new server (quit the app or run `claude` again).',
|
|
52
|
+
};
|
|
53
|
+
const claudeDesktop = {
|
|
54
|
+
id: 'claude-desktop',
|
|
55
|
+
name: 'Claude Desktop',
|
|
56
|
+
description: "Anthropic's macOS / Windows / Linux desktop app.",
|
|
57
|
+
supportsUserScope: true,
|
|
58
|
+
supportsProjectScope: false,
|
|
59
|
+
configPath(scope) {
|
|
60
|
+
if (scope !== 'user')
|
|
61
|
+
throw new Error('claude-desktop only supports user scope');
|
|
62
|
+
return claudeDesktopConfigPath();
|
|
63
|
+
},
|
|
64
|
+
serversKey: 'mcpServers',
|
|
65
|
+
serverName: 'hypertab',
|
|
66
|
+
buildServerEntry: httpBearerEntry,
|
|
67
|
+
supportsSkill: false,
|
|
68
|
+
restartInstruction: 'Quit Claude Desktop (Cmd+Q on macOS) and reopen it to load the new server.',
|
|
69
|
+
};
|
|
70
|
+
const cursor = {
|
|
71
|
+
id: 'cursor',
|
|
72
|
+
name: 'Cursor',
|
|
73
|
+
description: 'Cursor AI-native code editor.',
|
|
74
|
+
supportsUserScope: true,
|
|
75
|
+
supportsProjectScope: true,
|
|
76
|
+
configPath(scope) {
|
|
77
|
+
if (scope === 'user')
|
|
78
|
+
return join(HOME, '.cursor', 'mcp.json');
|
|
79
|
+
return join(process.cwd(), '.cursor', 'mcp.json');
|
|
80
|
+
},
|
|
81
|
+
serversKey: 'mcpServers',
|
|
82
|
+
serverName: 'hypertab',
|
|
83
|
+
buildServerEntry: cursorEntry,
|
|
84
|
+
supportsSkill: false,
|
|
85
|
+
restartInstruction: 'Restart Cursor (quit and reopen) to load the new server.',
|
|
86
|
+
};
|
|
87
|
+
const windsurf = {
|
|
88
|
+
id: 'windsurf',
|
|
89
|
+
name: 'Windsurf',
|
|
90
|
+
description: "Codeium's AI IDE.",
|
|
91
|
+
supportsUserScope: true,
|
|
92
|
+
supportsProjectScope: false,
|
|
93
|
+
configPath(scope) {
|
|
94
|
+
if (scope !== 'user')
|
|
95
|
+
throw new Error('windsurf only supports user scope');
|
|
96
|
+
return join(HOME, '.codeium', 'windsurf', 'mcp_config.json');
|
|
97
|
+
},
|
|
98
|
+
serversKey: 'mcpServers',
|
|
99
|
+
serverName: 'hypertab',
|
|
100
|
+
buildServerEntry: windsurfEntry,
|
|
101
|
+
supportsSkill: false,
|
|
102
|
+
restartInstruction: 'Restart Windsurf (quit and reopen) to load the new server.',
|
|
103
|
+
};
|
|
104
|
+
const antigravity = {
|
|
105
|
+
id: 'antigravity',
|
|
106
|
+
name: 'Antigravity',
|
|
107
|
+
description: "Google's AI coding IDE.",
|
|
108
|
+
supportsUserScope: true,
|
|
109
|
+
supportsProjectScope: true,
|
|
110
|
+
configPath(scope) {
|
|
111
|
+
if (scope === 'user')
|
|
112
|
+
return join(HOME, '.antigravity', 'mcp.json');
|
|
113
|
+
return join(process.cwd(), '.antigravity', 'mcp.json');
|
|
114
|
+
},
|
|
115
|
+
serversKey: 'mcpServers',
|
|
116
|
+
serverName: 'hypertab',
|
|
117
|
+
buildServerEntry: httpBearerEntry,
|
|
118
|
+
supportsSkill: false,
|
|
119
|
+
restartInstruction: 'Restart Antigravity (quit and reopen) to load the new server.',
|
|
120
|
+
note: 'Antigravity MCP support is still evolving. If the server does not appear after restart, verify the config path and shape against the Antigravity docs.',
|
|
121
|
+
};
|
|
122
|
+
// Display aliases ------------------------------------------------------------
|
|
123
|
+
const vscode = {
|
|
124
|
+
...claudeCode,
|
|
125
|
+
id: 'vscode',
|
|
126
|
+
name: 'VS Code',
|
|
127
|
+
description: 'Uses the Claude Code plugin config.',
|
|
128
|
+
aliasOf: 'claude-code',
|
|
129
|
+
note: 'VS Code uses the Claude Code plugin, which reads the same config file as standalone Claude Code.',
|
|
130
|
+
};
|
|
131
|
+
const cowork = {
|
|
132
|
+
...claudeCode,
|
|
133
|
+
id: 'cowork',
|
|
134
|
+
name: 'Claude Cowork',
|
|
135
|
+
description: 'Anthropic collaborative Claude Code environment.',
|
|
136
|
+
aliasOf: 'claude-code',
|
|
137
|
+
};
|
|
138
|
+
// Registry -------------------------------------------------------------------
|
|
139
|
+
export const PLATFORMS = {
|
|
140
|
+
'claude-code': claudeCode,
|
|
141
|
+
'claude-desktop': claudeDesktop,
|
|
142
|
+
cursor,
|
|
143
|
+
windsurf,
|
|
144
|
+
antigravity,
|
|
145
|
+
vscode,
|
|
146
|
+
cowork,
|
|
147
|
+
};
|
|
148
|
+
export const PLATFORM_IDS = Object.keys(PLATFORMS);
|
|
149
|
+
export function getPlatform(id) {
|
|
150
|
+
const p = PLATFORMS[id];
|
|
151
|
+
if (!p) {
|
|
152
|
+
throw new Error(`Unknown client '${id}'. Supported: ${PLATFORM_IDS.join(', ')}`);
|
|
153
|
+
}
|
|
154
|
+
return p;
|
|
155
|
+
}
|
|
156
|
+
/** Resolves display aliases (vscode, cowork) to their canonical platform. */
|
|
157
|
+
export function resolveCanonical(platform) {
|
|
158
|
+
if (!platform.aliasOf)
|
|
159
|
+
return platform;
|
|
160
|
+
return getPlatform(platform.aliasOf);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=platforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../src/install/platforms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PlatformDef, Scope } from './platforms.js';
|
|
2
|
+
export declare const DEFAULT_SKILL_URL = "https://hypertab.ai/skill.md";
|
|
3
|
+
export interface SkillInstallOptions {
|
|
4
|
+
platform: PlatformDef;
|
|
5
|
+
scope: Scope;
|
|
6
|
+
skillUrl?: string;
|
|
7
|
+
fetchImpl?: typeof fetch;
|
|
8
|
+
retries?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface SkillInstallResult {
|
|
11
|
+
action: 'installed' | 'up-to-date' | 'unsupported' | 'skipped-fetch-failed';
|
|
12
|
+
path?: string;
|
|
13
|
+
reason?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Fetches the Hypertab skill and installs it at the platform-specific path.
|
|
17
|
+
*
|
|
18
|
+
* Behavior:
|
|
19
|
+
* - Platforms that don't support skills return `unsupported` without touching disk.
|
|
20
|
+
* - Network failures return `skipped-fetch-failed` (config install still succeeded upstream).
|
|
21
|
+
* - Re-runs with an identical skill file are `up-to-date` no-ops.
|
|
22
|
+
*/
|
|
23
|
+
export declare function installSkill(opts: SkillInstallOptions): Promise<SkillInstallResult>;
|
|
24
|
+
//# sourceMappingURL=skill-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-writer.d.ts","sourceRoot":"","sources":["../../src/install/skill-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAExD,eAAO,MAAM,iBAAiB,iCAAiC,CAAA;AAE/D,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,sBAAsB,CAAA;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CACf;AAyCD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmCzF"}
|