@emmraan/ai-skills 0.0.2 → 0.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/LICENSE +21 -0
- package/README.md +20 -0
- package/dist/commands/install.d.ts +10 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +94 -2
- package/dist/commands/install.js.map +1 -1
- package/dist/core/config.d.ts +13 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +28 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/installer.d.ts +2 -1
- package/dist/core/installer.d.ts.map +1 -1
- package/dist/core/installer.js +3 -3
- package/dist/core/installer.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -24
- package/dist/index.js.map +1 -1
- package/package.json +2 -4
- package/src/commands/install.ts +128 -2
- package/src/core/config.ts +50 -4
- package/src/core/installer.ts +8 -4
- package/src/index.ts +17 -5
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 md εmrαη
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -6,11 +6,31 @@ Install framework-agnostic `SKILLS.md` files for AI agents.
|
|
|
6
6
|
|
|
7
7
|
- `npx @emmraan/ai-skills react` - Install React skill
|
|
8
8
|
- `npx @emmraan/ai-skills install react` - Install React skill (explicit command)
|
|
9
|
+
- `npx @emmraan/ai-skills react --local` - Install to local project (`process.cwd()`)
|
|
10
|
+
- `npx @emmraan/ai-skills react --platform claude,gemini` - Install globally to selected platforms
|
|
11
|
+
- `npx @emmraan/ai-skills react --local --platform claude,gemini` - Install locally to selected platforms
|
|
12
|
+
- `npx @emmraan/ai-skills react --global --all` - Install globally to all platforms
|
|
9
13
|
- `npx @emmraan/ai-skills list` - List available and installed skills
|
|
10
14
|
- `npx @emmraan/ai-skills update` - Update all installed skills
|
|
11
15
|
- `npx @emmraan/ai-skills remove react` - Remove React skill
|
|
12
16
|
- `npx @emmraan/ai-skills generate-local` - Run local backend generator
|
|
13
17
|
|
|
18
|
+
## Interactive install flow
|
|
19
|
+
|
|
20
|
+
When you run `npx @emmraan/ai-skills <skill>` without install flags, the CLI prompts for:
|
|
21
|
+
|
|
22
|
+
1. Install location: Local (current project) or Global (agent platforms)
|
|
23
|
+
2. If Global: All platforms or specific platforms
|
|
24
|
+
|
|
25
|
+
Supported non-interactive install flags:
|
|
26
|
+
|
|
27
|
+
- `--local`
|
|
28
|
+
- `--global`
|
|
29
|
+
- `--platform <name[,name]>`
|
|
30
|
+
- `--all`
|
|
31
|
+
|
|
32
|
+
Default behavior remains global + all platforms.
|
|
33
|
+
|
|
14
34
|
## Publish to npm
|
|
15
35
|
|
|
16
36
|
This package is the publishable CLI package for the `ai-skills` command.
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { type InstallOptions } from '../core/config.js';
|
|
2
|
+
export interface CliInstallFlags {
|
|
3
|
+
local?: boolean;
|
|
4
|
+
global?: boolean;
|
|
5
|
+
all?: boolean;
|
|
6
|
+
platforms?: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function parseInstallFlags(args: string[]): CliInstallFlags;
|
|
9
|
+
export declare function resolveInstallOptionsFromFlags(flags: CliInstallFlags, interactive: boolean): Promise<InstallOptions>;
|
|
10
|
+
export declare function install(skillName: string, options?: InstallOptions): Promise<boolean>;
|
|
2
11
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAM/F,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA0BjE;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,cAAc,CAAC,CAyCzB;AA4CD,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB/F"}
|
package/dist/commands/install.js
CHANGED
|
@@ -1,15 +1,107 @@
|
|
|
1
1
|
import { fetchSkill, fetchRegistryIndex } from '../core/downloader.js';
|
|
2
2
|
import { installSkill } from '../core/installer.js';
|
|
3
3
|
import { addSkillToLockfile } from '../core/lockfile.js';
|
|
4
|
+
import { AGENT_PLATFORMS } from '../core/config.js';
|
|
4
5
|
import { sha256 } from '../utils/hash.js';
|
|
5
6
|
import { error, success, info } from '../utils/logger.js';
|
|
6
|
-
|
|
7
|
+
import { createInterface } from 'readline/promises';
|
|
8
|
+
import { stdin as input, stdout as output } from 'process';
|
|
9
|
+
export function parseInstallFlags(args) {
|
|
10
|
+
const flags = {};
|
|
11
|
+
for (let i = 0; i < args.length; i++) {
|
|
12
|
+
const arg = args[i];
|
|
13
|
+
if (arg === '--local') {
|
|
14
|
+
flags.local = true;
|
|
15
|
+
}
|
|
16
|
+
else if (arg === '--global') {
|
|
17
|
+
flags.global = true;
|
|
18
|
+
}
|
|
19
|
+
else if (arg === '--all') {
|
|
20
|
+
flags.all = true;
|
|
21
|
+
}
|
|
22
|
+
else if (arg === '--platform') {
|
|
23
|
+
const value = args[i + 1];
|
|
24
|
+
if (!value || value.startsWith('--')) {
|
|
25
|
+
throw new Error('Missing value for --platform. Example: --platform claude,gemini');
|
|
26
|
+
}
|
|
27
|
+
i++;
|
|
28
|
+
const parsed = value
|
|
29
|
+
.split(',')
|
|
30
|
+
.map((p) => p.trim())
|
|
31
|
+
.filter(Boolean);
|
|
32
|
+
flags.platforms = [...(flags.platforms ?? []), ...parsed];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return flags;
|
|
36
|
+
}
|
|
37
|
+
export async function resolveInstallOptionsFromFlags(flags, interactive) {
|
|
38
|
+
if (flags.local && flags.global) {
|
|
39
|
+
throw new Error('Use only one of --local or --global');
|
|
40
|
+
}
|
|
41
|
+
const hasAnyFlag = Boolean(flags.local || flags.global || flags.all || (flags.platforms ?? []).length);
|
|
42
|
+
if (flags.local) {
|
|
43
|
+
return {
|
|
44
|
+
location: 'local',
|
|
45
|
+
all: flags.all || !flags.platforms || flags.platforms.length === 0,
|
|
46
|
+
platforms: flags.platforms,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (flags.global) {
|
|
50
|
+
return {
|
|
51
|
+
location: 'global',
|
|
52
|
+
all: flags.all || !flags.platforms || flags.platforms.length === 0,
|
|
53
|
+
platforms: flags.platforms,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if ((flags.platforms ?? []).length > 0 || flags.all) {
|
|
57
|
+
return {
|
|
58
|
+
location: 'global',
|
|
59
|
+
all: flags.all,
|
|
60
|
+
platforms: flags.platforms,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (!hasAnyFlag) {
|
|
64
|
+
if (interactive && input.isTTY && output.isTTY) {
|
|
65
|
+
return promptInstallOptions();
|
|
66
|
+
}
|
|
67
|
+
return { location: 'global', all: true };
|
|
68
|
+
}
|
|
69
|
+
return { location: 'global', all: true };
|
|
70
|
+
}
|
|
71
|
+
async function promptInstallOptions() {
|
|
72
|
+
const rl = createInterface({ input, output });
|
|
73
|
+
try {
|
|
74
|
+
const locationAnswer = (await rl.question('Install location? [1] Local (current project) [2] Global (agent platforms) (default: 2): ')).trim();
|
|
75
|
+
const location = locationAnswer === '1' ? 'local' : 'global';
|
|
76
|
+
if (location === 'local') {
|
|
77
|
+
return { location: 'local' };
|
|
78
|
+
}
|
|
79
|
+
const platformAnswer = (await rl.question('Global install target? [1] All platforms [2] Specific platforms (default: 1): ')).trim();
|
|
80
|
+
if (platformAnswer !== '2') {
|
|
81
|
+
return { location: 'global', all: true };
|
|
82
|
+
}
|
|
83
|
+
info(`Available platforms: ${AGENT_PLATFORMS.map((p) => p.replace(/^\./, '')).join(', ')}`);
|
|
84
|
+
const selected = (await rl.question('Enter comma-separated platform names (example: claude,gemini,vscode): '))
|
|
85
|
+
.split(',')
|
|
86
|
+
.map((p) => p.trim())
|
|
87
|
+
.filter(Boolean);
|
|
88
|
+
return {
|
|
89
|
+
location: 'global',
|
|
90
|
+
all: selected.length === 0,
|
|
91
|
+
platforms: selected,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
rl.close();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export async function install(skillName, options = {}) {
|
|
7
99
|
try {
|
|
8
100
|
info(`Fetching ${skillName}...`);
|
|
9
101
|
const skillContent = await fetchSkill(skillName);
|
|
10
102
|
const hash = sha256(skillContent);
|
|
11
103
|
info(`Installing ${skillName}...`);
|
|
12
|
-
const installPaths = await installSkill(skillName, skillContent);
|
|
104
|
+
const installPaths = await installSkill(skillName, skillContent, options);
|
|
13
105
|
if (installPaths.length === 0) {
|
|
14
106
|
error(`Failed to install ${skillName} to any location`);
|
|
15
107
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAA6C,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,SAAS,CAAC;AAS3D,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,MAAM,MAAM,GAAG,KAAK;iBACjB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAsB,EACtB,WAAoB;IAEpB,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CACxB,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAC3E,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO;YACL,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAClE,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAClE,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACpD,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,WAAW,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC/C,OAAO,oBAAoB,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,CACrB,MAAM,EAAE,CAAC,QAAQ,CACf,2FAA2F,CAC5F,CACF,CAAC,IAAI,EAAE,CAAC;QAET,MAAM,QAAQ,GAAoB,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9E,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,cAAc,GAAG,CACrB,MAAM,EAAE,CAAC,QAAQ,CACf,gFAAgF,CACjF,CACF,CAAC,IAAI,EAAE,CAAC;QAET,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;YAC3B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,wBAAwB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5F,MAAM,QAAQ,GAAG,CACf,MAAM,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC,CAC5F;aACE,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,GAAG,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;YAC1B,SAAS,EAAE,QAAQ;SACpB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAAiB,EAAE,UAA0B,EAAE;IAC3E,IAAI,CAAC;QACH,IAAI,CAAC,YAAY,SAAS,KAAK,CAAC,CAAC;QACjC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QAElC,IAAI,CAAC,cAAc,SAAS,KAAK,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAE1E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,qBAAqB,SAAS,kBAAkB,CAAC,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,IAAI,SAAS,CAAC;QAEnE,MAAM,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QACtE,OAAO,CAAC,aAAa,SAAS,KAAK,YAAY,QAAQ,YAAY,CAAC,MAAM,cAAc,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,qBAAqB,SAAS,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
export declare const REGISTRY_URL = "https://raw.githubusercontent.com/Emmraan/ai-skills/main/packages/skills-registry";
|
|
2
2
|
export declare const REGISTRY_INDEX_URL = "https://raw.githubusercontent.com/Emmraan/ai-skills/main/packages/skills-registry/skills/.index.json";
|
|
3
3
|
export declare const AGENT_PLATFORMS: string[];
|
|
4
|
+
export type InstallLocation = 'local' | 'global';
|
|
5
|
+
export interface InstallOptions {
|
|
6
|
+
location?: InstallLocation;
|
|
7
|
+
platforms?: string[];
|
|
8
|
+
all?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ResolvedInstallOptions {
|
|
11
|
+
location: InstallLocation;
|
|
12
|
+
platforms: string[];
|
|
13
|
+
}
|
|
4
14
|
export declare function getAgentPlatformDirs(): string[];
|
|
15
|
+
export declare function resolveInstallOptions(options?: InstallOptions): ResolvedInstallOptions;
|
|
5
16
|
export declare function getLockfilePath(): string;
|
|
6
|
-
export declare function getSkillInstallPaths(skillName: string): string[];
|
|
7
|
-
export declare function getSkillMetadataPaths(skillName: string): string[];
|
|
17
|
+
export declare function getSkillInstallPaths(skillName: string, options?: InstallOptions): string[];
|
|
18
|
+
export declare function getSkillMetadataPaths(skillName: string, options?: InstallOptions): string[];
|
|
8
19
|
export declare const IS_WINDOWS: boolean;
|
|
9
20
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,sFAC4D,CAAC;AAEtF,eAAO,MAAM,kBAAkB,yGAAuC,CAAC;AAEvE,eAAO,MAAM,eAAe,UAAsE,CAAC;AAEnG,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAG/C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,sFAC4D,CAAC;AAEtF,eAAO,MAAM,kBAAkB,yGAAuC,CAAC;AAEvE,eAAO,MAAM,eAAe,UAAsE,CAAC;AAEnG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAG/C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,cAAmB,GAAG,sBAAsB,CAiB1F;AAYD,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,EAAE,CAG9F;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,EAAE,CAK/F;AAED,eAAO,MAAM,UAAU,SAAyB,CAAC"}
|
package/dist/core/config.js
CHANGED
|
@@ -7,15 +7,39 @@ export function getAgentPlatformDirs() {
|
|
|
7
7
|
const home = homedir();
|
|
8
8
|
return AGENT_PLATFORMS.map((p) => join(home, p, 'skills'));
|
|
9
9
|
}
|
|
10
|
+
export function resolveInstallOptions(options = {}) {
|
|
11
|
+
const location = options.location ?? 'global';
|
|
12
|
+
const normalized = (options.platforms ?? []).map((p) => normalizePlatformName(p));
|
|
13
|
+
const unique = [...new Set(normalized)];
|
|
14
|
+
if (options.all || unique.length === 0) {
|
|
15
|
+
return { location, platforms: [...AGENT_PLATFORMS] };
|
|
16
|
+
}
|
|
17
|
+
for (const p of unique) {
|
|
18
|
+
if (!AGENT_PLATFORMS.includes(p)) {
|
|
19
|
+
throw new Error(`Unknown platform: ${p}. Supported: ${AGENT_PLATFORMS.join(', ')}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return { location, platforms: unique };
|
|
23
|
+
}
|
|
24
|
+
function normalizePlatformName(name) {
|
|
25
|
+
const trimmed = name.trim();
|
|
26
|
+
return trimmed.startsWith('.') ? trimmed : `.${trimmed}`;
|
|
27
|
+
}
|
|
28
|
+
function getSelectedPlatformDirs(resolved) {
|
|
29
|
+
const baseDir = resolved.location === 'local' ? process.cwd() : homedir();
|
|
30
|
+
return resolved.platforms.map((p) => join(baseDir, p, 'skills'));
|
|
31
|
+
}
|
|
10
32
|
export function getLockfilePath() {
|
|
11
33
|
const home = homedir();
|
|
12
34
|
return join(home, '.ai-skills', '.skill-lock.json');
|
|
13
35
|
}
|
|
14
|
-
export function getSkillInstallPaths(skillName) {
|
|
15
|
-
|
|
36
|
+
export function getSkillInstallPaths(skillName, options = {}) {
|
|
37
|
+
const resolved = resolveInstallOptions(options);
|
|
38
|
+
return getSelectedPlatformDirs(resolved).map((dir) => join(dir, skillName, 'SKILLS.md'));
|
|
16
39
|
}
|
|
17
|
-
export function getSkillMetadataPaths(skillName) {
|
|
18
|
-
|
|
40
|
+
export function getSkillMetadataPaths(skillName, options = {}) {
|
|
41
|
+
const resolved = resolveInstallOptions(options);
|
|
42
|
+
return getSelectedPlatformDirs(resolved).map((dir) => join(dir, skillName, '.skill-metadata.json'));
|
|
19
43
|
}
|
|
20
44
|
export const IS_WINDOWS = platform() === 'win32';
|
|
21
45
|
//# sourceMappingURL=config.js.map
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,YAAY,GACvB,mFAAmF,CAAC;AAEtF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,YAAY,qBAAqB,CAAC;AAEvE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/installer.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type InstallOptions } from './config.js';
|
|
2
|
+
export declare function installSkill(skillName: string, skillContent: string, options?: InstallOptions): Promise<string[]>;
|
|
2
3
|
export declare function removeSkill(skillName: string): Promise<string[]>;
|
|
3
4
|
export declare function skillExists(skillName: string): Promise<boolean>;
|
|
4
5
|
export declare function readSkill(skillName: string): Promise<string | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+C,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAI/F,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CA4CnB;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBtE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAarE;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYzE"}
|
package/dist/core/installer.js
CHANGED
|
@@ -3,9 +3,9 @@ import { dirname } from 'path';
|
|
|
3
3
|
import { getSkillInstallPaths, getSkillMetadataPaths } from './config.js';
|
|
4
4
|
import { sha256 } from '../utils/hash.js';
|
|
5
5
|
import { info, warn } from '../utils/logger.js';
|
|
6
|
-
export async function installSkill(skillName, skillContent) {
|
|
7
|
-
const installPaths = getSkillInstallPaths(skillName);
|
|
8
|
-
const metadataPaths = getSkillMetadataPaths(skillName);
|
|
6
|
+
export async function installSkill(skillName, skillContent, options = {}) {
|
|
7
|
+
const installPaths = getSkillInstallPaths(skillName, options);
|
|
8
|
+
const metadataPaths = getSkillMetadataPaths(skillName, options);
|
|
9
9
|
const installedPaths = [];
|
|
10
10
|
const installedMetadataPaths = [];
|
|
11
11
|
const hash = sha256(skillContent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1C"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { install } from './commands/install.js';
|
|
1
|
+
import { install, parseInstallFlags, resolveInstallOptionsFromFlags } from './commands/install.js';
|
|
2
2
|
import { remove } from './commands/remove.js';
|
|
3
3
|
import { list } from './commands/list.js';
|
|
4
4
|
import { update } from './commands/update.js';
|
|
@@ -14,7 +14,9 @@ export async function main() {
|
|
|
14
14
|
try {
|
|
15
15
|
if (command === 'install' && args.length >= 2) {
|
|
16
16
|
const skill = args[1];
|
|
17
|
-
const
|
|
17
|
+
const flags = parseInstallFlags(args.slice(2));
|
|
18
|
+
const options = await resolveInstallOptionsFromFlags(flags, true);
|
|
19
|
+
const success = await install(skill, options);
|
|
18
20
|
process.exit(success ? 0 : 1);
|
|
19
21
|
}
|
|
20
22
|
else if (command === 'remove' && args.length >= 2) {
|
|
@@ -44,7 +46,9 @@ export async function main() {
|
|
|
44
46
|
}
|
|
45
47
|
else if (!command.startsWith('-')) {
|
|
46
48
|
// Default behavior: treat first arg as skill name to install
|
|
47
|
-
const
|
|
49
|
+
const flags = parseInstallFlags(args.slice(1));
|
|
50
|
+
const options = await resolveInstallOptionsFromFlags(flags, true);
|
|
51
|
+
const success = await install(command, options);
|
|
48
52
|
process.exit(success ? 0 : 1);
|
|
49
53
|
}
|
|
50
54
|
else {
|
|
@@ -57,27 +61,35 @@ export async function main() {
|
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
63
|
function showHelp() {
|
|
60
|
-
info(`
|
|
61
|
-
AI Skills CLI - Install framework-agnostic SKILLS.md files
|
|
62
|
-
|
|
63
|
-
Usage:
|
|
64
|
-
ai-skills <skill> Install a skill
|
|
65
|
-
ai-skills install <skill> Install a skill
|
|
66
|
-
ai-skills list [--json] List installed and available skills
|
|
67
|
-
ai-skills remove <skill> Remove an installed skill
|
|
68
|
-
ai-skills update [--force] Update all installed skills
|
|
69
|
-
[--skill <name>] Update a specific skill
|
|
70
|
-
ai-skills generate-local [skill] Run local backend generator
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
ai-skills
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
ai-skills
|
|
80
|
-
ai-skills
|
|
64
|
+
info(`
|
|
65
|
+
AI Skills CLI - Install framework-agnostic SKILLS.md files
|
|
66
|
+
|
|
67
|
+
Usage:
|
|
68
|
+
ai-skills <skill> [options] Install a skill
|
|
69
|
+
ai-skills install <skill> [options] Install a skill
|
|
70
|
+
ai-skills list [--json] List installed and available skills
|
|
71
|
+
ai-skills remove <skill> Remove an installed skill
|
|
72
|
+
ai-skills update [--force] Update all installed skills
|
|
73
|
+
[--skill <name>] Update a specific skill
|
|
74
|
+
ai-skills generate-local [skill] Run local backend generator
|
|
75
|
+
|
|
76
|
+
Install options:
|
|
77
|
+
--local Install in current project (.ai-skills/skills)
|
|
78
|
+
--global Install in home agent folders
|
|
79
|
+
--all Install to all global platforms
|
|
80
|
+
--platform <a,b,c> Install to selected global platforms
|
|
81
|
+
|
|
82
|
+
Examples:
|
|
83
|
+
ai-skills react
|
|
84
|
+
ai-skills react --local
|
|
85
|
+
ai-skills react --platform claude,gemini,opencode,vscode,codex,agents
|
|
86
|
+
ai-skills install typescript
|
|
87
|
+
ai-skills list
|
|
88
|
+
ai-skills remove python
|
|
89
|
+
ai-skills update --force
|
|
90
|
+
ai-skills update --skill react
|
|
91
|
+
ai-skills generate-local
|
|
92
|
+
ai-skills generate-local react
|
|
81
93
|
`);
|
|
82
94
|
}
|
|
83
95
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emmraan/ai-skills",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "CLI tool for installing AI Skills across agent platforms",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,10 +23,8 @@
|
|
|
23
23
|
"typecheck": "tsc --noEmit --project tsconfig.json",
|
|
24
24
|
"clean": "rm -rf dist"
|
|
25
25
|
},
|
|
26
|
-
"dependencies": {
|
|
27
|
-
"@ai-skills/shared-types": "^0.0.1"
|
|
28
|
-
},
|
|
29
26
|
"devDependencies": {
|
|
27
|
+
"@ai-skills/shared-types": "workspace:*",
|
|
30
28
|
"@types/node": "^20.10.0",
|
|
31
29
|
"tsx": "^4.7.0",
|
|
32
30
|
"vitest": "^1.1.0"
|
package/src/commands/install.ts
CHANGED
|
@@ -1,17 +1,143 @@
|
|
|
1
1
|
import { fetchSkill, fetchRegistryIndex } from '../core/downloader.js';
|
|
2
2
|
import { installSkill } from '../core/installer.js';
|
|
3
3
|
import { addSkillToLockfile } from '../core/lockfile.js';
|
|
4
|
+
import { AGENT_PLATFORMS, type InstallOptions, type InstallLocation } from '../core/config.js';
|
|
4
5
|
import { sha256 } from '../utils/hash.js';
|
|
5
6
|
import { error, success, info } from '../utils/logger.js';
|
|
7
|
+
import { createInterface } from 'readline/promises';
|
|
8
|
+
import { stdin as input, stdout as output } from 'process';
|
|
6
9
|
|
|
7
|
-
export
|
|
10
|
+
export interface CliInstallFlags {
|
|
11
|
+
local?: boolean;
|
|
12
|
+
global?: boolean;
|
|
13
|
+
all?: boolean;
|
|
14
|
+
platforms?: string[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function parseInstallFlags(args: string[]): CliInstallFlags {
|
|
18
|
+
const flags: CliInstallFlags = {};
|
|
19
|
+
|
|
20
|
+
for (let i = 0; i < args.length; i++) {
|
|
21
|
+
const arg = args[i];
|
|
22
|
+
if (arg === '--local') {
|
|
23
|
+
flags.local = true;
|
|
24
|
+
} else if (arg === '--global') {
|
|
25
|
+
flags.global = true;
|
|
26
|
+
} else if (arg === '--all') {
|
|
27
|
+
flags.all = true;
|
|
28
|
+
} else if (arg === '--platform') {
|
|
29
|
+
const value = args[i + 1];
|
|
30
|
+
if (!value || value.startsWith('--')) {
|
|
31
|
+
throw new Error('Missing value for --platform. Example: --platform claude,gemini');
|
|
32
|
+
}
|
|
33
|
+
i++;
|
|
34
|
+
const parsed = value
|
|
35
|
+
.split(',')
|
|
36
|
+
.map((p) => p.trim())
|
|
37
|
+
.filter(Boolean);
|
|
38
|
+
flags.platforms = [...(flags.platforms ?? []), ...parsed];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return flags;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function resolveInstallOptionsFromFlags(
|
|
46
|
+
flags: CliInstallFlags,
|
|
47
|
+
interactive: boolean
|
|
48
|
+
): Promise<InstallOptions> {
|
|
49
|
+
if (flags.local && flags.global) {
|
|
50
|
+
throw new Error('Use only one of --local or --global');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const hasAnyFlag = Boolean(
|
|
54
|
+
flags.local || flags.global || flags.all || (flags.platforms ?? []).length
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
if (flags.local) {
|
|
58
|
+
return {
|
|
59
|
+
location: 'local',
|
|
60
|
+
all: flags.all || !flags.platforms || flags.platforms.length === 0,
|
|
61
|
+
platforms: flags.platforms,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (flags.global) {
|
|
66
|
+
return {
|
|
67
|
+
location: 'global',
|
|
68
|
+
all: flags.all || !flags.platforms || flags.platforms.length === 0,
|
|
69
|
+
platforms: flags.platforms,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if ((flags.platforms ?? []).length > 0 || flags.all) {
|
|
74
|
+
return {
|
|
75
|
+
location: 'global',
|
|
76
|
+
all: flags.all,
|
|
77
|
+
platforms: flags.platforms,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!hasAnyFlag) {
|
|
82
|
+
if (interactive && input.isTTY && output.isTTY) {
|
|
83
|
+
return promptInstallOptions();
|
|
84
|
+
}
|
|
85
|
+
return { location: 'global', all: true };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return { location: 'global', all: true };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function promptInstallOptions(): Promise<InstallOptions> {
|
|
92
|
+
const rl = createInterface({ input, output });
|
|
93
|
+
try {
|
|
94
|
+
const locationAnswer = (
|
|
95
|
+
await rl.question(
|
|
96
|
+
'Install location? [1] Local (current project) [2] Global (agent platforms) (default: 2): '
|
|
97
|
+
)
|
|
98
|
+
).trim();
|
|
99
|
+
|
|
100
|
+
const location: InstallLocation = locationAnswer === '1' ? 'local' : 'global';
|
|
101
|
+
if (location === 'local') {
|
|
102
|
+
return { location: 'local' };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const platformAnswer = (
|
|
106
|
+
await rl.question(
|
|
107
|
+
'Global install target? [1] All platforms [2] Specific platforms (default: 1): '
|
|
108
|
+
)
|
|
109
|
+
).trim();
|
|
110
|
+
|
|
111
|
+
if (platformAnswer !== '2') {
|
|
112
|
+
return { location: 'global', all: true };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
info(`Available platforms: ${AGENT_PLATFORMS.map((p) => p.replace(/^\./, '')).join(', ')}`);
|
|
116
|
+
const selected = (
|
|
117
|
+
await rl.question('Enter comma-separated platform names (example: claude,gemini,vscode): ')
|
|
118
|
+
)
|
|
119
|
+
.split(',')
|
|
120
|
+
.map((p) => p.trim())
|
|
121
|
+
.filter(Boolean);
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
location: 'global',
|
|
125
|
+
all: selected.length === 0,
|
|
126
|
+
platforms: selected,
|
|
127
|
+
};
|
|
128
|
+
} finally {
|
|
129
|
+
rl.close();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export async function install(skillName: string, options: InstallOptions = {}): Promise<boolean> {
|
|
8
134
|
try {
|
|
9
135
|
info(`Fetching ${skillName}...`);
|
|
10
136
|
const skillContent = await fetchSkill(skillName);
|
|
11
137
|
const hash = sha256(skillContent);
|
|
12
138
|
|
|
13
139
|
info(`Installing ${skillName}...`);
|
|
14
|
-
const installPaths = await installSkill(skillName, skillContent);
|
|
140
|
+
const installPaths = await installSkill(skillName, skillContent, options);
|
|
15
141
|
|
|
16
142
|
if (installPaths.length === 0) {
|
|
17
143
|
error(`Failed to install ${skillName} to any location`);
|
package/src/core/config.ts
CHANGED
|
@@ -8,22 +8,68 @@ export const REGISTRY_INDEX_URL = `${REGISTRY_URL}/skills/.index.json`;
|
|
|
8
8
|
|
|
9
9
|
export const AGENT_PLATFORMS = ['.claude', '.gemini', '.vscode', '.opencode', '.codex', '.agents'];
|
|
10
10
|
|
|
11
|
+
export type InstallLocation = 'local' | 'global';
|
|
12
|
+
|
|
13
|
+
export interface InstallOptions {
|
|
14
|
+
location?: InstallLocation;
|
|
15
|
+
platforms?: string[];
|
|
16
|
+
all?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ResolvedInstallOptions {
|
|
20
|
+
location: InstallLocation;
|
|
21
|
+
platforms: string[];
|
|
22
|
+
}
|
|
23
|
+
|
|
11
24
|
export function getAgentPlatformDirs(): string[] {
|
|
12
25
|
const home = homedir();
|
|
13
26
|
return AGENT_PLATFORMS.map((p) => join(home, p, 'skills'));
|
|
14
27
|
}
|
|
15
28
|
|
|
29
|
+
export function resolveInstallOptions(options: InstallOptions = {}): ResolvedInstallOptions {
|
|
30
|
+
const location: InstallLocation = options.location ?? 'global';
|
|
31
|
+
|
|
32
|
+
const normalized = (options.platforms ?? []).map((p) => normalizePlatformName(p));
|
|
33
|
+
const unique = [...new Set(normalized)];
|
|
34
|
+
|
|
35
|
+
if (options.all || unique.length === 0) {
|
|
36
|
+
return { location, platforms: [...AGENT_PLATFORMS] };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for (const p of unique) {
|
|
40
|
+
if (!AGENT_PLATFORMS.includes(p)) {
|
|
41
|
+
throw new Error(`Unknown platform: ${p}. Supported: ${AGENT_PLATFORMS.join(', ')}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return { location, platforms: unique };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function normalizePlatformName(name: string): string {
|
|
49
|
+
const trimmed = name.trim();
|
|
50
|
+
return trimmed.startsWith('.') ? trimmed : `.${trimmed}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function getSelectedPlatformDirs(resolved: ResolvedInstallOptions): string[] {
|
|
54
|
+
const baseDir = resolved.location === 'local' ? process.cwd() : homedir();
|
|
55
|
+
return resolved.platforms.map((p) => join(baseDir, p, 'skills'));
|
|
56
|
+
}
|
|
57
|
+
|
|
16
58
|
export function getLockfilePath(): string {
|
|
17
59
|
const home = homedir();
|
|
18
60
|
return join(home, '.ai-skills', '.skill-lock.json');
|
|
19
61
|
}
|
|
20
62
|
|
|
21
|
-
export function getSkillInstallPaths(skillName: string): string[] {
|
|
22
|
-
|
|
63
|
+
export function getSkillInstallPaths(skillName: string, options: InstallOptions = {}): string[] {
|
|
64
|
+
const resolved = resolveInstallOptions(options);
|
|
65
|
+
return getSelectedPlatformDirs(resolved).map((dir) => join(dir, skillName, 'SKILLS.md'));
|
|
23
66
|
}
|
|
24
67
|
|
|
25
|
-
export function getSkillMetadataPaths(skillName: string): string[] {
|
|
26
|
-
|
|
68
|
+
export function getSkillMetadataPaths(skillName: string, options: InstallOptions = {}): string[] {
|
|
69
|
+
const resolved = resolveInstallOptions(options);
|
|
70
|
+
return getSelectedPlatformDirs(resolved).map((dir) =>
|
|
71
|
+
join(dir, skillName, '.skill-metadata.json')
|
|
72
|
+
);
|
|
27
73
|
}
|
|
28
74
|
|
|
29
75
|
export const IS_WINDOWS = platform() === 'win32';
|
package/src/core/installer.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { writeFile, mkdir, readFile, rm } from 'fs/promises';
|
|
2
2
|
import { dirname } from 'path';
|
|
3
|
-
import { getSkillInstallPaths, getSkillMetadataPaths } from './config.js';
|
|
3
|
+
import { getSkillInstallPaths, getSkillMetadataPaths, type InstallOptions } from './config.js';
|
|
4
4
|
import { sha256 } from '../utils/hash.js';
|
|
5
5
|
import { info, warn } from '../utils/logger.js';
|
|
6
6
|
|
|
7
|
-
export async function installSkill(
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
export async function installSkill(
|
|
8
|
+
skillName: string,
|
|
9
|
+
skillContent: string,
|
|
10
|
+
options: InstallOptions = {}
|
|
11
|
+
): Promise<string[]> {
|
|
12
|
+
const installPaths = getSkillInstallPaths(skillName, options);
|
|
13
|
+
const metadataPaths = getSkillMetadataPaths(skillName, options);
|
|
10
14
|
const installedPaths: string[] = [];
|
|
11
15
|
const installedMetadataPaths: string[] = [];
|
|
12
16
|
const hash = sha256(skillContent);
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { install } from './commands/install.js';
|
|
1
|
+
import { install, parseInstallFlags, resolveInstallOptionsFromFlags } from './commands/install.js';
|
|
2
2
|
import { remove } from './commands/remove.js';
|
|
3
3
|
import { list } from './commands/list.js';
|
|
4
4
|
import { update } from './commands/update.js';
|
|
@@ -18,7 +18,9 @@ export async function main(): Promise<void> {
|
|
|
18
18
|
try {
|
|
19
19
|
if (command === 'install' && args.length >= 2) {
|
|
20
20
|
const skill = args[1];
|
|
21
|
-
const
|
|
21
|
+
const flags = parseInstallFlags(args.slice(2));
|
|
22
|
+
const options = await resolveInstallOptionsFromFlags(flags, true);
|
|
23
|
+
const success = await install(skill, options);
|
|
22
24
|
process.exit(success ? 0 : 1);
|
|
23
25
|
} else if (command === 'remove' && args.length >= 2) {
|
|
24
26
|
const skill = args[1];
|
|
@@ -43,7 +45,9 @@ export async function main(): Promise<void> {
|
|
|
43
45
|
process.exit(success ? 0 : 1);
|
|
44
46
|
} else if (!command.startsWith('-')) {
|
|
45
47
|
// Default behavior: treat first arg as skill name to install
|
|
46
|
-
const
|
|
48
|
+
const flags = parseInstallFlags(args.slice(1));
|
|
49
|
+
const options = await resolveInstallOptionsFromFlags(flags, true);
|
|
50
|
+
const success = await install(command, options);
|
|
47
51
|
process.exit(success ? 0 : 1);
|
|
48
52
|
} else {
|
|
49
53
|
showHelp();
|
|
@@ -59,16 +63,24 @@ function showHelp() {
|
|
|
59
63
|
AI Skills CLI - Install framework-agnostic SKILLS.md files
|
|
60
64
|
|
|
61
65
|
Usage:
|
|
62
|
-
ai-skills <skill> Install a skill
|
|
63
|
-
ai-skills install <skill> Install a skill
|
|
66
|
+
ai-skills <skill> [options] Install a skill
|
|
67
|
+
ai-skills install <skill> [options] Install a skill
|
|
64
68
|
ai-skills list [--json] List installed and available skills
|
|
65
69
|
ai-skills remove <skill> Remove an installed skill
|
|
66
70
|
ai-skills update [--force] Update all installed skills
|
|
67
71
|
[--skill <name>] Update a specific skill
|
|
68
72
|
ai-skills generate-local [skill] Run local backend generator
|
|
69
73
|
|
|
74
|
+
Install options:
|
|
75
|
+
--local Install in current project (.ai-skills/skills)
|
|
76
|
+
--global Install in home agent folders
|
|
77
|
+
--all Install to all global platforms
|
|
78
|
+
--platform <a,b,c> Install to selected global platforms
|
|
79
|
+
|
|
70
80
|
Examples:
|
|
71
81
|
ai-skills react
|
|
82
|
+
ai-skills react --local
|
|
83
|
+
ai-skills react --platform claude,gemini,opencode,vscode,codex,agents
|
|
72
84
|
ai-skills install typescript
|
|
73
85
|
ai-skills list
|
|
74
86
|
ai-skills remove python
|