@emmraan/ai-skills 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.eslintrc.cjs +21 -0
  2. package/README.md +1 -12
  3. package/dist/commands/generate-local.d.ts.map +1 -1
  4. package/dist/commands/generate-local.js +18 -3
  5. package/dist/commands/generate-local.js.map +1 -1
  6. package/dist/commands/install.d.ts.map +1 -1
  7. package/dist/commands/install.js +18 -3
  8. package/dist/commands/install.js.map +1 -1
  9. package/dist/commands/list.d.ts.map +1 -1
  10. package/dist/commands/list.js +57 -11
  11. package/dist/commands/list.js.map +1 -1
  12. package/dist/commands/remove.d.ts.map +1 -1
  13. package/dist/commands/remove.js +32 -2
  14. package/dist/commands/remove.js.map +1 -1
  15. package/dist/commands/search.d.ts +8 -0
  16. package/dist/commands/search.d.ts.map +1 -0
  17. package/dist/commands/search.js +69 -0
  18. package/dist/commands/search.js.map +1 -0
  19. package/dist/commands/update.d.ts.map +1 -1
  20. package/dist/commands/update.js +49 -8
  21. package/dist/commands/update.js.map +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +20 -5
  24. package/dist/index.js.map +1 -1
  25. package/dist/utils/logger.d.ts +7 -0
  26. package/dist/utils/logger.d.ts.map +1 -1
  27. package/dist/utils/logger.js +39 -3
  28. package/dist/utils/logger.js.map +1 -1
  29. package/dist/utils/ui.d.ts +13 -0
  30. package/dist/utils/ui.d.ts.map +1 -1
  31. package/dist/utils/ui.js +101 -8
  32. package/dist/utils/ui.js.map +1 -1
  33. package/package.json +6 -4
  34. package/src/commands/generate-local.ts +18 -3
  35. package/src/commands/install.ts +21 -3
  36. package/src/commands/list.ts +80 -11
  37. package/src/commands/remove.ts +36 -2
  38. package/src/commands/search.ts +94 -0
  39. package/src/commands/update.ts +54 -10
  40. package/src/index.ts +19 -5
  41. package/src/utils/logger.ts +46 -3
  42. package/src/utils/ui.ts +192 -57
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { remove, parseRemoveFlags, resolveRemoveOptionsFromFlags } from './comma
3
3
  import { list } from './commands/list.js';
4
4
  import { update } from './commands/update.js';
5
5
  import { generateLocal } from './commands/generate-local.js';
6
+ import { search, parseSearchFlags } from './commands/search.js';
6
7
  import { error, info } from './utils/logger.js';
7
8
  import { ui } from './utils/ui.js';
8
9
  const args = process.argv.slice(2);
@@ -33,6 +34,12 @@ export async function main() {
33
34
  await list(jsonFlag);
34
35
  process.exit(0);
35
36
  }
