skillpkg-cli 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.
Files changed (73) hide show
  1. package/dist/cli.d.ts +9 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +119 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/export.d.ts +13 -0
  6. package/dist/commands/export.d.ts.map +1 -0
  7. package/dist/commands/export.js +117 -0
  8. package/dist/commands/export.js.map +1 -0
  9. package/dist/commands/import.d.ts +12 -0
  10. package/dist/commands/import.d.ts.map +1 -0
  11. package/dist/commands/import.js +126 -0
  12. package/dist/commands/import.js.map +1 -0
  13. package/dist/commands/info.d.ts +10 -0
  14. package/dist/commands/info.d.ts.map +1 -0
  15. package/dist/commands/info.js +118 -0
  16. package/dist/commands/info.js.map +1 -0
  17. package/dist/commands/init.d.ts +10 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +161 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/install.d.ts +10 -0
  22. package/dist/commands/install.d.ts.map +1 -0
  23. package/dist/commands/install.js +190 -0
  24. package/dist/commands/install.js.map +1 -0
  25. package/dist/commands/list.d.ts +10 -0
  26. package/dist/commands/list.d.ts.map +1 -0
  27. package/dist/commands/list.js +74 -0
  28. package/dist/commands/list.js.map +1 -0
  29. package/dist/commands/login.d.ts +22 -0
  30. package/dist/commands/login.d.ts.map +1 -0
  31. package/dist/commands/login.js +100 -0
  32. package/dist/commands/login.js.map +1 -0
  33. package/dist/commands/publish.d.ts +12 -0
  34. package/dist/commands/publish.d.ts.map +1 -0
  35. package/dist/commands/publish.js +161 -0
  36. package/dist/commands/publish.js.map +1 -0
  37. package/dist/commands/search.d.ts +13 -0
  38. package/dist/commands/search.d.ts.map +1 -0
  39. package/dist/commands/search.js +94 -0
  40. package/dist/commands/search.js.map +1 -0
  41. package/dist/commands/sync.d.ts +10 -0
  42. package/dist/commands/sync.d.ts.map +1 -0
  43. package/dist/commands/sync.js +162 -0
  44. package/dist/commands/sync.js.map +1 -0
  45. package/dist/commands/uninstall.d.ts +10 -0
  46. package/dist/commands/uninstall.d.ts.map +1 -0
  47. package/dist/commands/uninstall.js +48 -0
  48. package/dist/commands/uninstall.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +17 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/ui/index.d.ts +8 -0
  54. package/dist/ui/index.d.ts.map +1 -0
  55. package/dist/ui/index.js +8 -0
  56. package/dist/ui/index.js.map +1 -0
  57. package/dist/ui/logger.d.ts +43 -0
  58. package/dist/ui/logger.d.ts.map +1 -0
  59. package/dist/ui/logger.js +77 -0
  60. package/dist/ui/logger.js.map +1 -0
  61. package/dist/ui/prompt.d.ts +35 -0
  62. package/dist/ui/prompt.d.ts.map +1 -0
  63. package/dist/ui/prompt.js +66 -0
  64. package/dist/ui/prompt.js.map +1 -0
  65. package/dist/ui/spinner.d.ts +16 -0
  66. package/dist/ui/spinner.d.ts.map +1 -0
  67. package/dist/ui/spinner.js +30 -0
  68. package/dist/ui/spinner.js.map +1 -0
  69. package/dist/ui/table.d.ts +20 -0
  70. package/dist/ui/table.d.ts.map +1 -0
  71. package/dist/ui/table.js +46 -0
  72. package/dist/ui/table.js.map +1 -0
  73. package/package.json +67 -0
