@lobu/cli 3.0.3 → 3.0.5

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 (113) hide show
  1. package/README.md +18 -222
  2. package/dist/api/context.d.ts +20 -0
  3. package/dist/api/context.d.ts.map +1 -0
  4. package/dist/api/context.js +113 -0
  5. package/dist/api/context.js.map +1 -0
  6. package/dist/api/credentials.d.ts +9 -4
  7. package/dist/api/credentials.d.ts.map +1 -1
  8. package/dist/api/credentials.js +127 -15
  9. package/dist/api/credentials.js.map +1 -1
  10. package/dist/commands/chat.d.ts +16 -0
  11. package/dist/commands/chat.d.ts.map +1 -0
  12. package/dist/commands/chat.js +281 -0
  13. package/dist/commands/chat.js.map +1 -0
  14. package/dist/commands/context.d.ts +8 -0
  15. package/dist/commands/context.d.ts.map +1 -0
  16. package/dist/commands/context.js +46 -0
  17. package/dist/commands/context.js.map +1 -0
  18. package/dist/commands/dev.d.ts +3 -9
  19. package/dist/commands/dev.d.ts.map +1 -1
  20. package/dist/commands/dev.js +95 -64
  21. package/dist/commands/dev.js.map +1 -1
  22. package/dist/commands/init.d.ts.map +1 -1
  23. package/dist/commands/init.js +421 -673
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/commands/login.d.ts +2 -0
  26. package/dist/commands/login.d.ts.map +1 -1
  27. package/dist/commands/login.js +283 -14
  28. package/dist/commands/login.js.map +1 -1
  29. package/dist/commands/logout.d.ts +3 -1
  30. package/dist/commands/logout.d.ts.map +1 -1
  31. package/dist/commands/logout.js +5 -3
  32. package/dist/commands/logout.js.map +1 -1
  33. package/dist/commands/providers/add.d.ts.map +1 -1
  34. package/dist/commands/providers/add.js +38 -14
  35. package/dist/commands/providers/add.js.map +1 -1
  36. package/dist/commands/providers/list.d.ts.map +1 -1
  37. package/dist/commands/providers/list.js +4 -2
  38. package/dist/commands/providers/list.js.map +1 -1
  39. package/dist/commands/skills/add.d.ts.map +1 -1
  40. package/dist/commands/skills/add.js +25 -7
  41. package/dist/commands/skills/add.js.map +1 -1
  42. package/dist/commands/skills/info.d.ts.map +1 -1
  43. package/dist/commands/skills/info.js +0 -9
  44. package/dist/commands/skills/info.js.map +1 -1
  45. package/dist/commands/skills/list.d.ts.map +1 -1
  46. package/dist/commands/skills/list.js +5 -6
  47. package/dist/commands/skills/list.js.map +1 -1
  48. package/dist/commands/skills/registry.d.ts +6 -11
  49. package/dist/commands/skills/registry.d.ts.map +1 -1
  50. package/dist/commands/skills/registry.js +0 -3
  51. package/dist/commands/skills/registry.js.map +1 -1
  52. package/dist/commands/skills/search.d.ts.map +1 -1
  53. package/dist/commands/skills/search.js +3 -1
  54. package/dist/commands/skills/search.js.map +1 -1
  55. package/dist/commands/status.d.ts +1 -1
  56. package/dist/commands/status.d.ts.map +1 -1
  57. package/dist/commands/status.js +107 -4
  58. package/dist/commands/status.js.map +1 -1
  59. package/dist/commands/validate.d.ts.map +1 -1
  60. package/dist/commands/validate.js +9 -20
  61. package/dist/commands/validate.js.map +1 -1
  62. package/dist/commands/whoami.d.ts +3 -1
  63. package/dist/commands/whoami.d.ts.map +1 -1
  64. package/dist/commands/whoami.js +17 -3
  65. package/dist/commands/whoami.js.map +1 -1
  66. package/dist/config/loader.d.ts.map +1 -1
  67. package/dist/config/loader.js.map +1 -1
  68. package/dist/config/schema.d.ts +546 -111
  69. package/dist/config/schema.d.ts.map +1 -1
  70. package/dist/config/schema.js +26 -19
  71. package/dist/config/schema.js.map +1 -1
  72. package/dist/index.d.ts +0 -4
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +60 -25
  75. package/dist/index.js.map +1 -1
  76. package/dist/utils/markdown.d.ts +3 -0
  77. package/dist/utils/markdown.d.ts.map +1 -0
  78. package/dist/utils/markdown.js +10 -0
  79. package/dist/utils/markdown.js.map +1 -0
  80. package/package.json +4 -3
  81. package/dist/api/client.d.ts +0 -11
  82. package/dist/api/client.d.ts.map +0 -1
  83. package/dist/api/client.js +0 -35
  84. package/dist/api/client.js.map +0 -1
  85. package/dist/commands/launch.d.ts +0 -6
  86. package/dist/commands/launch.d.ts.map +0 -1
  87. package/dist/commands/launch.js +0 -32
  88. package/dist/commands/launch.js.map +0 -1
  89. package/dist/config/transformer.d.ts +0 -11
  90. package/dist/config/transformer.d.ts.map +0 -1
  91. package/dist/config/transformer.js +0 -49
  92. package/dist/config/transformer.js.map +0 -1
  93. package/dist/mcp-servers.d.ts +0 -11
  94. package/dist/mcp-servers.d.ts.map +0 -1
  95. package/dist/mcp-servers.js +0 -27
  96. package/dist/mcp-servers.js.map +0 -1
  97. package/dist/mcp-servers.json +0 -216
  98. package/dist/system-skills.json +0 -561
  99. package/dist/templates/.env.tmpl +0 -29
  100. package/dist/templates/.gitignore.tmpl +0 -32
  101. package/dist/templates/AGENTS.md.tmpl +0 -1
  102. package/dist/templates/Dockerfile.worker.tmpl +0 -29
  103. package/dist/templates/README.md.tmpl +0 -95
  104. package/dist/templates/TESTING.md.tmpl +0 -225
  105. package/dist/templates/lobu.toml.tmpl +0 -44
  106. package/dist/types.d.ts +0 -76
  107. package/dist/types.d.ts.map +0 -1
  108. package/dist/types.js +0 -2
  109. package/dist/types.js.map +0 -1
  110. package/dist/utils/config.d.ts +0 -2
  111. package/dist/utils/config.d.ts.map +0 -1
  112. package/dist/utils/config.js +0 -13
  113. package/dist/utils/config.js.map +0 -1