37
+ else if (command === 'search' && args.length >= 2) {
38
+ const query = args[1];
39
+ const flags = parseSearchFlags(args.slice(2));
40
+ await search(query, flags);
41
+ process.exit(0);
42
+ }
36
43
  else if (command === 'update') {
37
44
  const forceFlag = args.includes('--force');
38
45
  let skillArg;
@@ -71,11 +78,12 @@ AI Skills CLI - Install framework-agnostic SKILLS.md files
71
78
  Usage:
72
79
  ai-skills <skill> [options] Install a skill
73
80
  ai-skills install <skill> [options] Install a skill
74
- ai-skills list [--json] List installed and available skills
75
- ai-skills remove <skill> [options] Remove an installed skill
76
- ai-skills update [--force] Update all installed skills
77
- [--skill <name>] Update a specific skill
78
- ai-skills generate-local [skill] Run local backend generator
81
+ ai-skills list [--json] List installed and available skills
82
+ ai-skills search <query> [options] Search for skills
83
+ ai-skills remove <skill> [options] Remove an installed skill
84
+ ai-skills update [--force] Update all installed skills
85
+ [--skill <name>] Update a specific skill
86
+ ai-skills generate-local [skill] Run local backend generator
79
87
 
80
88
  Install options:
81
89
  --local Install in current project (.ai-skills/skills)
@@ -89,12 +97,19 @@ Remove options:
89
97
  --all Remove from all platforms for selected scope
90
98
  --platform <a,b,c> Remove from selected platforms for selected scope
91
99
 
100
+ Search options:
101
+ --domain <name> Filter results by domain
102
+ --json Output results as JSON
103
+
92
104
  Examples:
93
105
  ai-skills react
94
106
  ai-skills react --local
95
107
  ai-skills react --platform claude,gemini,opencode,vscode,codex,agents
96
108
  ai-skills install typescript
97
109
  ai-skills list
110
+ ai-skills search react
111
+ ai-skills search "testing" --domain frontend
112
+ ai-skills search python --json
98
113
  ai-skills remove python
99
114
  ai-skills update --force
100
115
  ai-skills update --skill react
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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"}
@@ -3,4 +3,11 @@ export declare function info(message: string): void;
3
3
  export declare function success(message: string): void;
4
4
  export declare function error(message: string): void;
5
5
  export declare function warn(message: string): void;
6
+ export declare function debug(message: string): void;
7
+ export declare function divider(): void;
8
+ export declare function section(title: string): void;
9
+ export declare function highlight(message: string): void;
10
+ export declare function badge(label: string, content: string): void;
11
+ export declare function card(title: string, content: string[]): void;
12
+ export declare function progressBar(label: string, current: number, total: number): void;
6
13
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAIA,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,QAElC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,QAEnC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,QAEtC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,QAEpC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,QAEnC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,QAElC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,QAEnC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,QAEtC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,QAEpC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,QAEnC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,QAIpC;AAED,wBAAgB,OAAO,SAEtB;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,QAIpC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,QAExC;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAEnD;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAQpD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAMxE"}
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable no-console */
2
2
  import chalk from 'chalk';
3
+ import pc from 'picocolors';
3
4
  export function log(message) {
4
5
  console.log(message);
5
6
  }
@@ -7,12 +8,47 @@ export function info(message) {
7
8
  console.log(`${chalk.cyan('ℹ')} ${chalk.gray(message)}`);
8
9
  }
9
10
  export function success(message) {
10
- console.log(`${chalk.green('✓')} ${chalk.green(message)}`);
11
+ console.log(`${pc.green('✓')} ${chalk.green(message)}`);
11
12
  }
12
13
  export function error(message) {
13
- console.error(`${chalk.red('✗')} ${chalk.red(message)}`);
14
+ console.error(`${pc.red('✗')} ${chalk.red(message)}`);
14
15
  }
15
16
  export function warn(message) {
16
- console.warn(`${chalk.yellow('⚠')} ${chalk.yellow(message)}`);
17
+ console.warn(`${pc.yellow('⚠')} ${chalk.yellow(message)}`);
18
+ }
19
+ export function debug(message) {
20
+ if (process.env.DEBUG) {
21
+ console.log(`${chalk.gray('→')} ${chalk.gray(message)}`);
22
+ }
23
+ }
24
+ export function divider() {
25
+ console.log(pc.gray('─'.repeat(60)));
26
+ }
27
+ export function section(title) {
28
+ console.log('');
29
+ console.log(chalk.bold.cyan(`► ${title}`));
30
+ console.log(pc.gray('─'.repeat(title.length + 2)));
31
+ }
32
+ export function highlight(message) {
33
+ console.log(chalk.bold.cyan(message));
34
+ }
35
+ export function badge(label, content) {
36
+ console.log(`${chalk.bgCyan.black(` ${label} `)} ${pc.cyan(content)}`);
37
+ }
38
+ export function card(title, content) {
39
+ console.log('');
40
+ console.log(chalk.bold.cyan(`┌─ ${title}`));
41
+ content.forEach((line) => {
42
+ console.log(chalk.cyan('│') + ` ${line}`);
43
+ });
44
+ console.log(chalk.cyan('└' + '─'.repeat(title.length + 3)));
45
+ console.log('');
46
+ }
47
+ export function progressBar(label, current, total) {
48
+ const percentage = Math.round((current / total) * 100);
49
+ const filled = Math.floor((percentage / 100) * 20);
50
+ const empty = 20 - filled;
51
+ const bar = `${pc.green('█'.repeat(filled))}${pc.gray('░'.repeat(empty))}`;
52
+ console.log(`${label}: [${bar}] ${pc.cyan(`${percentage}%`)}`);
17
53
  }
18
54
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  export declare const ui: {
2
2
  bannerShown: boolean;
3
3
  printBanner(): void;
4
+ printSection(title: string): void;
5
+ printDivider(char?: string): void;
6
+ printBox(content: string[], title?: string): void;
4
7
  startSpinner(text: string): void;
5
8
  stopSpinnerSuccess(text?: string): void;
6
9
  stopSpinnerFail(text?: string): void;
7
10
  stopSpinner(): void;
11
+ updateSpinner(text: string): void;
12
+ printTable(rows: Array<string[]>, headers?: string[]): void;
13
+ printSummary(items: Array<{
14
+ label: string;
15
+ value: string | number;
16
+ }>): void;
17
+ printSuccess(message: string): void;
18
+ printError(message: string): void;
19
+ printWarning(message: string): void;
20
+ printInfo(message: string): void;
8
21
  };
9
22
  //# sourceMappingURL=ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,EAAE;;mBAGE,IAAI;uBAYA,MAAM,GAAG,IAAI;8BAWN,MAAM,GAAG,IAAI;2BAQhB,MAAM,GAAG,IAAI;mBAQrB,IAAI;CAOpB,CAAC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,EAAE;;mBAGE,IAAI;wBAmCC,MAAM,GAAG,IAAI;wBAMd,MAAM,GAAS,IAAI;sBAIpB,MAAM,EAAE,UAAU,MAAM,GAAG,IAAI;uBAkC9B,MAAM,GAAG,IAAI;8BAcN,MAAM,GAAG,IAAI;2BAQhB,MAAM,GAAG,IAAI;mBAQrB,IAAI;wBAQC,MAAM,GAAG,IAAI;qBAMhB,KAAK,CAAC,MAAM,EAAE,CAAC,YAAY,MAAM,EAAE,GAAG,IAAI;wBAsBvC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;0BAUrD,MAAM,GAAG,IAAI;wBAIf,MAAM,GAAG,IAAI;0BAIX,MAAM,GAAG,IAAI;uBAIhB,MAAM,GAAG,IAAI;CAGjC,CAAC"}
package/dist/utils/ui.js CHANGED
@@ -1,19 +1,66 @@
1
1
  import chalk from 'chalk';
2
+ import pc from 'picocolors';
2
3
  import ora from 'ora';
3
- import { info } from '../utils/logger.js';
4
+ import { log } from '../utils/logger.js';
4
5
  let activeSpinner = null;
6
+ const BOX_CHARS = {
7
+ TOP_LEFT: '╭',
8
+ TOP_RIGHT: '╮',
9
+ BOTTOM_LEFT: '╰',
10
+ BOTTOM_RIGHT: '╯',
11
+ HORIZONTAL: '─',
12
+ VERTICAL: '│',
13
+ T_DOWN: '┬',
14
+ T_UP: '┴',
15
+ };
5
16
  export const ui = {
6
17
  bannerShown: false,
7
18
  printBanner() {
8
19
  if (this.bannerShown || !process.stdout.isTTY) {
9
20
  return;
10
21
  }
11
- const title = chalk.bold.cyan('AI Skills CLI');
12
- const subtitle = chalk.gray('Install framework-agnostic SKILLS.md files');
13
- // Subtle, single-line banner to keep npx output concise
14
- info(`${title} ${chalk.gray('')} ${subtitle}`);
22
+ const title = 'AI Skills CLI';
23
+ const subtitle = 'Install framework-agnostic SKILLS.md files';
24
+ const width = Math.max(title.length, subtitle.length) + 6;
25
+ log('');
26
+ log(pc.cyan(`${BOX_CHARS.TOP_LEFT}${BOX_CHARS.HORIZONTAL.repeat(width - 2)}${BOX_CHARS.TOP_RIGHT}`));
27
+ log(pc.cyan(`${BOX_CHARS.VERTICAL}`) +
28
+ ` ${chalk.bold.cyan(title)}${' '.repeat(width - 3 - title.length)}` +
29
+ pc.cyan(`${BOX_CHARS.VERTICAL}`));
30
+ log(pc.cyan(`${BOX_CHARS.VERTICAL}`) +
31
+ ` ${pc.gray(subtitle)}${' '.repeat(width - 3 - subtitle.length)}` +
32
+ pc.cyan(`${BOX_CHARS.VERTICAL}`));
33
+ log(pc.cyan(`${BOX_CHARS.BOTTOM_LEFT}${BOX_CHARS.HORIZONTAL.repeat(width - 2)}${BOX_CHARS.BOTTOM_RIGHT}`));
34
+ log('');
15
35
  this.bannerShown = true;
16
36
  },
37
+ printSection(title) {
38
+ log('');
39
+ log(chalk.bold.cyan(`${BOX_CHARS.VERTICAL} ${title}`));
40
+ log(chalk.cyan(`${BOX_CHARS.VERTICAL}${BOX_CHARS.HORIZONTAL.repeat(title.length + 2)}`));
41
+ },
42
+ printDivider(char = '─') {
43
+ log(chalk.gray(char.repeat(60)));
44
+ },
45
+ printBox(content, title) {
46
+ // eslint-disable-next-line no-control-regex
47
+ const maxLength = Math.max(
48
+ // eslint-disable-next-line no-control-regex
49
+ ...content.map((line) => line.replace(/\u001b\[[0-9;]*m/g, '').length));
50
+ const width = Math.min(maxLength + 4, 70);
51
+ if (title) {
52
+ log(chalk.cyan(`${BOX_CHARS.TOP_LEFT}${BOX_CHARS.HORIZONTAL.repeat(width - 2)}${BOX_CHARS.TOP_RIGHT}`));
53
+ }
54
+ content.forEach((line) => {
55
+ // eslint-disable-next-line no-control-regex
56
+ const padding = width - 4 - line.replace(/\u001b\[[0-9;]*m/g, '').length;
57
+ log(chalk.cyan(`${BOX_CHARS.VERTICAL} `) +
58
+ line +
59
+ ' '.repeat(Math.max(0, padding)) +
60
+ chalk.cyan(` ${BOX_CHARS.VERTICAL}`));
61
+ });
62
+ log(chalk.cyan(`${BOX_CHARS.BOTTOM_LEFT}${BOX_CHARS.HORIZONTAL.repeat(width - 2)}${BOX_CHARS.BOTTOM_RIGHT}`));
63
+ },
17
64
  startSpinner(text) {
18
65
  if (!process.stdout.isTTY) {
19
66
  return;
@@ -21,20 +68,23 @@ export const ui = {
21
68
  if (activeSpinner) {
22
69
  activeSpinner.stop();
23
70
  }
24
- activeSpinner = ora({ text, spinner: 'dots' }).start();
71
+ activeSpinner = ora({
72
+ text: chalk.cyan(text),
73
+ spinner: 'dots2',
74
+ }).start();
25
75
  },
26
76
  stopSpinnerSuccess(text) {
27
77
  if (!activeSpinner) {
28
78
  return;
29
79
  }
30
- activeSpinner.succeed(text);
80
+ activeSpinner.succeed(chalk.green(text || 'Done'));
31
81
  activeSpinner = null;
32
82
  },
33
83
  stopSpinnerFail(text) {
34
84
  if (!activeSpinner) {
35
85
  return;
36
86
  }
37
- activeSpinner.fail(text);
87
+ activeSpinner.fail(chalk.red(text || 'Failed'));
38
88
  activeSpinner = null;
39
89
  },
40
90
  stopSpinner() {
@@ -44,5 +94,48 @@ export const ui = {
44
94
  activeSpinner.stop();
45
95
  activeSpinner = null;
46
96
  },
97
+ updateSpinner(text) {
98
+ if (activeSpinner) {
99
+ activeSpinner.text = chalk.cyan(text);
100
+ }
101
+ },
102
+ printTable(rows, headers) {
103
+ if (headers) {
104
+ const headerRow = headers.map((h) => chalk.bold.cyan(h));
105
+ const separators = headers.map((h) => chalk.gray('─'.repeat(Math.max(h.length, 15))));
106
+ const maxWidths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i]?.length || 0)));
107
+ log(headerRow.map((h, i) => h.padEnd(maxWidths[i])).join(' ' + chalk.gray('│') + ' '));
108
+ log(separators.join('─' + chalk.gray('┼') + '─'));
109
+ rows.forEach((row) => {
110
+ log(row.map((cell, i) => cell.padEnd(maxWidths[i])).join(' ' + chalk.gray('│') + ' '));
111
+ });
112
+ }
113
+ else {
114
+ rows.forEach((row) => {
115
+ log(' ' + row.join(' '));
116
+ });
117
+ }
118
+ },
119
+ printSummary(items) {
120
+ log('');
121
+ const maxLabelLength = Math.max(...items.map((i) => i.label.length));
122
+ items.forEach((item) => {
123
+ const paddedLabel = item.label.padEnd(maxLabelLength);
124
+ log(chalk.gray(` ${paddedLabel} `) + chalk.bold(String(item.value)));
125
+ });
126
+ log('');
127
+ },
128
+ printSuccess(message) {
129
+ log(chalk.green(`✓ ${message}`));
130
+ },
131
+ printError(message) {
132
+ log(chalk.red(`✗ ${message}`));
133
+ },
134
+ printWarning(message) {
135
+ log(chalk.yellow(`⚠ ${message}`));
136
+ },
137
+ printInfo(message) {
138
+ log(chalk.cyan(`ℹ ${message}`));
139
+ },
47
140
  };
48
141
  //# sourceMappingURL=ui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,IAAI,aAAa,GAAe,IAAI,CAAC;AAErC,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,WAAW,EAAE,KAAK;IAElB,WAAW;QACT,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1E,wDAAwD;QACxD,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QACD,aAAa,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACzD,CAAC;IAED,kBAAkB,CAAC,IAAa;QAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,eAAe,CAAC,IAAa;QAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,aAAa,CAAC,IAAI,EAAE,CAAC;QACrB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.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": "1.0.2",
3
+ "version": "1.2.0",
4
4
  "description": "CLI tool for installing AI Skills across agent platforms",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -28,19 +28,21 @@
28
28
  "build": "tsc --project tsconfig.json",
29
29
  "dev": "tsx src/bin/skills.ts",
30
30
  "test": "vitest run",
31
- "lint": "node -e \"process.exit(0)\"",
31
+ "lint": "eslint . --ext .ts,.js --config .eslintrc.cjs",
32
32
  "typecheck": "tsc --noEmit --project tsconfig.json",
33
33
  "clean": "rm -rf dist"
34
34
  },
35
35
  "dependencies": {
36
36
  "chalk": "^5.4.1",
37
37
  "inquirer": "^12.9.6",
38
- "ora": "^8.2.0"
38
+ "ora": "^8.2.0",
39
+ "picocolors": "^1.1.1"
39
40
  },
40
41
  "devDependencies": {
41
42
  "@ai-skills/shared-types": "workspace:*",
42
43
  "@types/node": "^20.10.0",
43
44
  "tsx": "^4.7.0",
44
- "vitest": "^1.1.0"
45
+ "vitest": "^1.1.0",
46
+ "eslint": "^8.45.0"
45
47
  }
46
48
  }
