@lyupro/skillforge-mcp 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +114 -0
- package/LICENSE +21 -0
- package/README.md +231 -0
- package/dist/cli/install.d.ts +41 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +223 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/config/config-schema.d.ts +175 -0
- package/dist/config/config-schema.d.ts.map +1 -0
- package/dist/config/config-schema.js +49 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/config/config-store.d.ts +24 -0
- package/dist/config/config-store.d.ts.map +1 -0
- package/dist/config/config-store.js +67 -0
- package/dist/config/config-store.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/core/errors.d.ts +9 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +13 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/skill-content-cache.d.ts +18 -0
- package/dist/core/skill-content-cache.d.ts.map +1 -0
- package/dist/core/skill-content-cache.js +56 -0
- package/dist/core/skill-content-cache.js.map +1 -0
- package/dist/core/skill-metadata-cache.d.ts +15 -0
- package/dist/core/skill-metadata-cache.d.ts.map +1 -0
- package/dist/core/skill-metadata-cache.js +31 -0
- package/dist/core/skill-metadata-cache.js.map +1 -0
- package/dist/core/skill-registry.d.ts +12 -0
- package/dist/core/skill-registry.d.ts.map +1 -0
- package/dist/core/skill-registry.js +28 -0
- package/dist/core/skill-registry.js.map +1 -0
- package/dist/core/skill-resolver.d.ts +6 -0
- package/dist/core/skill-resolver.d.ts.map +1 -0
- package/dist/core/skill-resolver.js +32 -0
- package/dist/core/skill-resolver.js.map +1 -0
- package/dist/core/types.d.ts +80 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/decorators/base-decorator.d.ts +10 -0
- package/dist/decorators/base-decorator.d.ts.map +1 -0
- package/dist/decorators/base-decorator.js +13 -0
- package/dist/decorators/base-decorator.js.map +1 -0
- package/dist/decorators/cache-decorator.d.ts +33 -0
- package/dist/decorators/cache-decorator.d.ts.map +1 -0
- package/dist/decorators/cache-decorator.js +89 -0
- package/dist/decorators/cache-decorator.js.map +1 -0
- package/dist/decorators/decorator-chain.d.ts +16 -0
- package/dist/decorators/decorator-chain.d.ts.map +1 -0
- package/dist/decorators/decorator-chain.js +31 -0
- package/dist/decorators/decorator-chain.js.map +1 -0
- package/dist/decorators/index.d.ts +10 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +6 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/logging-decorator.d.ts +15 -0
- package/dist/decorators/logging-decorator.d.ts.map +1 -0
- package/dist/decorators/logging-decorator.js +34 -0
- package/dist/decorators/logging-decorator.js.map +1 -0
- package/dist/decorators/timeout-decorator.d.ts +19 -0
- package/dist/decorators/timeout-decorator.d.ts.map +1 -0
- package/dist/decorators/timeout-decorator.js +59 -0
- package/dist/decorators/timeout-decorator.js.map +1 -0
- package/dist/factory/index.d.ts +2 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/factory/index.js +2 -0
- package/dist/factory/index.js.map +1 -0
- package/dist/factory/strategy-factory.d.ts +10 -0
- package/dist/factory/strategy-factory.d.ts.map +1 -0
- package/dist/factory/strategy-factory.js +37 -0
- package/dist/factory/strategy-factory.js.map +1 -0
- package/dist/handlers/composite-resolver.d.ts +34 -0
- package/dist/handlers/composite-resolver.d.ts.map +1 -0
- package/dist/handlers/composite-resolver.js +94 -0
- package/dist/handlers/composite-resolver.js.map +1 -0
- package/dist/handlers/hybrid-strategy.d.ts +14 -0
- package/dist/handlers/hybrid-strategy.d.ts.map +1 -0
- package/dist/handlers/hybrid-strategy.js +42 -0
- package/dist/handlers/hybrid-strategy.js.map +1 -0
- package/dist/handlers/index.d.ts +3 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +2 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/invocation-strategy.d.ts +17 -0
- package/dist/handlers/invocation-strategy.d.ts.map +1 -0
- package/dist/handlers/invocation-strategy.js +2 -0
- package/dist/handlers/invocation-strategy.js.map +1 -0
- package/dist/handlers/prompt-strategy.d.ts +8 -0
- package/dist/handlers/prompt-strategy.d.ts.map +1 -0
- package/dist/handlers/prompt-strategy.js +31 -0
- package/dist/handlers/prompt-strategy.js.map +1 -0
- package/dist/handlers/script-strategy.d.ts +20 -0
- package/dist/handlers/script-strategy.d.ts.map +1 -0
- package/dist/handlers/script-strategy.js +87 -0
- package/dist/handlers/script-strategy.js.map +1 -0
- package/dist/installers/atomic-write.d.ts +13 -0
- package/dist/installers/atomic-write.d.ts.map +1 -0
- package/dist/installers/atomic-write.js +98 -0
- package/dist/installers/atomic-write.js.map +1 -0
- package/dist/installers/claude-installer.d.ts +26 -0
- package/dist/installers/claude-installer.d.ts.map +1 -0
- package/dist/installers/claude-installer.js +118 -0
- package/dist/installers/claude-installer.js.map +1 -0
- package/dist/installers/codex-installer.d.ts +30 -0
- package/dist/installers/codex-installer.d.ts.map +1 -0
- package/dist/installers/codex-installer.js +125 -0
- package/dist/installers/codex-installer.js.map +1 -0
- package/dist/installers/cursor-installer.d.ts +29 -0
- package/dist/installers/cursor-installer.d.ts.map +1 -0
- package/dist/installers/cursor-installer.js +126 -0
- package/dist/installers/cursor-installer.js.map +1 -0
- package/dist/installers/paths.d.ts +20 -0
- package/dist/installers/paths.d.ts.map +1 -0
- package/dist/installers/paths.js +50 -0
- package/dist/installers/paths.js.map +1 -0
- package/dist/installers/registry.d.ts +8 -0
- package/dist/installers/registry.d.ts.map +1 -0
- package/dist/installers/registry.js +18 -0
- package/dist/installers/registry.js.map +1 -0
- package/dist/installers/types.d.ts +45 -0
- package/dist/installers/types.d.ts.map +1 -0
- package/dist/installers/types.js +9 -0
- package/dist/installers/types.js.map +1 -0
- package/dist/parser/file-scanner.d.ts +10 -0
- package/dist/parser/file-scanner.d.ts.map +1 -0
- package/dist/parser/file-scanner.js +37 -0
- package/dist/parser/file-scanner.js.map +1 -0
- package/dist/parser/format-detector.d.ts +11 -0
- package/dist/parser/format-detector.d.ts.map +1 -0
- package/dist/parser/format-detector.js +13 -0
- package/dist/parser/format-detector.js.map +1 -0
- package/dist/parser/frontmatter-parser.d.ts +14 -0
- package/dist/parser/frontmatter-parser.d.ts.map +1 -0
- package/dist/parser/frontmatter-parser.js +98 -0
- package/dist/parser/frontmatter-parser.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +4 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/scripts-dir-detector.d.ts +7 -0
- package/dist/parser/scripts-dir-detector.d.ts.map +1 -0
- package/dist/parser/scripts-dir-detector.js +17 -0
- package/dist/parser/scripts-dir-detector.js.map +1 -0
- package/dist/security/blacklist-filter.d.ts +32 -0
- package/dist/security/blacklist-filter.d.ts.map +1 -0
- package/dist/security/blacklist-filter.js +35 -0
- package/dist/security/blacklist-filter.js.map +1 -0
- package/dist/security/index.d.ts +5 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +3 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/pattern-scanner.d.ts +27 -0
- package/dist/security/pattern-scanner.d.ts.map +1 -0
- package/dist/security/pattern-scanner.js +46 -0
- package/dist/security/pattern-scanner.js.map +1 -0
- package/dist/security/sandbox-runner.d.ts +48 -0
- package/dist/security/sandbox-runner.d.ts.map +1 -0
- package/dist/security/sandbox-runner.js +131 -0
- package/dist/security/sandbox-runner.js.map +1 -0
- package/dist/server-deps.d.ts +28 -0
- package/dist/server-deps.d.ts.map +1 -0
- package/dist/server-deps.js +2 -0
- package/dist/server-deps.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +174 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/configure.d.ts +22 -0
- package/dist/tools/configure.d.ts.map +1 -0
- package/dist/tools/configure.js +126 -0
- package/dist/tools/configure.js.map +1 -0
- package/dist/tools/get.d.ts +10 -0
- package/dist/tools/get.d.ts.map +1 -0
- package/dist/tools/get.js +20 -0
- package/dist/tools/get.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/invoke.d.ts +12 -0
- package/dist/tools/invoke.d.ts.map +1 -0
- package/dist/tools/invoke.js +36 -0
- package/dist/tools/invoke.js.map +1 -0
- package/dist/tools/list.d.ts +16 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +33 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/loader.d.ts +30 -0
- package/dist/tools/loader.d.ts.map +1 -0
- package/dist/tools/loader.js +92 -0
- package/dist/tools/loader.js.map +1 -0
- package/dist/tools/reload.d.ts +22 -0
- package/dist/tools/reload.d.ts.map +1 -0
- package/dist/tools/reload.js +39 -0
- package/dist/tools/reload.js.map +1 -0
- package/dist/watcher/chokidar-types.d.ts +20 -0
- package/dist/watcher/chokidar-types.d.ts.map +1 -0
- package/dist/watcher/chokidar-types.js +2 -0
- package/dist/watcher/chokidar-types.js.map +1 -0
- package/dist/watcher/folder-watcher.d.ts +27 -0
- package/dist/watcher/folder-watcher.d.ts.map +1 -0
- package/dist/watcher/folder-watcher.js +123 -0
- package/dist/watcher/folder-watcher.js.map +1 -0
- package/dist/watcher/index.d.ts +4 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +2 -0
- package/dist/watcher/index.js.map +1 -0
- package/manifest.json +96 -0
- package/package.json +78 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic JSON / TOML helpers with .backup snapshots.
|
|
3
|
+
*
|
|
4
|
+
* Read helpers return null on missing file, throw on corrupt content.
|
|
5
|
+
* Write helpers go via <path>.tmp + fs.rename and snapshot the previous
|
|
6
|
+
* content into <path>.backup before overwriting. On rename failure the
|
|
7
|
+
* backup is restored.
|
|
8
|
+
*/
|
|
9
|
+
import { readFile, writeFile, rename, mkdir, access, copyFile, unlink } from 'node:fs/promises';
|
|
10
|
+
import { dirname } from 'node:path';
|
|
11
|
+
import toml from '@iarna/toml';
|
|
12
|
+
async function fileExists(path) {
|
|
13
|
+
try {
|
|
14
|
+
await access(path);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function readJsonSafe(path) {
|
|
22
|
+
if (!(await fileExists(path)))
|
|
23
|
+
return null;
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = await readFile(path, 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
throw new Error(`atomic-write: failed to read "${path}": ${String(err)}`);
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(raw);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
throw new Error(`atomic-write: invalid JSON in "${path}": ${String(err)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export async function readTomlSafe(path) {
|
|
39
|
+
if (!(await fileExists(path)))
|
|
40
|
+
return null;
|
|
41
|
+
let raw;
|
|
42
|
+
try {
|
|
43
|
+
raw = await readFile(path, 'utf8');
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
throw new Error(`atomic-write: failed to read "${path}": ${String(err)}`);
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
return toml.parse(raw);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
throw new Error(`atomic-write: invalid TOML in "${path}": ${String(err)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function backupAndRename(target, tmpPath) {
|
|
56
|
+
const backupPath = `${target}.backup`;
|
|
57
|
+
const had = await fileExists(target);
|
|
58
|
+
if (had) {
|
|
59
|
+
await copyFile(target, backupPath);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
await rename(tmpPath, target);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
// Best-effort restore from backup on rename failure.
|
|
66
|
+
if (had) {
|
|
67
|
+
try {
|
|
68
|
+
await copyFile(backupPath, target);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Restore failed — leave both .backup and original in place for operator recovery.
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Clean up the .tmp if it survives.
|
|
75
|
+
try {
|
|
76
|
+
await unlink(tmpPath);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// ignore
|
|
80
|
+
}
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function writeJsonAtomic(path, data) {
|
|
85
|
+
await mkdir(dirname(path), { recursive: true });
|
|
86
|
+
const tmpPath = `${path}.tmp`;
|
|
87
|
+
const contents = `${JSON.stringify(data, null, 2)}\n`;
|
|
88
|
+
await writeFile(tmpPath, contents, 'utf8');
|
|
89
|
+
await backupAndRename(path, tmpPath);
|
|
90
|
+
}
|
|
91
|
+
export async function writeTomlAtomic(path, data) {
|
|
92
|
+
await mkdir(dirname(path), { recursive: true });
|
|
93
|
+
const tmpPath = `${path}.tmp`;
|
|
94
|
+
const contents = toml.stringify(data);
|
|
95
|
+
await writeFile(tmpPath, contents, 'utf8');
|
|
96
|
+
await backupAndRename(path, tmpPath);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=atomic-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/installers/atomic-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code installer — edits ~/.claude.json mcpServers.skillforge.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code stores its host-level MCP server registry in a single JSON
|
|
5
|
+
* file at ~/.claude.json across all OSes. The installer detects presence
|
|
6
|
+
* of either the `claude` binary or that file, then merges the SkillForge
|
|
7
|
+
* entry under `mcpServers.skillforge`.
|
|
8
|
+
*/
|
|
9
|
+
import type { Installer, InstallOptions, InstallResult, PreviewResult, UninstallResult } from './types.js';
|
|
10
|
+
export interface ClaudeInstallerPathOverrides {
|
|
11
|
+
configPath?: string;
|
|
12
|
+
binaryPath?: string;
|
|
13
|
+
binaryProbe?: () => boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare class ClaudeInstaller implements Installer {
|
|
16
|
+
#private;
|
|
17
|
+
readonly name = "claude";
|
|
18
|
+
constructor(overrides?: ClaudeInstallerPathOverrides);
|
|
19
|
+
detect(): Promise<boolean>;
|
|
20
|
+
install(opts: InstallOptions): Promise<InstallResult>;
|
|
21
|
+
uninstall(): Promise<UninstallResult>;
|
|
22
|
+
preview(opts: InstallOptions & {
|
|
23
|
+
action: 'install' | 'uninstall';
|
|
24
|
+
}): Promise<PreviewResult>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=claude-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-installer.d.ts","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AAuCD,qBAAa,eAAgB,YAAW,SAAS;;IAC/C,QAAQ,CAAC,IAAI,YAAY;gBAKb,SAAS,GAAE,4BAAiC;IAMlD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAerC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CA4BlG"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code installer — edits ~/.claude.json mcpServers.skillforge.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code stores its host-level MCP server registry in a single JSON
|
|
5
|
+
* file at ~/.claude.json across all OSes. The installer detects presence
|
|
6
|
+
* of either the `claude` binary or that file, then merges the SkillForge
|
|
7
|
+
* entry under `mcpServers.skillforge`.
|
|
8
|
+
*/
|
|
9
|
+
import { spawnSync } from 'node:child_process';
|
|
10
|
+
import { access } from 'node:fs/promises';
|
|
11
|
+
import { readJsonSafe, writeJsonAtomic } from './atomic-write.js';
|
|
12
|
+
import { claudeConfigPath, defaultBinaryPath } from './paths.js';
|
|
13
|
+
const SKILL_KEY = 'skillforge';
|
|
14
|
+
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
15
|
+
function buildEntry(opts, binaryFallback) {
|
|
16
|
+
if (opts.entry === 'npx') {
|
|
17
|
+
return { command: 'npx', args: ['-y', NPX_PKG] };
|
|
18
|
+
}
|
|
19
|
+
const binary = opts.binaryPath ?? binaryFallback;
|
|
20
|
+
return { command: 'node', args: [binary] };
|
|
21
|
+
}
|
|
22
|
+
function probeClaudeBinary() {
|
|
23
|
+
try {
|
|
24
|
+
const result = spawnSync('claude', ['--version'], { stdio: 'ignore' });
|
|
25
|
+
return result.status === 0;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function fileExists(path) {
|
|
32
|
+
try {
|
|
33
|
+
await access(path);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class ClaudeInstaller {
|
|
41
|
+
name = 'claude';
|
|
42
|
+
#configPath;
|
|
43
|
+
#binaryFallback;
|
|
44
|
+
#probe;
|
|
45
|
+
constructor(overrides = {}) {
|
|
46
|
+
this.#configPath = overrides.configPath ?? claudeConfigPath();
|
|
47
|
+
this.#binaryFallback = overrides.binaryPath ?? defaultBinaryPath();
|
|
48
|
+
this.#probe = overrides.binaryProbe ?? probeClaudeBinary;
|
|
49
|
+
}
|
|
50
|
+
async detect() {
|
|
51
|
+
if (this.#probe())
|
|
52
|
+
return true;
|
|
53
|
+
return fileExists(this.#configPath);
|
|
54
|
+
}
|
|
55
|
+
async install(opts) {
|
|
56
|
+
const existing = (await readJsonSafe(this.#configPath)) ?? {};
|
|
57
|
+
const servers = existing.mcpServers ?? {};
|
|
58
|
+
const entry = buildEntry(opts, this.#binaryFallback);
|
|
59
|
+
if (servers[SKILL_KEY] !== undefined && opts.force !== true) {
|
|
60
|
+
return {
|
|
61
|
+
tool: this.name,
|
|
62
|
+
status: 'already-installed',
|
|
63
|
+
configPath: this.#configPath,
|
|
64
|
+
message: `SkillForge entry already present; pass --force to overwrite`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const next = {
|
|
68
|
+
...existing,
|
|
69
|
+
mcpServers: { ...servers, [SKILL_KEY]: entry },
|
|
70
|
+
};
|
|
71
|
+
await writeJsonAtomic(this.#configPath, next);
|
|
72
|
+
const status = servers[SKILL_KEY] !== undefined ? 'updated' : 'installed';
|
|
73
|
+
return { tool: this.name, status, configPath: this.#configPath };
|
|
74
|
+
}
|
|
75
|
+
async uninstall() {
|
|
76
|
+
const existing = (await readJsonSafe(this.#configPath));
|
|
77
|
+
if (existing === null || existing.mcpServers === undefined || existing.mcpServers[SKILL_KEY] === undefined) {
|
|
78
|
+
return {
|
|
79
|
+
tool: this.name,
|
|
80
|
+
status: 'not-installed',
|
|
81
|
+
configPath: this.#configPath,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const { [SKILL_KEY]: _drop, ...rest } = existing.mcpServers;
|
|
85
|
+
const next = { ...existing, mcpServers: rest };
|
|
86
|
+
await writeJsonAtomic(this.#configPath, next);
|
|
87
|
+
return { tool: this.name, status: 'uninstalled', configPath: this.#configPath };
|
|
88
|
+
}
|
|
89
|
+
async preview(opts) {
|
|
90
|
+
const existing = (await readJsonSafe(this.#configPath));
|
|
91
|
+
const before = existing === null ? null : JSON.stringify(existing, null, 2);
|
|
92
|
+
let nextValue;
|
|
93
|
+
if (opts.action === 'install') {
|
|
94
|
+
const base = existing ?? {};
|
|
95
|
+
const servers = base.mcpServers ?? {};
|
|
96
|
+
const entry = buildEntry(opts, this.#binaryFallback);
|
|
97
|
+
nextValue = { ...base, mcpServers: { ...servers, [SKILL_KEY]: entry } };
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
if (existing === null || existing.mcpServers === undefined) {
|
|
101
|
+
nextValue = existing ?? {};
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const { [SKILL_KEY]: _drop, ...rest } = existing.mcpServers;
|
|
105
|
+
nextValue = { ...existing, mcpServers: rest };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
tool: this.name,
|
|
110
|
+
configPath: this.#configPath,
|
|
111
|
+
willCreate: existing === null,
|
|
112
|
+
before,
|
|
113
|
+
after: JSON.stringify(nextValue, null, 2),
|
|
114
|
+
action: opts.action,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=claude-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-installer.js","sourceRoot":"","sources":["../../src/installers/claude-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI installer — edits ~/.codex/config.toml [mcp_servers.skillforge].
|
|
3
|
+
*
|
|
4
|
+
* Codex stores MCP servers in TOML at ~/.codex/config.toml under a
|
|
5
|
+
* `[mcp_servers.<name>]` table. SkillForge's table shape is:
|
|
6
|
+
*
|
|
7
|
+
* [mcp_servers.skillforge]
|
|
8
|
+
* command = "npx"
|
|
9
|
+
* args = ["-y", "@lyupro/skillforge-mcp"]
|
|
10
|
+
*
|
|
11
|
+
* Per the Codex MCP reference (developers.openai.com/codex/mcp).
|
|
12
|
+
*/
|
|
13
|
+
import type { Installer, InstallOptions, InstallResult, PreviewResult, UninstallResult } from './types.js';
|
|
14
|
+
export interface CodexInstallerPathOverrides {
|
|
15
|
+
configPath?: string;
|
|
16
|
+
binaryPath?: string;
|
|
17
|
+
binaryProbe?: () => boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class CodexInstaller implements Installer {
|
|
20
|
+
#private;
|
|
21
|
+
readonly name = "codex";
|
|
22
|
+
constructor(overrides?: CodexInstallerPathOverrides);
|
|
23
|
+
detect(): Promise<boolean>;
|
|
24
|
+
install(opts: InstallOptions): Promise<InstallResult>;
|
|
25
|
+
uninstall(): Promise<UninstallResult>;
|
|
26
|
+
preview(opts: InstallOptions & {
|
|
27
|
+
action: 'install' | 'uninstall';
|
|
28
|
+
}): Promise<PreviewResult>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=codex-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-installer.d.ts","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AA4CD,qBAAa,cAAe,YAAW,SAAS;;IAC9C,QAAQ,CAAC,IAAI,WAAW;gBAKZ,SAAS,GAAE,2BAAgC;IAMjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAerC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CA4BlG"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI installer — edits ~/.codex/config.toml [mcp_servers.skillforge].
|
|
3
|
+
*
|
|
4
|
+
* Codex stores MCP servers in TOML at ~/.codex/config.toml under a
|
|
5
|
+
* `[mcp_servers.<name>]` table. SkillForge's table shape is:
|
|
6
|
+
*
|
|
7
|
+
* [mcp_servers.skillforge]
|
|
8
|
+
* command = "npx"
|
|
9
|
+
* args = ["-y", "@lyupro/skillforge-mcp"]
|
|
10
|
+
*
|
|
11
|
+
* Per the Codex MCP reference (developers.openai.com/codex/mcp).
|
|
12
|
+
*/
|
|
13
|
+
import { spawnSync } from 'node:child_process';
|
|
14
|
+
import { access } from 'node:fs/promises';
|
|
15
|
+
import { readTomlSafe, writeTomlAtomic } from './atomic-write.js';
|
|
16
|
+
import { codexConfigPath, defaultBinaryPath } from './paths.js';
|
|
17
|
+
const SKILL_KEY = 'skillforge';
|
|
18
|
+
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
19
|
+
function buildEntry(opts, binaryFallback) {
|
|
20
|
+
if (opts.entry === 'npx') {
|
|
21
|
+
return { command: 'npx', args: ['-y', NPX_PKG] };
|
|
22
|
+
}
|
|
23
|
+
return { command: 'node', args: [opts.binaryPath ?? binaryFallback] };
|
|
24
|
+
}
|
|
25
|
+
function probeCodexBinary() {
|
|
26
|
+
try {
|
|
27
|
+
const result = spawnSync('codex', ['--version'], { stdio: 'ignore' });
|
|
28
|
+
return result.status === 0;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function fileExists(path) {
|
|
35
|
+
try {
|
|
36
|
+
await access(path);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
import toml from '@iarna/toml';
|
|
44
|
+
function tomlStringify(obj) {
|
|
45
|
+
return toml.stringify(obj);
|
|
46
|
+
}
|
|
47
|
+
export class CodexInstaller {
|
|
48
|
+
name = 'codex';
|
|
49
|
+
#configPath;
|
|
50
|
+
#binaryFallback;
|
|
51
|
+
#probe;
|
|
52
|
+
constructor(overrides = {}) {
|
|
53
|
+
this.#configPath = overrides.configPath ?? codexConfigPath();
|
|
54
|
+
this.#binaryFallback = overrides.binaryPath ?? defaultBinaryPath();
|
|
55
|
+
this.#probe = overrides.binaryProbe ?? probeCodexBinary;
|
|
56
|
+
}
|
|
57
|
+
async detect() {
|
|
58
|
+
if (this.#probe())
|
|
59
|
+
return true;
|
|
60
|
+
return fileExists(this.#configPath);
|
|
61
|
+
}
|
|
62
|
+
async install(opts) {
|
|
63
|
+
const existing = (await readTomlSafe(this.#configPath)) ?? {};
|
|
64
|
+
const servers = (existing.mcp_servers ?? {});
|
|
65
|
+
const entry = buildEntry(opts, this.#binaryFallback);
|
|
66
|
+
if (servers[SKILL_KEY] !== undefined && opts.force !== true) {
|
|
67
|
+
return {
|
|
68
|
+
tool: this.name,
|
|
69
|
+
status: 'already-installed',
|
|
70
|
+
configPath: this.#configPath,
|
|
71
|
+
message: `SkillForge entry already present; pass --force to overwrite`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const next = {
|
|
75
|
+
...existing,
|
|
76
|
+
mcp_servers: { ...servers, [SKILL_KEY]: entry },
|
|
77
|
+
};
|
|
78
|
+
await writeTomlAtomic(this.#configPath, next);
|
|
79
|
+
const status = servers[SKILL_KEY] !== undefined ? 'updated' : 'installed';
|
|
80
|
+
return { tool: this.name, status, configPath: this.#configPath };
|
|
81
|
+
}
|
|
82
|
+
async uninstall() {
|
|
83
|
+
const existing = (await readTomlSafe(this.#configPath));
|
|
84
|
+
if (existing === null || existing.mcp_servers === undefined || existing.mcp_servers[SKILL_KEY] === undefined) {
|
|
85
|
+
return {
|
|
86
|
+
tool: this.name,
|
|
87
|
+
status: 'not-installed',
|
|
88
|
+
configPath: this.#configPath,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const { [SKILL_KEY]: _drop, ...rest } = existing.mcp_servers;
|
|
92
|
+
const next = { ...existing, mcp_servers: rest };
|
|
93
|
+
await writeTomlAtomic(this.#configPath, next);
|
|
94
|
+
return { tool: this.name, status: 'uninstalled', configPath: this.#configPath };
|
|
95
|
+
}
|
|
96
|
+
async preview(opts) {
|
|
97
|
+
const existing = (await readTomlSafe(this.#configPath));
|
|
98
|
+
const before = existing === null ? null : tomlStringify(existing);
|
|
99
|
+
let nextValue;
|
|
100
|
+
if (opts.action === 'install') {
|
|
101
|
+
const base = (existing ?? {});
|
|
102
|
+
const servers = (base.mcp_servers ?? {});
|
|
103
|
+
const entry = buildEntry(opts, this.#binaryFallback);
|
|
104
|
+
nextValue = { ...base, mcp_servers: { ...servers, [SKILL_KEY]: entry } };
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
if (existing === null || existing.mcp_servers === undefined) {
|
|
108
|
+
nextValue = (existing ?? {});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const { [SKILL_KEY]: _drop, ...rest } = existing.mcp_servers;
|
|
112
|
+
nextValue = { ...existing, mcp_servers: rest };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
tool: this.name,
|
|
117
|
+
configPath: this.#configPath,
|
|
118
|
+
willCreate: existing === null,
|
|
119
|
+
before,
|
|
120
|
+
after: tomlStringify(nextValue),
|
|
121
|
+
action: opts.action,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=codex-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-installer.js","sourceRoot":"","sources":["../../src/installers/codex-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor installer — edits Cursor's settings.json mcp.servers.skillforge.
|
|
3
|
+
*
|
|
4
|
+
* Cursor stores its global settings JSON at an OS-specific path:
|
|
5
|
+
* Windows: %APPDATA%/Cursor/User/settings.json
|
|
6
|
+
* macOS: ~/Library/Application Support/Cursor/User/settings.json
|
|
7
|
+
* Linux: ~/.config/Cursor/User/settings.json
|
|
8
|
+
*
|
|
9
|
+
* The MCP server registry lives under `mcp.servers.<name>` with the same
|
|
10
|
+
* { command, args, env? } shape used by Claude Code.
|
|
11
|
+
*/
|
|
12
|
+
import type { Installer, InstallOptions, InstallResult, PreviewResult, UninstallResult } from './types.js';
|
|
13
|
+
export interface CursorInstallerPathOverrides {
|
|
14
|
+
configPath?: string;
|
|
15
|
+
binaryPath?: string;
|
|
16
|
+
binaryProbe?: () => boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class CursorInstaller implements Installer {
|
|
19
|
+
#private;
|
|
20
|
+
readonly name = "cursor";
|
|
21
|
+
constructor(overrides?: CursorInstallerPathOverrides);
|
|
22
|
+
detect(): Promise<boolean>;
|
|
23
|
+
install(opts: InstallOptions): Promise<InstallResult>;
|
|
24
|
+
uninstall(): Promise<UninstallResult>;
|
|
25
|
+
preview(opts: InstallOptions & {
|
|
26
|
+
action: 'install' | 'uninstall';
|
|
27
|
+
}): Promise<PreviewResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=cursor-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-installer.d.ts","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AA0DD,qBAAa,eAAgB,YAAW,SAAS;;IAC/C,QAAQ,CAAC,IAAI,YAAY;gBAKb,SAAS,GAAE,4BAAiC;IAMlD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBrD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAUrC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAsBlG"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor installer — edits Cursor's settings.json mcp.servers.skillforge.
|
|
3
|
+
*
|
|
4
|
+
* Cursor stores its global settings JSON at an OS-specific path:
|
|
5
|
+
* Windows: %APPDATA%/Cursor/User/settings.json
|
|
6
|
+
* macOS: ~/Library/Application Support/Cursor/User/settings.json
|
|
7
|
+
* Linux: ~/.config/Cursor/User/settings.json
|
|
8
|
+
*
|
|
9
|
+
* The MCP server registry lives under `mcp.servers.<name>` with the same
|
|
10
|
+
* { command, args, env? } shape used by Claude Code.
|
|
11
|
+
*/
|
|
12
|
+
import { spawnSync } from 'node:child_process';
|
|
13
|
+
import { access } from 'node:fs/promises';
|
|
14
|
+
import { readJsonSafe, writeJsonAtomic } from './atomic-write.js';
|
|
15
|
+
import { cursorSettingsPath, defaultBinaryPath } from './paths.js';
|
|
16
|
+
const SKILL_KEY = 'skillforge';
|
|
17
|
+
const NPX_PKG = '@lyupro/skillforge-mcp';
|
|
18
|
+
function buildEntry(opts, binaryFallback) {
|
|
19
|
+
if (opts.entry === 'npx') {
|
|
20
|
+
return { command: 'npx', args: ['-y', NPX_PKG] };
|
|
21
|
+
}
|
|
22
|
+
return { command: 'node', args: [opts.binaryPath ?? binaryFallback] };
|
|
23
|
+
}
|
|
24
|
+
function probeCursorBinary() {
|
|
25
|
+
try {
|
|
26
|
+
const result = spawnSync('cursor', ['--version'], { stdio: 'ignore' });
|
|
27
|
+
return result.status === 0;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function fileExists(path) {
|
|
34
|
+
try {
|
|
35
|
+
await access(path);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function readSkillforge(cfg) {
|
|
43
|
+
return cfg.mcp?.servers?.[SKILL_KEY];
|
|
44
|
+
}
|
|
45
|
+
function mergeInstall(existing, entry) {
|
|
46
|
+
const mcp = existing.mcp ?? {};
|
|
47
|
+
const servers = mcp.servers ?? {};
|
|
48
|
+
return {
|
|
49
|
+
...existing,
|
|
50
|
+
mcp: { ...mcp, servers: { ...servers, [SKILL_KEY]: entry } },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function mergeUninstall(existing) {
|
|
54
|
+
const mcp = existing.mcp;
|
|
55
|
+
if (mcp === undefined || mcp.servers === undefined)
|
|
56
|
+
return existing;
|
|
57
|
+
const { [SKILL_KEY]: _drop, ...rest } = mcp.servers;
|
|
58
|
+
return { ...existing, mcp: { ...mcp, servers: rest } };
|
|
59
|
+
}
|
|
60
|
+
export class CursorInstaller {
|
|
61
|
+
name = 'cursor';
|
|
62
|
+
#configPath;
|
|
63
|
+
#binaryFallback;
|
|
64
|
+
#probe;
|
|
65
|
+
constructor(overrides = {}) {
|
|
66
|
+
this.#configPath = overrides.configPath ?? cursorSettingsPath();
|
|
67
|
+
this.#binaryFallback = overrides.binaryPath ?? defaultBinaryPath();
|
|
68
|
+
this.#probe = overrides.binaryProbe ?? probeCursorBinary;
|
|
69
|
+
}
|
|
70
|
+
async detect() {
|
|
71
|
+
if (this.#probe())
|
|
72
|
+
return true;
|
|
73
|
+
return fileExists(this.#configPath);
|
|
74
|
+
}
|
|
75
|
+
async install(opts) {
|
|
76
|
+
const existing = (await readJsonSafe(this.#configPath)) ?? {};
|
|
77
|
+
const entry = buildEntry(opts, this.#binaryFallback);
|
|
78
|
+
const prior = readSkillforge(existing);
|
|
79
|
+
if (prior !== undefined && opts.force !== true) {
|
|
80
|
+
return {
|
|
81
|
+
tool: this.name,
|
|
82
|
+
status: 'already-installed',
|
|
83
|
+
configPath: this.#configPath,
|
|
84
|
+
message: `SkillForge entry already present; pass --force to overwrite`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const next = mergeInstall(existing, entry);
|
|
88
|
+
await writeJsonAtomic(this.#configPath, next);
|
|
89
|
+
return {
|
|
90
|
+
tool: this.name,
|
|
91
|
+
status: prior !== undefined ? 'updated' : 'installed',
|
|
92
|
+
configPath: this.#configPath,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async uninstall() {
|
|
96
|
+
const existing = (await readJsonSafe(this.#configPath));
|
|
97
|
+
if (existing === null || readSkillforge(existing) === undefined) {
|
|
98
|
+
return { tool: this.name, status: 'not-installed', configPath: this.#configPath };
|
|
99
|
+
}
|
|
100
|
+
const next = mergeUninstall(existing);
|
|
101
|
+
await writeJsonAtomic(this.#configPath, next);
|
|
102
|
+
return { tool: this.name, status: 'uninstalled', configPath: this.#configPath };
|
|
103
|
+
}
|
|
104
|
+
async preview(opts) {
|
|
105
|
+
const existing = (await readJsonSafe(this.#configPath));
|
|
106
|
+
const before = existing === null ? null : JSON.stringify(existing, null, 2);
|
|
107
|
+
let nextValue;
|
|
108
|
+
if (opts.action === 'install') {
|
|
109
|
+
const base = existing ?? {};
|
|
110
|
+
const entry = buildEntry(opts, this.#binaryFallback);
|
|
111
|
+
nextValue = mergeInstall(base, entry);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
nextValue = existing === null ? {} : mergeUninstall(existing);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
tool: this.name,
|
|
118
|
+
configPath: this.#configPath,
|
|
119
|
+
willCreate: existing === null,
|
|
120
|
+
before,
|
|
121
|
+
after: JSON.stringify(nextValue, null, 2),
|
|
122
|
+
action: opts.action,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=cursor-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-installer.js","sourceRoot":"","sources":["../../src/installers/cursor-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-specific config path helpers for host tools.
|
|
3
|
+
*
|
|
4
|
+
* Per repo convention, all SkillForge config paths use `os.homedir()`
|
|
5
|
+
* exclusively — no platform branching. Cursor is the exception: its
|
|
6
|
+
* `settings.json` location is third-party (Cursor app), out of our
|
|
7
|
+
* control, so the platform-specific dispatch here is rubric-exempt.
|
|
8
|
+
*/
|
|
9
|
+
export interface PathOverrides {
|
|
10
|
+
claudeConfigPath: string;
|
|
11
|
+
codexConfigPath: string;
|
|
12
|
+
cursorSettingsPath: string;
|
|
13
|
+
defaultBinaryPath: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function claudeConfigPath(): string;
|
|
16
|
+
export declare function codexConfigPath(): string;
|
|
17
|
+
export declare function cursorSettingsPath(): string;
|
|
18
|
+
export declare function defaultBinaryPath(): string;
|
|
19
|
+
export declare function defaultPaths(): PathOverrides;
|
|
20
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/installers/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD,wBAAgB,kBAAkB,IAAI,MAAM,CAU3C;AAKD,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,YAAY,IAAI,aAAa,CAO5C"}
|