@@ -0,0 +1,161 @@
1
+ /**
2
+ * init command - Create a new skill.yaml
3
+ */
4
+ import { existsSync } from 'fs';
5
+ import { writeFile } from 'fs/promises';
6
+ import { join, basename } from 'path';
7
+ import inquirer from 'inquirer';
8
+ import { stringify } from 'skillpkg-core';
9
+ import { logger, colors, withSpinner } from '../ui/index.js';
10
+ /**
11
+ * Default skill template
12
+ */
13
+ function getDefaultSkill(name) {
14
+ return {
15
+ schema: '1.0',
16
+ name,
17
+ version: '1.0.0',
18
+ description: 'A skillpkg skill',
19
+ instructions: `# ${name}
20
+
21
+ ## Overview
22
+
23
+ Describe what this skill does.
24
+
25
+ ## Usage
26
+
27
+ Explain how to use this skill.
28
+
29
+ ## Examples
30
+
31
+ Provide usage examples.
32
+ `,
33
+ };
34
+ }
35
+ /**
36
+ * Validate skill name
37
+ */
38
+ function validateName(input) {
39
+ if (!input) {
40
+ return 'Name is required';
41
+ }
42
+ if (!/^[a-z][a-z0-9-]*[a-z0-9]$/.test(input)) {
43
+ return 'Name must be kebab-case (e.g., my-skill)';
44
+ }
45
+ if (input.length < 2 || input.length > 100) {
46
+ return 'Name must be between 2 and 100 characters';
47
+ }
48
+ return true;
49
+ }
50
+ /**
51
+ * init command handler
52
+ */
53
+ export async function initCommand(options) {
54
+ const cwd = process.cwd();
55
+ const skillPath = join(cwd, 'skill.yaml');
56
+ // Check if skill.yaml already exists
57
+ if (existsSync(skillPath)) {
58
+ logger.error('skill.yaml already exists in this directory');
59
+ process.exit(1);
60
+ }
61
+ let skill;
62
+ if (options.yes) {
63
+ // Quick mode - use defaults
64
+ const defaultName = options.name || toKebabCase(basename(cwd)) || 'my-skill';
65
+ skill = getDefaultSkill(defaultName);
66
+ logger.info(`Creating skill.yaml with defaults (name: ${colors.cyan(defaultName)})`);
67
+ }
68
+ else {
69
+ // Interactive mode
70
+ logger.header('Create a new skill');
71
+ const answers = await inquirer.prompt([
72
+ {
73
+ type: 'input',
74
+ name: 'name',
75
+ message: 'Skill name:',
76
+ default: options.name || toKebabCase(basename(cwd)) || 'my-skill',
77
+ validate: validateName,
78
+ },
79
+ {
80
+ type: 'input',
81
+ name: 'version',
82
+ message: 'Version:',
83
+ default: '1.0.0',
84
+ validate: (input) => {
85
+ if (!/^\d+\.\d+\.\d+/.test(input)) {
86
+ return 'Version must be semver (e.g., 1.0.0)';
87
+ }
88
+ return true;
89
+ },
90
+ },
91
+ {
92
+ type: 'input',
93
+ name: 'description',
94
+ message: 'Description:',
95
+ default: 'A skillpkg skill',
96
+ },
97
+ {
98
+ type: 'input',
99
+ name: 'author',
100
+ message: 'Author:',
101
+ },
102
+ {
103
+ type: 'checkbox',
104
+ name: 'platforms',
105
+ message: 'Target platforms:',
106
+ choices: [
107
+ { name: 'Claude Code', value: 'claude-code', checked: true },
108
+ { name: 'Codex (OpenAI)', value: 'codex' },
109
+ { name: 'GitHub Copilot', value: 'copilot' },
110
+ { name: 'Cline (VS Code)', value: 'cline' },
111
+ ],
112
+ },
113
+ ]);
114
+ skill = {
115
+ schema: '1.0',
116
+ name: answers.name,
117
+ version: answers.version,
118
+ description: answers.description,
119
+ ...(answers.author && { author: answers.author }),
120
+ ...(answers.platforms?.length > 0 && {
121
+ platforms: Object.fromEntries(answers.platforms.map((p) => [p, {}])),
122
+ }),
123
+ instructions: `# ${answers.name}
124
+
125
+ ## Overview
126
+
127
+ ${answers.description}
128
+
129
+ ## Usage
130
+
131
+ Explain how to use this skill.
132
+
133
+ ## Examples
134
+
135
+ Provide usage examples.
136
+ `,
137
+ };
138
+ }
139
+ // Write skill.yaml
140
+ await withSpinner('Creating skill.yaml', async () => {
141
+ const content = stringify(skill);
142
+ await writeFile(skillPath, content, 'utf-8');
143
+ });
144
+ logger.blank();
145
+ logger.success(`Created ${colors.cyan('skill.yaml')}`);
146
+ logger.blank();
147
+ logger.log('Next steps:');
148
+ logger.item(`Edit ${colors.cyan('skill.yaml')} to customize your skill`);
149
+ logger.item(`Run ${colors.cyan('skillpkg sync')} to sync to platforms`);
150
+ logger.blank();
151
+ }
152
+ /**
153
+ * Convert string to kebab-case
154
+ */
155
+ function toKebabCase(str) {
156
+ return str
157
+ .toLowerCase()
158
+ .replace(/[^a-z0-9]+/g, '-')
159
+ .replace(/^-|-$/g, '');
160
+ }
161
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface InstallOptions {
2
+ global?: boolean;
3
+ registry?: string;
4
+ }
5
+ /**
6
+ * install command handler
7
+ */
8
+ export declare function installCommand(skillArg: string | undefined, options: InstallOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAYA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * install command - Install a skill
3
+ */
4
+ import { existsSync, createReadStream } from 'fs';
5
+ import { readFile } from 'fs/promises';
6
+ import { join, resolve, isAbsolute } from 'path';
7
+ import { createGunzip } from 'zlib';
8
+ import { parse, createGlobalStore, createLocalStore } from 'skillpkg-core';
9
+ import { logger, colors, withSpinner } from '../ui/index.js';
10
+ import * as tar from 'tar-stream';
11
+ /**
12
+ * install command handler
13
+ */
14
+ export async function installCommand(skillArg, options) {
15
+ // If no skill argument, try to install from current directory
16
+ if (!skillArg) {
17
+ const localSkillPath = join(process.cwd(), 'skill.yaml');
18
+ if (existsSync(localSkillPath)) {
19
+ skillArg = '.';
20
+ }
21
+ else {
22
+ logger.error('No skill specified and no skill.yaml found in current directory');
23
+ logger.log(`Usage: ${colors.cyan('skillpkg install <skill>')}`);
24
+ process.exit(1);
25
+ }
26
+ }
27
+ // Determine if it's a local path or registry name
28
+ const isLocalPath = skillArg.startsWith('.') || skillArg.startsWith('/') || existsSync(skillArg);
29
+ if (isLocalPath) {
30
+ // Check if it's a .skillpkg file
31
+ if (skillArg.endsWith('.skillpkg')) {
32
+ await installFromPack(skillArg, options);
33
+ }
34
+ else {
35
+ await installFromLocal(skillArg, options);
36
+ }
37
+ }
38
+ else {
39
+ await installFromRegistry(skillArg, options);
40
+ }
41
+ }
42
+ /**
43
+ * Install skill from local path
44
+ */
45
+ async function installFromLocal(pathArg, options) {
46
+ // Resolve path
47
+ const skillPath = isAbsolute(pathArg) ? pathArg : resolve(process.cwd(), pathArg);
48
+ const yamlPath = existsSync(join(skillPath, 'skill.yaml'))
49
+ ? join(skillPath, 'skill.yaml')
50
+ : skillPath.endsWith('.yaml')
51
+ ? skillPath
52
+ : join(skillPath, 'skill.yaml');
53
+ if (!existsSync(yamlPath)) {
54
+ logger.error(`skill.yaml not found at ${yamlPath}`);
55
+ process.exit(1);
56
+ }
57
+ // Parse skill.yaml
58
+ let skill;
59
+ try {
60
+ const content = await readFile(yamlPath, 'utf-8');
61
+ const result = parse(content);
62
+ if (!result.success || !result.data) {
63
+ logger.error('Failed to parse skill.yaml:');
64
+ result.errors?.forEach((e) => logger.error(` ${e.message}`));
65
+ process.exit(1);
66
+ }
67
+ skill = result.data;
68
+ }
69
+ catch (error) {
70
+ logger.error(`Failed to read skill.yaml: ${error instanceof Error ? error.message : error}`);
71
+ process.exit(1);
72
+ }
73
+ // Get store
74
+ const store = options.global ? createGlobalStore() : createLocalStore();
75
+ // Initialize store if needed
76
+ if (!(await store.isInitialized())) {
77
+ await withSpinner('Initializing store', () => store.init());
78
+ }
79
+ // Check if already installed
80
+ if (await store.hasSkill(skill.name)) {
81
+ const existing = await store.getSkill(skill.name);
82
+ if (existing?.version === skill.version) {
83
+ logger.warn(`${skill.name}@${skill.version} is already installed`);
84
+ return;
85
+ }
86
+ logger.info(`Updating ${skill.name} from ${existing?.version} to ${skill.version}`);
87
+ }
88
+ // Install skill
89
+ await withSpinner(`Installing ${colors.cyan(skill.name)}@${skill.version}`, async () => {
90
+ await store.addSkill(skill, { source: 'local' });
91
+ });
92
+ logger.blank();
93
+ logger.success(`Installed ${colors.cyan(skill.name)}@${skill.version}`);
94
+ logger.blank();
95
+ logger.log('Next steps:');
96
+ logger.item(`Run ${colors.cyan('skillpkg list')} to see installed skills`);
97
+ logger.item(`Run ${colors.cyan('skillpkg sync')} to sync to platforms`);
98
+ logger.blank();
99
+ }
100
+ /**
101
+ * Install skill from .skillpkg pack file
102
+ */
103
+ async function installFromPack(packPath, options) {
104
+ // Resolve path
105
+ const fullPath = isAbsolute(packPath) ? packPath : resolve(process.cwd(), packPath);
106
+ if (!existsSync(fullPath)) {
107
+ logger.error(`Pack file not found: ${fullPath}`);
108
+ process.exit(1);
109
+ }
110
+ logger.info(`Installing from ${colors.cyan(packPath)}`);
111
+ // Extract skill.yaml from the pack
112
+ const skill = await withSpinner('Extracting pack', async () => {
113
+ const extract = tar.extract();
114
+ const chunks = [];
115
+ return new Promise((resolvePromise, reject) => {
116
+ extract.on('entry', (header, stream, next) => {
117
+ // skill.yaml can be at root or inside a skill-named folder
118
+ if (header.name === 'skill.yaml' || header.name.endsWith('/skill.yaml')) {
119
+ stream.on('data', (chunk) => chunks.push(chunk));
120
+ stream.on('end', next);
121
+ }
122
+ else {
123
+ stream.resume();
124
+ next();
125
+ }
126
+ });
127
+ extract.on('finish', async () => {
128
+ if (chunks.length === 0) {
129
+ reject(new Error('skill.yaml not found in pack'));
130
+ return;
131
+ }
132
+ const content = Buffer.concat(chunks).toString('utf-8');
133
+ const result = parse(content);
134
+ if (!result.success || !result.data) {
135
+ reject(new Error(`Failed to parse skill.yaml: ${result.errors?.[0]?.message}`));
136
+ return;
137
+ }
138
+ resolvePromise(result.data);
139
+ });
140
+ extract.on('error', reject);
141
+ createReadStream(fullPath)
142
+ .pipe(createGunzip())
143
+ .pipe(extract);
144
+ });
145
+ });
146
+ // Get store
147
+ const store = options.global ? createGlobalStore() : createLocalStore();
148
+ // Initialize store if needed
149
+ if (!(await store.isInitialized())) {
150
+ await withSpinner('Initializing store', () => store.init());
151
+ }
152
+ // Check if already installed
153
+ if (await store.hasSkill(skill.name)) {
154
+ const existing = await store.getSkill(skill.name);
155
+ if (existing?.version === skill.version) {
156
+ logger.warn(`${skill.name}@${skill.version} is already installed`);
157
+ return;
158
+ }
159
+ logger.info(`Updating ${skill.name} from ${existing?.version} to ${skill.version}`);
160
+ }
161
+ // Install skill
162
+ await withSpinner(`Installing ${colors.cyan(skill.name)}@${skill.version}`, async () => {
163
+ await store.addSkill(skill, { source: 'local' });
164
+ });
165
+ logger.blank();
166
+ logger.success(`Installed ${colors.cyan(skill.name)}@${skill.version}`);
167
+ logger.blank();
168
+ logger.log('Next steps:');
169
+ logger.item(`Run ${colors.cyan('skillpkg list')} to see installed skills`);
170
+ logger.item(`Run ${colors.cyan('skillpkg sync')} to sync to platforms`);
171
+ logger.blank();
172
+ }
173
+ /**
174
+ * Install skill from registry
175
+ */
176
+ async function installFromRegistry(skillName, _options) {
177
+ // Parse name@version
178
+ const [name, version] = skillName.includes('@')
179
+ ? skillName.split('@')
180
+ : [skillName, 'latest'];
181
+ logger.info(`Installing ${colors.cyan(name)}@${version} from registry...`);
182
+ // TODO: Implement registry client in M6
183
+ logger.warn('Registry installation not yet implemented');
184
+ logger.log(`Will be available after M6: Registry Client`);
185
+ logger.blank();
186
+ logger.log('For now, use local installation:');
187
+ logger.item(`${colors.cyan('skillpkg install ./path/to/skill')}`);
188
+ logger.blank();
189
+ }
190
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface ListOptions {
2
+ global?: boolean;
3
+ json?: boolean;
4
+ }
5
+ /**
6
+ * list command handler
7
+ */
8
+ export declare function listCommand(options: ListOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAOA,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCrE"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * list command - List installed skills
3
+ */
4
+ import { createGlobalStore, createLocalStore } from 'skillpkg-core';
5
+ import { logger, colors, createTable, printTable } from '../ui/index.js';
6
+ /**
7
+ * list command handler
8
+ */
9
+ export async function listCommand(options) {
10
+ const store = options.global ? createGlobalStore() : createLocalStore();
11
+ // Check if store is initialized
12
+ if (!(await store.isInitialized())) {
13
+ if (options.json) {
14
+ console.log(JSON.stringify({ skills: [] }, null, 2));
15
+ }
16
+ else {
17
+ logger.info('No skills installed');
18
+ logger.log(`Run ${colors.cyan('skillpkg install <skill>')} to install one`);
19
+ }
20
+ return;
21
+ }
22
+ // Get all skills
23
+ const skills = await store.listSkills();
24
+ if (skills.length === 0) {
25
+ if (options.json) {
26
+ console.log(JSON.stringify({ skills: [] }, null, 2));
27
+ }
28
+ else {
29
+ logger.info('No skills installed');
30
+ logger.log(`Run ${colors.cyan('skillpkg install <skill>')} to install one`);
31
+ }
32
+ return;
33
+ }
34
+ // Output based on format
35
+ if (options.json) {
36
+ console.log(JSON.stringify({ skills }, null, 2));
37
+ }
38
+ else {
39
+ printSkillTable(skills, options.global);
40
+ }
41
+ }
42
+ /**
43
+ * Print skills as a table
44
+ */
45
+ function printSkillTable(skills, isGlobal = false) {
46
+ logger.header(`Installed Skills (${isGlobal ? 'global' : 'local'})`);
47
+ const table = createTable({
48
+ head: ['Name', 'Version', 'Description', 'Synced To'],
49
+ });
50
+ for (const skill of skills) {
51
+ const syncedPlatforms = skill.syncedPlatforms.length > 0
52
+ ? skill.syncedPlatforms.map((p) => colors.green(p)).join(', ')
53
+ : colors.dim('none');
54
+ table.push([
55
+ colors.cyan(skill.name),
56
+ skill.version,
57
+ truncate(skill.description, 30),
58
+ syncedPlatforms,
59
+ ]);
60
+ }
61
+ printTable(table);
62
+ logger.blank();
63
+ logger.log(`Total: ${colors.cyan(String(skills.length))} skill(s)`);
64
+ logger.blank();
65
+ }
66
+ /**
67
+ * Truncate string with ellipsis
68
+ */
69
+ function truncate(str, maxLength) {
70
+ if (str.length <= maxLength)
71
+ return str;
72
+ return str.slice(0, maxLength - 3) + '...';
73
+ }
74
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ interface LoginCommandOptions {
2
+ registry?: string;
3
+ token?: string;
4
+ }
5
+ /**
6
+ * login command handler
7
+ */
8
+ export declare function loginCommand(options: LoginCommandOptions): Promise<void>;
9
+ /**
10
+ * logout command handler
11
+ */
12
+ export declare function logoutCommand(options: {
13
+ registry?: string;
14
+ }): Promise<void>;
15
+ /**
16
+ * whoami command handler - Show current logged in user
17
+ */
18
+ export declare function whoamiCommand(options: {
19
+ registry?: string;
20
+ }): Promise<void>;
21
+ export {};
22
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAaA,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE9E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjF"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * login command - Authenticate with a registry
3
+ */
4
+ import { setToken, removeToken, isAuthenticated, getUsername, createRegistryClient, DEFAULT_REGISTRY_URL, } from 'skillpkg-core';
5
+ import { logger, colors, createPrompt } from '../ui/index.js';
6
+ /**
7
+ * login command handler
8
+ */
9
+ export async function loginCommand(options) {
10
+ const registryUrl = options.registry || DEFAULT_REGISTRY_URL;
11
+ logger.header('Login to Registry');
12
+ logger.log(`Registry: ${colors.cyan(registryUrl)}`);
13
+ logger.blank();
14
+ // Check if already logged in
15
+ if (await isAuthenticated(registryUrl)) {
16
+ const username = await getUsername(registryUrl);
17
+ logger.info(`Already logged in as ${colors.cyan(username || 'unknown')}`);
18
+ const { confirm } = await createPrompt([
19
+ {
20
+ type: 'confirm',
21
+ name: 'confirm',
22
+ message: 'Do you want to re-authenticate?',
23
+ default: false,
24
+ },
25
+ ]);
26
+ if (!confirm) {
27
+ return;
28
+ }
29
+ }
30
+ // Get token from option or prompt
31
+ let token = options.token;
32
+ if (!token) {
33
+ logger.log('To get a token, visit:');
34
+ logger.log(` ${colors.cyan(`${registryUrl}/tokens`)}`);
35
+ logger.blank();
36
+ const answers = await createPrompt([
37
+ {
38
+ type: 'password',
39
+ name: 'token',
40
+ message: 'Enter your auth token:',
41
+ },
42
+ ]);
43
+ token = answers.token;
44
+ }
45
+ if (!token || token.trim() === '') {
46
+ logger.error('Token is required');
47
+ process.exit(1);
48
+ }
49
+ // Verify token by making a test request
50
+ logger.info('Verifying token...');
51
+ const client = createRegistryClient({ registryUrl });
52
+ // Check if registry is reachable
53
+ const isOnline = await client.ping();
54
+ if (!isOnline) {
55
+ logger.warn('Could not verify token (registry unreachable)');
56
+ logger.log('Token saved locally. It will be verified on next request.');
57
+ }
58
+ // Save token
59
+ await setToken(registryUrl, token.trim());
60
+ logger.blank();
61
+ logger.success('Successfully logged in!');
62
+ logger.blank();
63
+ logger.log('You can now:');
64
+ logger.item(`${colors.cyan('skillpkg publish')} - Publish skills`);
65
+ logger.item(`${colors.cyan('skillpkg logout')} - Log out`);
66
+ logger.blank();
67
+ }
68
+ /**
69
+ * logout command handler
70
+ */
71
+ export async function logoutCommand(options) {
72
+ const registryUrl = options.registry || DEFAULT_REGISTRY_URL;
73
+ logger.header('Logout from Registry');
74
+ if (!(await isAuthenticated(registryUrl))) {
75
+ logger.info('Not currently logged in');
76
+ return;
77
+ }
78
+ const username = await getUsername(registryUrl);
79
+ const removed = await removeToken(registryUrl);
80
+ if (removed) {
81
+ logger.success(`Logged out ${username ? `(${colors.cyan(username)})` : ''}`);
82
+ }
83
+ else {
84
+ logger.error('Failed to log out');
85
+ }
86
+ }
87
+ /**
88
+ * whoami command handler - Show current logged in user
89
+ */
90
+ export async function whoamiCommand(options) {
91
+ const registryUrl = options.registry || DEFAULT_REGISTRY_URL;
92
+ if (!(await isAuthenticated(registryUrl))) {
93
+ logger.log('Not logged in');
94
+ logger.log(`Run ${colors.cyan('skillpkg login')} to authenticate`);
95
+ return;
96
+ }
97
+ const username = await getUsername(registryUrl);
98
+ logger.log(username || 'Logged in (username unknown)');
99
+ }
100
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface PublishCommandOptions {
2
+ tag?: string;
3
+ access?: string;
4
+ registry?: string;
5
+ dryRun?: boolean;
6
+ }
7
+ /**
8
+ * publish command handler
9
+ */
10
+ export declare function publishCommand(options: PublishCommandOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAiBA,UAAU,qBAAqB;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6IlF"}