@@ -0,0 +1,281 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import chalk from "chalk";
4
+ import { getToken } from "../api/credentials.js";
5
+ import { isLoadError, loadConfig } from "../config/loader.js";
6
+ import { renderMarkdown } from "../utils/markdown.js";
7
+ /**
8
+ * `lobu chat "prompt"` — send a prompt to an agent and stream the response.
9
+ *
10
+ * Without --user: API mode — creates a session, sends message, streams to terminal.
11
+ * With --user platform:id: Platform mode — sends through Telegram/Slack, response
12
+ * appears on the platform. Terminal shows the streamed response too.
13
+ */
14
+ export async function chatCommand(cwd, prompt, options) {
15
+ const gatewayUrl = (options.gateway ?? (await resolveGatewayUrl(cwd))).replace(/\/$/, "");
16
+ const authToken = (await getToken()) ?? process.env.ADMIN_PASSWORD;
17
+ if (!authToken) {
18
+ console.error(chalk.red("\n Authentication required. Run `lobu login` or set ADMIN_PASSWORD.\n"));
19
+ process.exit(1);
20
+ }
21
+ const agentId = options.agent ?? (await resolveAgentId(cwd));
22
+ // Parse --user flag: "telegram:12345" → { platform: "telegram", userId: "12345" }
23
+ const platformUser = options.user ? parsePlatformUser(options.user) : null;
24
+ if (platformUser) {
25
+ // Platform mode: route through Telegram/Slack
26
+ await sendViaPlatform(gatewayUrl, authToken, {
27
+ agentId,
28
+ platform: platformUser.platform,
29
+ userId: platformUser.userId,
30
+ message: prompt,
31
+ thread: options.thread,
32
+ });
33
+ }
34
+ else {
35
+ // API mode: create session, send message, stream response
36
+ await sendViaApi(gatewayUrl, authToken, {
37
+ agentId,
38
+ message: prompt,
39
+ thread: options.thread,
40
+ dryRun: options.dryRun,
41
+ forceNew: options.new,
42
+ });
43
+ }
44
+ }
45
+ function parsePlatformUser(user) {
46
+ const colonIndex = user.indexOf(":");
47
+ if (colonIndex === -1) {
48
+ // No platform prefix — use as plain userId in API mode
49
+ return null;
50
+ }
51
+ return {
52
+ platform: user.slice(0, colonIndex),
53
+ userId: user.slice(colonIndex + 1),
54
+ };
55
+ }
56
+ /**
57
+ * Platform mode: send message through Telegram/Slack via /api/v1/agents/{agentId}/messages.
58
+ * The response appears on the platform AND streams to terminal via eventsUrl.
59
+ */
60
+ async function sendViaPlatform(gatewayUrl, authToken, opts) {
61
+ const agentId = opts.agentId || `test-${opts.platform}`;
62
+ const body = {
63
+ platform: opts.platform,
64
+ content: opts.message,
65
+ };
66
+ // Platform-specific routing
67
+ if (opts.platform === "telegram") {
68
+ body.telegram = { chatId: opts.userId };
69
+ }
70
+ else if (opts.platform === "slack") {
71
+ body.slack = {
72
+ channel: opts.userId,
73
+ thread: opts.thread,
74
+ };
75
+ }
76
+ else if (opts.platform === "discord") {
77
+ body.discord = { channelId: opts.userId };
78
+ }
79
+ const res = await fetch(`${gatewayUrl}/api/v1/agents/${encodeURIComponent(agentId)}/messages`, {
80
+ method: "POST",
81
+ headers: {
82
+ "Content-Type": "application/json",
83
+ Authorization: `Bearer ${authToken}`,
84
+ },
85
+ body: JSON.stringify(body),
86
+ });
87
+ if (!res.ok) {
88
+ const resBody = await res.text().catch(() => "");
89
+ console.error(chalk.red(`\n Failed to send message (${res.status}): ${resBody}\n`));
90
+ process.exit(1);
91
+ }
92
+ const result = (await res.json());
93
+ if (result.eventsUrl) {
94
+ // Stream the response from the agent
95
+ const sseUrl = result.eventsUrl.startsWith("http")
96
+ ? result.eventsUrl
97
+ : `${gatewayUrl}${result.eventsUrl}`;
98
+ const sseController = new AbortController();
99
+ await streamResponse(sseUrl, authToken, sseController);
100
+ }
101
+ else {
102
+ console.log(chalk.dim(` Message sent via ${opts.platform}. Response will appear on the platform.\n`));
103
+ }
104
+ }
105
+ /**
106
+ * API mode: create session, send message, stream response to terminal.
107
+ */
108
+ async function sendViaApi(gatewayUrl, authToken, opts) {
109
+ const createBody = {};
110
+ if (opts.agentId)
111
+ createBody.agentId = opts.agentId;
112
+ if (opts.thread)
113
+ createBody.thread = opts.thread;
114
+ if (opts.dryRun)
115
+ createBody.dryRun = true;
116
+ if (opts.forceNew)
117
+ createBody.forceNew = true;
118
+ const createRes = await fetch(`${gatewayUrl}/api/v1/agents`, {
119
+ method: "POST",
120
+ headers: {
121
+ "Content-Type": "application/json",
122
+ Authorization: `Bearer ${authToken}`,
123
+ },
124
+ body: JSON.stringify(createBody),
125
+ });
126
+ if (!createRes.ok) {
127
+ const body = await createRes.text().catch(() => "");
128
+ if (createRes.status === 401) {
129
+ console.error(chalk.red("\n Authentication required. Run `lobu login` or set ADMIN_PASSWORD.\n"));
130
+ process.exit(1);
131
+ }
132
+ console.error(chalk.red(`\n Failed to create session (${createRes.status}): ${body}\n`));
133
+ process.exit(1);
134
+ }
135
+ const session = (await createRes.json());
136
+ const base = `${gatewayUrl}/api/v1/agents/${session.agentId}`;
137
+ const sseUrl = `${base}/events`;
138
+ const messagesUrl = `${base}/messages`;
139
+ const sseController = new AbortController();
140
+ const streaming = streamResponse(sseUrl, session.token, sseController);
141
+ const msgRes = await fetch(messagesUrl, {
142
+ method: "POST",
143
+ headers: {
144
+ "Content-Type": "application/json",
145
+ Authorization: `Bearer ${session.token}`,
146
+ },
147
+ body: JSON.stringify({ content: opts.message }),
148
+ });
149
+ if (!msgRes.ok) {
150
+ sseController.abort();
151
+ const body = await msgRes.text().catch(() => "");
152
+ console.error(chalk.red(`\n Failed to send message (${msgRes.status}): ${body}\n`));
153
+ process.exit(1);
154
+ }
155
+ await streaming;
156
+ }
157
+ async function resolveAgentId(cwd) {
158
+ const result = await loadConfig(cwd);
159
+ if (isLoadError(result))
160
+ return undefined;
161
+ const ids = Object.keys(result.config.agents);
162
+ return ids[0];
163
+ }
164
+ async function streamResponse(sseUrl, token, controller) {
165
+ const OVERALL_TIMEOUT_MS = 5 * 60 * 1000;
166
+ const IDLE_TIMEOUT_MS = 60 * 1000;
167
+ const overallTimer = setTimeout(() => controller.abort(), OVERALL_TIMEOUT_MS);
168
+ let idleTimer = setTimeout(() => controller.abort(), IDLE_TIMEOUT_MS);
169
+ const resetIdleTimer = () => {
170
+ clearTimeout(idleTimer);
171
+ idleTimer = setTimeout(() => controller.abort(), IDLE_TIMEOUT_MS);
172
+ };
173
+ try {
174
+ const res = await fetch(sseUrl, {
175
+ headers: { Authorization: `Bearer ${token}` },
176
+ signal: controller.signal,
177
+ });
178
+ if (!res.ok || !res.body) {
179
+ console.error(chalk.red(`\n SSE connection failed (${res.status})\n`));
180
+ process.exit(1);
181
+ }
182
+ const reader = res.body.getReader();
183
+ const decoder = new TextDecoder();
184
+ let buffer = "";
185
+ let currentEvent = "";
186
+ while (true) {
187
+ const { done, value } = await reader.read();
188
+ if (done)
189
+ break;
190
+ resetIdleTimer();
191
+ buffer += decoder.decode(value, { stream: true });
192
+ const lines = buffer.split("\n");
193
+ buffer = lines.pop() ?? "";
194
+ for (const line of lines) {
195
+ if (line.startsWith("event: ")) {
196
+ currentEvent = line.slice(7).trim();
197
+ }
198
+ else if (line.startsWith("data: ") && currentEvent) {
199
+ const data = parseJSON(line.slice(6));
200
+ if (!data)
201
+ continue;
202
+ switch (currentEvent) {
203
+ case "output":
204
+ if (typeof data.content === "string")
205
+ process.stdout.write(renderMarkdown(data.content));
206
+ break;
207
+ case "ephemeral":
208
+ if (typeof data.content === "string") {
209
+ console.error(`\n${renderMarkdown(data.content)}\n`);
210
+ }
211
+ controller.abort();
212
+ return;
213
+ case "link-button":
214
+ case "question":
215
+ case "grant-request":
216
+ case "package-request":
217
+ case "suggestion":
218
+ console.error(JSON.stringify({ event: currentEvent, ...data }));
219
+ break;
220
+ case "complete":
221
+ process.stdout.write("\n");
222
+ controller.abort();
223
+ return;
224
+ case "error":
225
+ process.stdout.write("\n");
226
+ console.error(chalk.red(`\n Agent error: ${String(data.error)}\n`));
227
+ controller.abort();
228
+ return;
229
+ }
230
+ currentEvent = "";
231
+ }
232
+ else if (line === "") {
233
+ currentEvent = "";
234
+ }
235
+ }
236
+ }
237
+ }
238
+ catch (err) {
239
+ if (err instanceof Error && err.name === "AbortError")
240
+ return;
241
+ throw err;
242
+ }
243
+ finally {
244
+ clearTimeout(overallTimer);
245
+ clearTimeout(idleTimer);
246
+ }
247
+ }
248
+ function parseJSON(str) {
249
+ try {
250
+ const parsed = JSON.parse(str);
251
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
252
+ return parsed;
253
+ }
254
+ return null;
255
+ }
256
+ catch {
257
+ return null;
258
+ }
259
+ }
260
+ async function resolveGatewayUrl(cwd) {
261
+ try {
262
+ const envContent = await readFile(join(cwd, ".env"), "utf-8");
263
+ for (const line of envContent.split("\n")) {
264
+ const trimmed = line.trim();
265
+ if (trimmed.startsWith("GATEWAY_PORT=")) {
266
+ let port = trimmed.slice("GATEWAY_PORT=".length);
267
+ if ((port.startsWith('"') && port.endsWith('"')) ||
268
+ (port.startsWith("'") && port.endsWith("'"))) {
269
+ port = port.slice(1, -1);
270
+ }
271
+ if (port)
272
+ return `http://localhost:${port}`;
273
+ }
274
+ }
275
+ }
276
+ catch {
277
+ // No .env file
278
+ }
279
+ return "http://localhost:8080";
280
+ }
281
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function contextListCommand(): Promise<void>;
2
+ export declare function contextCurrentCommand(): Promise<void>;
3
+ export declare function contextAddCommand(options: {
4
+ name: string;
5
+ apiUrl: string;
6
+ }): Promise<void>;
7
+ export declare function contextUseCommand(name: string): Promise<void>;
8
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AASA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBxD;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnE"}
@@ -0,0 +1,46 @@
1
+ import chalk from "chalk";
2
+ import { addContext, getCurrentContextName, loadContextConfig, resolveContext, setCurrentContext, } from "../api/context.js";
3
+ export async function contextListCommand() {
4
+ const config = await loadContextConfig();
5
+ const currentContext = await getCurrentContextName();
6
+ console.log(chalk.bold("\n Lobu contexts"));
7
+ for (const [name, context] of Object.entries(config.contexts)) {
8
+ const marker = name === currentContext ? chalk.green(" *") : " ";
9
+ console.log(`${marker} ${name} ${chalk.dim(context.apiUrl)}`);
10
+ }
11
+ if (process.env.LOBU_CONTEXT || process.env.LOBU_API_URL) {
12
+ console.log(chalk.dim("\n Environment override is active."));
13
+ if (process.env.LOBU_CONTEXT) {
14
+ console.log(chalk.dim(` LOBU_CONTEXT=${process.env.LOBU_CONTEXT}`));
15
+ }
16
+ if (process.env.LOBU_API_URL) {
17
+ console.log(chalk.dim(` LOBU_API_URL=${process.env.LOBU_API_URL}`));
18
+ }
19
+ }
20
+ console.log();
21
+ }
22
+ export async function contextCurrentCommand() {
23
+ const context = await resolveContext();
24
+ console.log(chalk.bold("\n Current context"));
25
+ console.log(chalk.dim(` Name: ${context.name}`));
26
+ console.log(chalk.dim(` API URL: ${context.apiUrl}`));
27
+ if (context.source === "env") {
28
+ console.log(chalk.dim(" Source: environment override"));
29
+ }
30
+ console.log();
31
+ }
32
+ export async function contextAddCommand(options) {
33
+ await addContext(options.name, options.apiUrl);
34
+ console.log(chalk.green(`\n Saved context ${options.name} -> ${options.apiUrl}\n`));
35
+ }
36
+ export async function contextUseCommand(name) {
37
+ const trimmedName = name.trim();
38
+ const config = await setCurrentContext(trimmedName);
39
+ const context = config.contexts[trimmedName];
40
+ if (!context) {
41
+ throw new Error(`Context ${trimmedName} was not found after update.`);
42
+ }
43
+ console.log(chalk.green(`\n Switched to context ${trimmedName}`));
44
+ console.log(chalk.dim(` API URL: ${context.apiUrl}\n`));
45
+ }
46
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,7 @@
1
1
  /**
2
- * `lobu dev` — smart wrapper around `docker compose up`.
3
- * Reads lobu.toml, seeds .env + MCP config, then passes all args through.
4
- *
5
- * Examples:
6
- * lobu dev → docker compose up
7
- * lobu dev -d → docker compose up -d
8
- * lobu dev --build → docker compose up --build
9
- * lobu dev -d --build → docker compose up -d --build
10
- * lobu dev --force-recreate → docker compose up --force-recreate
2
+ * `lobu run` — smart wrapper around `docker compose up`.
3
+ * Validates lobu.toml, seeds .env, then starts docker compose.
4
+ * The gateway reads lobu.toml directly from the mounted workspace.
11
5
  */
