@soederpop/luca 0.0.19 → 0.0.21

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.
@@ -26,6 +26,13 @@ luca describe clients # index of all available clients
26
26
  luca describe servers # index of all available servers
27
27
  ```
28
28
 
29
+ You can even learn about features in the browser container, or a specific platform (server, node are the same, browser,web are the same)
30
+
31
+ ```shell
32
+ luca describe features --platform=web
33
+ luca describe features --platform=server
34
+ ```
35
+
29
36
  ### Learn about specific helpers
30
37
 
31
38
  ```shell
@@ -230,6 +237,15 @@ This is useful inside commands and scripts where you need introspection data pro
230
237
 
231
238
  ---
232
239
 
240
+ ## Server development troubleshooting
241
+
242
+ - You can use `container.proc.findPidsByPort(3000)` which will return an array of numbers.
243
+ - You can use `container.proc.kill(pid)` to kill that process
244
+ - You can combine these two functions in `luca eval` if a server you're developing won't start because a previous instance is running (common inside e.g. claude code sessions )
245
+ - `luca serve --force` will also replace the running process with the current one
246
+ - `luca serve --any-port` will open on any port
247
+
248
+
233
249
  ## Reference
234
250
 
235
251
  See `references/api-docs/` for the full pre-generated API reference for every built-in feature, client, and server.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soederpop/luca",
3
- "version": "0.0.19",
3
+ "version": "0.0.21",
4
4
  "website": "https://luca.soederpop.com",
5
5
  "description": "lightweight universal conversational architecture AKA Le Ultimate Component Architecture AKA Last Universal Common Ancestor, part AI part Human",
6
6
  "author": "jon soeder aka the people's champ <jon@soederpop.com>",
@@ -1,5 +1,5 @@
1
1
  // Auto-generated bootstrap content
2
- // Generated at: 2026-03-20T21:13:00.583Z
2
+ // Generated at: 2026-03-21T05:24:16.832Z
3
3
  // Source: docs/bootstrap/*.md, docs/bootstrap/templates/*
4
4
  //
5
5
  // Do not edit manually. Run: luca build-bootstrap
@@ -33,6 +33,13 @@ luca describe clients # index of all available clients
33
33
  luca describe servers # index of all available servers
34
34
  \`\`\`
35
35
 
36
+ You can even learn about features in the browser container, or a specific platform (server, node are the same, browser,web are the same)
37
+
38
+ \`\`\`shell
39
+ luca describe features --platform=web
40
+ luca describe features --platform=server
41
+ \`\`\`
42
+
36
43
  ### Learn about specific helpers
37
44
 
38
45
  \`\`\`shell
@@ -237,6 +244,15 @@ This is useful inside commands and scripts where you need introspection data pro
237
244
 
238
245
  ---
239
246
 
247
+ ## Server development troubleshooting
248
+
249
+ - You can use \`container.proc.findPidsByPort(3000)\` which will return an array of numbers.
250
+ - You can use \`container.proc.kill(pid)\` to kill that process
251
+ - You can combine these two functions in \`luca eval\` if a server you're developing won't start because a previous instance is running (common inside e.g. claude code sessions )
252
+ - \`luca serve --force\` will also replace the running process with the current one
253
+ - \`luca serve --any-port\` will open on any port
254
+
255
+
240
256
  ## Reference
241
257
 
242
258
  See \`references/api-docs/\` for the full pre-generated API reference for every built-in feature, client, and server.
@@ -187,8 +187,20 @@ export default async function chat(options: z.infer<typeof argsSchema>, context:
187
187
  output: process.stdout,
188
188
  })
189
189
 
190
+ let rlClosed = false
191
+ rl.on('close', () => { rlClosed = true })
192
+
193
+ function ensureRl() {
194
+ if (rlClosed) {
195
+ rl = readline.createInterface({ input: process.stdin, output: process.stdout })
196
+ rlClosed = false
197
+ rl.on('close', () => { rlClosed = true })
198
+ }
199
+ }
200
+
190
201
  function prompt(): Promise<string> {
191
202
  return new Promise((resolve) => {
203
+ ensureRl()
192
204
  rl.question(ui.colors.dim(`\n${name} > `), (answer: string) => resolve(answer.trim()))
193
205
  })
194
206
  }
@@ -247,6 +259,8 @@ export default async function chat(options: z.infer<typeof argsSchema>, context:
247
259
  console.log()
248
260
  console.log(ui.colors.dim(` Back in chat with ${ui.colors.cyan(name)}.`))
249
261
  rl = readline.createInterface({ input: process.stdin, output: process.stdout })
262
+ rlClosed = false
263
+ rl.on('close', () => { rlClosed = true })
250
264
  continue
251
265
  }
252
266