@soederpop/luca 0.0.2

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 (358) hide show
  1. package/CLAUDE.md +71 -0
  2. package/README.md +78 -0
  3. package/bun.lock +2928 -0
  4. package/bunfig.toml +3 -0
  5. package/commands/audit-docs.ts +740 -0
  6. package/commands/build-scaffolds.ts +154 -0
  7. package/commands/generate-api-docs.ts +114 -0
  8. package/commands/update-introspection.ts +67 -0
  9. package/docs/CLI.md +335 -0
  10. package/docs/README.md +88 -0
  11. package/docs/TABLE-OF-CONTENTS.md +157 -0
  12. package/docs/apis/clients/elevenlabs.md +84 -0
  13. package/docs/apis/clients/graph.md +56 -0
  14. package/docs/apis/clients/openai.md +69 -0
  15. package/docs/apis/clients/rest.md +41 -0
  16. package/docs/apis/clients/websocket.md +107 -0
  17. package/docs/apis/features/agi/assistant.md +471 -0
  18. package/docs/apis/features/agi/assistants-manager.md +154 -0
  19. package/docs/apis/features/agi/claude-code.md +602 -0
  20. package/docs/apis/features/agi/conversation-history.md +352 -0
  21. package/docs/apis/features/agi/conversation.md +333 -0
  22. package/docs/apis/features/agi/docs-reader.md +121 -0
  23. package/docs/apis/features/agi/openai-codex.md +318 -0
  24. package/docs/apis/features/agi/openapi.md +138 -0
  25. package/docs/apis/features/agi/semantic-search.md +387 -0
  26. package/docs/apis/features/agi/skills-library.md +216 -0
  27. package/docs/apis/features/node/container-link.md +133 -0
  28. package/docs/apis/features/node/content-db.md +313 -0
  29. package/docs/apis/features/node/disk-cache.md +379 -0
  30. package/docs/apis/features/node/dns.md +651 -0
  31. package/docs/apis/features/node/docker.md +705 -0
  32. package/docs/apis/features/node/downloader.md +81 -0
  33. package/docs/apis/features/node/esbuild.md +59 -0
  34. package/docs/apis/features/node/file-manager.md +182 -0
  35. package/docs/apis/features/node/fs.md +581 -0
  36. package/docs/apis/features/node/git.md +330 -0
  37. package/docs/apis/features/node/google-auth.md +174 -0
  38. package/docs/apis/features/node/google-calendar.md +187 -0
  39. package/docs/apis/features/node/google-docs.md +151 -0
  40. package/docs/apis/features/node/google-drive.md +225 -0
  41. package/docs/apis/features/node/google-sheets.md +179 -0
  42. package/docs/apis/features/node/grep.md +290 -0
  43. package/docs/apis/features/node/helpers.md +135 -0
  44. package/docs/apis/features/node/ink.md +334 -0
  45. package/docs/apis/features/node/ipc-socket.md +260 -0
  46. package/docs/apis/features/node/json-tree.md +86 -0
  47. package/docs/apis/features/node/launcher-app-command-listener.md +145 -0
  48. package/docs/apis/features/node/networking.md +281 -0
  49. package/docs/apis/features/node/nlp.md +133 -0
  50. package/docs/apis/features/node/opener.md +97 -0
  51. package/docs/apis/features/node/os.md +118 -0
  52. package/docs/apis/features/node/package-finder.md +402 -0
  53. package/docs/apis/features/node/postgres.md +212 -0
  54. package/docs/apis/features/node/proc.md +430 -0
  55. package/docs/apis/features/node/process-manager.md +210 -0
  56. package/docs/apis/features/node/python.md +278 -0
  57. package/docs/apis/features/node/repl.md +88 -0
  58. package/docs/apis/features/node/runpod.md +673 -0
  59. package/docs/apis/features/node/secure-shell.md +169 -0
  60. package/docs/apis/features/node/semantic-search.md +401 -0
  61. package/docs/apis/features/node/sqlite.md +211 -0
  62. package/docs/apis/features/node/telegram.md +254 -0
  63. package/docs/apis/features/node/tts.md +118 -0
  64. package/docs/apis/features/node/ui.md +703 -0
  65. package/docs/apis/features/node/vault.md +64 -0
  66. package/docs/apis/features/node/vm.md +84 -0
  67. package/docs/apis/features/node/window-manager.md +337 -0
  68. package/docs/apis/features/node/yaml-tree.md +85 -0
  69. package/docs/apis/features/node/yaml.md +176 -0
  70. package/docs/apis/features/web/asset-loader.md +47 -0
  71. package/docs/apis/features/web/container-link.md +133 -0
  72. package/docs/apis/features/web/esbuild.md +59 -0
  73. package/docs/apis/features/web/helpers.md +135 -0
  74. package/docs/apis/features/web/network.md +30 -0
  75. package/docs/apis/features/web/speech.md +55 -0
  76. package/docs/apis/features/web/vault.md +64 -0
  77. package/docs/apis/features/web/vm.md +84 -0
  78. package/docs/apis/features/web/voice.md +67 -0
  79. package/docs/apis/servers/express.md +127 -0
  80. package/docs/apis/servers/mcp.md +213 -0
  81. package/docs/apis/servers/websocket.md +99 -0
  82. package/docs/documentation-audit.md +134 -0
  83. package/docs/examples/content-db.md +77 -0
  84. package/docs/examples/disk-cache.md +83 -0
  85. package/docs/examples/docker.md +101 -0
  86. package/docs/examples/downloader.md +70 -0
  87. package/docs/examples/esbuild.md +80 -0
  88. package/docs/examples/file-manager.md +82 -0
  89. package/docs/examples/fs.md +83 -0
  90. package/docs/examples/git.md +85 -0
  91. package/docs/examples/google-auth.md +88 -0
  92. package/docs/examples/google-calendar.md +94 -0
  93. package/docs/examples/google-docs.md +82 -0
  94. package/docs/examples/google-drive.md +96 -0
  95. package/docs/examples/google-sheets.md +95 -0
  96. package/docs/examples/grep.md +85 -0
  97. package/docs/examples/ink-blocks.md +75 -0
  98. package/docs/examples/ink-renderer.md +41 -0
  99. package/docs/examples/ink.md +103 -0
  100. package/docs/examples/ipc-socket.md +103 -0
  101. package/docs/examples/json-tree.md +91 -0
  102. package/docs/examples/launcher-app-command-listener.md +120 -0
  103. package/docs/examples/networking.md +58 -0
  104. package/docs/examples/nlp.md +91 -0
  105. package/docs/examples/opener.md +78 -0
  106. package/docs/examples/os.md +72 -0
  107. package/docs/examples/package-finder.md +89 -0
  108. package/docs/examples/port-exposer.md +89 -0
  109. package/docs/examples/postgres.md +91 -0
  110. package/docs/examples/proc.md +81 -0
  111. package/docs/examples/process-manager.md +79 -0
  112. package/docs/examples/python.md +91 -0
  113. package/docs/examples/repl.md +93 -0
  114. package/docs/examples/runpod.md +119 -0
  115. package/docs/examples/secure-shell.md +92 -0
  116. package/docs/examples/sqlite.md +86 -0
  117. package/docs/examples/telegram.md +77 -0
  118. package/docs/examples/tts.md +86 -0
  119. package/docs/examples/ui.md +80 -0
  120. package/docs/examples/vault.md +70 -0
  121. package/docs/examples/vm.md +86 -0
  122. package/docs/examples/window-manager.md +125 -0
  123. package/docs/examples/yaml-tree.md +93 -0
  124. package/docs/examples/yaml.md +104 -0
  125. package/docs/ideas/class-registration-refactor-possibilities.md +197 -0
  126. package/docs/ideas/container-use-api.md +9 -0
  127. package/docs/ideas/easy-auth-for-express-servers-and-luca-serve.md +0 -0
  128. package/docs/ideas/feature-stacks.md +22 -0
  129. package/docs/ideas/luca-cli-self-sufficiency-demo.md +23 -0
  130. package/docs/ideas/mcp-design.md +9 -0
  131. package/docs/ideas/web-container-debugging-feature.md +13 -0
  132. package/docs/introspection-audit.md +49 -0
  133. package/docs/introspection.md +154 -0
  134. package/docs/mcp/readme.md +162 -0
  135. package/docs/models.ts +38 -0
  136. package/docs/philosophy.md +85 -0
  137. package/docs/principles.md +7 -0
  138. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
  139. package/docs/prompts/mcp-test-easy-command.md +27 -0
  140. package/docs/reports/assistant-bugs.md +38 -0
  141. package/docs/reports/attach-pattern-usage.md +18 -0
  142. package/docs/reports/code-audit-results.md +391 -0
  143. package/docs/reports/introspection-audit-tasks.md +378 -0
  144. package/docs/reports/luca-mcp-improvements.md +128 -0
  145. package/docs/scaffolds/client.md +140 -0
  146. package/docs/scaffolds/command.md +106 -0
  147. package/docs/scaffolds/endpoint.md +176 -0
  148. package/docs/scaffolds/feature.md +148 -0
  149. package/docs/scaffolds/server.md +187 -0
  150. package/docs/tasks/web-container-helper-discovery.md +71 -0
  151. package/docs/todos.md +1 -0
  152. package/docs/tutorials/01-getting-started.md +106 -0
  153. package/docs/tutorials/02-container.md +210 -0
  154. package/docs/tutorials/03-scripts.md +194 -0
  155. package/docs/tutorials/04-features-overview.md +196 -0
  156. package/docs/tutorials/05-state-and-events.md +171 -0
  157. package/docs/tutorials/06-servers.md +157 -0
  158. package/docs/tutorials/07-endpoints.md +198 -0
  159. package/docs/tutorials/08-commands.md +171 -0
  160. package/docs/tutorials/09-clients.md +162 -0
  161. package/docs/tutorials/10-creating-features.md +198 -0
  162. package/docs/tutorials/11-contentbase.md +191 -0
  163. package/docs/tutorials/12-assistants.md +215 -0
  164. package/docs/tutorials/13-introspection.md +147 -0
  165. package/docs/tutorials/14-type-system.md +174 -0
  166. package/docs/tutorials/15-project-patterns.md +222 -0
  167. package/docs/tutorials/16-google-features.md +534 -0
  168. package/docs/tutorials/17-tui-blocks.md +530 -0
  169. package/docs/tutorials/18-semantic-search.md +334 -0
  170. package/index.ts +1 -0
  171. package/luca.console.ts +9 -0
  172. package/main.py +6 -0
  173. package/package.json +154 -0
  174. package/pyproject.toml +7 -0
  175. package/scripts/animations/chrome-glitch.ts +55 -0
  176. package/scripts/animations/index.ts +16 -0
  177. package/scripts/animations/neon-pulse.ts +64 -0
  178. package/scripts/animations/types.ts +6 -0
  179. package/scripts/build-web.ts +28 -0
  180. package/scripts/examples/ask-luca-expert.ts +42 -0
  181. package/scripts/examples/assistant-questions.ts +12 -0
  182. package/scripts/examples/excalidraw-expert.ts +75 -0
  183. package/scripts/examples/expert-chat.ts +0 -0
  184. package/scripts/examples/file-manager.ts +14 -0
  185. package/scripts/examples/ideas.ts +12 -0
  186. package/scripts/examples/interactive-chat.ts +20 -0
  187. package/scripts/examples/openai-tool-calls.ts +113 -0
  188. package/scripts/examples/opening-a-web-browser.ts +5 -0
  189. package/scripts/examples/telegram-bot.ts +79 -0
  190. package/scripts/examples/telegram-ink-ui.ts +302 -0
  191. package/scripts/examples/using-assistant-with-mcp.ts +560 -0
  192. package/scripts/examples/using-claude-code.ts +10 -0
  193. package/scripts/examples/using-contentdb.ts +35 -0
  194. package/scripts/examples/using-conversations.ts +35 -0
  195. package/scripts/examples/using-disk-cache.ts +10 -0
  196. package/scripts/examples/using-docker-shell.ts +75 -0
  197. package/scripts/examples/using-elevenlabs.ts +25 -0
  198. package/scripts/examples/using-google-calendar.ts +57 -0
  199. package/scripts/examples/using-google-docs.ts +74 -0
  200. package/scripts/examples/using-google-drive.ts +74 -0
  201. package/scripts/examples/using-google-sheets.ts +89 -0
  202. package/scripts/examples/using-nlp.ts +55 -0
  203. package/scripts/examples/using-ollama.ts +10 -0
  204. package/scripts/examples/using-openai-codex.ts +23 -0
  205. package/scripts/examples/using-postgres.ts +55 -0
  206. package/scripts/examples/using-runpod.ts +32 -0
  207. package/scripts/examples/using-tts.ts +40 -0
  208. package/scripts/examples/vm-loading-esm-modules.ts +16 -0
  209. package/scripts/scaffold.ts +391 -0
  210. package/scripts/scratch.ts +15 -0
  211. package/scripts/test-command-listener.ts +123 -0
  212. package/scripts/test-window-manager-lifecycle.ts +86 -0
  213. package/scripts/test-window-manager.ts +43 -0
  214. package/scripts/update-introspection-data.ts +58 -0
  215. package/src/agi/README.md +14 -0
  216. package/src/agi/container.server.ts +114 -0
  217. package/src/agi/endpoints/ask.ts +60 -0
  218. package/src/agi/endpoints/conversations/[id].ts +45 -0
  219. package/src/agi/endpoints/conversations.ts +31 -0
  220. package/src/agi/endpoints/experts.ts +37 -0
  221. package/src/agi/features/assistant.ts +767 -0
  222. package/src/agi/features/assistants-manager.ts +260 -0
  223. package/src/agi/features/claude-code.ts +1111 -0
  224. package/src/agi/features/conversation-history.ts +497 -0
  225. package/src/agi/features/conversation.ts +799 -0
  226. package/src/agi/features/openai-codex.ts +631 -0
  227. package/src/agi/features/openapi.ts +438 -0
  228. package/src/agi/features/skills-library.ts +425 -0
  229. package/src/agi/index.ts +6 -0
  230. package/src/agi/lib/token-counter.ts +122 -0
  231. package/src/browser.ts +25 -0
  232. package/src/bus.ts +100 -0
  233. package/src/cli/cli.ts +70 -0
  234. package/src/client.ts +461 -0
  235. package/src/clients/civitai/index.ts +541 -0
  236. package/src/clients/client-template.ts +41 -0
  237. package/src/clients/comfyui/index.ts +597 -0
  238. package/src/clients/elevenlabs/index.ts +291 -0
  239. package/src/clients/openai/index.ts +451 -0
  240. package/src/clients/supabase/index.ts +366 -0
  241. package/src/command.ts +164 -0
  242. package/src/commands/chat.ts +182 -0
  243. package/src/commands/console.ts +192 -0
  244. package/src/commands/describe.ts +433 -0
  245. package/src/commands/eval.ts +116 -0
  246. package/src/commands/help.ts +214 -0
  247. package/src/commands/index.ts +14 -0
  248. package/src/commands/mcp.ts +64 -0
  249. package/src/commands/prompt.ts +807 -0
  250. package/src/commands/run.ts +257 -0
  251. package/src/commands/sandbox-mcp.ts +439 -0
  252. package/src/commands/scaffold.ts +79 -0
  253. package/src/commands/serve.ts +172 -0
  254. package/src/container.ts +781 -0
  255. package/src/endpoint.ts +340 -0
  256. package/src/feature.ts +75 -0
  257. package/src/hash-object.ts +97 -0
  258. package/src/helper.ts +543 -0
  259. package/src/introspection/generated.agi.ts +23388 -0
  260. package/src/introspection/generated.node.ts +18899 -0
  261. package/src/introspection/generated.web.ts +2021 -0
  262. package/src/introspection/index.ts +256 -0
  263. package/src/introspection/scan.ts +912 -0
  264. package/src/node/container.ts +354 -0
  265. package/src/node/feature.ts +13 -0
  266. package/src/node/features/container-link.ts +558 -0
  267. package/src/node/features/content-db.ts +475 -0
  268. package/src/node/features/disk-cache.ts +382 -0
  269. package/src/node/features/dns.ts +655 -0
  270. package/src/node/features/docker.ts +912 -0
  271. package/src/node/features/downloader.ts +92 -0
  272. package/src/node/features/esbuild.ts +68 -0
  273. package/src/node/features/file-manager.ts +357 -0
  274. package/src/node/features/fs.ts +534 -0
  275. package/src/node/features/git.ts +492 -0
  276. package/src/node/features/google-auth.ts +502 -0
  277. package/src/node/features/google-calendar.ts +300 -0
  278. package/src/node/features/google-docs.ts +404 -0
  279. package/src/node/features/google-drive.ts +339 -0
  280. package/src/node/features/google-sheets.ts +279 -0
  281. package/src/node/features/grep.ts +406 -0
  282. package/src/node/features/helpers.ts +374 -0
  283. package/src/node/features/ink.ts +490 -0
  284. package/src/node/features/ipc-socket.ts +459 -0
  285. package/src/node/features/json-tree.ts +188 -0
  286. package/src/node/features/launcher-app-command-listener.ts +388 -0
  287. package/src/node/features/networking.ts +925 -0
  288. package/src/node/features/nlp.ts +211 -0
  289. package/src/node/features/opener.ts +166 -0
  290. package/src/node/features/os.ts +157 -0
  291. package/src/node/features/package-finder.ts +539 -0
  292. package/src/node/features/port-exposer.ts +342 -0
  293. package/src/node/features/postgres.ts +273 -0
  294. package/src/node/features/proc.ts +502 -0
  295. package/src/node/features/process-manager.ts +542 -0
  296. package/src/node/features/python.ts +444 -0
  297. package/src/node/features/repl.ts +194 -0
  298. package/src/node/features/runpod.ts +802 -0
  299. package/src/node/features/secure-shell.ts +248 -0
  300. package/src/node/features/semantic-search.ts +924 -0
  301. package/src/node/features/sqlite.ts +289 -0
  302. package/src/node/features/telegram.ts +342 -0
  303. package/src/node/features/tts.ts +184 -0
  304. package/src/node/features/ui.ts +857 -0
  305. package/src/node/features/vault.ts +164 -0
  306. package/src/node/features/vm.ts +312 -0
  307. package/src/node/features/window-manager.ts +804 -0
  308. package/src/node/features/yaml-tree.ts +149 -0
  309. package/src/node/features/yaml.ts +132 -0
  310. package/src/node.ts +70 -0
  311. package/src/react/index.ts +175 -0
  312. package/src/registry.ts +199 -0
  313. package/src/scaffolds/generated.ts +1613 -0
  314. package/src/scaffolds/template.ts +37 -0
  315. package/src/schemas/base.ts +255 -0
  316. package/src/server.ts +135 -0
  317. package/src/servers/express.ts +209 -0
  318. package/src/servers/mcp.ts +805 -0
  319. package/src/servers/socket.ts +120 -0
  320. package/src/state.ts +101 -0
  321. package/src/web/clients/socket.ts +82 -0
  322. package/src/web/container.ts +74 -0
  323. package/src/web/extension.ts +30 -0
  324. package/src/web/feature.ts +12 -0
  325. package/src/web/features/asset-loader.ts +64 -0
  326. package/src/web/features/container-link.ts +385 -0
  327. package/src/web/features/esbuild.ts +79 -0
  328. package/src/web/features/helpers.ts +267 -0
  329. package/src/web/features/network.ts +61 -0
  330. package/src/web/features/speech.ts +87 -0
  331. package/src/web/features/vault.ts +189 -0
  332. package/src/web/features/vm.ts +78 -0
  333. package/src/web/features/voice-recognition.ts +129 -0
  334. package/src/web/shims/isomorphic-vm.ts +149 -0
  335. package/test/bus.test.ts +134 -0
  336. package/test/clients-servers.test.ts +216 -0
  337. package/test/container-link.test.ts +274 -0
  338. package/test/features.test.ts +160 -0
  339. package/test/integration.test.ts +787 -0
  340. package/test/node-container.test.ts +121 -0
  341. package/test/rate-limit.test.ts +272 -0
  342. package/test/semantic-search.test.ts +550 -0
  343. package/test/state.test.ts +121 -0
  344. package/test-integration/assistant.test.ts +138 -0
  345. package/test-integration/assistants-manager.test.ts +123 -0
  346. package/test-integration/claude-code.test.ts +98 -0
  347. package/test-integration/conversation-history.test.ts +205 -0
  348. package/test-integration/conversation.test.ts +137 -0
  349. package/test-integration/elevenlabs.test.ts +55 -0
  350. package/test-integration/google-services.test.ts +80 -0
  351. package/test-integration/helpers.ts +89 -0
  352. package/test-integration/openai-codex.test.ts +93 -0
  353. package/test-integration/runpod.test.ts +58 -0
  354. package/test-integration/server-endpoints.test.ts +97 -0
  355. package/test-integration/skills-library.test.ts +157 -0
  356. package/test-integration/telegram.test.ts +46 -0
  357. package/tsconfig.json +58 -0
  358. package/uv.lock +8 -0
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: Getting Started with Luca
3
+ tags: [setup, quickstart, project, init]
4
+ ---
5
+
6
+ # Getting Started with Luca
7
+
8
+ ## Prerequisites
9
+
10
+ - [Bun](https://bun.sh) installed (Luca's runtime)
11
+ - A new or existing bun project
12
+
13
+ ## Create a New Project
14
+
15
+ ```bash
16
+ mkdir my-app && cd my-app
17
+ bun init -y
18
+ bun add @soederpop/luca
19
+ ```
20
+
21
+ ## Project Structure
22
+
23
+ A typical Luca project looks like this:
24
+
25
+ ```
26
+ my-app/
27
+ ├── package.json
28
+ ├── endpoints/ # File-based HTTP routes (auto-discovered by `luca serve`)
29
+ │ ├── health.ts
30
+ │ └── users.ts
31
+ ├── commands/ # Project-local CLI commands (auto-discovered by `luca`)
32
+ │ └── seed.ts
33
+ ├── assistants/ # AI assistants (file-based convention)
34
+ │ └── my-helper/
35
+ │ ├── CORE.md
36
+ │ ├── tools.ts
37
+ │ ├── hooks.ts
38
+ │ └── docs/
39
+ ├── public/ # Static files served by `luca serve`
40
+ │ └── index.html
41
+ └── scripts/ # Standalone scripts that use the container
42
+ └── migrate.ts
43
+ ```
44
+
45
+ ## The Container
46
+
47
+ Everything in Luca revolves around the **container**. It is a per-process singleton that acts as your dependency injector, event bus, and state machine.
48
+
49
+ In scripts, you create one directly:
50
+
51
+ ```typescript
52
+ import container from '@soederpop/luca/node'
53
+
54
+ // Now you have access to all features
55
+ const fs = container.fs // File system operations
56
+ const git = container.git // Git utilities (branch, sha, lsFiles, etc.)
57
+ const ui = container.ui // Terminal UI (colors, prompts, figlet)
58
+ const proc = container.feature('proc') // Process execution
59
+ ```
60
+
61
+ In endpoints and commands, the container is provided for you via context:
62
+
63
+ ```typescript
64
+ // endpoints/health.ts
65
+ export const path = '/health'
66
+
67
+ export async function get(_params: any, ctx: EndpointContext) {
68
+ const { container } = ctx
69
+ return { status: 'ok', uptime: process.uptime() }
70
+ }
71
+ ```
72
+
73
+ ## Running Your Project
74
+
75
+ ### Start the API server
76
+
77
+ ```bash
78
+ luca serve
79
+ # or with options:
80
+ luca serve --port 4000 --endpointsDir src/endpoints
81
+ ```
82
+
83
+ This auto-discovers your `endpoints/` directory, mounts all routes, and generates an OpenAPI spec at `/openapi.json`.
84
+
85
+ ### Run a CLI command
86
+
87
+ ```bash
88
+ luca seed --count 10
89
+ ```
90
+
91
+ This auto-discovers `commands/seed.ts` from your project and runs it.
92
+
93
+ ### Run a script
94
+
95
+ ```bash
96
+ luca run scripts/migrate.ts
97
+ ```
98
+
99
+ ## What's Next
100
+
101
+ - [The Container](./02-container.md) -- deep dive into the container
102
+ - [Scripts and Markdown Notebooks](./03-scripts.md) -- run scripts and executable markdown
103
+ - [Using Features](./04-features-overview.md) -- explore built-in features
104
+ - [Servers](./06-servers.md) -- set up Express and WebSocket servers
105
+ - [Writing Endpoints](./07-endpoints.md) -- build your API routes
106
+ - [Writing Commands](./08-commands.md) -- add CLI commands to your project
@@ -0,0 +1,210 @@
1
+ ---
2
+ title: The Container
3
+ tags: [container, singleton, state, events, registries, dependency-injection]
4
+ ---
5
+
6
+ # The Container
7
+
8
+ The container is the heart of every Luca application. It is a per-process singleton that provides:
9
+
10
+ - **Dependency injection** via factory methods and registries
11
+ - **Observable state** that you can watch for changes
12
+ - **Event bus** for decoupled communication
13
+ - **Registries** for discovering available helpers
14
+
15
+ ## Getting the Container
16
+
17
+ ```typescript
18
+ import container from '@soederpop/luca'
19
+ ```
20
+
21
+ The import resolves automatically based on environment -- `@soederpop/luca` gives you a `NodeContainer` on the server and a `WebContainer` in browser builds. You can also be explicit:
22
+
23
+ ```typescript
24
+ import container from '@soederpop/luca/node' // Always NodeContainer
25
+ import container from '@soederpop/luca/web' // Always WebContainer
26
+ ```
27
+
28
+ The NodeContainer comes pre-loaded with registries for features, clients, servers, commands, and endpoints. Core features like `fs`, `git`, `proc`, `os`, `networking`, `ui`, and `vm` are auto-enabled.
29
+
30
+ ## Registries
31
+
32
+ Every helper type has a registry. Registries let you discover what's available and create instances:
33
+
34
+ ```typescript
35
+ // What features are available?
36
+ container.features.available
37
+ // => ['fs', 'git', 'proc', 'vm', 'ui', 'networking', 'os', 'diskCache', 'contentDb', ...]
38
+
39
+ // Get documentation for a feature
40
+ container.features.describe('fs')
41
+
42
+ // Get documentation for all features
43
+ container.features.describeAll()
44
+
45
+ // Check if something is registered
46
+ container.features.has('diskCache')
47
+
48
+ // Same pattern for all helper types:
49
+ container.servers.available // ['express', 'websocket']
50
+ container.clients.available // ['rest', 'graph', 'websocket']
51
+ container.commands.available // ['serve', 'run', ...]
52
+ ```
53
+
54
+ ## Factory Methods
55
+
56
+ Create helper instances through the container's factory methods:
57
+
58
+ ```typescript
59
+ // Features (cached by id + options hash)
60
+ const fs = container.feature('fs')
61
+ const cache = container.feature('diskCache', { path: './cache' })
62
+
63
+ // Servers
64
+ const server = container.server('express', { port: 3000, cors: true })
65
+
66
+ // Clients
67
+ const api = container.client('rest', { baseURL: 'https://api.example.com' })
68
+ ```
69
+
70
+ Factory results are **cached**. Calling `container.feature('fs')` twice returns the same instance. Different options produce different instances.
71
+
72
+ ## Enabled Features (Shortcuts)
73
+
74
+ Some features are "enabled" on the container, giving them shortcut access:
75
+
76
+ ```typescript
77
+ // These are equivalent:
78
+ container.feature('fs')
79
+ container.fs
80
+
81
+ // Auto-enabled features:
82
+ container.fs // File system
83
+ container.git // Git operations
84
+ container.proc // Process execution
85
+ container.vm // JavaScript VM
86
+ container.ui // Terminal UI
87
+ container.os // OS info
88
+ container.networking // Port finding, availability
89
+ ```
90
+
91
+ To enable your own feature:
92
+
93
+ ```typescript
94
+ const myFeature = container.feature('myFeature', { enable: true })
95
+ // Now accessible as container.myFeature
96
+ ```
97
+
98
+ ## Observable State
99
+
100
+ The container (and every helper) has observable state:
101
+
102
+ ```typescript
103
+ // Set state
104
+ container.state.set('ready', true)
105
+
106
+ // Get state
107
+ container.state.get('ready') // true
108
+
109
+ // Get a snapshot of all state
110
+ container.state.current
111
+
112
+ // Observe all changes (changeType is 'add' | 'update' | 'delete')
113
+ container.state.observe((changeType, key, value) => {
114
+ console.log(`${key} ${changeType}:`, value)
115
+ })
116
+
117
+ // State has a version counter
118
+ container.state.version // increments on every change
119
+ ```
120
+
121
+ ## Event Bus
122
+
123
+ The container has a built-in event bus for decoupled communication:
124
+
125
+ ```typescript
126
+ // Listen for events
127
+ container.on('featureEnabled', (featureName) => {
128
+ console.log(`${featureName} was enabled`)
129
+ })
130
+
131
+ // Emit events
132
+ container.emit('myCustomEvent', { some: 'data' })
133
+
134
+ // One-time listener
135
+ container.once('ready', () => console.log('Container is ready'))
136
+
137
+ // Wait for an event (promise-based)
138
+ await container.waitFor('ready')
139
+ ```
140
+
141
+ ## Plugins and `.use()`
142
+
143
+ Extend the container with the `.use()` method:
144
+
145
+ ```typescript
146
+ // Enable a feature by name
147
+ container.use('diskCache')
148
+
149
+ // Attach a plugin
150
+ container.use(MyPlugin)
151
+ ```
152
+
153
+ A plugin is any class with a static `attach(container)` method:
154
+
155
+ ```typescript
156
+ class MyPlugin {
157
+ static attach(container) {
158
+ // Add registries, factories, whatever you need
159
+ container.myThing = new MyThing(container)
160
+ return container
161
+ }
162
+ }
163
+ ```
164
+
165
+ ## Utilities
166
+
167
+ The container provides common utilities so you don't need extra dependencies:
168
+
169
+ ```typescript
170
+ container.utils.uuid() // Generate a v4 UUID
171
+ container.utils.hashObject({ foo: 'bar' }) // Deterministic hash
172
+ container.utils.stringUtils.camelCase('my-var') // 'myVar'
173
+ container.utils.stringUtils.kebabCase('MyVar') // 'my-var'
174
+ container.utils.stringUtils.pluralize('feature') // 'features'
175
+
176
+ // Lodash utilities
177
+ const { uniq, groupBy, keyBy, debounce, throttle } = container.utils.lodash
178
+ ```
179
+
180
+ ## Path Utilities
181
+
182
+ ```typescript
183
+ container.paths.resolve('relative/path') // Resolve from cwd
184
+ container.paths.join('a', 'b', 'c') // Join path segments
185
+ container.paths.relative('/absolute/path') // Make relative to cwd
186
+ ```
187
+
188
+ ## Package Manifest
189
+
190
+ Access the project's package.json:
191
+
192
+ ```typescript
193
+ container.manifest.name // "my-app"
194
+ container.manifest.version // "0.1.0"
195
+ container.manifest.dependencies
196
+ ```
197
+
198
+ ## Introspection
199
+
200
+ Discover everything about the container at runtime:
201
+
202
+ ```typescript
203
+ // Structured introspection data
204
+ const info = container.inspect()
205
+
206
+ // Human-readable markdown
207
+ const docs = container.inspectAsText()
208
+ ```
209
+
210
+ This is what makes Luca especially powerful for AI agents -- they can discover the entire API surface at runtime without reading documentation.
@@ -0,0 +1,194 @@
1
+ ---
2
+ title: Running Scripts and Markdown Notebooks
3
+ tags: [scripts, luca-run, automation, bun, standalone, markdown, codeblocks, notebook]
4
+ ---
5
+
6
+ # Running Scripts and Markdown Notebooks
7
+
8
+ `luca run` executes TypeScript/JavaScript files and markdown files. This is often the fastest way to try out Luca features, automate tasks, or build runnable documentation.
9
+
10
+ ## Running a TypeScript Script
11
+
12
+ ```bash
13
+ luca run scripts/hello.ts
14
+ ```
15
+
16
+ ```typescript
17
+ // scripts/hello.ts
18
+ import container from '@soederpop/luca'
19
+
20
+ console.log('Available features:', container.features.available)
21
+ console.log('Git branch:', container.git.branch)
22
+ console.log('OS:', container.os.platform, container.os.arch)
23
+ ```
24
+
25
+ The extension is optional -- `luca run scripts/hello` tries `.ts`, `.js`, and `.md` automatically.
26
+
27
+ ## Running Markdown Files
28
+
29
+ This is one of Luca's most useful features. `luca run` can execute markdown files as runnable notebooks. It walks through the document, renders the prose to the terminal, and executes each `ts` or `js` fenced codeblock in sequence. All blocks share the same VM context, so variables defined in one block are available in the next.
30
+
31
+ ```bash
32
+ luca run docs/tutorial.md
33
+ ```
34
+
35
+ ### How It Works
36
+
37
+ Given a markdown file like this:
38
+
39
+ ````markdown
40
+ # Setup Tutorial
41
+
42
+ First, let's see what's available (container is provided automatically):
43
+
44
+ ```ts
45
+ console.log(container.features.available)
46
+ ```
47
+
48
+ Now let's use the file system feature:
49
+
50
+ ```ts
51
+ const { files } = container.fs.walk('./src', { include: ['*.ts'] })
52
+ console.log(`Found ${files.length} TypeScript files`)
53
+ ```
54
+
55
+ This block won't run because it's Python:
56
+
57
+ ```python
58
+ print("I'm skipped -- only ts and js blocks run")
59
+ ```
60
+ ````
61
+
62
+ When you run `luca run docs/tutorial.md`, it:
63
+
64
+ 1. Renders "# Setup Tutorial" and the prose as formatted markdown in your terminal
65
+ 2. Displays the first codeblock, then executes it
66
+ 3. Renders the next paragraph
67
+ 4. Displays and executes the second codeblock (which can reference `container` from block 1)
68
+ 5. Skips the Python block entirely (only `ts` and `js` blocks execute)
69
+
70
+ ### Skipping Blocks
71
+
72
+ Add `skip` in the code fence meta to prevent a block from running:
73
+
74
+ ````markdown
75
+ ```ts skip
76
+ // This block is shown but NOT executed
77
+ dangerousOperation()
78
+ ```
79
+ ````
80
+
81
+ ### Safe Mode
82
+
83
+ Use `--safe` to require manual approval before each block runs:
84
+
85
+ ```bash
86
+ luca run docs/tutorial.md --safe
87
+ ```
88
+
89
+ The runner will prompt "Run this block? (y/n)" before executing each codeblock. Great for walkthroughs where you want to pause and observe.
90
+
91
+ ### Shared Context
92
+
93
+ All codeblocks in a markdown file share a VM context. The context includes `console` and the full container context, so you can use container features without importing:
94
+
95
+ ````markdown
96
+ ```ts
97
+ // Block 1: container is already available in the context
98
+ const { files } = container.fs.walk('./src')
99
+ ```
100
+
101
+ ```ts
102
+ // Block 2: `files` from block 1 is still in scope
103
+ console.log(`Found ${files.length} files in src/`)
104
+ ```
105
+ ````
106
+
107
+ ### Use Cases for Markdown Scripts
108
+
109
+ - **Runnable tutorials** -- documentation that actually executes
110
+ - **Onboarding guides** -- new developers run the guide and see real output
111
+ - **Demo scripts** -- explain and execute in the same document
112
+ - **Literate DevOps** -- annotated operational runbooks
113
+
114
+ ## TypeScript Script Examples
115
+
116
+ ### File Processor
117
+
118
+ ```typescript
119
+ // scripts/process-images.ts
120
+ import container from '@soederpop/luca'
121
+
122
+ const { fs, proc } = container
123
+
124
+ const { files: images } = fs.walk('./uploads', { include: ['*.png', '*.jpg'] })
125
+ console.log(`Processing ${images.length} images...`)
126
+
127
+ for (const image of images) {
128
+ console.log(` Optimizing: ${image}`)
129
+ proc.exec(`optipng ${image}`)
130
+ }
131
+
132
+ console.log('Done.')
133
+ ```
134
+
135
+ ### Data Migration
136
+
137
+ ```typescript
138
+ // scripts/migrate-data.ts
139
+ import container from '@soederpop/luca'
140
+
141
+ const { fs } = container
142
+
143
+ const api = container.client('rest', {
144
+ baseURL: 'https://api.example.com',
145
+ })
146
+ await api.connect()
147
+
148
+ const oldData = fs.readJson('./data/legacy-users.json')
149
+ console.log(`Migrating ${oldData.length} users...`)
150
+
151
+ for (const user of oldData) {
152
+ await api.post('/users', {
153
+ name: user.full_name,
154
+ email: user.email_address,
155
+ role: 'user',
156
+ })
157
+ console.log(` Migrated: ${user.full_name}`)
158
+ }
159
+
160
+ console.log('Migration complete.')
161
+ ```
162
+
163
+ ### Generate Report
164
+
165
+ ```typescript
166
+ // scripts/weekly-report.ts
167
+ import container from '@soederpop/luca'
168
+
169
+ const { git, fs } = container
170
+
171
+ const branch = git.branch // getter, not a method
172
+ const sha = git.sha // getter, not a method
173
+ const files = await git.lsFiles()
174
+ const { files: srcFiles } = fs.walk('./src', { include: ['*.ts'] })
175
+
176
+ const report = `# Weekly Report
177
+
178
+ - Branch: ${branch}
179
+ - Commit: ${sha}
180
+ - Tracked files: ${files.length}
181
+ - Source files: ${srcFiles.length}
182
+
183
+ Generated: ${new Date().toISOString()}
184
+ `
185
+
186
+ await fs.writeFile('./reports/weekly.md', report)
187
+ console.log('Report generated: reports/weekly.md')
188
+ ```
189
+
190
+ ## Tips
191
+
192
+ - **Use the container** -- don't import `fs` from Node directly. `container.fs` gives you the same operations with the benefit of working within the container ecosystem.
193
+ - **Markdown scripts are great for prototyping** -- write a markdown file, mix explanation with code, run it, iterate.
194
+ - **Use `--safe` for unfamiliar scripts** -- review each block before it runs.
@@ -0,0 +1,196 @@
1
+ ---
2
+ title: Features Overview
3
+ tags: [features, built-in, fs, git, proc, vm, ui, networking, os, diskCache]
4
+ ---
5
+
6
+ # Features Overview
7
+
8
+ Features are the core building blocks in Luca. A feature is a thing that emits events, has observable state, and provides an interface for doing something meaningful. The container comes with many built-in features.
9
+
10
+ ## Using Features
11
+
12
+ ```typescript
13
+ // Auto-enabled features have shortcuts
14
+ container.fs // File system
15
+ container.git // Git operations
16
+ container.proc // Process execution
17
+ container.vm // JavaScript VM
18
+ container.ui // Terminal UI
19
+ container.os // OS info
20
+ container.networking // Port utilities
21
+
22
+ // On-demand features are created through the factory
23
+ const cache = container.feature('diskCache', { path: './.cache' })
24
+ const db = container.feature('contentDb', { rootPath: './docs' })
25
+ ```
26
+
27
+ ## Built-In Feature Reference
28
+
29
+ ### fs -- File System
30
+
31
+ Read, write, and navigate the file system:
32
+
33
+ ```typescript
34
+ const fs = container.fs
35
+
36
+ // Read files (synchronous)
37
+ const content = fs.readFile('./README.md')
38
+ const json = fs.readJson('./package.json')
39
+
40
+ // Write files (async -- creates parent dirs automatically)
41
+ await fs.writeFile('./output.txt', 'Hello')
42
+
43
+ // Check existence
44
+ fs.exists('./path/to/file')
45
+
46
+ // Walk directories -- returns { files: string[], directories: string[] }
47
+ const { files } = fs.walk('./src', { include: ['*.ts'] })
48
+
49
+ // Find files upward (synchronous)
50
+ const configPath = fs.findUp('tsconfig.json')
51
+ ```
52
+
53
+ ### git -- Git Operations
54
+
55
+ Work with git repositories:
56
+
57
+ ```typescript
58
+ const git = container.git
59
+
60
+ const branch = git.branch // Current branch name (getter)
61
+ const sha = git.sha // Current commit SHA (getter)
62
+ const isRepo = git.isRepo // Whether cwd is a git repo (getter)
63
+ const root = git.repoRoot // Absolute path to repo root (getter)
64
+ const files = await git.lsFiles() // List tracked files
65
+ const recent = await git.getLatestChanges(5) // Recent commits
66
+ ```
67
+
68
+ ### proc -- Process Execution
69
+
70
+ Run external processes:
71
+
72
+ ```typescript
73
+ const proc = container.proc
74
+
75
+ // Execute a command synchronously and get output as a string
76
+ const result = proc.exec('ls -la')
77
+
78
+ // Execute with options
79
+ const output = proc.exec('npm test', {
80
+ cwd: '/path/to/project',
81
+ env: { NODE_ENV: 'test' },
82
+ })
83
+ ```
84
+
85
+ ### vm -- JavaScript VM
86
+
87
+ Execute JavaScript in an isolated context:
88
+
89
+ ```typescript
90
+ const vm = container.vm
91
+
92
+ const result = await vm.run('1 + 2 + 3') // 6
93
+
94
+ const greeting = await vm.run('`Hello ${name}!`', { name: 'World' })
95
+ // 'Hello World!'
96
+
97
+ // The VM has access to the container context by default
98
+ const files = await vm.run('container.fs.walk("./src")')
99
+ ```
100
+
101
+ ### ui -- Terminal UI
102
+
103
+ Colors, prompts, and formatted output:
104
+
105
+ ```typescript
106
+ const ui = container.ui
107
+
108
+ // Colors
109
+ ui.colors.green('Success!')
110
+ ui.colors.red('Error!')
111
+ ui.colors.yellow('Warning!')
112
+
113
+ // ASCII art
114
+ console.log(ui.asciiArt('My App', 'Standard'))
115
+
116
+ // Colorful ASCII banner with gradient
117
+ console.log(ui.banner('My App', { font: 'Star Wars', colors: ['red', 'white', 'blue'] }))
118
+
119
+ // Render markdown in the terminal
120
+ ui.markdown('# Hello\n\nThis is **bold**')
121
+ ```
122
+
123
+ ### networking -- Port Utilities
124
+
125
+ ```typescript
126
+ const net = container.networking
127
+
128
+ // Find an available port (starting from a preferred port)
129
+ const port = await net.findOpenPort(3000)
130
+ ```
131
+
132
+ ### os -- System Info
133
+
134
+ ```typescript
135
+ const os = container.os
136
+
137
+ os.platform // 'darwin', 'linux', 'win32'
138
+ os.arch // 'x64', 'arm64'
139
+ os.cpuCount // Number of CPU cores
140
+ os.tmpdir // Temp directory path
141
+ ```
142
+
143
+ ### diskCache -- Disk-Based Cache
144
+
145
+ ```typescript
146
+ const cache = container.feature('diskCache', { path: './.cache' })
147
+
148
+ await cache.set('key', { data: 'value' })
149
+ const data = await cache.get('key')
150
+ await cache.has('key') // true
151
+ await cache.rm('key') // remove a cached item
152
+ ```
153
+
154
+ ### contentDb -- Markdown as a Database
155
+
156
+ Turn markdown folders into queryable collections. See the dedicated [ContentBase tutorial](./11-contentbase.md).
157
+
158
+ ### fileManager -- Batch File Operations
159
+
160
+ ```typescript
161
+ const fm = container.feature('fileManager')
162
+ // Batch read, write, copy, move operations
163
+ ```
164
+
165
+ ### grep -- Search File Contents
166
+
167
+ ```typescript
168
+ const grep = container.grep
169
+ const results = await grep.search({ pattern: 'TODO', include: '*.ts' })
170
+ // Returns array of { file, line, column, match } objects
171
+ ```
172
+
173
+ ### docker -- Docker Operations
174
+
175
+ ```typescript
176
+ const docker = container.feature('docker')
177
+ // Build, run, manage containers
178
+ ```
179
+
180
+ ## Discovering Features
181
+
182
+ Don't memorize this list. You can always discover what's available at runtime:
183
+
184
+ ```typescript
185
+ // List all registered features
186
+ container.features.available
187
+
188
+ // Get documentation for any feature
189
+ container.features.describe('diskCache')
190
+
191
+ // Get docs for everything
192
+ container.features.describeAll()
193
+
194
+ // Structured introspection data for a feature's full API
195
+ container.feature('fs').introspect()
196
+ ```