@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,155 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename, join, resolve } from 'node:path';
3
+ import JSON5 from 'json5';
4
+ import { resolveHome } from '../homedir.js';
5
+ export async function resolveAutonomeeSkillRoots() {
6
+ const roots = [];
7
+ const labels = {};
8
+ const autonomeeStateDir = resolveAutonomeeStateDir();
9
+ const sharedSkills = resolveUserPath(join(autonomeeStateDir, 'skills'));
10
+ pushRoot(roots, labels, sharedSkills, 'Shared skills');
11
+ const legacyStateDir = resolveLegacyStateDir();
12
+ const legacyShared = resolveUserPath(join(legacyStateDir, 'skills'));
13
+ pushRoot(roots, labels, legacyShared, 'Autonomee: Shared skills');
14
+ const [autonomeeConfig, legacyConfig] = await Promise.all([
15
+ readAutonomeeConfig(),
16
+ readLegacyConfig(),
17
+ ]);
18
+ if (!autonomeeConfig && !legacyConfig)
19
+ return { roots, labels };
20
+ if (autonomeeConfig) {
21
+ addConfigRoots(autonomeeConfig, roots, labels);
22
+ }
23
+ if (legacyConfig) {
24
+ addConfigRoots(legacyConfig, roots, labels, 'Autonomee');
25
+ }
26
+ return { roots, labels };
27
+ }
28
+ export async function resolveAutonomeeDefaultWorkspace() {
29
+ const config = await readAutonomeeConfig();
30
+ const legacyConfig = await readLegacyConfig();
31
+ if (!config && !legacyConfig)
32
+ return null;
33
+ const defaultsWorkspace = resolveUserPath(config?.agents?.defaults?.workspace ?? config?.agent?.workspace ?? '');
34
+ if (defaultsWorkspace)
35
+ return defaultsWorkspace;
36
+ const listedAgents = config?.agents?.list ?? [];
37
+ const defaultAgent = listedAgents.find((entry) => entry.default) ?? listedAgents.find((entry) => entry.id === 'main');
38
+ const listWorkspace = resolveUserPath(defaultAgent?.workspace ?? '');
39
+ if (listWorkspace)
40
+ return listWorkspace;
41
+ if (!legacyConfig)
42
+ return null;
43
+ const legacyDefaults = resolveUserPath(legacyConfig.agents?.defaults?.workspace ?? legacyConfig.agent?.workspace ?? '');
44
+ if (legacyDefaults)
45
+ return legacyDefaults;
46
+ const legacyAgents = legacyConfig.agents?.list ?? [];
47
+ const legacyDefaultAgent = legacyAgents.find((entry) => entry.default) ??
48
+ legacyAgents.find((entry) => entry.id === 'main');
49
+ const legacyWorkspace = resolveUserPath(legacyDefaultAgent?.workspace ?? '');
50
+ return legacyWorkspace || null;
51
+ }
52
+ function resolveAutonomeeStateDir() {
53
+ const override = process.env.AUTONOMEE_STATE_DIR?.trim();
54
+ if (override)
55
+ return resolveUserPath(override);
56
+ return join(resolveHome(), '.autonomee');
57
+ }
58
+ function resolveAutonomeeConfigPath() {
59
+ const override = process.env.AUTONOMEE_CONFIG_PATH?.trim();
60
+ if (override)
61
+ return resolveUserPath(override);
62
+ return join(resolveAutonomeeStateDir(), 'autonomee.json');
63
+ }
64
+ function resolveLegacyStateDir() {
65
+ const override = process.env.OPENCLAW_STATE_DIR?.trim();
66
+ if (override)
67
+ return resolveUserPath(override);
68
+ return join(resolveHome(), '.openclaw');
69
+ }
70
+ function resolveLegacyConfigPath() {
71
+ const override = process.env.OPENCLAW_CONFIG_PATH?.trim();
72
+ if (override)
73
+ return resolveUserPath(override);
74
+ return join(resolveLegacyStateDir(), 'openclaw.json');
75
+ }
76
+ function resolveUserPath(input) {
77
+ const trimmed = input.trim();
78
+ if (!trimmed)
79
+ return '';
80
+ if (trimmed.startsWith('~')) {
81
+ return resolve(trimmed.replace(/^~(?=$|[\\/])/, resolveHome()));
82
+ }
83
+ return resolve(trimmed);
84
+ }
85
+ async function readAutonomeeConfig() {
86
+ return readConfigFile(resolveAutonomeeConfigPath());
87
+ }
88
+ async function readLegacyConfig() {
89
+ return readConfigFile(resolveLegacyConfigPath());
90
+ }
91
+ async function readConfigFile(path) {
92
+ try {
93
+ const raw = await readFile(path, 'utf8');
94
+ const parsed = JSON5.parse(raw);
95
+ if (!parsed || typeof parsed !== 'object')
96
+ return null;
97
+ return parsed;
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ function addConfigRoots(config, roots, labels, labelPrefix) {
104
+ const prefix = labelPrefix ? `${labelPrefix}: ` : '';
105
+ const mainWorkspace = resolveUserPath(config.agents?.defaults?.workspace ?? config.agent?.workspace ?? '');
106
+ if (mainWorkspace) {
107
+ pushRoot(roots, labels, join(mainWorkspace, 'skills'), `${prefix}Agent: main`);
108
+ }
109
+ const listedAgents = config.agents?.list ?? [];
110
+ for (const entry of listedAgents) {
111
+ const workspace = resolveUserPath(entry?.workspace ?? '');
112
+ if (!workspace)
113
+ continue;
114
+ const name = entry?.name?.trim() || entry?.id?.trim() || 'agent';
115
+ pushRoot(roots, labels, join(workspace, 'skills'), `${prefix}Agent: ${name}`);
116
+ }
117
+ const agents = config.routing?.agents ?? {};
118
+ for (const [agentId, entry] of Object.entries(agents)) {
119
+ const workspace = resolveUserPath(entry?.workspace ?? '');
120
+ if (!workspace)
121
+ continue;
122
+ const name = entry?.name?.trim() || agentId;
123
+ pushRoot(roots, labels, join(workspace, 'skills'), `${prefix}Agent: ${name}`);
124
+ }
125
+ const extraDirs = config.skills?.load?.extraDirs ?? [];
126
+ for (const dir of extraDirs) {
127
+ const resolved = resolveUserPath(String(dir));
128
+ if (!resolved)
129
+ continue;
130
+ const label = `${prefix}Extra: ${basename(resolved) || resolved}`;
131
+ pushRoot(roots, labels, resolved, label);
132
+ }
133
+ }
134
+ function pushRoot(roots, labels, root, label) {
135
+ const resolved = resolveUserPath(root);
136
+ if (!resolved)
137
+ return;
138
+ if (!roots.includes(resolved))
139
+ roots.push(resolved);
140
+ if (!label)
141
+ return;
142
+ const existing = labels[resolved];
143
+ if (!existing) {
144
+ labels[resolved] = label;
145
+ return;
146
+ }
147
+ const parts = existing
148
+ .split(', ')
149
+ .map((part) => part.trim())
150
+ .filter(Boolean);
151
+ if (parts.includes(label))
152
+ return;
153
+ labels[resolved] = `${existing}, ${label}`;
154
+ }
155
+ //# sourceMappingURL=clawdbotConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawdbotConfig.js","sourceRoot":"","sources":["../../src/cli/clawdbotConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,199 @@
1
+ /* @vitest-environment node */
2
+ import { mkdir, mkdtemp, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { afterEach, describe, expect, it } from 'vitest';
6
+ import { resolveHome } from '../homedir.js';
7
+ import { resolveAutonomeeDefaultWorkspace, resolveAutonomeeSkillRoots } from './autonomeeConfig.js';
8
+ const originalEnv = { ...process.env };
9
+ afterEach(() => {
10
+ process.env = { ...originalEnv };
11
+ });
12
+ describe('resolveAutonomeeSkillRoots', () => {
13
+ it('reads JSON5 config and resolves per-agent + shared skill roots', async () => {
14
+ const base = await mkdtemp(join(tmpdir(), 'gohub-autonomee-'));
15
+ const home = join(base, 'home');
16
+ const stateDir = join(base, 'state');
17
+ const configPath = join(base, 'autonomee.json');
18
+ const autonomeeStateDir = join(base, 'autonomee-state');
19
+ process.env.HOME = home;
20
+ process.env.CLAWDBOT_STATE_DIR = stateDir;
21
+ process.env.CLAWDBOT_CONFIG_PATH = configPath;
22
+ process.env.OPENCLAW_STATE_DIR = autonomeeStateDir;
23
+ process.env.OPENCLAW_CONFIG_PATH = join(autonomeeStateDir, 'autonomee.json');
24
+ const config = `{
25
+ // JSON5 comments + trailing commas supported
26
+ agents: {
27
+ defaults: { workspace: '~/clawd-main', },
28
+ list: [
29
+ { id: 'work', name: 'Work Bot', workspace: '~/clawd-work', },
30
+ { id: 'family', workspace: '~/clawd-family', },
31
+ ],
32
+ },
33
+ // legacy entries still supported
34
+ agent: { workspace: '~/clawd-legacy', },
35
+ routing: {
36
+ agents: {
37
+ work: { name: 'Work Bot', workspace: '~/clawd-work', },
38
+ family: { workspace: '~/clawd-family' },
39
+ },
40
+ },
41
+ skills: {
42
+ load: { extraDirs: ['~/shared/skills', '/opt/skills',], },
43
+ },
44
+ }`;
45
+ await writeFile(configPath, config, 'utf8');
46
+ const { roots, labels } = await resolveAutonomeeSkillRoots();
47
+ const expectedRoots = [
48
+ resolve(stateDir, 'skills'),
49
+ resolve(autonomeeStateDir, 'skills'),
50
+ resolve(home, 'clawd-main', 'skills'),
51
+ resolve(home, 'clawd-work', 'skills'),
52
+ resolve(home, 'clawd-family', 'skills'),
53
+ resolve(home, 'shared', 'skills'),
54
+ resolve('/opt/skills'),
55
+ ];
56
+ expect(roots).toEqual(expect.arrayContaining(expectedRoots));
57
+ expect(labels[resolve(stateDir, 'skills')]).toBe('Shared skills');
58
+ expect(labels[resolve(autonomeeStateDir, 'skills')]).toBe('Autonomee: Shared skills');
59
+ expect(labels[resolve(home, 'clawd-main', 'skills')]).toBe('Agent: main');
60
+ expect(labels[resolve(home, 'clawd-work', 'skills')]).toBe('Agent: Work Bot');
61
+ expect(labels[resolve(home, 'clawd-family', 'skills')]).toBe('Agent: family');
62
+ expect(labels[resolve(home, 'shared', 'skills')]).toBe('Extra: skills');
63
+ expect(labels[resolve('/opt/skills')]).toBe('Extra: skills');
64
+ });
65
+ it('resolves default workspace from agents.defaults and agents.list', async () => {
66
+ const base = await mkdtemp(join(tmpdir(), 'gohub-autonomee-default-'));
67
+ const home = join(base, 'home');
68
+ const stateDir = join(base, 'state');
69
+ const configPath = join(base, 'autonomee.json');
70
+ const workspaceMain = join(base, 'workspace-main');
71
+ const workspaceList = join(base, 'workspace-list');
72
+ const autonomeeStateDir = join(base, 'autonomee-state');
73
+ process.env.HOME = home;
74
+ process.env.CLAWDBOT_STATE_DIR = stateDir;
75
+ process.env.CLAWDBOT_CONFIG_PATH = configPath;
76
+ process.env.OPENCLAW_STATE_DIR = autonomeeStateDir;
77
+ process.env.OPENCLAW_CONFIG_PATH = join(autonomeeStateDir, 'autonomee.json');
78
+ const config = `{
79
+ agents: {
80
+ defaults: { workspace: "${workspaceMain}", },
81
+ list: [
82
+ { id: 'main', workspace: "${workspaceList}", default: true },
83
+ ],
84
+ },
85
+ }`;
86
+ await writeFile(configPath, config, 'utf8');
87
+ const workspace = await resolveAutonomeeDefaultWorkspace();
88
+ expect(workspace).toBe(resolve(workspaceMain));
89
+ });
90
+ it('falls back to default agent in agents.list when defaults missing', async () => {
91
+ const base = await mkdtemp(join(tmpdir(), 'gohub-autonomee-list-'));
92
+ const home = join(base, 'home');
93
+ const configPath = join(base, 'autonomee.json');
94
+ const workspaceMain = join(base, 'workspace-main');
95
+ const workspaceWork = join(base, 'workspace-work');
96
+ const autonomeeStateDir = join(base, 'autonomee-state');
97
+ process.env.HOME = home;
98
+ process.env.CLAWDBOT_CONFIG_PATH = configPath;
99
+ process.env.OPENCLAW_STATE_DIR = autonomeeStateDir;
100
+ process.env.OPENCLAW_CONFIG_PATH = join(autonomeeStateDir, 'autonomee.json');
101
+ const config = `{
102
+ agents: {
103
+ list: [
104
+ { id: 'main', workspace: "${workspaceMain}", default: true },
105
+ { id: 'work', workspace: "${workspaceWork}" },
106
+ ],
107
+ },
108
+ }`;
109
+ await writeFile(configPath, config, 'utf8');
110
+ const workspace = await resolveAutonomeeDefaultWorkspace();
111
+ expect(workspace).toBe(resolve(workspaceMain));
112
+ });
113
+ it('respects CLAWDBOT_STATE_DIR and CLAWDBOT_CONFIG_PATH overrides', async () => {
114
+ const base = await mkdtemp(join(tmpdir(), 'gohub-autonomee-override-'));
115
+ const home = join(base, 'home');
116
+ const stateDir = join(base, 'custom-state');
117
+ const configPath = join(base, 'config', 'autonomee.json');
118
+ const autonomeeStateDir = join(base, 'autonomee-state');
119
+ process.env.HOME = home;
120
+ process.env.CLAWDBOT_STATE_DIR = stateDir;
121
+ process.env.CLAWDBOT_CONFIG_PATH = configPath;
122
+ process.env.OPENCLAW_STATE_DIR = autonomeeStateDir;
123
+ process.env.OPENCLAW_CONFIG_PATH = join(autonomeeStateDir, 'autonomee.json');
124
+ const config = `{
125
+ agent: { workspace: "${join(base, 'workspace-main')}" },
126
+ }`;
127
+ await mkdir(join(base, 'config'), { recursive: true });
128
+ await writeFile(configPath, config, 'utf8');
129
+ const { roots, labels } = await resolveAutonomeeSkillRoots();
130
+ expect(roots).toEqual(expect.arrayContaining([
131
+ resolve(stateDir, 'skills'),
132
+ resolve(autonomeeStateDir, 'skills'),
133
+ resolve(join(base, 'workspace-main'), 'skills'),
134
+ ]));
135
+ expect(labels[resolve(stateDir, 'skills')]).toBe('Shared skills');
136
+ expect(labels[resolve(autonomeeStateDir, 'skills')]).toBe('Autonomee: Shared skills');
137
+ expect(labels[resolve(join(base, 'workspace-main'), 'skills')]).toBe('Agent: main');
138
+ });
139
+ it('returns shared skills root when config is missing', async () => {
140
+ const base = await mkdtemp(join(tmpdir(), 'gohub-autonomee-missing-'));
141
+ const stateDir = join(base, 'state');
142
+ const configPath = join(base, 'missing', 'autonomee.json');
143
+ const autonomeeStateDir = join(base, 'autonomee-state');
144
+ process.env.CLAWDBOT_STATE_DIR = stateDir;
145
+ process.env.CLAWDBOT_CONFIG_PATH = configPath;
146
+ process.env.OPENCLAW_STATE_DIR = autonomeeStateDir;
147
+ process.env.OPENCLAW_CONFIG_PATH = join(autonomeeStateDir, 'autonomee.json');
148
+ const { roots, labels } = await resolveAutonomeeSkillRoots();
149
+ expect(roots).toEqual([resolve(stateDir, 'skills'), resolve(autonomeeStateDir, 'skills')]);
150
+ expect(labels[resolve(stateDir, 'skills')]).toBe('Shared skills');
151
+ expect(labels[resolve(autonomeeStateDir, 'skills')]).toBe('Autonomee: Shared skills');
152
+ });
153
+ it('uses $HOME over os.homedir() for tilde expansion', async () => {
154
+ const base = await mkdtemp(join(tmpdir(), 'gohub-home-override-'));
155
+ const customHome = join(base, 'custom-home');
156
+ const stateDir = join(base, 'state');
157
+ const configPath = join(base, 'autonomee.json');
158
+ const autonomeeStateDir = join(base, 'autonomee-state');
159
+ process.env.HOME = customHome;
160
+ process.env.CLAWDBOT_STATE_DIR = stateDir;
161
+ process.env.CLAWDBOT_CONFIG_PATH = configPath;
162
+ process.env.OPENCLAW_STATE_DIR = autonomeeStateDir;
163
+ process.env.OPENCLAW_CONFIG_PATH = join(autonomeeStateDir, 'autonomee.json');
164
+ const config = `{
165
+ agents: {
166
+ defaults: { workspace: "~/my-workspace" },
167
+ },
168
+ }`;
169
+ await writeFile(configPath, config, 'utf8');
170
+ const workspace = await resolveAutonomeeDefaultWorkspace();
171
+ expect(workspace).toBe(resolve(customHome, 'my-workspace'));
172
+ expect(resolveHome()).toBe(customHome);
173
+ });
174
+ it('normalizes trailing separators in $HOME', async () => {
175
+ const base = await mkdtemp(join(tmpdir(), 'gohub-home-trailing-'));
176
+ const customHome = join(base, 'custom-home');
177
+ process.env.HOME = `${customHome}/`;
178
+ expect(resolveHome()).toBe(customHome);
179
+ });
180
+ it('supports Autonomee configuration files', async () => {
181
+ const base = await mkdtemp(join(tmpdir(), 'gohub-autonomee-'));
182
+ const stateDir = join(base, 'autonomee-state');
183
+ const workspace = join(base, 'autonomee-main');
184
+ const configPath = join(stateDir, 'autonomee.json');
185
+ process.env.OPENCLAW_STATE_DIR = stateDir;
186
+ await mkdir(stateDir, { recursive: true });
187
+ const config = `{
188
+ agents: {
189
+ defaults: { workspace: "${workspace}", },
190
+ },
191
+ }`;
192
+ await writeFile(configPath, config, 'utf8');
193
+ const { roots, labels } = await resolveAutonomeeSkillRoots();
194
+ expect(roots).toEqual(expect.arrayContaining([resolve(stateDir, 'skills'), resolve(workspace, 'skills')]));
195
+ expect(labels[resolve(stateDir, 'skills')]).toBe('Autonomee: Shared skills');
196
+ expect(labels[resolve(workspace, 'skills')]).toBe('Autonomee: Agent: main');
197
+ });
198
+ });
199
+ //# sourceMappingURL=clawdbotConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawdbotConfig.test.js","sourceRoot":"","sources":["../../src/cli/clawdbotConfig.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { GlobalOpts } from '../types.js';
2
+ export declare function cmdLoginFlow(opts: GlobalOpts, options: {
3
+ token?: string;
4
+ label?: string;
5
+ browser?: boolean;
6
+ }, inputAllowed: boolean): Promise<void>;
7
+ export declare function cmdLogin(opts: GlobalOpts, tokenFlag: string | undefined, inputAllowed: boolean): Promise<void>;
8
+ export declare function cmdLogout(opts: GlobalOpts): Promise<void>;
9
+ export declare function cmdWhoami(opts: GlobalOpts): Promise<void>;
@@ -0,0 +1,74 @@
1
+ import { buildCliAuthUrl, startLoopbackAuthServer } from '../../browserAuth.js';
2
+ import { readGlobalConfig, writeGlobalConfig } from '../../config.js';
3
+ import { discoverRegistryFromSite } from '../../discovery.js';
4
+ import { apiRequest } from '../../http.js';
5
+ import { ApiRoutes, ApiV1WhoamiResponseSchema } from '../../schema/index.js';
6
+ import { requireAuthToken } from '../authToken.js';
7
+ import { getRegistry } from '../registry.js';
8
+ import { createSpinner, fail, formatError, openInBrowser, promptHidden } from '../ui.js';
9
+ export async function cmdLoginFlow(opts, options, inputAllowed) {
10
+ if (options.token) {
11
+ await cmdLogin(opts, options.token, inputAllowed);
12
+ return;
13
+ }
14
+ if (options.browser === false) {
15
+ fail('Token required (use --token or remove --no-browser)');
16
+ }
17
+ const label = String(options.label ?? 'CLI token').trim() || 'CLI token';
18
+ const receiver = await startLoopbackAuthServer();
19
+ const discovery = await discoverRegistryFromSite(opts.site).catch(() => null);
20
+ const authBase = discovery?.authBase?.trim() || opts.site;
21
+ const authUrl = buildCliAuthUrl({
22
+ siteUrl: authBase,
23
+ redirectUri: receiver.redirectUri,
24
+ label,
25
+ state: receiver.state,
26
+ });
27
+ console.log(`Opening browser: ${authUrl}`);
28
+ openInBrowser(authUrl);
29
+ const result = await receiver.waitForResult();
30
+ const registry = result.registry?.trim() || opts.registry;
31
+ const registrySource = result.registry?.trim() ? 'cli' : opts.registrySource;
32
+ await cmdLogin({ ...opts, registry, registrySource }, result.token, inputAllowed);
33
+ }
34
+ export async function cmdLogin(opts, tokenFlag, inputAllowed) {
35
+ if (!tokenFlag && !inputAllowed)
36
+ fail('Token required (use --token or remove --no-input)');
37
+ const token = tokenFlag || (await promptHidden('Go Hub token: '));
38
+ if (!token)
39
+ fail('Token required');
40
+ const registry = await getRegistry(opts, { cache: true });
41
+ const spinner = createSpinner('Verifying token');
42
+ try {
43
+ const whoami = await apiRequest(registry, { method: 'GET', path: ApiRoutes.whoami, token }, ApiV1WhoamiResponseSchema);
44
+ if (!whoami.user)
45
+ fail('Login failed');
46
+ await writeGlobalConfig({ registry, token });
47
+ const handle = whoami.user.handle ? `@${whoami.user.handle}` : 'unknown user';
48
+ spinner.succeed(`OK. Logged in as ${handle}.`);
49
+ }
50
+ catch (error) {
51
+ spinner.fail(formatError(error));
52
+ throw error;
53
+ }
54
+ }
55
+ export async function cmdLogout(opts) {
56
+ const cfg = await readGlobalConfig();
57
+ const registry = cfg?.registry || (await getRegistry(opts, { cache: true }));
58
+ await writeGlobalConfig({ registry, token: undefined });
59
+ console.log('OK. Logged out locally. Token still valid until revoked (Settings -> API tokens).');
60
+ }
61
+ export async function cmdWhoami(opts) {
62
+ const token = await requireAuthToken();
63
+ const registry = await getRegistry(opts, { cache: true });
64
+ const spinner = createSpinner('Checking token');
65
+ try {
66
+ const whoami = await apiRequest(registry, { method: 'GET', path: ApiRoutes.whoami, token }, ApiV1WhoamiResponseSchema);
67
+ spinner.succeed(whoami.user.handle ?? 'unknown');
68
+ }
69
+ catch (error) {
70
+ spinner.fail(formatError(error));
71
+ throw error;
72
+ }
73
+ }
74
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ /* @vitest-environment node */
2
+ import { afterEach, describe, expect, it, vi } from 'vitest';
3
+ const mockReadGlobalConfig = vi.fn(async () => null);
4
+ const mockWriteGlobalConfig = vi.fn(async (_cfg) => { });
5
+ vi.mock('../../config.js', () => ({
6
+ readGlobalConfig: () => mockReadGlobalConfig(),
7
+ writeGlobalConfig: (cfg) => mockWriteGlobalConfig(cfg),
8
+ }));
9
+ const mockGetRegistry = vi.fn(async () => 'https://gohub.ai');
10
+ vi.mock('../registry.js', () => ({
11
+ getRegistry: () => mockGetRegistry(),
12
+ }));
13
+ const { cmdLogout } = await import('./auth');
14
+ const mockLog = vi.spyOn(console, 'log').mockImplementation(() => { });
15
+ function makeOpts() {
16
+ return {
17
+ workdir: '/work',
18
+ dir: '/work/skills',
19
+ site: 'https://gohub.ai',
20
+ registry: 'https://gohub.ai',
21
+ registrySource: 'default',
22
+ };
23
+ }
24
+ afterEach(() => {
25
+ vi.clearAllMocks();
26
+ mockLog.mockClear();
27
+ });
28
+ describe('cmdLogout', () => {
29
+ it('removes token and logs a clear message', async () => {
30
+ mockReadGlobalConfig.mockResolvedValueOnce({ registry: 'https://gohub.ai', token: 'tkn' });
31
+ await cmdLogout(makeOpts());
32
+ expect(mockWriteGlobalConfig).toHaveBeenCalledWith({
33
+ registry: 'https://gohub.ai',
34
+ token: undefined,
35
+ });
36
+ expect(mockGetRegistry).not.toHaveBeenCalled();
37
+ expect(mockLog).toHaveBeenCalledWith('OK. Logged out locally. Token still valid until revoked (Settings -> API tokens).');
38
+ });
39
+ it('falls back to resolved registry when config has no registry', async () => {
40
+ mockReadGlobalConfig.mockResolvedValueOnce({ token: 'tkn' });
41
+ mockGetRegistry.mockResolvedValueOnce('https://registry.example');
42
+ await cmdLogout(makeOpts());
43
+ expect(mockGetRegistry).toHaveBeenCalled();
44
+ expect(mockWriteGlobalConfig).toHaveBeenCalledWith({
45
+ registry: 'https://registry.example',
46
+ token: undefined,
47
+ });
48
+ });
49
+ });
50
+ //# sourceMappingURL=auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.test.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG5D,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAoD,CAAC,CAAA;AACpG,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;AAChE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,gBAAgB,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE;IAC9C,iBAAiB,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC;CAChE,CAAC,CAAC,CAAA;AAEH,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAA;AAC7D,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE;CACrC,CAAC,CAAC,CAAA;AAEH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;AAE5C,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAErE,SAAS,QAAQ;IACf,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,kBAAkB;QAC5B,cAAc,EAAE,SAAS;KAC1B,CAAA;AACH,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAA;IAClB,OAAO,CAAC,SAAS,EAAE,CAAA;AACrB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,oBAAoB,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAE1F,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QAE3B,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC;YACjD,QAAQ,EAAE,kBAAkB;YAC5B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAA;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,mFAAmF,CACpF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,oBAAoB,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5D,eAAe,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,CAAA;QAEjE,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QAE3B,MAAM,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,CAAA;QAC1C,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC;YACjD,QAAQ,EAAE,0BAA0B;YACpC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ import type { GlobalOpts } from '../types.js';
2
+ type SkillActionLabels = {
3
+ verb: string;
4
+ progress: string;
5
+ past: string;
6
+ promptSuffix?: string;
7
+ };
8
+ export declare function cmdDeleteSkill(opts: GlobalOpts, slugArg: string, options: {
9
+ yes?: boolean;
10
+ }, inputAllowed: boolean, labels?: SkillActionLabels): Promise<{
11
+ ok: true;
12
+ } | undefined>;
13
+ export declare function cmdUndeleteSkill(opts: GlobalOpts, slugArg: string, options: {
14
+ yes?: boolean;
15
+ }, inputAllowed: boolean, labels?: SkillActionLabels): Promise<{
16
+ ok: true;
17
+ } | undefined>;
18
+ export declare function cmdHideSkill(opts: GlobalOpts, slugArg: string, options: {
19
+ yes?: boolean;
20
+ }, inputAllowed: boolean): Promise<{
21
+ ok: true;
22
+ } | undefined>;
23
+ export declare function cmdUnhideSkill(opts: GlobalOpts, slugArg: string, options: {
24
+ yes?: boolean;
25
+ }, inputAllowed: boolean): Promise<{
26
+ ok: true;
27
+ } | undefined>;
28
+ export {};