@fprad0/skill-master-mcp 0.0.2
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 +22 -0
- package/README.md +168 -0
- package/VERSION.md +9 -0
- package/bin/skill-master-configure-private-registry.mjs +3 -0
- package/bin/skill-master.mjs +3 -0
- package/dist/catalog.d.ts +11 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +202 -0
- package/dist/catalog.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +284 -0
- package/dist/index.js.map +1 -0
- package/dist/recommender.d.ts +6 -0
- package/dist/recommender.d.ts.map +1 -0
- package/dist/recommender.js +102 -0
- package/dist/recommender.js.map +1 -0
- package/dist/skill-network.d.ts +67 -0
- package/dist/skill-network.d.ts.map +1 -0
- package/dist/skill-network.js +226 -0
- package/dist/skill-network.js.map +1 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/update.d.ts +45 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +288 -0
- package/dist/update.js.map +1 -0
- package/docs/operations/GUIA_NPM_PRIVADO.md +250 -0
- package/examples/client-configs/claude-code.commands.md +17 -0
- package/examples/client-configs/claude-code.project.mcp.json +18 -0
- package/examples/client-configs/claude-desktop.macos.json +18 -0
- package/examples/client-configs/claude-desktop.windows.json +20 -0
- package/examples/client-configs/codex.windows.toml +11 -0
- package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -0
- package/examples/client-configs/gemini.linux.settings.json +21 -0
- package/examples/client-configs/gemini.windows.settings.json +23 -0
- package/examples/client-configs/generic-stdio.json +16 -0
- package/manifests/channels/beta.json +25 -0
- package/manifests/channels/stable.json +26 -0
- package/network/approved-skills.json +5 -0
- package/package.json +60 -0
- package/scripts/configure-private-registry.mjs +124 -0
- package/scripts/lib/private-registry.mjs +56 -0
- package/sources.json +8 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_PACKAGE_NAME,
|
|
6
|
+
DEFAULT_REGISTRY_URL,
|
|
7
|
+
DEFAULT_SCOPE,
|
|
8
|
+
DEFAULT_TOKEN_ENV,
|
|
9
|
+
upsertNpmrc,
|
|
10
|
+
} from './lib/private-registry.mjs';
|
|
11
|
+
|
|
12
|
+
function parseArgs(argv) {
|
|
13
|
+
const parsed = {
|
|
14
|
+
npmrc: resolve(process.env.USERPROFILE ?? process.env.HOME ?? '.', '.npmrc'),
|
|
15
|
+
scope: DEFAULT_SCOPE,
|
|
16
|
+
registry: DEFAULT_REGISTRY_URL,
|
|
17
|
+
tokenEnv: DEFAULT_TOKEN_ENV,
|
|
18
|
+
backup: true,
|
|
19
|
+
dryRun: false,
|
|
20
|
+
validate: false,
|
|
21
|
+
packageName: DEFAULT_PACKAGE_NAME,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
25
|
+
const arg = argv[i];
|
|
26
|
+
switch (arg) {
|
|
27
|
+
case '--npmrc':
|
|
28
|
+
parsed.npmrc = resolve(argv[++i]);
|
|
29
|
+
break;
|
|
30
|
+
case '--scope':
|
|
31
|
+
parsed.scope = argv[++i];
|
|
32
|
+
break;
|
|
33
|
+
case '--registry':
|
|
34
|
+
parsed.registry = argv[++i];
|
|
35
|
+
break;
|
|
36
|
+
case '--token':
|
|
37
|
+
parsed.token = argv[++i];
|
|
38
|
+
break;
|
|
39
|
+
case '--token-env':
|
|
40
|
+
parsed.tokenEnv = argv[++i];
|
|
41
|
+
break;
|
|
42
|
+
case '--no-backup':
|
|
43
|
+
parsed.backup = false;
|
|
44
|
+
break;
|
|
45
|
+
case '--dry-run':
|
|
46
|
+
parsed.dryRun = true;
|
|
47
|
+
break;
|
|
48
|
+
case '--validate':
|
|
49
|
+
parsed.validate = true;
|
|
50
|
+
break;
|
|
51
|
+
case '--package':
|
|
52
|
+
parsed.packageName = argv[++i];
|
|
53
|
+
break;
|
|
54
|
+
default:
|
|
55
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function main() {
|
|
63
|
+
const options = parseArgs(process.argv.slice(2));
|
|
64
|
+
const token = options.token ?? process.env[options.tokenEnv];
|
|
65
|
+
|
|
66
|
+
if (!token) {
|
|
67
|
+
throw new Error(`Token not provided. Use --token or define ${options.tokenEnv}.`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const currentContent = existsSync(options.npmrc)
|
|
71
|
+
? readFileSync(options.npmrc, 'utf8')
|
|
72
|
+
: '';
|
|
73
|
+
|
|
74
|
+
const nextContent = upsertNpmrc(currentContent, {
|
|
75
|
+
scope: options.scope,
|
|
76
|
+
registryUrl: options.registry,
|
|
77
|
+
tokenValue: token,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const changed = nextContent !== currentContent.replace(/\r\n/g, '\n');
|
|
81
|
+
|
|
82
|
+
if (!options.dryRun) {
|
|
83
|
+
mkdirSync(dirname(options.npmrc), { recursive: true });
|
|
84
|
+
if (changed && options.backup && existsSync(options.npmrc)) {
|
|
85
|
+
copyFileSync(options.npmrc, `${options.npmrc}.bak`);
|
|
86
|
+
}
|
|
87
|
+
writeFileSync(options.npmrc, nextContent, 'utf8');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (options.validate) {
|
|
91
|
+
if (options.dryRun) {
|
|
92
|
+
throw new Error('Cannot use --validate together with --dry-run.');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const result = spawnSync(
|
|
96
|
+
'npm',
|
|
97
|
+
['view', options.packageName, `--registry=${options.registry}`],
|
|
98
|
+
{ stdio: 'inherit', shell: process.platform === 'win32' },
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
if (result.status !== 0) {
|
|
102
|
+
throw new Error(`Validation failed for ${options.packageName}.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
process.stdout.write(
|
|
107
|
+
[
|
|
108
|
+
`[skill_master] ${options.dryRun ? 'Preview ready for' : 'Configured'} ${options.npmrc}`,
|
|
109
|
+
`[skill_master] Scope: ${options.scope}`,
|
|
110
|
+
`[skill_master] Registry: ${options.registry}`,
|
|
111
|
+
`[skill_master] Changed: ${changed ? 'yes' : 'no'}`,
|
|
112
|
+
`[skill_master] Validate with: npm view ${options.packageName} --registry=${options.registry}`,
|
|
113
|
+
`[skill_master] Run with: npx -y ${options.packageName}@latest`,
|
|
114
|
+
].join('\n') + '\n',
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
main();
|
|
120
|
+
} catch (error) {
|
|
121
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
122
|
+
process.stderr.write(`[skill_master] ${message}\n`);
|
|
123
|
+
process.exitCode = 1;
|
|
124
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export const DEFAULT_SCOPE = '@fprad0';
|
|
2
|
+
export const DEFAULT_PACKAGE_NAME = '@fprad0/skill-master-mcp';
|
|
3
|
+
export const DEFAULT_REGISTRY_URL = 'https://npm.pkg.github.com';
|
|
4
|
+
export const DEFAULT_TOKEN_ENV = 'GITHUB_PACKAGES_TOKEN';
|
|
5
|
+
|
|
6
|
+
export function registryHostFromUrl(registryUrl = DEFAULT_REGISTRY_URL) {
|
|
7
|
+
return new URL(registryUrl).host;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function buildRegistryLine(scope = DEFAULT_SCOPE, registryUrl = DEFAULT_REGISTRY_URL) {
|
|
11
|
+
return `${scope}:registry=${registryUrl}`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function buildTokenLine(registryUrl = DEFAULT_REGISTRY_URL, tokenValue) {
|
|
15
|
+
return `//${registryHostFromUrl(registryUrl)}/:_authToken=${tokenValue}`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function upsertNpmrc(content, {
|
|
19
|
+
scope = DEFAULT_SCOPE,
|
|
20
|
+
registryUrl = DEFAULT_REGISTRY_URL,
|
|
21
|
+
tokenValue,
|
|
22
|
+
} = {}) {
|
|
23
|
+
if (!tokenValue) {
|
|
24
|
+
throw new Error('tokenValue is required');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existing = (content ?? '').replace(/\r\n/g, '\n');
|
|
28
|
+
const registryLinePrefix = `${scope}:registry=`;
|
|
29
|
+
const tokenLinePrefix = `//${registryHostFromUrl(registryUrl)}/:_authToken=`;
|
|
30
|
+
|
|
31
|
+
const filteredLines = existing
|
|
32
|
+
.split('\n')
|
|
33
|
+
.filter((line) => !line.startsWith(registryLinePrefix) && !line.startsWith(tokenLinePrefix));
|
|
34
|
+
|
|
35
|
+
while (filteredLines.length > 0 && filteredLines[filteredLines.length - 1] === '') {
|
|
36
|
+
filteredLines.pop();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (filteredLines.length > 0) {
|
|
40
|
+
filteredLines.push('');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
filteredLines.push(buildRegistryLine(scope, registryUrl));
|
|
44
|
+
filteredLines.push(buildTokenLine(registryUrl, tokenValue));
|
|
45
|
+
|
|
46
|
+
return `${filteredLines.join('\n')}\n`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function hasRegistryConfig(content, {
|
|
50
|
+
scope = DEFAULT_SCOPE,
|
|
51
|
+
registryUrl = DEFAULT_REGISTRY_URL,
|
|
52
|
+
} = {}) {
|
|
53
|
+
const normalized = (content ?? '').replace(/\r\n/g, '\n');
|
|
54
|
+
return normalized.includes(buildRegistryLine(scope, registryUrl));
|
|
55
|
+
}
|
|
56
|
+
|