@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.
Files changed (179) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +57 -0
  3. package/bin/clawdhub.js +2 -0
  4. package/bin/gohub.js +2 -0
  5. package/dist/browserAuth.d.ts +20 -0
  6. package/dist/browserAuth.js +156 -0
  7. package/dist/browserAuth.js.map +1 -0
  8. package/dist/browserAuth.test.d.ts +1 -0
  9. package/dist/browserAuth.test.js +83 -0
  10. package/dist/browserAuth.test.js.map +1 -0
  11. package/dist/cli/authToken.d.ts +2 -0
  12. package/dist/cli/authToken.js +13 -0
  13. package/dist/cli/authToken.js.map +1 -0
  14. package/dist/cli/autonomeeConfig.d.ts +1 -0
  15. package/dist/cli/autonomeeConfig.js +2 -0
  16. package/dist/cli/autonomeeConfig.js.map +1 -0
  17. package/dist/cli/buildInfo.d.ts +3 -0
  18. package/dist/cli/buildInfo.js +104 -0
  19. package/dist/cli/buildInfo.js.map +1 -0
  20. package/dist/cli/clawdbotConfig.d.ts +6 -0
  21. package/dist/cli/clawdbotConfig.js +155 -0
  22. package/dist/cli/clawdbotConfig.js.map +1 -0
  23. package/dist/cli/clawdbotConfig.test.d.ts +1 -0
  24. package/dist/cli/clawdbotConfig.test.js +199 -0
  25. package/dist/cli/clawdbotConfig.test.js.map +1 -0
  26. package/dist/cli/commands/auth.d.ts +9 -0
  27. package/dist/cli/commands/auth.js +74 -0
  28. package/dist/cli/commands/auth.js.map +1 -0
  29. package/dist/cli/commands/auth.test.d.ts +1 -0
  30. package/dist/cli/commands/auth.test.js +50 -0
  31. package/dist/cli/commands/auth.test.js.map +1 -0
  32. package/dist/cli/commands/delete.d.ts +28 -0
  33. package/dist/cli/commands/delete.js +94 -0
  34. package/dist/cli/commands/delete.js.map +1 -0
  35. package/dist/cli/commands/delete.test.d.ts +1 -0
  36. package/dist/cli/commands/delete.test.js +61 -0
  37. package/dist/cli/commands/delete.test.js.map +1 -0
  38. package/dist/cli/commands/inspect.d.ts +12 -0
  39. package/dist/cli/commands/inspect.js +281 -0
  40. package/dist/cli/commands/inspect.js.map +1 -0
  41. package/dist/cli/commands/inspect.test.d.ts +1 -0
  42. package/dist/cli/commands/inspect.test.js +151 -0
  43. package/dist/cli/commands/inspect.test.js.map +1 -0
  44. package/dist/cli/commands/moderation.d.ts +19 -0
  45. package/dist/cli/commands/moderation.js +161 -0
  46. package/dist/cli/commands/moderation.js.map +1 -0
  47. package/dist/cli/commands/moderation.test.d.ts +1 -0
  48. package/dist/cli/commands/moderation.test.js +147 -0
  49. package/dist/cli/commands/moderation.test.js.map +1 -0
  50. package/dist/cli/commands/ownership.d.ts +15 -0
  51. package/dist/cli/commands/ownership.js +76 -0
  52. package/dist/cli/commands/ownership.js.map +1 -0
  53. package/dist/cli/commands/ownership.test.d.ts +1 -0
  54. package/dist/cli/commands/ownership.test.js +68 -0
  55. package/dist/cli/commands/ownership.test.js.map +1 -0
  56. package/dist/cli/commands/publish.d.ts +9 -0
  57. package/dist/cli/commands/publish.js +85 -0
  58. package/dist/cli/commands/publish.js.map +1 -0
  59. package/dist/cli/commands/publish.test.d.ts +1 -0
  60. package/dist/cli/commands/publish.test.js +105 -0
  61. package/dist/cli/commands/publish.test.js.map +1 -0
  62. package/dist/cli/commands/skills.d.ts +26 -0
  63. package/dist/cli/commands/skills.js +394 -0
  64. package/dist/cli/commands/skills.js.map +1 -0
  65. package/dist/cli/commands/skills.test.d.ts +1 -0
  66. package/dist/cli/commands/skills.test.js +402 -0
  67. package/dist/cli/commands/skills.test.js.map +1 -0
  68. package/dist/cli/commands/star.d.ts +8 -0
  69. package/dist/cli/commands/star.js +31 -0
  70. package/dist/cli/commands/star.js.map +1 -0
  71. package/dist/cli/commands/sync.d.ts +3 -0
  72. package/dist/cli/commands/sync.js +157 -0
  73. package/dist/cli/commands/sync.js.map +1 -0
  74. package/dist/cli/commands/sync.test.d.ts +1 -0
  75. package/dist/cli/commands/sync.test.js +277 -0
  76. package/dist/cli/commands/sync.test.js.map +1 -0
  77. package/dist/cli/commands/syncHelpers.d.ts +76 -0
  78. package/dist/cli/commands/syncHelpers.js +350 -0
  79. package/dist/cli/commands/syncHelpers.js.map +1 -0
  80. package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
  81. package/dist/cli/commands/syncHelpers.test.js +22 -0
  82. package/dist/cli/commands/syncHelpers.test.js.map +1 -0
  83. package/dist/cli/commands/syncTypes.d.ts +24 -0
  84. package/dist/cli/commands/syncTypes.js +2 -0
  85. package/dist/cli/commands/syncTypes.js.map +1 -0
  86. package/dist/cli/commands/transfer.d.ts +50 -0
  87. package/dist/cli/commands/transfer.js +131 -0
  88. package/dist/cli/commands/transfer.js.map +1 -0
  89. package/dist/cli/commands/transfer.test.d.ts +1 -0
  90. package/dist/cli/commands/transfer.test.js +90 -0
  91. package/dist/cli/commands/transfer.test.js.map +1 -0
  92. package/dist/cli/commands/unstar.d.ts +8 -0
  93. package/dist/cli/commands/unstar.js +31 -0
  94. package/dist/cli/commands/unstar.js.map +1 -0
  95. package/dist/cli/helpStyle.d.ts +13 -0
  96. package/dist/cli/helpStyle.js +38 -0
  97. package/dist/cli/helpStyle.js.map +1 -0
  98. package/dist/cli/registry.d.ts +7 -0
  99. package/dist/cli/registry.js +42 -0
  100. package/dist/cli/registry.js.map +1 -0
  101. package/dist/cli/registry.test.d.ts +1 -0
  102. package/dist/cli/registry.test.js +48 -0
  103. package/dist/cli/registry.test.js.map +1 -0
  104. package/dist/cli/scanSkills.d.ts +7 -0
  105. package/dist/cli/scanSkills.js +91 -0
  106. package/dist/cli/scanSkills.js.map +1 -0
  107. package/dist/cli/scanSkills.test.d.ts +1 -0
  108. package/dist/cli/scanSkills.test.js +62 -0
  109. package/dist/cli/scanSkills.test.js.map +1 -0
  110. package/dist/cli/slug.d.ts +2 -0
  111. package/dist/cli/slug.js +16 -0
  112. package/dist/cli/slug.js.map +1 -0
  113. package/dist/cli/types.d.ts +15 -0
  114. package/dist/cli/types.js +2 -0
  115. package/dist/cli/types.js.map +1 -0
  116. package/dist/cli/ui.d.ts +7 -0
  117. package/dist/cli/ui.js +82 -0
  118. package/dist/cli/ui.js.map +1 -0
  119. package/dist/cli/ui.test.d.ts +1 -0
  120. package/dist/cli/ui.test.js +45 -0
  121. package/dist/cli/ui.test.js.map +1 -0
  122. package/dist/cli.d.ts +2 -0
  123. package/dist/cli.js +419 -0
  124. package/dist/cli.js.map +1 -0
  125. package/dist/config.d.ts +4 -0
  126. package/dist/config.js +77 -0
  127. package/dist/config.js.map +1 -0
  128. package/dist/config.test.d.ts +1 -0
  129. package/dist/config.test.js +56 -0
  130. package/dist/config.test.js.map +1 -0
  131. package/dist/discovery.d.ts +5 -0
  132. package/dist/discovery.js +25 -0
  133. package/dist/discovery.js.map +1 -0
  134. package/dist/discovery.test.d.ts +1 -0
  135. package/dist/discovery.test.js +46 -0
  136. package/dist/discovery.test.js.map +1 -0
  137. package/dist/homedir.d.ts +7 -0
  138. package/dist/homedir.js +29 -0
  139. package/dist/homedir.js.map +1 -0
  140. package/dist/http.bun.test.d.ts +1 -0
  141. package/dist/http.bun.test.js +231 -0
  142. package/dist/http.bun.test.js.map +1 -0
  143. package/dist/http.d.ts +43 -0
  144. package/dist/http.js +498 -0
  145. package/dist/http.js.map +1 -0
  146. package/dist/http.test.d.ts +1 -0
  147. package/dist/http.test.js +322 -0
  148. package/dist/http.test.js.map +1 -0
  149. package/dist/schema/ark.d.ts +4 -0
  150. package/dist/schema/ark.js +26 -0
  151. package/dist/schema/ark.js.map +1 -0
  152. package/dist/schema/index.d.ts +6 -0
  153. package/dist/schema/index.js +6 -0
  154. package/dist/schema/index.js.map +1 -0
  155. package/dist/schema/license.d.ts +4 -0
  156. package/dist/schema/license.js +5 -0
  157. package/dist/schema/license.js.map +1 -0
  158. package/dist/schema/routes.d.ts +22 -0
  159. package/dist/schema/routes.js +23 -0
  160. package/dist/schema/routes.js.map +1 -0
  161. package/dist/schema/schemas.d.ts +353 -0
  162. package/dist/schema/schemas.js +318 -0
  163. package/dist/schema/schemas.js.map +1 -0
  164. package/dist/schema/textFiles.d.ts +5 -0
  165. package/dist/schema/textFiles.js +66 -0
  166. package/dist/schema/textFiles.js.map +1 -0
  167. package/dist/schema/textFiles.test.d.ts +1 -0
  168. package/dist/schema/textFiles.test.js +20 -0
  169. package/dist/schema/textFiles.test.js.map +1 -0
  170. package/dist/skills.d.ts +43 -0
  171. package/dist/skills.js +178 -0
  172. package/dist/skills.js.map +1 -0
  173. package/dist/skills.test.d.ts +1 -0
  174. package/dist/skills.test.js +147 -0
  175. package/dist/skills.test.js.map +1 -0
  176. package/dist/types.d.ts +7 -0
  177. package/dist/types.js +2 -0
  178. package/dist/types.js.map +1 -0
  179. 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,7 @@
1
+ export type SkillFolder = {
2
+ folder: string;
3
+ slug: string;
4
+ displayName: string;
5
+ };
6
+ export declare function findSkillFolders(root: string): Promise<SkillFolder[]>;
7
+ export declare function getFallbackSkillRoots(workdir: string): string[];
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ export declare function sanitizeSlug(value: string): string;
2
+ export declare function titleCase(value: string): string;
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -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;