@skillsmith/cli 0.3.7 → 0.4.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 (53) hide show
  1. package/README.md +68 -3
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/commands/author/init.d.ts +4 -1
  4. package/dist/src/commands/author/init.d.ts.map +1 -1
  5. package/dist/src/commands/author/init.js +65 -4
  6. package/dist/src/commands/author/init.js.map +1 -1
  7. package/dist/src/commands/index.d.ts +3 -0
  8. package/dist/src/commands/index.d.ts.map +1 -1
  9. package/dist/src/commands/index.js +4 -0
  10. package/dist/src/commands/index.js.map +1 -1
  11. package/dist/src/commands/login.d.ts +23 -0
  12. package/dist/src/commands/login.d.ts.map +1 -0
  13. package/dist/src/commands/login.js +121 -0
  14. package/dist/src/commands/login.js.map +1 -0
  15. package/dist/src/commands/login.test.d.ts +8 -0
  16. package/dist/src/commands/login.test.d.ts.map +1 -0
  17. package/dist/src/commands/login.test.js +218 -0
  18. package/dist/src/commands/login.test.js.map +1 -0
  19. package/dist/src/commands/logout.d.ts +14 -0
  20. package/dist/src/commands/logout.d.ts.map +1 -0
  21. package/dist/src/commands/logout.js +45 -0
  22. package/dist/src/commands/logout.js.map +1 -0
  23. package/dist/src/commands/logout.test.d.ts +8 -0
  24. package/dist/src/commands/logout.test.d.ts.map +1 -0
  25. package/dist/src/commands/logout.test.js +135 -0
  26. package/dist/src/commands/logout.test.js.map +1 -0
  27. package/dist/src/commands/manage.d.ts +1 -16
  28. package/dist/src/commands/manage.d.ts.map +1 -1
  29. package/dist/src/commands/manage.js +4 -97
  30. package/dist/src/commands/manage.js.map +1 -1
  31. package/dist/src/commands/merge.d.ts.map +1 -1
  32. package/dist/src/commands/merge.js +3 -4
  33. package/dist/src/commands/merge.js.map +1 -1
  34. package/dist/src/commands/search-formatters.d.ts.map +1 -1
  35. package/dist/src/commands/search-formatters.js +1 -0
  36. package/dist/src/commands/search-formatters.js.map +1 -1
  37. package/dist/src/commands/whoami.d.ts +14 -0
  38. package/dist/src/commands/whoami.d.ts.map +1 -0
  39. package/dist/src/commands/whoami.js +42 -0
  40. package/dist/src/commands/whoami.js.map +1 -0
  41. package/dist/src/commands/whoami.test.d.ts +8 -0
  42. package/dist/src/commands/whoami.test.d.ts.map +1 -0
  43. package/dist/src/commands/whoami.test.js +131 -0
  44. package/dist/src/commands/whoami.test.js.map +1 -0
  45. package/dist/src/index.js +12 -4
  46. package/dist/src/index.js.map +1 -1
  47. package/dist/src/templates/mcp-template-handlers.js +1 -1
  48. package/dist/src/templates/mcp-template-handlers.js.map +1 -1
  49. package/dist/src/utils/skills-directory.d.ts +25 -0
  50. package/dist/src/utils/skills-directory.d.ts.map +1 -0
  51. package/dist/src/utils/skills-directory.js +102 -0
  52. package/dist/src/utils/skills-directory.js.map +1 -0
  53. package/package.json +7 -5
