@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 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
- export declare function install(skillName: string): Promise<boolean>;
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":"AAMA,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBjE"}
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"}
@@ -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
- export async function install(skillName) {
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;AAE1D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAAiB;IAC7C,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,CAAC,CAAC;QAEjE,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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -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,CAEhE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED,eAAO,MAAM,UAAU,SAAyB,CAAC"}
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"}
@@ -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
- return getAgentPlatformDirs().map((dir) => join(dir, skillName, 'SKILLS.md'));
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
- return getAgentPlatformDirs().map((dir) => join(dir, skillName, '.skill-metadata.json'));
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
@@ -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;AAEnG,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,oBAAoB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,oBAAoB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- export declare function installSkill(skillName: string, skillContent: string): Promise<string[]>;
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":"AAMA,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4C7F;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"}
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"}
@@ -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":"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"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA6C1C"}
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 success = await install(skill);
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 success = await install(command);
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
- Examples:
73
- ai-skills react
74
- ai-skills install typescript
75
- ai-skills list
76
- ai-skills remove python
77
- ai-skills update --force
78
- ai-skills update --skill react
79
- ai-skills generate-local
80
- ai-skills generate-local react
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":"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"}
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.2",
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"
@@ -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 async function install(skillName: string): Promise<boolean> {
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`);
@@ -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
- return getAgentPlatformDirs().map((dir) => join(dir, skillName, 'SKILLS.md'));
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
- return getAgentPlatformDirs().map((dir) => join(dir, skillName, '.skill-metadata.json'));
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';
@@ -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(skillName: string, skillContent: string): Promise<string[]> {
8
- const installPaths = getSkillInstallPaths(skillName);
9
- const metadataPaths = getSkillMetadataPaths(skillName);
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 success = await install(skill);
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 success = await install(command);
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