@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.
- package/README.md +68 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/commands/author/init.d.ts +4 -1
- package/dist/src/commands/author/init.d.ts.map +1 -1
- package/dist/src/commands/author/init.js +65 -4
- package/dist/src/commands/author/init.js.map +1 -1
- package/dist/src/commands/index.d.ts +3 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +4 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/login.d.ts +23 -0
- package/dist/src/commands/login.d.ts.map +1 -0
- package/dist/src/commands/login.js +121 -0
- package/dist/src/commands/login.js.map +1 -0
- package/dist/src/commands/login.test.d.ts +8 -0
- package/dist/src/commands/login.test.d.ts.map +1 -0
- package/dist/src/commands/login.test.js +218 -0
- package/dist/src/commands/login.test.js.map +1 -0
- package/dist/src/commands/logout.d.ts +14 -0
- package/dist/src/commands/logout.d.ts.map +1 -0
- package/dist/src/commands/logout.js +45 -0
- package/dist/src/commands/logout.js.map +1 -0
- package/dist/src/commands/logout.test.d.ts +8 -0
- package/dist/src/commands/logout.test.d.ts.map +1 -0
- package/dist/src/commands/logout.test.js +135 -0
- package/dist/src/commands/logout.test.js.map +1 -0
- package/dist/src/commands/manage.d.ts +1 -16
- package/dist/src/commands/manage.d.ts.map +1 -1
- package/dist/src/commands/manage.js +4 -97
- package/dist/src/commands/manage.js.map +1 -1
- package/dist/src/commands/merge.d.ts.map +1 -1
- package/dist/src/commands/merge.js +3 -4
- package/dist/src/commands/merge.js.map +1 -1
- package/dist/src/commands/search-formatters.d.ts.map +1 -1
- package/dist/src/commands/search-formatters.js +1 -0
- package/dist/src/commands/search-formatters.js.map +1 -1
- package/dist/src/commands/whoami.d.ts +14 -0
- package/dist/src/commands/whoami.d.ts.map +1 -0
- package/dist/src/commands/whoami.js +42 -0
- package/dist/src/commands/whoami.js.map +1 -0
- package/dist/src/commands/whoami.test.d.ts +8 -0
- package/dist/src/commands/whoami.test.d.ts.map +1 -0
- package/dist/src/commands/whoami.test.js +131 -0
- package/dist/src/commands/whoami.test.js.map +1 -0
- package/dist/src/index.js +12 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/templates/mcp-template-handlers.js +1 -1
- package/dist/src/templates/mcp-template-handlers.js.map +1 -1
- package/dist/src/utils/skills-directory.d.ts +25 -0
- package/dist/src/utils/skills-directory.d.ts.map +1 -0
- package/dist/src/utils/skills-directory.js +102 -0
- package/dist/src/utils/skills-directory.js.map +1 -0
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAExE,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;CACvB,CAAC,CAAC,CAAA;AAEH,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;AAElD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,KAAK,UAAU,UAAU,CAAC,OAAiB,EAAE;IAC3C,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAA;IACjC,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;AACnD,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,aAA0C,CAAA;IAC9C,IAAI,cAA2C,CAAA;IAE/C,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACrE,cAAc,GAAG,EAAE;aAChB,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;aACtB,kBAAkB,CAAC,CAAC,IAAyC,EAAE,EAAE;YAChE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QACJ,EAAE,CAAC,aAAa,EAAE,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,WAAW,EAAE,CAAA;QAC3B,cAAc,CAAC,WAAW,EAAE,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC3B,MAAM,CAAC,mBAAmB,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,iBAAiB,CAAC,iBAAiB,CAAC;gBAClC,aAAa,EAAE,KAAK;gBACpB,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,MAAM;aACf,CAAC,CAAA;YAEF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,iBAAiB,CAAC,iBAAiB,CAAC;gBAClC,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,SAAS;aAClB,CAAC,CAAA;YAEF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,iBAAiB,CAAC,iBAAiB,CAAC;gBAClC,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,SAAS;aAClB,CAAC,CAAA;YAEF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,iBAAiB,CAAC,iBAAiB,CAAC;gBAClC,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAA;YAEF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,iBAAiB,CAAC,iBAAiB,CAAC;gBAClC,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,KAAK;aACd,CAAC,CAAA;YAEF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,iBAAiB,CAAC,iBAAiB,CAAC;gBAClC,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAA;YAEF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,iBAAiB,CAAC,iBAAiB,CAAC;gBAClC,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAA;YAEF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
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
|
-
//
|
|
50
|
-
|
|
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
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,
|
|
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":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;
|
|
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.
|
|
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.
|
|
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": {
|