@@ -0,0 +1,131 @@
1
+ /**
2
+ * SMI-2715: Whoami Command Tests
3
+ *
4
+ * Tests for `skillsmith whoami` — unauthenticated state, each source label,
5
+ * and masked key display.
6
+ */
7
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
8
+ // ---------------------------------------------------------------------------
9
+ // Mocks
10
+ // ---------------------------------------------------------------------------
11
+ vi.mock('@skillsmith/core', () => ({
12
+ getAuthStatus: vi.fn(),
13
+ }));
14
+ // ---------------------------------------------------------------------------
15
+ // Imports
16
+ // ---------------------------------------------------------------------------
17
+ import { createWhoamiCommand } from './whoami.js';
18
+ import { getAuthStatus } from '@skillsmith/core';
19
+ const mockGetAuthStatus = vi.mocked(getAuthStatus);
20
+ // ---------------------------------------------------------------------------
21
+ // Helpers
22
+ // ---------------------------------------------------------------------------
23
+ async function runCommand(args = []) {
24
+ const cmd = createWhoamiCommand();
25
+ await cmd.parseAsync(['node', 'whoami', ...args]);
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // Tests
29
+ // ---------------------------------------------------------------------------
30
+ describe('createWhoamiCommand', () => {
31
+ let consoleLogSpy;
32
+ let processExitSpy;
33
+ beforeEach(() => {
34
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
35
+ processExitSpy = vi
36
+ .spyOn(process, 'exit')
37
+ .mockImplementation((code) => {
38
+ throw new Error(`process.exit(${code ?? 0})`);
39
+ });
40
+ vi.clearAllMocks();
41
+ });
42
+ afterEach(() => {
43
+ consoleLogSpy.mockRestore();
44
+ processExitSpy.mockRestore();
45
+ });
46
+ describe('command metadata', () => {
47
+ it('has the correct name', () => {
48
+ expect(createWhoamiCommand().name()).toBe('whoami');
49
+ });
50
+ it('has a description', () => {
51
+ expect(createWhoamiCommand().description()).toBeTruthy();
52
+ });
53
+ });
54
+ describe('unauthenticated state', () => {
55
+ it('prints login suggestion when not authenticated', async () => {
56
+ mockGetAuthStatus.mockResolvedValue({
57
+ authenticated: false,
58
+ keyPrefix: null,
59
+ source: 'none',
60
+ });
61
+ await expect(runCommand()).rejects.toThrow('process.exit(0)');
62
+ const output = consoleLogSpy.mock.calls.flat().join('\n');
63
+ expect(output).toContain('Not authenticated');
64
+ expect(output).toContain('skillsmith login');
65
+ });
66
+ });
67
+ describe('authenticated state', () => {
68
+ it('displays masked key (prefix + ellipsis)', async () => {
69
+ mockGetAuthStatus.mockResolvedValue({
70
+ authenticated: true,
71
+ keyPrefix: 'sk_live_xxxx',
72
+ source: 'keyring',
73
+ });
74
+ await expect(runCommand()).rejects.toThrow('process.exit(0)');
75
+ const output = consoleLogSpy.mock.calls.flat().join('\n');
76
+ expect(output).toContain('sk_live_xxxx...');
77
+ });
78
+ it('shows "OS keyring" source label for keyring source', async () => {
79
+ mockGetAuthStatus.mockResolvedValue({
80
+ authenticated: true,
81
+ keyPrefix: 'sk_live_xxxx',
82
+ source: 'keyring',
83
+ });
84
+ await expect(runCommand()).rejects.toThrow('process.exit(0)');
85
+ const output = consoleLogSpy.mock.calls.flat().join('\n');
86
+ expect(output).toContain('OS keyring');
87
+ });
88
+ it('shows config file source label for config source', async () => {
89
+ mockGetAuthStatus.mockResolvedValue({
90
+ authenticated: true,
91
+ keyPrefix: 'sk_live_xxxx',
92
+ source: 'config',
93
+ });
94
+ await expect(runCommand()).rejects.toThrow('process.exit(0)');
95
+ const output = consoleLogSpy.mock.calls.flat().join('\n');
96
+ expect(output).toContain('config file');
97
+ expect(output).toContain('~/.skillsmith/config.json');
98
+ });
99
+ it('shows env var source label for env source', async () => {
100
+ mockGetAuthStatus.mockResolvedValue({
101
+ authenticated: true,
102
+ keyPrefix: 'sk_live_xxxx',
103
+ source: 'env',
104
+ });
105
+ await expect(runCommand()).rejects.toThrow('process.exit(0)');
106
+ const output = consoleLogSpy.mock.calls.flat().join('\n');
107
+ expect(output).toContain('SKILLSMITH_API_KEY');
108
+ });
109
+ it('shows "Skillsmith CLI" heading when authenticated', async () => {
110
+ mockGetAuthStatus.mockResolvedValue({
111
+ authenticated: true,
112
+ keyPrefix: 'sk_live_xxxx',
113
+ source: 'config',
114
+ });
115
+ await expect(runCommand()).rejects.toThrow('process.exit(0)');
116
+ const output = consoleLogSpy.mock.calls.flat().join('\n');
117
+ expect(output).toContain('Skillsmith CLI');
118
+ });
119
+ it('shows "valid" format indicator', async () => {
120
+ mockGetAuthStatus.mockResolvedValue({
121
+ authenticated: true,
122
+ keyPrefix: 'sk_live_xxxx',
123
+ source: 'config',
124
+ });
125
+ await expect(runCommand()).rejects.toThrow('process.exit(0)');
126
+ const output = consoleLogSpy.mock.calls.flat().join('\n');
127
+ expect(output).toContain('valid');
128
+ });
129
+ });
130
+ });
131
+ //# sourceMappingURL=whoami.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.test.js","sourceRoot":"","sources":["../../../src/commands/whoami.test.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -19,7 +19,7 @@
19
19
  */
20
20
  import { Command } from 'commander';
21
21
  import { importSkills } from './import.js';
22
- import { createSearchCommand, createListCommand, createUpdateCommand, createRemoveCommand, createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, createAnalyzeCommand, createRecommendCommand, createSyncCommand, createInstallSkillCommand, } from './commands/index.js';
22
+ import { createSearchCommand, createListCommand, createUpdateCommand, createRemoveCommand, createInitCommand, createValidateCommand, createPublishCommand, createSubagentCommand, createTransformCommand, createMcpInitCommand, createAnalyzeCommand, createRecommendCommand, createSyncCommand, createInstallSkillCommand, createLoginCommand, createLogoutCommand, createWhoamiCommand, } from './commands/index.js';
23
23
  import { DEFAULT_DB_PATH } from './config.js';
24
24
  import { sanitizeError } from './utils/sanitize.js';
25
25
  import { displayStartupHeader } from './utils/license.js';
@@ -45,9 +45,13 @@ program
45
45
  .name(commandName)
46
46
  .description('Claude Skill Discovery and Management CLI (alias: sklx)')
47
47
  .version(CLI_VERSION);
48
- // Display startup header with license status before parsing commands
49
- // Use hook to display header before any command runs
50
- program.hook('preAction', async () => {
48
+ // Display startup header with license status before parsing commands.
49
+ // Skip for auth commands (login/logout/whoami) which manage credentials and
50
+ // must not emit extra output that could interfere with scripted use.
51
+ const NO_HEADER_COMMANDS = ['login', 'logout', 'whoami'];
52
+ program.hook('preAction', async (_thisCommand, actionCommand) => {
53
+ if (NO_HEADER_COMMANDS.includes(actionCommand.name()))
54
+ return;
51
55
  await displayStartupHeader(CLI_VERSION);
52
56
  });
53
57
  // SMI-580: Import command
@@ -102,5 +106,9 @@ program.addCommand(createRecommendCommand());
102
106
  program.addCommand(createSyncCommand());
103
107
  // SMI-824: Install skillsmith skill for /skillsmith slash command
104
108
  program.addCommand(createInstallSkillCommand());
109
+ // SMI-2715: CLI Login Device Flow
110
+ program.addCommand(createLoginCommand());
111
+ program.addCommand(createLogoutCommand());
112
+ program.addCommand(createWhoamiCommand());
105
113
  program.parse();
106
114
  //# sourceMappingURL=index.js.map
@@ -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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"}
@@ -9,7 +9,7 @@
9
9
  * Escape single quotes in strings for safe template interpolation
10
10
  */
11
11
  export function escapeQuotes(str) {
12
- return str.replace(/'/g, "\\'");
12
+ return str.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
13
13
  }
14
14
  /**
15
15
  * Generate tool definition code for a single tool
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-template-handlers.js","sourceRoot":"","sources":["../../../src/templates/mcp-template-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-template-handlers.js","sourceRoot":"","sources":["../../../src/templates/mcp-template-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SMI-2713: Extracted from manage.ts — helpers for reading installed skills
3
+ * from the global and local ~/.claude/skills directories.
4
+ */
5
+ import { type TrustTier } from '@skillsmith/core';
6
+ export interface InstalledSkill {
7
+ name: string;
8
+ path: string;
9
+ version: string | null;
10
+ trustTier: TrustTier;
11
+ installDate: string;
12
+ hasUpdates: boolean;
13
+ }
14
+ /**
15
+ * Get skills from a specific directory
16
+ */
17
+ export declare function getSkillsFromDirectory(skillsDir: string): Promise<InstalledSkill[]>;
18
+ /**
19
+ * Get list of installed skills from both global (~/.claude/skills) and
20
+ * local (.claude/skills) directories.
21
+ *
22
+ * SMI-1630: Local skills take precedence over global skills with the same name.
23
+ */
24
+ export declare function getInstalledSkills(): Promise<InstalledSkill[]>;
25
+ //# sourceMappingURL=skills-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-directory.d.ts","sourceRoot":"","sources":["../../../src/utils/skills-directory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE9D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;CACpB;AAoBD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAqDzF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAqBpE"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * SMI-2713: Extracted from manage.ts — helpers for reading installed skills
3
+ * from the global and local ~/.claude/skills directories.
4
+ */
5
+ import { readdir, readFile, stat } from 'fs/promises';
6
+ import { join } from 'path';
7
+ import { homedir } from 'os';
8
+ import { SkillParser } from '@skillsmith/core';
9
+ /**
10
+ * SMI-1630: Search both global and local skill directories
11
+ *
12
+ * Global: ~/.claude/skills/
13
+ * Local: ${process.cwd()}/.claude/skills/
14
+ *
15
+ * Local skills take precedence over global skills with the same name.
16
+ */
17
+ const GLOBAL_SKILLS_DIR = join(homedir(), '.claude', 'skills');
18
+ /**
19
+ * Returns the local skills directory path.
20
+ * Computed at call time to handle working directory changes.
21
+ */
22
+ function getLocalSkillsDir() {
23
+ return join(process.cwd(), '.claude', 'skills');
24
+ }
25
+ /**
26
+ * Get skills from a specific directory
27
+ */
28
+ export async function getSkillsFromDirectory(skillsDir) {
29
+ const skills = [];
30
+ try {
31
+ const entries = await readdir(skillsDir, { withFileTypes: true });
32
+ for (const entry of entries) {
33
+ if (entry.isDirectory()) {
34
+ const skillPath = join(skillsDir, entry.name);
35
+ const skillMdPath = join(skillPath, 'SKILL.md');
36
+ try {
37
+ const skillMdStat = await stat(skillMdPath);
38
+ const content = await readFile(skillMdPath, 'utf-8');
39
+ const parser = new SkillParser();
40
+ const parsed = parser.parse(content);
41
+ skills.push({
42
+ name: parsed?.name || entry.name,
43
+ path: skillPath,
44
+ version: parsed?.version || null,
45
+ trustTier: parsed ? parser.inferTrustTier(parsed) : 'unknown',
46
+ installDate: skillMdStat.mtime.toISOString().split('T')[0] || 'Unknown',
47
+ hasUpdates: false, // Would check remote for updates
48
+ });
49
+ }
50
+ catch (error) {
51
+ // Only treat ENOENT (file not found) as "no SKILL.md"
52
+ // Re-throw permission errors and other unexpected errors
53
+ const errno = error.code;
54
+ if (errno !== 'ENOENT') {
55
+ throw error;
56
+ }
57
+ // No SKILL.md, treat as unknown skill
58
+ const dirStat = await stat(skillPath);
59
+ skills.push({
60
+ name: entry.name,
61
+ path: skillPath,
62
+ version: null,
63
+ trustTier: 'unknown',
64
+ installDate: dirStat.mtime.toISOString().split('T')[0] || 'Unknown',
65
+ hasUpdates: false,
66
+ });
67
+ }
68
+ }
69
+ }
70
+ }
71
+ catch (error) {
72
+ if (error.code !== 'ENOENT') {
73
+ throw error;
74
+ }
75
+ }
76
+ return skills;
77
+ }
78
+ /**
79
+ * Get list of installed skills from both global (~/.claude/skills) and
80
+ * local (.claude/skills) directories.
81
+ *
82
+ * SMI-1630: Local skills take precedence over global skills with the same name.
83
+ */
84
+ export async function getInstalledSkills() {
85
+ // Get skills from both directories
86
+ const [globalSkills, localSkills] = await Promise.all([
87
+ getSkillsFromDirectory(GLOBAL_SKILLS_DIR),
88
+ getSkillsFromDirectory(getLocalSkillsDir()),
89
+ ]);
90
+ // Create a map for deduplication, local skills take precedence
91
+ const skillMap = new Map();
92
+ // Add global skills first
93
+ for (const skill of globalSkills) {
94
+ skillMap.set(skill.name, skill);
95
+ }
96
+ // Add local skills (overwrites global skills with same name)
97
+ for (const skill of localSkills) {
98
+ skillMap.set(skill.name, skill);
99
+ }
100
+ return Array.from(skillMap.values());
101
+ }
102
+ //# sourceMappingURL=skills-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-directory.js","sourceRoot":"","sources":["../../../src/utils/skills-directory.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@skillsmith/cli",
3
- "version": "0.3.7",
4
- "description": "CLI tools for Skillsmith skill discovery",
3
+ "version": "0.4.0",
4
+ "description": "CLI tools for Skillsmith skill discovery and authentication",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "skillsmith": "dist/src/index.js",
@@ -16,13 +16,17 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@inquirer/prompts": "7.10.1",
19
- "@skillsmith/core": "0.4.8",
19
+ "@skillsmith/core": "0.4.10",
20
20
  "chalk": "5.6.2",
21
21
  "cli-table3": "0.6.5",
22
22
  "commander": "12.1.0",
23
23
  "esbuild": "0.27.2",
24
+ "open": "10.2.0",
24
25
  "ora": "8.2.0"
25
26
  },
27
+ "optionalDependencies": {
28
+ "@isaacs/keytar": "7.9.0"
29
+ },
26
30
  "devDependencies": {
27
31
  "@types/node": "20.19.30",
28
32
  "vitest": "4.0.16"
@@ -50,12 +54,10 @@
50
54
  "url": "https://github.com/smith-horn/skillsmith/issues"
51
55
  },
52
56
  "keywords": [
53
- "claude",
54
57
  "ai",
55
58
  "skills",
56
59
  "mcp",
57
60
  "llm",
58
- "anthropic",
59
61
  "cli"
60
62
  ],
61
63
  "engines": {