transskill 0.2.8 → 0.3.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.
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Interactive search TUI — search and browse skills from the registry.
3
+ */
4
+ import { intro, outro, autocomplete, isCancel, log, spinner } from '@clack/prompts';
5
+ import chalk from 'chalk';
6
+ import { getRegistry, searchSkills } from './registry-client.js';
7
+ import { showSkillInfo } from './info.js';
8
+ const BRAND = chalk.cyan('◈ TransSkill Marketplace');
9
+ /**
10
+ * Format a skill manifest as an autocomplete option label.
11
+ */
12
+ function formatSkillOption(s) {
13
+ const stars = s.stars > 0 ? chalk.yellow(` ⭐${s.stars}`) : '';
14
+ const audit = s.auditScore >= 90
15
+ ? chalk.green(` ${s.auditScore}`)
16
+ : s.auditScore >= 70
17
+ ? chalk.yellow(` ${s.auditScore}`)
18
+ : chalk.red(` ${s.auditScore}`);
19
+ return `${chalk.bold(s.name)} ${chalk.gray(`v${s.version}`)}${stars}${audit} ${s.description}`;
20
+ }
21
+ /**
22
+ * Custom filter that matches name, description, and tags.
23
+ */
24
+ function skillFilter(search, option) {
25
+ if (!search)
26
+ return true;
27
+ const q = search.toLowerCase();
28
+ const s = option.value;
29
+ return (s.name.toLowerCase().includes(q) ||
30
+ s.description.toLowerCase().includes(q) ||
31
+ s.tags.some((t) => t.toLowerCase().includes(q)));
32
+ }
33
+ /**
34
+ * Show detailed info about a selected skill.
35
+ */
36
+ async function showAndOfferInstall(manifest) {
37
+ await showSkillInfo(manifest.name);
38
+ }
39
+ /**
40
+ * Launch interactive search TUI.
41
+ */
42
+ export async function interactiveSearch(options) {
43
+ const spin = spinner();
44
+ intro(BRAND);
45
+ // Step 1: Fetch registry
46
+ spin.start('Loading skill registry…');
47
+ let registry;
48
+ try {
49
+ registry = await getRegistry(options.refresh ?? false);
50
+ spin.stop(`Loaded ${registry.skills.length} skills from registry`);
51
+ }
52
+ catch (err) {
53
+ spin.stop('Failed to load registry');
54
+ const message = err instanceof Error ? err.message : String(err);
55
+ log.error(`Could not reach registry: ${message}`);
56
+ log.info('Check your internet connection or try `transskill info <name>` with a local cache.');
57
+ outro('Search cancelled');
58
+ process.exit(1);
59
+ }
60
+ // Step 2: Pre-filter by tag if specified
61
+ let skills = registry.skills;
62
+ if (options.tag) {
63
+ const tag = options.tag.toLowerCase();
64
+ skills = skills.filter((s) => s.tags.some((t) => t.toLowerCase() === tag));
65
+ if (skills.length === 0) {
66
+ log.warn(`No skills found with tag "${options.tag}"`);
67
+ outro('Search cancelled');
68
+ return;
69
+ }
70
+ log.info(`Filtered by tag: ${chalk.cyan(options.tag)} (${skills.length} skills)`);
71
+ }
72
+ // Step 3: Interactive autocomplete prompt
73
+ const result = await autocomplete({
74
+ message: 'Search skills (type to filter, ↑↓ to navigate, Enter to select):',
75
+ options: skills.map((s) => ({
76
+ value: s,
77
+ label: formatSkillOption(s),
78
+ hint: `v${s.version}`,
79
+ })),
80
+ initialUserInput: options.query ?? '',
81
+ filter: skillFilter,
82
+ maxItems: 10,
83
+ });
84
+ if (isCancel(result)) {
85
+ outro('Search cancelled');
86
+ return;
87
+ }
88
+ // Step 4: Show details for selected skill
89
+ const selected = result;
90
+ outro(`Selected ${chalk.bold(selected.name)} v${selected.version}`);
91
+ await showAndOfferInstall(selected);
92
+ }
93
+ /**
94
+ * Non-interactive search — output JSON.
95
+ */
96
+ export async function jsonSearch(options) {
97
+ let registry;
98
+ try {
99
+ registry = await getRegistry(options.refresh ?? false);
100
+ }
101
+ catch (err) {
102
+ const message = err instanceof Error ? err.message : String(err);
103
+ console.error(JSON.stringify({ error: message }, null, 2));
104
+ process.exit(1);
105
+ }
106
+ let skills = registry.skills;
107
+ if (options.tag) {
108
+ const tag = options.tag.toLowerCase();
109
+ skills = skills.filter((s) => s.tags.some((t) => t.toLowerCase() === tag));
110
+ }
111
+ if (options.query) {
112
+ skills = searchSkills(registry, options.query);
113
+ }
114
+ process.stdout.write(JSON.stringify({ skills }, null, 2) + '\n');
115
+ }
116
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/marketplace/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Marketplace types for skill metadata and registry.
3
+ */
4
+ export interface SkillManifest {
5
+ name: string;
6
+ version: string;
7
+ description: string;
8
+ tags: string[];
9
+ author: string;
10
+ stars: number;
11
+ auditScore: number;
12
+ created: string;
13
+ }
14
+ export interface RegistryIndex {
15
+ $schema: string;
16
+ updated: string;
17
+ skills: SkillManifest[];
18
+ }
19
+ export interface SkillDetail extends SkillManifest {
20
+ /** Full content of SKILL.md */
21
+ readme: string;
22
+ /** Raw download URL for the SKILL.md */
23
+ downloadUrl: string;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/marketplace/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Marketplace types for skill metadata and registry.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/marketplace/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "transskill",
3
- "version": "0.2.8",
3
+ "version": "0.3.0",
4
4
  "description": "Cross-platform AI agent skill converter - Write once, run on any agent",
5
5
  "bin": {
6
6
  "transskill": "dist/index.js"
@@ -32,6 +32,7 @@
32
32
  "node": ">=18"
33
33
  },
34
34
  "dependencies": {
35
+ "@clack/prompts": "^1.4.0",
35
36
  "chalk": "^5.4.1",
36
37
  "commander": "^13.1.0",
37
38
  "execa": "^9.5.2",
@@ -40,10 +41,10 @@
40
41
  "tempy": "^3.1.0"
41
42
  },
42
43
  "devDependencies": {
43
- "@types/node": "^22.14.0",
44
+ "@types/node": "^22.19.19",
44
45
  "eslint": "^9.24.0",
45
46
  "prettier": "^3.5.3",
46
- "typescript": "^5.8.3",
47
- "vitest": "^3.1.2"
47
+ "typescript": "^5.9.3",
48
+ "vitest": "^3.2.4"
48
49
  }
49
50
  }