@@ -1,6 +1,7 @@
1
1
  import { spawn } from 'child_process';
2
2
  import { resolve } from 'path';
3
- import { error, info, success } from '../utils/logger.js';
3
+ import { error, info, section, highlight } from '../utils/logger.js';
4
+ import pc from 'picocolors';
4
5
 
5
6
  export async function generateLocal(skill?: string): Promise<boolean> {
6
7
  const backendDir = resolve(process.cwd(), 'backend');
@@ -11,7 +12,15 @@ export async function generateLocal(skill?: string): Promise<boolean> {
11
12
  args.push('--', '--skill', skill);
12
13
  }
13
14
 
14
- info(`Running local generator in ${backendDir}...`);
15
+ section(`Running Local Generator`);
16
+ // eslint-disable-next-line no-console
17
+ console.log('');
18
+ info(`Backend directory: ${pc.cyan(backendDir)}`);
19
+ if (skill) {
20
+ info(`Skill: ${pc.cyan(skill)}`);
21
+ }
22
+ // eslint-disable-next-line no-console
23
+ console.log('');
15
24
 
16
25
  return new Promise((resolvePromise) => {
17
26
  const child = spawn(command, args, {
@@ -26,11 +35,17 @@ export async function generateLocal(skill?: string): Promise<boolean> {
26
35
  });
27
36
 
28
37
  child.on('exit', (code) => {
38
+ // eslint-disable-next-line no-console
39
+ console.log('');
29
40
  if (code === 0) {
30
- success('Local generation completed successfully');
41
+ highlight('Local generation completed successfully');
42
+ // eslint-disable-next-line no-console
43
+ console.log('');
31
44
  resolvePromise(true);
32
45
  } else {
33
46
  error(`Local generation failed with exit code ${code ?? -1}`);
47
+ // eslint-disable-next-line no-console
48
+ console.log('');
34
49
  resolvePromise(false);
35
50
  }
36
51
  });
@@ -3,9 +3,11 @@ import { installSkill } from '../core/installer.js';
3
3
  import { addSkillToLockfile } from '../core/lockfile.js';
4
4
  import { AGENT_PLATFORMS, type InstallOptions, type InstallLocation } from '../core/config.js';
5
5
  import { sha256 } from '../utils/hash.js';
6
- import { error, success } from '../utils/logger.js';
6
+ import { error, highlight, section } from '../utils/logger.js';
7
7
  import inquirer from 'inquirer';
8
8
  import { ui } from '../utils/ui.js';
9
+ import chalk from 'chalk';
10
+ import pc from 'picocolors';
9
11
 
10
12
  export interface CliInstallFlags {
11
13
  local?: boolean;
@@ -145,6 +147,8 @@ async function promptInstallOptions(): Promise<InstallOptions> {
145
147
 
146
148
  export async function install(skillName: string, options: InstallOptions = {}): Promise<boolean> {
147
149
  try {
150
+ section(`Installing ${chalk.bold.cyan(skillName)}`);
151
+
148
152
  ui.startSpinner(`Fetching ${skillName}...`);
149
153
  const skillContent = await fetchSkill(skillName);
150
154
  ui.stopSpinnerSuccess(`Fetched ${skillName}`);
@@ -164,8 +168,22 @@ export async function install(skillName: string, options: InstallOptions = {}):
164
168
  const skillVersion = index.skills[skillName]?.version || 'unknown';
165
169
 
166
170
  await addSkillToLockfile(skillName, skillVersion, hash, installPaths);
167
- ui.stopSpinnerSuccess(`Updated lockfile for ${skillName}`);
168
- success(`Installed ${skillName} (${skillVersion}) to ${installPaths.length} location(s)`);
171
+ ui.stopSpinnerSuccess(`Updated lockfile`);
172
+
173
+ // eslint-disable-next-line no-console
174
+ console.log('');
175
+ highlight(`✨ Successfully installed ${skillName} (v${skillVersion})`);
176
+ // eslint-disable-next-line no-console
177
+ console.log('');
178
+ // eslint-disable-next-line no-console
179
+ console.log(pc.gray('Location summary:'));
180
+ installPaths.forEach((path) => {
181
+ // eslint-disable-next-line no-console
182
+ console.log(` ${pc.green('→')} ${pc.cyan(path)}`);
183
+ });
184
+ // eslint-disable-next-line no-console
185
+ console.log('');
186
+
169
187
  return true;
170
188
  } catch (err) {
171
189
  ui.stopSpinner();
@@ -1,6 +1,8 @@
1
1
  import { getAvailableSkills } from '../core/downloader.js';
2
2
  import { getInstalledSkills } from '../core/lockfile.js';
3
3
  import { log } from '../utils/logger.js';
4
+ import chalk from 'chalk';
5
+ import pc from 'picocolors';
4
6
 
5
7
  export async function list(json: boolean = false): Promise<void> {
6
8
  const installedSkills = await getInstalledSkills();
@@ -19,23 +21,90 @@ export async function list(json: boolean = false): Promise<void> {
19
21
  };
20
22
  log(JSON.stringify(output, null, 2));
21
23
  } else {
22
- log('\n📦 Installed Skills:');
23
- if (installed.length === 0) {
24
- log(' (none)');
25
- } else {
26
- installed.forEach((name) => {
27
- const entry = installedSkills.find((s) => s.name === name);
28
- log(` • ${name} (v${entry?.version || 'unknown'})`);
24
+ log('');
25
+
26
+ // Calculate max width needed
27
+ const maxSkillLength = Math.max(
28
+ ...installed.map((s) => s.length),
29
+ ...availableSkills.map((s) => s.length),
30
+ 10
31
+ );
32
+ const boxWidth = maxSkillLength + 20;
33
+
34
+ // Helper function to pad content to box width
35
+ const padLine = (content: string): string => {
36
+ // eslint-disable-next-line no-control-regex
37
+ const stripped = content.replace(
38
+ // eslint-disable-next-line no-control-regex
39
+ /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcm]/g,
40
+ ''
41
+ );
42
+ const strippedLength = stripped.length;
43
+ const padding = boxWidth - 2 - strippedLength;
44
+ return padding > 0 ? content + ' '.repeat(padding) : content;
45
+ };
46
+
47
+ // Calculate border dimensions
48
+ const titlePart = '─ AI Skills Status '; // 19 characters
49
+ const middleDashesCount = Math.max(boxWidth - titlePart.length - 2, 1);
50
+
51
+ // Top border with title - use enhanced picocolors
52
+ log(pc.cyan(`┌${titlePart}${pc.gray('─'.repeat(middleDashesCount))}┐`));
53
+
54
+ // Installed Skills Section
55
+ log(pc.cyan('│') + padLine('') + pc.cyan('│'));
56
+ log(pc.cyan('│') + padLine(' 📦 Installed Skills') + pc.cyan('│'));
57
+ log(
58
+ pc.cyan('│') + padLine(` ${pc.gray('─'.repeat(Math.max(boxWidth - 8, 1)))}`) + pc.cyan('│')
59
+ );
60
+
61
+ if (installed.length > 0) {
62
+ installedSkills.forEach((entry) => {
63
+ const version = chalk.gray(`v${entry.version}`);
64
+ const line = ` ${chalk.green('✓')} ${entry.name.padEnd(20)} ${version}`;
65
+ log(pc.cyan('│') + padLine(line) + pc.cyan('│'));
29
66
  });
67
+ } else {
68
+ log(pc.cyan('│') + padLine(' ' + chalk.gray('(none installed yet)')) + pc.cyan('│'));
30
69
  }
31
70
 
32
- log('\n🌐 Available Skills:');
71
+ // Available Skills Section
72
+ log(pc.cyan('│') + padLine('') + pc.cyan('│'));
73
+ log(pc.cyan('│') + padLine(' 🌐 Available Skills') + pc.cyan('│'));
74
+ log(
75
+ pc.cyan('│') + padLine(` ${pc.gray('─'.repeat(Math.max(boxWidth - 8, 1)))}`) + pc.cyan('│')
76
+ );
77
+
33
78
  availableSkills.forEach((name) => {
34
79
  const isInstalled = installed.includes(name);
35
- const status = isInstalled ? ' [installed]' : '';
36
- log(` ${name}${status}`);
80
+ const line = isInstalled
81
+ ? ` ${chalk.dim(name.padEnd(20))} ${chalk.gray('[installed]')}`
82
+ : ` ${chalk.yellow('○')} ${name}`;
83
+ log(pc.cyan('│') + padLine(line) + pc.cyan('│'));
37
84
  });
38
85
 
39
- log(`\nTotal: ${installed.length} installed, ${availableSkills.length} available\n`);
86
+ log(pc.cyan('│') + padLine('') + pc.cyan('│'));
87
+
88
+ // Bottom border
89
+ log(pc.cyan(`└${pc.gray('─'.repeat(boxWidth - 2))}┘`));
90
+ log('');
91
+
92
+ // Summary with enhanced visual style
93
+ const totalInstalled = installed.length;
94
+ const totalAvailable = availableSkills.length;
95
+ const notInstalled = totalAvailable - totalInstalled;
96
+
97
+ log(chalk.bold.cyan('─ Summary'));
98
+ log(` ${pc.green('✓')} Installed: ${chalk.bold(totalInstalled.toString())} skill(s)`);
99
+ log(` ${pc.yellow('○')} Available: ${chalk.bold(totalAvailable.toString())} skill(s)`);
100
+ log(` ${pc.cyan('➜')} Not installed: ${chalk.bold(notInstalled.toString())} skill(s)`);
101
+ log('');
102
+
103
+ if (notInstalled > 0) {
104
+ log(
105
+ pc.gray(`💡 Tip: Use ${chalk.cyan('npx @emmraan/ai-skills <skill>')} to install a skill`)
106
+ );
107
+ log('');
108
+ }
40
109
  }
41
110
  }