12
6
  export declare function devCommand(cwd: string, passthroughArgs: string[]): Promise<void>;
13
7
  //# sourceMappingURL=dev.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CA4Ff"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAoIf"}
@@ -1,20 +1,13 @@
1
- import { mkdir, readFile, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
1
  import { spawn } from "node:child_process";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { basename, join } from "node:path";
4
4
  import chalk from "chalk";
5
5
  import ora from "ora";
6
6
  import { isLoadError, loadConfig } from "../config/loader.js";
7
- import { transformConfig } from "../config/transformer.js";
8
7
  /**
9
- * `lobu dev` — smart wrapper around `docker compose up`.
10
- * Reads lobu.toml, seeds .env + MCP config, then passes all args through.
11
- *
12
- * Examples:
13
- * lobu dev → docker compose up
14
- * lobu dev -d → docker compose up -d
15
- * lobu dev --build → docker compose up --build
16
- * lobu dev -d --build → docker compose up -d --build
17
- * lobu dev --force-recreate → docker compose up --force-recreate
8
+ * `lobu run` — smart wrapper around `docker compose up`.
9
+ * Validates lobu.toml, seeds .env, then starts docker compose.
10
+ * The gateway reads lobu.toml directly from the mounted workspace.
18
11
  */
19
12
  export async function devCommand(cwd, passthroughArgs) {
20
13
  const result = await loadConfig(cwd);
@@ -31,8 +24,7 @@ export async function devCommand(cwd, passthroughArgs) {
31
24
  const { config } = result;
32
25
  const spinner = ora("Preparing local dev environment...").start();
33
26
  try {
34
- const { envVars, mcpConfig } = transformConfig(config);
35
- // Write .env from lobu.toml-derived vars (merge with existing .env to preserve secrets)
27
+ // Parse .env to merge derived vars
36
28
  const envPath = join(cwd, ".env");
37
29
  let existingEnv = "";
38
30
  try {
@@ -41,45 +33,70 @@ export async function devCommand(cwd, passthroughArgs) {
41
33
  catch {
42
34
  // No existing .env, start fresh
43
35
  }
44
- const existingVars = parseEnvFile(existingEnv);
45
- // Existing vars take precedence — user's .env secrets aren't overwritten
46
- const mergedVars = { ...envVars, ...existingVars };
47
- const envContent = Object.entries(mergedVars)
48
- .map(([k, v]) => `${k}=${v}`)
49
- .join("\n");
50
- await writeFile(envPath, envContent + "\n");
51
- // Write MCP config if needed
52
- if (mcpConfig) {
53
- const lobuDir = join(cwd, ".lobu");
54
- await mkdir(lobuDir, { recursive: true });
55
- await writeFile(join(lobuDir, "mcp.config.json"), JSON.stringify({ mcpServers: mcpConfig }, null, 2));
56
- }
57
- // Load IDENTITY.md, SOUL.md, USER.md if they exist
58
- await seedMarkdownFiles(cwd, mergedVars);
36
+ const dotenvVars = parseEnvFile(existingEnv);
37
+ const agentCount = Object.keys(config.agents).length;
38
+ // Derive env vars (compose project name from first agent or directory name)
39
+ const firstAgent = Object.values(config.agents)[0];
40
+ const envVars = {
41
+ COMPOSE_PROJECT_NAME: firstAgent?.name
42
+ ? firstAgent.name.toLowerCase().replace(/\s+/g, "-")
43
+ : basename(cwd),
44
+ };
45
+ // Merge derived vars into existing .env (preserves comments and formatting)
46
+ await mergeEnvFile(envPath, existingEnv, envVars);
59
47
  spinner.succeed("Environment prepared from lobu.toml");
60
48
  // Check for docker-compose.yml
61
- const composePath = join(cwd, "docker-compose.yml");
62
49
  try {
63
- await readFile(composePath, "utf-8");
50
+ await readFile(join(cwd, "docker-compose.yml"), "utf-8");
64
51
  }
65
52
  catch {
66
53
  console.log(chalk.yellow("\n No docker-compose.yml found. Run `lobu init` to generate one.\n"));
67
54
  process.exit(1);
68
55
  }
69
- // Pass everything through to docker compose up
70
- console.log(chalk.cyan(`\n Starting ${config.agent.name}...\n`));
71
- const composeArgs = ["compose", "up", ...passthroughArgs];
72
- const child = spawn("docker", composeArgs, {
73
- cwd,
74
- stdio: "inherit",
75
- });
76
- child.on("error", (err) => {
56
+ const fallbackPort = dotenvVars.GATEWAY_PORT || "8080";
57
+ console.log(chalk.cyan(`\n Starting ${agentCount} agent(s)...\n`));
58
+ const explicitDetach = passthroughArgs.includes("-d") || passthroughArgs.includes("--detach");
59
+ // Always start detached so we can print the banner before logs
60
+ const upArgs = explicitDetach
61
+ ? ["compose", "up", ...passthroughArgs]
62
+ : ["compose", "up", "-d", ...passthroughArgs];
63
+ const up = spawn("docker", upArgs, { cwd, stdio: "inherit" });
64
+ up.on("error", (err) => {
77
65
  console.error(chalk.red(`\n Failed to start docker compose: ${err.message}`));
78
66
  console.log(chalk.dim(" Make sure Docker Desktop is running.\n"));
79
67
  process.exit(1);
80
68
  });
81
- child.on("exit", (code) => {
82
- process.exit(code ?? 0);
69
+ up.on("exit", (code) => {
70
+ if (code !== 0) {
71
+ process.exit(code ?? 1);
72
+ }
73
+ // Detect actual host port from the running container
74
+ const portProbe = spawn("docker", ["compose", "port", "gateway", "8080"], { cwd, stdio: ["ignore", "pipe", "ignore"] });
75
+ let portOutput = "";
76
+ portProbe.stdout.on("data", (data) => {
77
+ portOutput += data.toString();
78
+ });
79
+ portProbe.on("exit", () => {
80
+ const match = portOutput.trim().match(/:(\d+)$/);
81
+ const port = match ? match[1] : fallbackPort;
82
+ const gatewayUrl = `http://localhost:${port}`;
83
+ console.log(chalk.green("\n Lobu is running!\n"));
84
+ console.log(chalk.cyan(` API docs: ${gatewayUrl}/api/docs`));
85
+ console.log(chalk.dim(`\n Stop: docker compose down`));
86
+ if (explicitDetach) {
87
+ console.log(chalk.dim(` View logs: docker compose logs -f gateway\n`));
88
+ process.exit(0);
89
+ }
90
+ console.log(chalk.dim(` Ctrl+C stops log tail, containers keep running.\n`));
91
+ // Tail only gateway logs (skip redis noise)
92
+ const logs = spawn("docker", ["compose", "logs", "-f", "gateway"], {
93
+ cwd,
94
+ stdio: "inherit",
95
+ });
96
+ logs.on("exit", (logCode) => {
97
+ process.exit(logCode ?? 0);
98
+ });
99
+ });
83
100
  });
84
101
  }
85
102
  catch (err) {
@@ -88,28 +105,6 @@ export async function devCommand(cwd, passthroughArgs) {
88
105
  process.exit(1);
89
106
  }
90
107
  }
91
- /**
92
- * Read IDENTITY.md, SOUL.md, USER.md and add their content as env vars
93
- * so the gateway can seed agent settings on startup.
94
- */
95
- async function seedMarkdownFiles(cwd, envVars) {
96
- const files = [
97
- { path: "IDENTITY.md", envKey: "AGENT_IDENTITY_MD" },
98
- { path: "SOUL.md", envKey: "AGENT_SOUL_MD" },
99
- { path: "USER.md", envKey: "AGENT_USER_MD" },
100
- ];
101
- for (const { path, envKey } of files) {
102
- try {
103
- const content = await readFile(join(cwd, path), "utf-8");
104
- if (content.trim()) {
105
- envVars[envKey] = content.trim();
106
- }
107
- }
108
- catch {
109
- // File doesn't exist, skip
110
- }
111
- }
112
- }
113
108
  function parseEnvFile(content) {
114
109
  const vars = {};
115
110
  for (const line of content.split("\n")) {
@@ -120,9 +115,45 @@ function parseEnvFile(content) {
120
115
  if (eqIdx === -1)
121
116
  continue;
122
117
  const key = trimmed.slice(0, eqIdx);
123
- const value = trimmed.slice(eqIdx + 1);
118
+ let value = trimmed.slice(eqIdx + 1);
119
+ // Strip surrounding quotes (double or single)
120
+ if ((value.startsWith('"') && value.endsWith('"')) ||
121
+ (value.startsWith("'") && value.endsWith("'"))) {
122
+ value = value.slice(1, -1);
123
+ }
124
124
  vars[key] = value;
125
125
  }
126
126
  return vars;
127
127
  }
128
+ /**
129
+ * Merge derived env vars into an existing .env file.
130
+ * Updates existing keys in-place and appends new ones at the end.
131
+ * Preserves comments, blank lines, and formatting.
132
+ */
133
+ async function mergeEnvFile(envPath, existingContent, newVars) {
134
+ const remaining = { ...newVars };
135
+ const lines = existingContent.split("\n");
136
+ const updated = lines.map((line) => {
137
+ const trimmed = line.trim();
138
+ if (!trimmed || trimmed.startsWith("#"))
139
+ return line;
140
+ const eqIdx = trimmed.indexOf("=");
141
+ if (eqIdx === -1)
142
+ return line;
143
+ const key = trimmed.slice(0, eqIdx);
144
+ if (key in remaining) {
145
+ const val = remaining[key];
146
+ delete remaining[key];
147
+ return `${key}=${val}`;
148
+ }
149
+ return line;
150
+ });
151
+ // Append any new vars that weren't already in the file
152
+ for (const [key, value] of Object.entries(remaining)) {
153
+ updated.push(`${key}=${value}`);
154
+ }
155
+ // Ensure trailing newline
156
+ const content = `${updated.join("\n").trimEnd()}\n`;
157
+ await writeFile(envPath, content);
158
+ }
128
159
  //# sourceMappingURL=dev.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,eAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,oCAAoC,CAAC,CAAC,KAAK,EAAE,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAEvD,wFAAwF;QACxF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;QAED,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAC/C,yEAAyE;QACzE,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;QAEnD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;aAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;QAE5C,6BAA6B;QAC7B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACnC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAChC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACnD,CAAC;QACJ,CAAC;QAED,mDAAmD;QACnD,MAAM,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAEzC,OAAO,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QAEvD,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,qEAAqE,CACtE,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,+CAA+C;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE;YACzC,GAAG;YACH,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,uCAAuC,GAAG,CAAC,OAAO,EAAE,CAAC,CAChE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CACnE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAC9B,GAAW,EACX,OAA+B;IAE/B,MAAM,KAAK,GAAG;QACZ,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,mBAAmB,EAAE;QACpD,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE;QAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE;KAC7C,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnB,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,SAAS;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAgHA,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CA+wBf"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAeA,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CA8iBf"}