@autonomee/gohub 0.8.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/LICENSE +22 -0
- package/README.md +57 -0
- package/bin/clawdhub.js +2 -0
- package/bin/gohub.js +2 -0
- package/dist/browserAuth.d.ts +20 -0
- package/dist/browserAuth.js +156 -0
- package/dist/browserAuth.js.map +1 -0
- package/dist/browserAuth.test.d.ts +1 -0
- package/dist/browserAuth.test.js +83 -0
- package/dist/browserAuth.test.js.map +1 -0
- package/dist/cli/authToken.d.ts +2 -0
- package/dist/cli/authToken.js +13 -0
- package/dist/cli/authToken.js.map +1 -0
- package/dist/cli/autonomeeConfig.d.ts +1 -0
- package/dist/cli/autonomeeConfig.js +2 -0
- package/dist/cli/autonomeeConfig.js.map +1 -0
- package/dist/cli/buildInfo.d.ts +3 -0
- package/dist/cli/buildInfo.js +104 -0
- package/dist/cli/buildInfo.js.map +1 -0
- package/dist/cli/clawdbotConfig.d.ts +6 -0
- package/dist/cli/clawdbotConfig.js +155 -0
- package/dist/cli/clawdbotConfig.js.map +1 -0
- package/dist/cli/clawdbotConfig.test.d.ts +1 -0
- package/dist/cli/clawdbotConfig.test.js +199 -0
- package/dist/cli/clawdbotConfig.test.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +9 -0
- package/dist/cli/commands/auth.js +74 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/auth.test.d.ts +1 -0
- package/dist/cli/commands/auth.test.js +50 -0
- package/dist/cli/commands/auth.test.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +28 -0
- package/dist/cli/commands/delete.js +94 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/delete.test.d.ts +1 -0
- package/dist/cli/commands/delete.test.js +61 -0
- package/dist/cli/commands/delete.test.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +12 -0
- package/dist/cli/commands/inspect.js +281 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/inspect.test.d.ts +1 -0
- package/dist/cli/commands/inspect.test.js +151 -0
- package/dist/cli/commands/inspect.test.js.map +1 -0
- package/dist/cli/commands/moderation.d.ts +19 -0
- package/dist/cli/commands/moderation.js +161 -0
- package/dist/cli/commands/moderation.js.map +1 -0
- package/dist/cli/commands/moderation.test.d.ts +1 -0
- package/dist/cli/commands/moderation.test.js +147 -0
- package/dist/cli/commands/moderation.test.js.map +1 -0
- package/dist/cli/commands/ownership.d.ts +15 -0
- package/dist/cli/commands/ownership.js +76 -0
- package/dist/cli/commands/ownership.js.map +1 -0
- package/dist/cli/commands/ownership.test.d.ts +1 -0
- package/dist/cli/commands/ownership.test.js +68 -0
- package/dist/cli/commands/ownership.test.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +9 -0
- package/dist/cli/commands/publish.js +85 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/publish.test.d.ts +1 -0
- package/dist/cli/commands/publish.test.js +105 -0
- package/dist/cli/commands/publish.test.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +26 -0
- package/dist/cli/commands/skills.js +394 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/skills.test.d.ts +1 -0
- package/dist/cli/commands/skills.test.js +402 -0
- package/dist/cli/commands/skills.test.js.map +1 -0
- package/dist/cli/commands/star.d.ts +8 -0
- package/dist/cli/commands/star.js +31 -0
- package/dist/cli/commands/star.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.js +157 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/sync.test.d.ts +1 -0
- package/dist/cli/commands/sync.test.js +277 -0
- package/dist/cli/commands/sync.test.js.map +1 -0
- package/dist/cli/commands/syncHelpers.d.ts +76 -0
- package/dist/cli/commands/syncHelpers.js +350 -0
- package/dist/cli/commands/syncHelpers.js.map +1 -0
- package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
- package/dist/cli/commands/syncHelpers.test.js +22 -0
- package/dist/cli/commands/syncHelpers.test.js.map +1 -0
- package/dist/cli/commands/syncTypes.d.ts +24 -0
- package/dist/cli/commands/syncTypes.js +2 -0
- package/dist/cli/commands/syncTypes.js.map +1 -0
- package/dist/cli/commands/transfer.d.ts +50 -0
- package/dist/cli/commands/transfer.js +131 -0
- package/dist/cli/commands/transfer.js.map +1 -0
- package/dist/cli/commands/transfer.test.d.ts +1 -0
- package/dist/cli/commands/transfer.test.js +90 -0
- package/dist/cli/commands/transfer.test.js.map +1 -0
- package/dist/cli/commands/unstar.d.ts +8 -0
- package/dist/cli/commands/unstar.js +31 -0
- package/dist/cli/commands/unstar.js.map +1 -0
- package/dist/cli/helpStyle.d.ts +13 -0
- package/dist/cli/helpStyle.js +38 -0
- package/dist/cli/helpStyle.js.map +1 -0
- package/dist/cli/registry.d.ts +7 -0
- package/dist/cli/registry.js +42 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/registry.test.d.ts +1 -0
- package/dist/cli/registry.test.js +48 -0
- package/dist/cli/registry.test.js.map +1 -0
- package/dist/cli/scanSkills.d.ts +7 -0
- package/dist/cli/scanSkills.js +91 -0
- package/dist/cli/scanSkills.js.map +1 -0
- package/dist/cli/scanSkills.test.d.ts +1 -0
- package/dist/cli/scanSkills.test.js +62 -0
- package/dist/cli/scanSkills.test.js.map +1 -0
- package/dist/cli/slug.d.ts +2 -0
- package/dist/cli/slug.js +16 -0
- package/dist/cli/slug.js.map +1 -0
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/ui.d.ts +7 -0
- package/dist/cli/ui.js +82 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli/ui.test.d.ts +1 -0
- package/dist/cli/ui.test.js +45 -0
- package/dist/cli/ui.test.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +419 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +77 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +1 -0
- package/dist/config.test.js +56 -0
- package/dist/config.test.js.map +1 -0
- package/dist/discovery.d.ts +5 -0
- package/dist/discovery.js +25 -0
- package/dist/discovery.js.map +1 -0
- package/dist/discovery.test.d.ts +1 -0
- package/dist/discovery.test.js +46 -0
- package/dist/discovery.test.js.map +1 -0
- package/dist/homedir.d.ts +7 -0
- package/dist/homedir.js +29 -0
- package/dist/homedir.js.map +1 -0
- package/dist/http.bun.test.d.ts +1 -0
- package/dist/http.bun.test.js +231 -0
- package/dist/http.bun.test.js.map +1 -0
- package/dist/http.d.ts +43 -0
- package/dist/http.js +498 -0
- package/dist/http.js.map +1 -0
- package/dist/http.test.d.ts +1 -0
- package/dist/http.test.js +322 -0
- package/dist/http.test.js.map +1 -0
- package/dist/schema/ark.d.ts +4 -0
- package/dist/schema/ark.js +26 -0
- package/dist/schema/ark.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/license.d.ts +4 -0
- package/dist/schema/license.js +5 -0
- package/dist/schema/license.js.map +1 -0
- package/dist/schema/routes.d.ts +22 -0
- package/dist/schema/routes.js +23 -0
- package/dist/schema/routes.js.map +1 -0
- package/dist/schema/schemas.d.ts +353 -0
- package/dist/schema/schemas.js +318 -0
- package/dist/schema/schemas.js.map +1 -0
- package/dist/schema/textFiles.d.ts +5 -0
- package/dist/schema/textFiles.js +66 -0
- package/dist/schema/textFiles.js.map +1 -0
- package/dist/schema/textFiles.test.d.ts +1 -0
- package/dist/schema/textFiles.test.js +20 -0
- package/dist/schema/textFiles.test.js.map +1 -0
- package/dist/skills.d.ts +43 -0
- package/dist/skills.js +178 -0
- package/dist/skills.js.map +1 -0
- package/dist/skills.test.d.ts +1 -0
- package/dist/skills.test.js +147 -0
- package/dist/skills.test.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
vi.mock('../authToken.js', () => ({
|
|
4
|
+
requireAuthToken: vi.fn(async () => 'tkn'),
|
|
5
|
+
}));
|
|
6
|
+
vi.mock('../registry.js', () => ({
|
|
7
|
+
getRegistry: vi.fn(async () => 'https://gohub.ai'),
|
|
8
|
+
}));
|
|
9
|
+
const mockApiRequest = vi.fn();
|
|
10
|
+
vi.mock('../../http.js', () => ({
|
|
11
|
+
apiRequest: (registry, args, schema) => mockApiRequest(registry, args, schema),
|
|
12
|
+
}));
|
|
13
|
+
vi.mock('../ui.js', () => ({
|
|
14
|
+
createSpinner: vi.fn(() => ({ succeed: vi.fn(), fail: vi.fn(), stop: vi.fn() })),
|
|
15
|
+
fail: (message) => {
|
|
16
|
+
throw new Error(message);
|
|
17
|
+
},
|
|
18
|
+
formatError: (error) => (error instanceof Error ? error.message : String(error)),
|
|
19
|
+
isInteractive: () => false,
|
|
20
|
+
promptConfirm: vi.fn(async () => true),
|
|
21
|
+
}));
|
|
22
|
+
const { cmdTransferAccept, cmdTransferCancel, cmdTransferList, cmdTransferReject, cmdTransferRequest, } = await import('./transfer');
|
|
23
|
+
function makeOpts() {
|
|
24
|
+
return {
|
|
25
|
+
workdir: '/work',
|
|
26
|
+
dir: '/work/skills',
|
|
27
|
+
site: 'https://gohub.ai',
|
|
28
|
+
registry: 'https://gohub.ai',
|
|
29
|
+
registrySource: 'default',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const consoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
vi.clearAllMocks();
|
|
35
|
+
});
|
|
36
|
+
describe('transfer commands', () => {
|
|
37
|
+
it('request requires --yes when input is disabled', async () => {
|
|
38
|
+
await expect(cmdTransferRequest(makeOpts(), 'demo', '@alice', {}, false)).rejects.toThrow(/--yes/i);
|
|
39
|
+
});
|
|
40
|
+
it('request calls transfer endpoint', async () => {
|
|
41
|
+
mockApiRequest.mockResolvedValueOnce({
|
|
42
|
+
ok: true,
|
|
43
|
+
transferId: 'skillOwnershipTransfers:1',
|
|
44
|
+
toUserHandle: 'alice',
|
|
45
|
+
expiresAt: Date.now() + 10_000,
|
|
46
|
+
});
|
|
47
|
+
await cmdTransferRequest(makeOpts(), 'Demo', '@Alice', { yes: true, message: 'Please take over' }, false);
|
|
48
|
+
expect(mockApiRequest).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
|
|
49
|
+
method: 'POST',
|
|
50
|
+
path: '/api/v1/skills/demo/transfer',
|
|
51
|
+
}), expect.anything());
|
|
52
|
+
const requestArgs = mockApiRequest.mock.calls[0]?.[1];
|
|
53
|
+
expect(requestArgs.body).toContain('"toUserHandle":"alice"');
|
|
54
|
+
});
|
|
55
|
+
it('list calls incoming transfers endpoint', async () => {
|
|
56
|
+
mockApiRequest.mockResolvedValueOnce({
|
|
57
|
+
transfers: [],
|
|
58
|
+
});
|
|
59
|
+
await cmdTransferList(makeOpts(), {});
|
|
60
|
+
expect(mockApiRequest).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
|
|
61
|
+
method: 'GET',
|
|
62
|
+
path: '/api/v1/transfers/incoming',
|
|
63
|
+
}), expect.anything());
|
|
64
|
+
expect(consoleLog).toHaveBeenCalledWith('No incoming transfers.');
|
|
65
|
+
});
|
|
66
|
+
it('list supports outgoing endpoint', async () => {
|
|
67
|
+
mockApiRequest.mockResolvedValueOnce({
|
|
68
|
+
transfers: [],
|
|
69
|
+
});
|
|
70
|
+
await cmdTransferList(makeOpts(), { outgoing: true });
|
|
71
|
+
expect(mockApiRequest).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
|
|
72
|
+
method: 'GET',
|
|
73
|
+
path: '/api/v1/transfers/outgoing',
|
|
74
|
+
}), expect.anything());
|
|
75
|
+
expect(consoleLog).toHaveBeenCalledWith('No outgoing transfers.');
|
|
76
|
+
});
|
|
77
|
+
it('accept/reject/cancel call action endpoints', async () => {
|
|
78
|
+
mockApiRequest.mockResolvedValue({
|
|
79
|
+
ok: true,
|
|
80
|
+
skillSlug: 'demo',
|
|
81
|
+
});
|
|
82
|
+
await cmdTransferAccept(makeOpts(), 'demo', { yes: true }, false);
|
|
83
|
+
await cmdTransferReject(makeOpts(), 'demo', { yes: true }, false);
|
|
84
|
+
await cmdTransferCancel(makeOpts(), 'demo', { yes: true }, false);
|
|
85
|
+
expect(mockApiRequest).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({ method: 'POST', path: '/api/v1/skills/demo/transfer/accept' }), expect.anything());
|
|
86
|
+
expect(mockApiRequest).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({ method: 'POST', path: '/api/v1/skills/demo/transfer/reject' }), expect.anything());
|
|
87
|
+
expect(mockApiRequest).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({ method: 'POST', path: '/api/v1/skills/demo/transfer/cancel' }), expect.anything());
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=transfer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.test.js","sourceRoot":"","sources":["../../../src/cli/commands/transfer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GlobalOpts } from '../types.js';
|
|
2
|
+
export declare function cmdUnstarSkill(opts: GlobalOpts, slugArg: string, options: {
|
|
3
|
+
yes?: boolean;
|
|
4
|
+
}, inputAllowed: boolean): Promise<{
|
|
5
|
+
ok: true;
|
|
6
|
+
unstarred: boolean;
|
|
7
|
+
alreadyUnstarred: boolean;
|
|
8
|
+
} | undefined>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { apiRequest } from '../../http.js';
|
|
2
|
+
import { ApiRoutes, ApiV1UnstarResponseSchema } from '../../schema/index.js';
|
|
3
|
+
import { requireAuthToken } from '../authToken.js';
|
|
4
|
+
import { getRegistry } from '../registry.js';
|
|
5
|
+
import { createSpinner, fail, formatError, isInteractive, promptConfirm } from '../ui.js';
|
|
6
|
+
export async function cmdUnstarSkill(opts, slugArg, options, inputAllowed) {
|
|
7
|
+
const slug = slugArg.trim().toLowerCase();
|
|
8
|
+
if (!slug)
|
|
9
|
+
fail('Slug required');
|
|
10
|
+
const allowPrompt = isInteractive() && inputAllowed !== false;
|
|
11
|
+
if (!options.yes) {
|
|
12
|
+
if (!allowPrompt)
|
|
13
|
+
fail('Pass --yes (no input)');
|
|
14
|
+
const ok = await promptConfirm(`Unstar ${slug}?`);
|
|
15
|
+
if (!ok)
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const token = await requireAuthToken();
|
|
19
|
+
const registry = await getRegistry(opts, { cache: true });
|
|
20
|
+
const spinner = createSpinner(`Unstarring ${slug}`);
|
|
21
|
+
try {
|
|
22
|
+
const result = await apiRequest(registry, { method: 'DELETE', path: `${ApiRoutes.stars}/${encodeURIComponent(slug)}`, token }, ApiV1UnstarResponseSchema);
|
|
23
|
+
spinner.succeed(result.alreadyUnstarred ? `OK. ${slug} already unstarred.` : `OK. Unstarred ${slug}`);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
spinner.fail(formatError(error));
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=unstar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unstar.js","sourceRoot":"","sources":["../../../src/cli/commands/unstar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAEzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAgB,EAChB,OAAe,EACf,OAA0B,EAC1B,YAAqB;IAErB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACzC,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,eAAe,CAAC,CAAA;IAChC,MAAM,WAAW,GAAG,aAAa,EAAE,IAAI,YAAY,KAAK,KAAK,CAAA;IAE7D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC/C,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,UAAU,IAAI,GAAG,CAAC,CAAA;QACjD,IAAI,CAAC,EAAE;YAAE,OAAM;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACtC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,IAAI,EAAE,CAAC,CAAA;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,QAAQ,EACR,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EACnF,yBAAyB,CAC1B,CAAA;QACD,OAAO,CAAC,OAAO,CACb,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE,CACrF,CAAA;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function styleTitle(value: string): string;
|
|
2
|
+
export declare function configureCommanderHelp(program: {
|
|
3
|
+
configureHelp: (config: {
|
|
4
|
+
sectionTitle?: (title: string) => string;
|
|
5
|
+
optionTerm?: (option: {
|
|
6
|
+
flags: string;
|
|
7
|
+
}) => string;
|
|
8
|
+
commandTerm?: (cmd: {
|
|
9
|
+
name: () => string;
|
|
10
|
+
}) => string;
|
|
11
|
+
}) => unknown;
|
|
12
|
+
}): void;
|
|
13
|
+
export declare function styleEnvBlock(value: string): string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
function wrap(start, end = '\x1b[0m') {
|
|
2
|
+
return (value) => `${start}${value}${end}`;
|
|
3
|
+
}
|
|
4
|
+
const ansi = {
|
|
5
|
+
reset: '\x1b[0m',
|
|
6
|
+
bold: wrap('\x1b[1m'),
|
|
7
|
+
dim: wrap('\x1b[2m'),
|
|
8
|
+
cyan: wrap('\x1b[36m'),
|
|
9
|
+
green: wrap('\x1b[32m'),
|
|
10
|
+
yellow: wrap('\x1b[33m'),
|
|
11
|
+
};
|
|
12
|
+
function isColorEnabled() {
|
|
13
|
+
if (!process.stdout.isTTY)
|
|
14
|
+
return false;
|
|
15
|
+
if (process.env.NO_COLOR)
|
|
16
|
+
return false;
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
export function styleTitle(value) {
|
|
20
|
+
if (!isColorEnabled())
|
|
21
|
+
return value;
|
|
22
|
+
return `${ansi.bold(ansi.cyan(value))}${ansi.reset}`;
|
|
23
|
+
}
|
|
24
|
+
export function configureCommanderHelp(program) {
|
|
25
|
+
if (!isColorEnabled())
|
|
26
|
+
return;
|
|
27
|
+
program.configureHelp({
|
|
28
|
+
sectionTitle: (title) => ansi.bold(ansi.cyan(title)),
|
|
29
|
+
optionTerm: (option) => ansi.yellow(option.flags),
|
|
30
|
+
commandTerm: (cmd) => ansi.green(cmd.name()),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export function styleEnvBlock(value) {
|
|
34
|
+
if (!isColorEnabled())
|
|
35
|
+
return value;
|
|
36
|
+
return `${ansi.dim(value)}${ansi.reset}`;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=helpStyle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpStyle.js","sourceRoot":"","sources":["../../src/cli/helpStyle.ts"],"names":[],"mappings":"AAEA,SAAS,IAAI,CAAC,KAAa,EAAE,GAAG,GAAG,SAAS;IAC1C,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,EAAE,CAAA;AAC5C,CAAC;AAED,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;IACrB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;IACtB,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;IACvB,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC;CACzB,CAAA;AAED,SAAS,cAAc;IACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAA;IACtC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,KAAK,CAAA;IACnC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAMtC;IACC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAM;IAC7B,OAAO,CAAC,aAAa,CAAC;QACpB,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QACjD,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;KAC7C,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,KAAK,CAAA;IACnC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GlobalOpts } from './types.js';
|
|
2
|
+
export declare const DEFAULT_SITE = "https://hub.autonomee.ai";
|
|
3
|
+
export declare const DEFAULT_REGISTRY = "https://hub.autonomee.ai";
|
|
4
|
+
export declare function resolveRegistry(opts: GlobalOpts): Promise<string>;
|
|
5
|
+
export declare function getRegistry(opts: GlobalOpts, params?: {
|
|
6
|
+
cache?: boolean;
|
|
7
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readGlobalConfig, writeGlobalConfig } from '../config.js';
|
|
2
|
+
import { discoverRegistryFromSite } from '../discovery.js';
|
|
3
|
+
export const DEFAULT_SITE = 'https://hub.autonomee.ai';
|
|
4
|
+
export const DEFAULT_REGISTRY = 'https://hub.autonomee.ai';
|
|
5
|
+
const LEGACY_REGISTRY_HOSTS = new Set(['auth.clawdhub.com', 'auth.clawhub.com', 'auth.clawhub.ai', 'clawhub.ai']);
|
|
6
|
+
export async function resolveRegistry(opts) {
|
|
7
|
+
const explicit = opts.registrySource !== 'default' ? opts.registry.trim() : '';
|
|
8
|
+
if (explicit)
|
|
9
|
+
return explicit;
|
|
10
|
+
const discovery = await discoverRegistryFromSite(opts.site).catch(() => null);
|
|
11
|
+
const discovered = discovery?.apiBase?.trim();
|
|
12
|
+
if (discovered)
|
|
13
|
+
return discovered;
|
|
14
|
+
const cfg = await readGlobalConfig();
|
|
15
|
+
const cached = cfg?.registry?.trim();
|
|
16
|
+
if (cached && !isLegacyRegistry(cached))
|
|
17
|
+
return cached;
|
|
18
|
+
return DEFAULT_REGISTRY;
|
|
19
|
+
}
|
|
20
|
+
export async function getRegistry(opts, params) {
|
|
21
|
+
const cache = params?.cache !== false;
|
|
22
|
+
const registry = await resolveRegistry(opts);
|
|
23
|
+
if (!cache)
|
|
24
|
+
return registry;
|
|
25
|
+
const cfg = await readGlobalConfig();
|
|
26
|
+
const cached = cfg?.registry?.trim();
|
|
27
|
+
const shouldUpdate = !cached ||
|
|
28
|
+
isLegacyRegistry(cached) ||
|
|
29
|
+
(cached === DEFAULT_REGISTRY && registry !== DEFAULT_REGISTRY);
|
|
30
|
+
if (shouldUpdate)
|
|
31
|
+
await writeGlobalConfig({ registry, token: cfg?.token });
|
|
32
|
+
return registry;
|
|
33
|
+
}
|
|
34
|
+
function isLegacyRegistry(registry) {
|
|
35
|
+
try {
|
|
36
|
+
return LEGACY_REGISTRY_HOSTS.has(new URL(registry).hostname);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAG1D,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAA;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAA;AAC1D,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAA;AAEjH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAgB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC7E,MAAM,UAAU,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IAEjC,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACpC,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IACtD,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB,EAAE,MAA4B;IAC9E,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,KAAK,KAAK,CAAA;IACrC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAA;IAC3B,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACpC,MAAM,YAAY,GAChB,CAAC,MAAM;QACP,gBAAgB,CAAC,MAAM,CAAC;QACxB,CAAC,MAAM,KAAK,gBAAgB,IAAI,QAAQ,KAAK,gBAAgB,CAAC,CAAA;IAChE,IAAI,YAAY;QAAE,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1E,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAA;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
const readGlobalConfig = vi.fn();
|
|
4
|
+
const writeGlobalConfig = vi.fn();
|
|
5
|
+
const discoverRegistryFromSite = vi.fn();
|
|
6
|
+
vi.mock('../config.js', () => ({
|
|
7
|
+
readGlobalConfig: (...args) => readGlobalConfig(...args),
|
|
8
|
+
writeGlobalConfig: (...args) => writeGlobalConfig(...args),
|
|
9
|
+
}));
|
|
10
|
+
vi.mock('../discovery.js', () => ({
|
|
11
|
+
discoverRegistryFromSite: (...args) => discoverRegistryFromSite(...args),
|
|
12
|
+
}));
|
|
13
|
+
const { DEFAULT_REGISTRY, getRegistry, resolveRegistry } = await import('./registry');
|
|
14
|
+
function makeOpts(overrides = {}) {
|
|
15
|
+
return {
|
|
16
|
+
workdir: '/work',
|
|
17
|
+
dir: '/work/skills',
|
|
18
|
+
site: 'https://gohub.ai',
|
|
19
|
+
registry: DEFAULT_REGISTRY,
|
|
20
|
+
registrySource: 'default',
|
|
21
|
+
...overrides,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
readGlobalConfig.mockReset();
|
|
26
|
+
writeGlobalConfig.mockReset();
|
|
27
|
+
discoverRegistryFromSite.mockReset();
|
|
28
|
+
});
|
|
29
|
+
describe('registry resolution', () => {
|
|
30
|
+
it('prefers explicit registry over discovery/cache', async () => {
|
|
31
|
+
readGlobalConfig.mockResolvedValue({ registry: 'https://auth.gohub.com' });
|
|
32
|
+
discoverRegistryFromSite.mockResolvedValue({ apiBase: 'https://gohub.ai' });
|
|
33
|
+
const registry = await resolveRegistry(makeOpts({ registry: 'https://custom.example', registrySource: 'cli' }));
|
|
34
|
+
expect(registry).toBe('https://custom.example');
|
|
35
|
+
expect(discoverRegistryFromSite).not.toHaveBeenCalled();
|
|
36
|
+
});
|
|
37
|
+
it('ignores legacy registry and updates cache from discovery', async () => {
|
|
38
|
+
readGlobalConfig.mockResolvedValue({ registry: 'https://auth.gohub.com', token: 'tkn' });
|
|
39
|
+
discoverRegistryFromSite.mockResolvedValue({ apiBase: 'https://gohub.ai' });
|
|
40
|
+
const registry = await getRegistry(makeOpts(), { cache: true });
|
|
41
|
+
expect(registry).toBe('https://gohub.ai');
|
|
42
|
+
expect(writeGlobalConfig).toHaveBeenCalledWith({
|
|
43
|
+
registry: 'https://gohub.ai',
|
|
44
|
+
token: 'tkn',
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/cli/registry.test.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG7D,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AAChC,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AACjC,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AAExC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,gBAAgB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACnE,iBAAiB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;CACtE,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,wBAAwB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;CACpF,CAAC,CAAC,CAAA;AAEH,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;AAErF,SAAS,QAAQ,CAAC,YAAiC,EAAE;IACnD,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,gBAAgB;QAC1B,cAAc,EAAE,SAAS;QACzB,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,gBAAgB,CAAC,SAAS,EAAE,CAAA;IAC5B,iBAAiB,CAAC,SAAS,EAAE,CAAA;IAC7B,wBAAwB,CAAC,SAAS,EAAE,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,CAAA;QAC1E,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAA;QAE3E,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,QAAQ,CAAC,EAAE,QAAQ,EAAE,wBAAwB,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CACxE,CAAA;QAED,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QAC/C,MAAM,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACxF,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAA;QAE3E,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAE/D,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACzC,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC;YAC7C,QAAQ,EAAE,kBAAkB;YAC5B,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { basename, join, resolve } from 'node:path';
|
|
3
|
+
import { resolveHome } from '../homedir.js';
|
|
4
|
+
import { sanitizeSlug, titleCase } from './slug.js';
|
|
5
|
+
export async function findSkillFolders(root) {
|
|
6
|
+
const absRoot = resolve(root);
|
|
7
|
+
const rootStat = await stat(absRoot).catch(() => null);
|
|
8
|
+
if (!rootStat || !rootStat.isDirectory())
|
|
9
|
+
return [];
|
|
10
|
+
const direct = await isSkillFolder(absRoot);
|
|
11
|
+
if (direct)
|
|
12
|
+
return [direct];
|
|
13
|
+
const entries = await readdir(absRoot, { withFileTypes: true }).catch(() => []);
|
|
14
|
+
const folders = entries
|
|
15
|
+
.filter((entry) => entry.isDirectory())
|
|
16
|
+
.map((entry) => join(absRoot, entry.name));
|
|
17
|
+
const results = [];
|
|
18
|
+
for (const folder of folders) {
|
|
19
|
+
const found = await isSkillFolder(folder);
|
|
20
|
+
if (found)
|
|
21
|
+
results.push(found);
|
|
22
|
+
}
|
|
23
|
+
return results.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
24
|
+
}
|
|
25
|
+
export function getFallbackSkillRoots(workdir) {
|
|
26
|
+
const home = resolveHome();
|
|
27
|
+
const roots = [
|
|
28
|
+
// adjacent repo installs
|
|
29
|
+
resolve(workdir, '..', 'autonomee', 'skills'),
|
|
30
|
+
resolve(workdir, '..', 'autonomee', 'Skills'),
|
|
31
|
+
resolve(workdir, '..', 'autonomee', 'skills'),
|
|
32
|
+
resolve(workdir, '..', 'autonomee', 'Skills'),
|
|
33
|
+
resolve(workdir, '..', 'autonomee', 'skills'),
|
|
34
|
+
resolve(workdir, '..', 'autonomee', 'Skills'),
|
|
35
|
+
resolve(workdir, '..', 'moltbot', 'skills'),
|
|
36
|
+
resolve(workdir, '..', 'moltbot', 'Skills'),
|
|
37
|
+
// legacy locations
|
|
38
|
+
resolve(home, 'clawd', 'skills'),
|
|
39
|
+
resolve(home, 'clawd', 'Skills'),
|
|
40
|
+
resolve(home, '.clawd', 'skills'),
|
|
41
|
+
resolve(home, '.clawd', 'Skills'),
|
|
42
|
+
resolve(home, 'autonomee', 'skills'),
|
|
43
|
+
resolve(home, 'autonomee', 'Skills'),
|
|
44
|
+
resolve(home, '.autonomee', 'skills'),
|
|
45
|
+
resolve(home, '.autonomee', 'Skills'),
|
|
46
|
+
resolve(home, 'autonomee', 'skills'),
|
|
47
|
+
resolve(home, 'autonomee', 'Skills'),
|
|
48
|
+
resolve(home, '.autonomee', 'skills'),
|
|
49
|
+
resolve(home, '.autonomee', 'Skills'),
|
|
50
|
+
resolve(home, 'autonomee', 'skills'),
|
|
51
|
+
resolve(home, 'autonomee', 'Skills'),
|
|
52
|
+
resolve(home, '.autonomee', 'skills'),
|
|
53
|
+
resolve(home, '.autonomee', 'Skills'),
|
|
54
|
+
resolve(home, 'moltbot', 'skills'),
|
|
55
|
+
resolve(home, 'moltbot', 'Skills'),
|
|
56
|
+
resolve(home, '.moltbot', 'skills'),
|
|
57
|
+
resolve(home, '.moltbot', 'Skills'),
|
|
58
|
+
// macOS App Support legacy
|
|
59
|
+
resolve(home, 'Library', 'Application Support', 'autonomee', 'skills'),
|
|
60
|
+
resolve(home, 'Library', 'Application Support', 'autonomee', 'Skills'),
|
|
61
|
+
resolve(home, 'Library', 'Application Support', 'autonomee', 'skills'),
|
|
62
|
+
resolve(home, 'Library', 'Application Support', 'autonomee', 'Skills'),
|
|
63
|
+
resolve(home, 'Library', 'Application Support', 'autonomee', 'skills'),
|
|
64
|
+
resolve(home, 'Library', 'Application Support', 'autonomee', 'Skills'),
|
|
65
|
+
resolve(home, 'Library', 'Application Support', 'moltbot', 'skills'),
|
|
66
|
+
resolve(home, 'Library', 'Application Support', 'moltbot', 'Skills'),
|
|
67
|
+
];
|
|
68
|
+
return Array.from(new Set(roots));
|
|
69
|
+
}
|
|
70
|
+
async function isSkillFolder(folder) {
|
|
71
|
+
const marker = await findSkillMarker(folder);
|
|
72
|
+
if (!marker)
|
|
73
|
+
return null;
|
|
74
|
+
const base = basename(folder);
|
|
75
|
+
const slug = sanitizeSlug(base);
|
|
76
|
+
if (!slug)
|
|
77
|
+
return null;
|
|
78
|
+
const displayName = titleCase(base);
|
|
79
|
+
return { folder, slug, displayName };
|
|
80
|
+
}
|
|
81
|
+
async function findSkillMarker(folder) {
|
|
82
|
+
const candidates = ['SKILL.md', 'skill.md'];
|
|
83
|
+
for (const name of candidates) {
|
|
84
|
+
const path = join(folder, name);
|
|
85
|
+
const st = await stat(path).catch(() => null);
|
|
86
|
+
if (st?.isFile())
|
|
87
|
+
return path;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=scanSkills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanSkills.js","sourceRoot":"","sources":["../../src/cli/scanSkills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { findSkillFolders, getFallbackSkillRoots } from './scanSkills';
|
|
7
|
+
async function makeTmpDir() {
|
|
8
|
+
return mkdtemp(join(tmpdir(), 'gohub-scan-'));
|
|
9
|
+
}
|
|
10
|
+
describe('scanSkills', () => {
|
|
11
|
+
it('detects a single skill folder (root contains SKILL.md)', async () => {
|
|
12
|
+
const root = await makeTmpDir();
|
|
13
|
+
try {
|
|
14
|
+
await writeFile(join(root, 'SKILL.md'), '# Skill\n', 'utf8');
|
|
15
|
+
const found = await findSkillFolders(root);
|
|
16
|
+
expect(found).toHaveLength(1);
|
|
17
|
+
expect(found[0]?.folder).toBe(resolve(root));
|
|
18
|
+
expect(found[0]?.slug).toBeTruthy();
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
await rm(root, { recursive: true, force: true });
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
it('detects skills in a skills directory (subfolders)', async () => {
|
|
25
|
+
const root = await makeTmpDir();
|
|
26
|
+
try {
|
|
27
|
+
const skillsDir = join(root, 'skills');
|
|
28
|
+
const folder = join(skillsDir, 'cool-skill');
|
|
29
|
+
await mkdir(folder, { recursive: true });
|
|
30
|
+
await writeFile(join(folder, 'SKILL.md'), '# Skill\n', 'utf8');
|
|
31
|
+
const found = await findSkillFolders(skillsDir);
|
|
32
|
+
expect(found).toHaveLength(1);
|
|
33
|
+
expect(found[0]?.slug).toBe('cool-skill');
|
|
34
|
+
expect(found[0]?.folder).toBe(resolve(folder));
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
await rm(root, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
it('ignores plural skills.md marker files', async () => {
|
|
41
|
+
const root = await makeTmpDir();
|
|
42
|
+
try {
|
|
43
|
+
const folder = join(root, 'docs');
|
|
44
|
+
await mkdir(folder, { recursive: true });
|
|
45
|
+
await writeFile(join(folder, 'skills.md'), '# Docs\n', 'utf8');
|
|
46
|
+
const found = await findSkillFolders(root);
|
|
47
|
+
expect(found).toHaveLength(0);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
await rm(root, { recursive: true, force: true });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it('includes known legacy roots', () => {
|
|
54
|
+
const roots = getFallbackSkillRoots('/tmp/anywhere');
|
|
55
|
+
expect(roots.some((p) => p.endsWith('/autonomee/skills'))).toBe(true);
|
|
56
|
+
expect(roots.some((p) => p.endsWith('/clawd/skills'))).toBe(true);
|
|
57
|
+
expect(roots.some((p) => p.endsWith('/autonomee/skills'))).toBe(true);
|
|
58
|
+
expect(roots.some((p) => p.endsWith('/autonomee/skills'))).toBe(true);
|
|
59
|
+
expect(roots.some((p) => p.endsWith('/moltbot/skills'))).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=scanSkills.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanSkills.test.js","sourceRoot":"","sources":["../../src/cli/scanSkills.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/slug.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function sanitizeSlug(value) {
|
|
2
|
+
const raw = value
|
|
3
|
+
.trim()
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/[^a-z0-9-]+/g, '-');
|
|
6
|
+
const cleaned = raw.replace(/^-+/, '').replace(/-+$/, '').replace(/--+/g, '-');
|
|
7
|
+
return cleaned;
|
|
8
|
+
}
|
|
9
|
+
export function titleCase(value) {
|
|
10
|
+
return value
|
|
11
|
+
.trim()
|
|
12
|
+
.replace(/[-_]+/g, ' ')
|
|
13
|
+
.replace(/\s+/g, ' ')
|
|
14
|
+
.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/cli/slug.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,GAAG,GAAG,KAAK;SACd,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9E,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type GlobalOpts = {
|
|
2
|
+
workdir: string;
|
|
3
|
+
dir: string;
|
|
4
|
+
site: string;
|
|
5
|
+
registry: string;
|
|
6
|
+
registrySource: 'cli' | 'env' | 'default';
|
|
7
|
+
};
|
|
8
|
+
export type ResolveResult = {
|
|
9
|
+
match: {
|
|
10
|
+
version: string;
|
|
11
|
+
} | null;
|
|
12
|
+
latestVersion: {
|
|
13
|
+
version: string;
|
|
14
|
+
} | null;
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
|
package/dist/cli/ui.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function promptHidden(prompt: string): Promise<string>;
|
|
2
|
+
export declare function promptConfirm(prompt: string): Promise<boolean>;
|
|
3
|
+
export declare function openInBrowser(url: string): void;
|
|
4
|
+
export declare function isInteractive(): boolean;
|
|
5
|
+
export declare function createSpinner(text: string): import("ora").Ora;
|
|
6
|
+
export declare function formatError(error: unknown): string;
|
|
7
|
+
export declare function fail(message: string): never;
|