luca 3.0.0 → 3.1.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 (388) hide show
  1. package/.github/workflows/release.yaml +1 -0
  2. package/CLAUDE.md +10 -2
  3. package/README.md +130 -112
  4. package/assistants/codingAssistant/CORE.md +6 -1
  5. package/assistants/codingAssistant/hooks.ts +1 -1
  6. package/assistants/inkbot/hooks.ts +1 -1
  7. package/assistants/inkbot/tools.ts +1 -1
  8. package/bun.lock +264 -321
  9. package/commands/audit-docs.ts +2 -2
  10. package/commands/build-bootstrap.ts +2 -3
  11. package/commands/build-python-bridge.ts +2 -3
  12. package/commands/build-scaffolds.ts +2 -3
  13. package/commands/bundle-consumer-project.ts +521 -0
  14. package/commands/generate-api-docs.ts +2 -2
  15. package/commands/inkbot.ts +2 -2
  16. package/commands/release.ts +2 -2
  17. package/commands/social.ts +137 -0
  18. package/commands/try-all-challenges.ts +3 -3
  19. package/commands/try-challenge.ts +3 -3
  20. package/datasets/lora/agentic-loop-session-candidates.jsonl +91 -0
  21. package/datasets/lora/agentic-loop-session-curation-summary.json +123 -0
  22. package/datasets/lora/luca-session-candidates.jsonl +29 -0
  23. package/datasets/lora/luca-session-curation-summary.json +121 -0
  24. package/datasets/lora/review-batch-1.jsonl +30 -0
  25. package/datasets/lora/review-manifest.json +41 -0
  26. package/datasets/lora/review-queue.jsonl +120 -0
  27. package/datasets/lora/review-schema.json +134 -0
  28. package/datasets/lora/review-template.jsonl +2 -0
  29. package/datasets/lora/review-ui.html +725 -0
  30. package/dist/agi/container.server.d.ts +2 -2
  31. package/dist/agi/features/assistant.d.ts +2 -2
  32. package/dist/agi/features/assistants-manager.d.ts +1 -1
  33. package/dist/agi/features/autonomous-assistant.d.ts +1 -1
  34. package/dist/agi/features/browser-use.d.ts +1 -1
  35. package/dist/agi/features/claude-code.d.ts +1 -1
  36. package/dist/agi/features/conversation-history.d.ts +2 -2
  37. package/dist/agi/features/conversation.d.ts +1 -1
  38. package/dist/agi/features/docs-reader.d.ts +1 -1
  39. package/dist/agi/features/file-tools.d.ts +1 -1
  40. package/dist/agi/features/luca-coder.d.ts +1 -1
  41. package/dist/agi/features/openai-codex.d.ts +1 -1
  42. package/dist/agi/features/skills-library.d.ts +1 -1
  43. package/dist/clients/civitai/index.d.ts +4 -4
  44. package/dist/clients/client-template.d.ts +4 -4
  45. package/dist/clients/comfyui/index.d.ts +2 -2
  46. package/dist/clients/elevenlabs/index.d.ts +2 -2
  47. package/dist/clients/openai/index.d.ts +2 -2
  48. package/dist/clients/supabase/index.d.ts +3 -3
  49. package/dist/command.d.ts +1 -1
  50. package/dist/node/container.d.ts +1 -1
  51. package/dist/node/features/helpers.d.ts +3 -3
  52. package/dist/node/features/semantic-search.d.ts +1 -1
  53. package/dist/node/features/vm.d.ts +3 -3
  54. package/dist/node.d.ts +1 -1
  55. package/dist/scaffolds/generated.d.ts +1 -1
  56. package/dist/selector.d.ts +1 -1
  57. package/features/cipher-social.ts +493 -0
  58. package/index.html +217 -190
  59. package/luca.console.ts +1 -1
  60. package/package.json +7 -2
  61. package/public/index.html +217 -190
  62. package/public/slides-ai-native.html +1 -1
  63. package/public/slides-intro.html +2 -2
  64. package/scripts/curate-claude-sessions.ts +561 -0
  65. package/scripts/examples/ask-luca-expert.ts +1 -1
  66. package/scripts/examples/assistant-questions.ts +1 -1
  67. package/scripts/examples/excalidraw-expert.ts +1 -1
  68. package/scripts/examples/file-manager.ts +1 -1
  69. package/scripts/examples/ideas.ts +1 -1
  70. package/scripts/examples/interactive-chat.ts +1 -1
  71. package/scripts/examples/opening-a-web-browser.ts +1 -1
  72. package/scripts/examples/telegram-bot.ts +1 -1
  73. package/scripts/examples/using-assistant-with-mcp.ts +1 -1
  74. package/scripts/examples/using-claude-code.ts +1 -1
  75. package/scripts/examples/using-contentdb.ts +2 -2
  76. package/scripts/examples/using-conversations.ts +1 -1
  77. package/scripts/examples/using-disk-cache.ts +1 -1
  78. package/scripts/examples/using-docker-shell.ts +1 -1
  79. package/scripts/examples/using-elevenlabs.ts +1 -1
  80. package/scripts/examples/using-google-calendar.ts +1 -1
  81. package/scripts/examples/using-google-docs.ts +1 -1
  82. package/scripts/examples/using-google-drive.ts +1 -1
  83. package/scripts/examples/using-google-sheets.ts +1 -1
  84. package/scripts/examples/using-nlp.ts +1 -1
  85. package/scripts/examples/using-ollama.ts +1 -1
  86. package/scripts/examples/using-postgres.ts +1 -1
  87. package/scripts/examples/using-runpod.ts +1 -1
  88. package/scripts/examples/using-tts.ts +1 -1
  89. package/scripts/scaffold.ts +5 -5
  90. package/scripts/scratch.ts +1 -1
  91. package/scripts/test-assistant-hooks.ts +1 -1
  92. package/scripts/test-docs-reader.ts +1 -1
  93. package/src/agi/container.server.ts +6 -2
  94. package/src/agi/features/agent-memory.ts +25 -25
  95. package/src/agi/features/assistant.ts +34 -5
  96. package/src/agi/features/assistants-manager.ts +122 -6
  97. package/src/agi/features/autonomous-assistant.ts +1 -1
  98. package/src/agi/features/browser-use.ts +20 -1
  99. package/src/agi/features/claude-code.ts +51 -5
  100. package/src/agi/features/coding-tools.ts +1 -1
  101. package/src/agi/features/conversation-history.ts +181 -4
  102. package/src/agi/features/conversation.ts +186 -15
  103. package/src/agi/features/docs-reader.ts +2 -2
  104. package/src/agi/features/file-tools.ts +49 -2
  105. package/src/agi/features/luca-coder.ts +7 -5
  106. package/src/agi/features/mcp-bridge.ts +532 -0
  107. package/src/agi/features/openai-codex.ts +2 -2
  108. package/src/agi/features/skills-library.ts +131 -52
  109. package/src/agi/lib/token-counter.ts +80 -0
  110. package/src/bootstrap/generated.ts +56 -57
  111. package/src/browser.ts +1 -1
  112. package/src/cli/build-info.ts +2 -2
  113. package/src/cli/cli.ts +2 -2
  114. package/src/clients/civitai/index.ts +5 -5
  115. package/src/clients/client-template.ts +4 -4
  116. package/src/clients/comfyui/index.ts +4 -4
  117. package/src/clients/elevenlabs/index.ts +4 -4
  118. package/src/clients/openai/index.ts +7 -7
  119. package/src/clients/supabase/index.ts +4 -4
  120. package/src/clients/voicebox/index.ts +4 -4
  121. package/src/command.ts +2 -1
  122. package/src/commands/chat.ts +1 -0
  123. package/src/commands/eval.ts +2 -56
  124. package/src/commands/introspect.ts +1 -1
  125. package/src/commands/prompt.ts +41 -9
  126. package/src/container-describer.ts +8 -1
  127. package/src/container.ts +13 -0
  128. package/src/entity.ts +2 -2
  129. package/src/helper.ts +1 -1
  130. package/src/introspection/generated.agi.ts +29596 -27654
  131. package/src/introspection/generated.node.ts +20284 -19247
  132. package/src/introspection/generated.web.ts +605 -584
  133. package/src/introspection/scan.ts +11 -6
  134. package/src/node/container.ts +9 -1
  135. package/src/node/features/content-db.ts +39 -2
  136. package/src/node/features/display-result.ts +57 -0
  137. package/src/node/features/helpers.ts +46 -7
  138. package/src/node/features/python.ts +25 -19
  139. package/src/node/features/repl.ts +1 -1
  140. package/src/node/features/secure-shell.ts +11 -17
  141. package/src/node/features/semantic-search.ts +2 -2
  142. package/src/node/features/socket-repl.ts +336 -0
  143. package/src/node/features/telnyx-assistant-connector.ts +1206 -0
  144. package/src/node/features/transpiler.ts +2 -3
  145. package/src/node/features/ui.ts +5 -0
  146. package/src/node/features/vm.ts +20 -3
  147. package/src/node.ts +3 -3
  148. package/src/python/generated.ts +0 -1
  149. package/src/scaffolds/generated.ts +82 -83
  150. package/src/selector.ts +1 -1
  151. package/src/servers/express.ts +1 -1
  152. package/src/web/features/helpers.ts +22 -0
  153. package/tsconfig.json +12 -12
  154. package/docs/CLI.md +0 -335
  155. package/docs/CNAME +0 -1
  156. package/docs/README.md +0 -60
  157. package/docs/TABLE-OF-CONTENTS.md +0 -183
  158. package/docs/apis/clients/elevenlabs.md +0 -308
  159. package/docs/apis/clients/graph.md +0 -107
  160. package/docs/apis/clients/openai.md +0 -429
  161. package/docs/apis/clients/rest.md +0 -161
  162. package/docs/apis/clients/websocket.md +0 -174
  163. package/docs/apis/features/agi/assistant.md +0 -625
  164. package/docs/apis/features/agi/assistants-manager.md +0 -282
  165. package/docs/apis/features/agi/auto-assistant.md +0 -279
  166. package/docs/apis/features/agi/browser-use.md +0 -802
  167. package/docs/apis/features/agi/claude-code.md +0 -884
  168. package/docs/apis/features/agi/conversation-history.md +0 -364
  169. package/docs/apis/features/agi/conversation.md +0 -548
  170. package/docs/apis/features/agi/docs-reader.md +0 -99
  171. package/docs/apis/features/agi/file-tools.md +0 -163
  172. package/docs/apis/features/agi/luca-coder.md +0 -407
  173. package/docs/apis/features/agi/openai-codex.md +0 -396
  174. package/docs/apis/features/agi/openapi.md +0 -138
  175. package/docs/apis/features/agi/semantic-search.md +0 -387
  176. package/docs/apis/features/agi/skills-library.md +0 -239
  177. package/docs/apis/features/node/container-link.md +0 -192
  178. package/docs/apis/features/node/content-db.md +0 -450
  179. package/docs/apis/features/node/disk-cache.md +0 -379
  180. package/docs/apis/features/node/dns.md +0 -652
  181. package/docs/apis/features/node/docker.md +0 -706
  182. package/docs/apis/features/node/downloader.md +0 -81
  183. package/docs/apis/features/node/esbuild.md +0 -60
  184. package/docs/apis/features/node/file-manager.md +0 -191
  185. package/docs/apis/features/node/fs.md +0 -1217
  186. package/docs/apis/features/node/git.md +0 -371
  187. package/docs/apis/features/node/google-auth.md +0 -193
  188. package/docs/apis/features/node/google-calendar.md +0 -202
  189. package/docs/apis/features/node/google-docs.md +0 -173
  190. package/docs/apis/features/node/google-drive.md +0 -246
  191. package/docs/apis/features/node/google-mail.md +0 -214
  192. package/docs/apis/features/node/google-sheets.md +0 -194
  193. package/docs/apis/features/node/grep.md +0 -292
  194. package/docs/apis/features/node/helpers.md +0 -164
  195. package/docs/apis/features/node/ink.md +0 -334
  196. package/docs/apis/features/node/ipc-socket.md +0 -249
  197. package/docs/apis/features/node/json-tree.md +0 -86
  198. package/docs/apis/features/node/networking.md +0 -316
  199. package/docs/apis/features/node/nlp.md +0 -133
  200. package/docs/apis/features/node/opener.md +0 -97
  201. package/docs/apis/features/node/os.md +0 -146
  202. package/docs/apis/features/node/package-finder.md +0 -392
  203. package/docs/apis/features/node/postgres.md +0 -234
  204. package/docs/apis/features/node/proc.md +0 -399
  205. package/docs/apis/features/node/process-manager.md +0 -305
  206. package/docs/apis/features/node/python.md +0 -604
  207. package/docs/apis/features/node/redis.md +0 -380
  208. package/docs/apis/features/node/repl.md +0 -88
  209. package/docs/apis/features/node/runpod.md +0 -674
  210. package/docs/apis/features/node/secure-shell.md +0 -176
  211. package/docs/apis/features/node/semantic-search.md +0 -408
  212. package/docs/apis/features/node/sqlite.md +0 -233
  213. package/docs/apis/features/node/telegram.md +0 -279
  214. package/docs/apis/features/node/transpiler.md +0 -74
  215. package/docs/apis/features/node/tts.md +0 -133
  216. package/docs/apis/features/node/ui.md +0 -701
  217. package/docs/apis/features/node/vault.md +0 -59
  218. package/docs/apis/features/node/vm.md +0 -75
  219. package/docs/apis/features/node/yaml-tree.md +0 -85
  220. package/docs/apis/features/node/yaml.md +0 -176
  221. package/docs/apis/features/web/asset-loader.md +0 -59
  222. package/docs/apis/features/web/container-link.md +0 -192
  223. package/docs/apis/features/web/esbuild.md +0 -54
  224. package/docs/apis/features/web/helpers.md +0 -164
  225. package/docs/apis/features/web/network.md +0 -44
  226. package/docs/apis/features/web/speech.md +0 -69
  227. package/docs/apis/features/web/vault.md +0 -59
  228. package/docs/apis/features/web/vm.md +0 -75
  229. package/docs/apis/features/web/voice.md +0 -84
  230. package/docs/apis/servers/express.md +0 -171
  231. package/docs/apis/servers/mcp.md +0 -238
  232. package/docs/apis/servers/websocket.md +0 -170
  233. package/docs/bootstrap/CLAUDE.md +0 -101
  234. package/docs/bootstrap/SKILL.md +0 -341
  235. package/docs/bootstrap/templates/about-command.ts +0 -41
  236. package/docs/bootstrap/templates/docs-models.ts +0 -22
  237. package/docs/bootstrap/templates/docs-readme.md +0 -43
  238. package/docs/bootstrap/templates/example-feature.ts +0 -53
  239. package/docs/bootstrap/templates/health-endpoint.ts +0 -15
  240. package/docs/bootstrap/templates/luca-cli.ts +0 -30
  241. package/docs/bootstrap/templates/runme.md +0 -54
  242. package/docs/challenges/caching-proxy.md +0 -16
  243. package/docs/challenges/content-db-round-trip.md +0 -14
  244. package/docs/challenges/custom-command.md +0 -9
  245. package/docs/challenges/file-watcher-pipeline.md +0 -11
  246. package/docs/challenges/grep-audit-report.md +0 -15
  247. package/docs/challenges/multi-feature-dashboard.md +0 -14
  248. package/docs/challenges/process-orchestrator.md +0 -17
  249. package/docs/challenges/rest-api-server-with-client.md +0 -12
  250. package/docs/challenges/script-runner-with-vm.md +0 -11
  251. package/docs/challenges/simple-rest-api.md +0 -15
  252. package/docs/challenges/websocket-serve-and-client.md +0 -11
  253. package/docs/challenges/yaml-config-system.md +0 -14
  254. package/docs/command-system-overhaul.md +0 -94
  255. package/docs/documentation-audit.md +0 -134
  256. package/docs/examples/assistant/CORE.md +0 -18
  257. package/docs/examples/assistant/hooks.ts +0 -3
  258. package/docs/examples/assistant/tools.ts +0 -10
  259. package/docs/examples/assistant-hooks-reference.ts +0 -171
  260. package/docs/examples/assistant-with-process-manager.md +0 -84
  261. package/docs/examples/content-db.md +0 -77
  262. package/docs/examples/disk-cache.md +0 -83
  263. package/docs/examples/docker.md +0 -101
  264. package/docs/examples/downloader.md +0 -70
  265. package/docs/examples/entity.md +0 -124
  266. package/docs/examples/esbuild.md +0 -80
  267. package/docs/examples/feature-as-tool-provider.md +0 -143
  268. package/docs/examples/file-manager.md +0 -82
  269. package/docs/examples/fs.md +0 -83
  270. package/docs/examples/git.md +0 -85
  271. package/docs/examples/google-auth.md +0 -88
  272. package/docs/examples/google-calendar.md +0 -94
  273. package/docs/examples/google-docs.md +0 -82
  274. package/docs/examples/google-drive.md +0 -96
  275. package/docs/examples/google-sheets.md +0 -95
  276. package/docs/examples/grep.md +0 -85
  277. package/docs/examples/ink-blocks.md +0 -75
  278. package/docs/examples/ink-renderer.md +0 -41
  279. package/docs/examples/ink.md +0 -103
  280. package/docs/examples/ipc-socket.md +0 -103
  281. package/docs/examples/json-tree.md +0 -91
  282. package/docs/examples/networking.md +0 -58
  283. package/docs/examples/nlp.md +0 -91
  284. package/docs/examples/opener.md +0 -78
  285. package/docs/examples/os.md +0 -72
  286. package/docs/examples/package-finder.md +0 -89
  287. package/docs/examples/postgres.md +0 -91
  288. package/docs/examples/proc.md +0 -81
  289. package/docs/examples/process-manager.md +0 -79
  290. package/docs/examples/python.md +0 -132
  291. package/docs/examples/repl.md +0 -93
  292. package/docs/examples/runpod.md +0 -119
  293. package/docs/examples/secure-shell.md +0 -92
  294. package/docs/examples/sqlite.md +0 -86
  295. package/docs/examples/structured-output-with-assistants.md +0 -144
  296. package/docs/examples/telegram.md +0 -77
  297. package/docs/examples/tts.md +0 -86
  298. package/docs/examples/ui.md +0 -80
  299. package/docs/examples/vault.md +0 -70
  300. package/docs/examples/vm.md +0 -86
  301. package/docs/examples/websocket-ask-and-reply-example.md +0 -128
  302. package/docs/examples/yaml-tree.md +0 -93
  303. package/docs/examples/yaml.md +0 -104
  304. package/docs/ideas/assistant-factory-pattern.md +0 -142
  305. package/docs/in-memory-fs.md +0 -4
  306. package/docs/introspection-audit.md +0 -49
  307. package/docs/introspection.md +0 -164
  308. package/docs/mcp/readme.md +0 -162
  309. package/docs/models.ts +0 -41
  310. package/docs/philosophy.md +0 -86
  311. package/docs/principles.md +0 -7
  312. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +0 -34
  313. package/docs/prompts/check-for-undocumented-features.md +0 -27
  314. package/docs/prompts/mcp-test-easy-command.md +0 -27
  315. package/docs/scaffolds/client.md +0 -149
  316. package/docs/scaffolds/command.md +0 -120
  317. package/docs/scaffolds/endpoint.md +0 -171
  318. package/docs/scaffolds/feature.md +0 -158
  319. package/docs/scaffolds/selector.md +0 -91
  320. package/docs/scaffolds/server.md +0 -196
  321. package/docs/selectors.md +0 -115
  322. package/docs/sessions/custom-command/attempt-log-2.md +0 -195
  323. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +0 -728
  324. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +0 -555
  325. package/docs/sessions/grep-audit-report/attempt-log-1.md +0 -289
  326. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +0 -679
  327. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +0 -1
  328. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +0 -920
  329. package/docs/sessions/simple-rest-api/attempt-log-1.md +0 -593
  330. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +0 -995
  331. package/docs/tutorials/00-bootstrap.md +0 -166
  332. package/docs/tutorials/01-getting-started.md +0 -106
  333. package/docs/tutorials/02-container.md +0 -210
  334. package/docs/tutorials/03-scripts.md +0 -194
  335. package/docs/tutorials/04-features-overview.md +0 -196
  336. package/docs/tutorials/05-state-and-events.md +0 -171
  337. package/docs/tutorials/06-servers.md +0 -157
  338. package/docs/tutorials/07-endpoints.md +0 -198
  339. package/docs/tutorials/08-commands.md +0 -252
  340. package/docs/tutorials/09-clients.md +0 -162
  341. package/docs/tutorials/10-creating-features.md +0 -203
  342. package/docs/tutorials/11-contentbase.md +0 -191
  343. package/docs/tutorials/12-assistants.md +0 -215
  344. package/docs/tutorials/13-introspection.md +0 -157
  345. package/docs/tutorials/14-type-system.md +0 -174
  346. package/docs/tutorials/15-project-patterns.md +0 -222
  347. package/docs/tutorials/16-google-features.md +0 -534
  348. package/docs/tutorials/17-tui-blocks.md +0 -530
  349. package/docs/tutorials/18-semantic-search.md +0 -334
  350. package/docs/tutorials/19-python-sessions.md +0 -401
  351. package/docs/tutorials/20-browser-esm.md +0 -234
  352. package/index.ts +0 -1
  353. package/src/agi/endpoints/ask.ts +0 -60
  354. package/src/agi/endpoints/conversations/[id].ts +0 -45
  355. package/src/agi/endpoints/conversations.ts +0 -31
  356. package/src/agi/endpoints/experts.ts +0 -37
  357. package/test/assistant-hooks.test.ts +0 -306
  358. package/test/assistant.test.ts +0 -81
  359. package/test/bus.test.ts +0 -134
  360. package/test/clients-servers.test.ts +0 -217
  361. package/test/command.test.ts +0 -267
  362. package/test/container-link.test.ts +0 -274
  363. package/test/conversation.test.ts +0 -220
  364. package/test/features.test.ts +0 -160
  365. package/test/fork-and-research.test.ts +0 -450
  366. package/test/integration.test.ts +0 -787
  367. package/test/interceptor-chain.test.ts +0 -61
  368. package/test/node-container.test.ts +0 -121
  369. package/test/python-session.test.ts +0 -105
  370. package/test/rate-limit.test.ts +0 -272
  371. package/test/semantic-search.test.ts +0 -550
  372. package/test/state.test.ts +0 -121
  373. package/test/vm-context.test.ts +0 -146
  374. package/test/vm-loadmodule.test.ts +0 -213
  375. package/test/websocket-ask.test.ts +0 -101
  376. package/test-integration/assistant.test.ts +0 -138
  377. package/test-integration/assistants-manager.test.ts +0 -113
  378. package/test-integration/claude-code.test.ts +0 -98
  379. package/test-integration/conversation-history.test.ts +0 -205
  380. package/test-integration/conversation.test.ts +0 -137
  381. package/test-integration/elevenlabs.test.ts +0 -55
  382. package/test-integration/google-services.test.ts +0 -80
  383. package/test-integration/helpers.ts +0 -89
  384. package/test-integration/memory.test.ts +0 -204
  385. package/test-integration/openai-codex.test.ts +0 -93
  386. package/test-integration/runpod.test.ts +0 -58
  387. package/test-integration/server-endpoints.test.ts +0 -97
  388. package/test-integration/telegram.test.ts +0 -46
@@ -1,341 +0,0 @@
1
- ---
2
- name: Using the luca framework
3
- description: The @soederpop/luca framework, when you see a project with docs/ commands/ features/ luca.cli.ts endpoints/ folders, or @soederpop/luca is in the package.json, or the user is asking you to develop a new Luca feature, use this skill to learn about the APIs and how to learn the framework at runtime. The luca cli bundles all of the documentation in a searchable, progressively learnable interface designed for students and AI assistants alike
4
- ---
5
- # Luca: Learning the Container
6
-
7
- The Luca framework `@soederpop/luca` ships a `luca` binary — a bun-based CLI for a dependency injection container. This project is based on it if this skill is present. The container auto-discovers modules in `commands/`, `clients/`, `servers/`, `features/`, and `endpoints/` folders.
8
-
9
- The `luca` cli loads typescript modules in through its VM which injects a `container` global that is a singleton object from which you can learn about, and access all different kinds of utils and Helpers (features, clients, servers, commands, and compositions thereof)
10
-
11
- There are three things to learn, in this order:
12
-
13
- 1. **Discover** what the container can do — `luca describe`
14
- 2. **Build** new helpers when your project needs them — `luca scaffold`
15
- 3. **Prototype** and debug with live code — `luca eval`
16
- 4. **Write Runnable Markdown** a great usecase is `luca run markdown.md` where the markdown codeblocks are executed inside the Luca VM.
17
- ---
18
-
19
- ## Phase 1: Discover with `luca describe`
20
-
21
- This is your primary tool. The `luca` binary is a compiled artifact that bundles all introspection data — it is the authority on what the container provides. Run `luca describe` first — it outputs full documentation for any part of the container: methods, options, events, state, examples. Reading source can be helpful for additional context if it exists in the project, but the source for built-in helpers may not be present — the binary is always the ground truth.
22
-
23
- ### See what's available
24
-
25
- ```shell
26
- luca describe features # index of all available features
27
- luca describe clients # index of all available clients
28
- luca describe servers # index of all available servers
29
- ```
30
-
31
- You can even learn about features in the browser container, or a specific platform (server, node are the same, browser,web are the same)
32
-
33
- ```shell
34
- luca describe features --platform=web
35
- luca describe features --platform=server
36
- ```
37
-
38
- ### Learn about specific helpers
39
-
40
- ```shell
41
- luca describe fs # full docs for the fs feature
42
- luca describe git # full docs for git
43
- luca describe rest # full docs for the rest client
44
- luca describe express # full docs for the express server
45
- luca describe git fs proc # multiple helpers in one shot
46
- ```
47
-
48
- ### Drill into a specific method or getter
49
-
50
- Use dot notation to get docs for a single method or getter on any helper:
51
-
52
- ```shell
53
- luca describe ui.banner # docs for the banner() method on ui
54
- luca describe fs.readFile # docs for readFile() on fs
55
- luca describe ui.colors # docs for the colors getter on ui
56
- luca describe git.branch # docs for the branch getter on git
57
- ```
58
-
59
- This shows the description, parameters, return type, and examples for just that member. If the member doesn't exist, it lists all available methods and getters on the helper.
60
-
61
- ### Get targeted documentation
62
-
63
- You can filter to only the sections you need:
64
-
65
- ```shell
66
- luca describe fs --methods # just the methods
67
- luca describe git --events # just the events it emits
68
- luca describe express --options # just the constructor options
69
- luca describe fs git --examples # just examples for both
70
- luca describe fs --usage --methods # combine sections
71
- ```
72
-
73
- ### Get approximate TypeScript types
74
-
75
- Need to know the shape of a helper for type-safe code? Use `--ts`:
76
-
77
- ```shell
78
- luca describe fs --ts # approximate TS interface for fs
79
- luca describe conversation --ts # see the conversation feature's type surface
80
- luca describe rest --ts # client type shape
81
- ```
82
-
83
- This outputs a ~95% accurate TypeScript representation based on runtime introspection. If a type looks wrong or a method signature seems off, verify with `luca eval` against the live instance.
84
-
85
- ### Describe the container itself
86
-
87
- ```shell
88
- luca describe # overview of the container
89
- luca describe self # same thing
90
- ```
91
-
92
- ### Get help on any command
93
-
94
- ```shell
95
- luca # list all available commands
96
- luca describe --help # full flag reference for describe
97
- luca help scaffold # help for any command
98
- ```
99
-
100
- **Use `luca describe` liberally.** It is the fastest, safest way to understand what the container provides. Every feature, client, and server is self-describing — if you know a name, describe will tell you everything about it. Use dot notation (`ui.banner`, `fs.readFile`) when you need docs on just one method or getter. Use `--ts` when you need type information for writing code.
101
-
102
- > **NOTE:** The `luca` binary is compiled and bundles all introspection data. `luca describe` reflects what actually ships in the binary — source files for built-in helpers may not exist in your project. Reading source can add context when it's available, but `luca describe` and `luca eval` are always the authority.
103
-
104
- ---
105
-
106
- ## Phase 2: Build with `luca scaffold`
107
-
108
- When your project needs a new helper, scaffold it. The `scaffold` command generates correct boilerplate — you fill in the logic.
109
-
110
- ### Learn how to build each type
111
-
112
- Before creating anything, read the tutorial for that helper type:
113
-
114
- ```shell
115
- luca scaffold feature --tutorial # how features work, full guide
116
- luca scaffold command --tutorial # how commands work
117
- luca scaffold endpoint --tutorial # how endpoints work
118
- luca scaffold client --tutorial # how clients work
119
- luca scaffold server --tutorial # how servers work
120
- ```
121
-
122
- These tutorials are the authoritative reference for each helper type. They cover imports, schemas, class structure, registration, conventions, and complete examples.
123
-
124
- ### Generate a helper
125
-
126
- ```shell
127
- luca scaffold <type> <name> --description "What it does"
128
- ```
129
-
130
- The workflow after scaffolding:
131
-
132
- ```shell
133
- luca scaffold command sync-data --description "Pull data from staging"
134
- # edit commands/sync-data.ts — add your logic
135
- luca describe sync-data # verify it shows up and reads correctly
136
- ```
137
-
138
- Every scaffolded helper is auto-discovered by the container at runtime.
139
-
140
- ### When to use each type
141
-
142
- | You need to... | Scaffold a... | Example |
143
- |----------------------------------------------------|----------------|----------------------------------------------------------------|
144
- | Add a reusable local capability (caching, crypto) | **feature** | `luca scaffold feature disk-cache --description "File-backed key-value cache"` |
145
- | Add a CLI task (build, deploy, generate) | **command** | `luca scaffold command deploy --description "Deploy to production"` |
146
- | Talk to an external API or service | **client** | `luca scaffold client github --description "GitHub API wrapper"` |
147
- | Accept incoming connections (HTTP, WS) | **server** | `luca scaffold server mqtt --description "MQTT broker"` |
148
- | Add a REST route to `luca serve` | **endpoint** | `luca scaffold endpoint users --description "User management API"` |
149
-
150
- ### Scaffold options
151
-
152
- ```shell
153
- luca scaffold command deploy --description "..." # writes to commands/deploy.ts
154
- luca scaffold endpoint users --print # print to stdout instead of writing
155
- luca scaffold feature cache --output lib/cache.ts # override output path
156
- ```
157
-
158
- ---
159
-
160
- ## Phase 3: Prototype with `luca eval`
161
-
162
- Once you know what's available (describe) and how to build things (scaffold), use `luca eval` to test ideas, verify behavior, and debug.
163
-
164
- ```shell
165
- luca eval "container.features.available"
166
- luca eval "container.feature('proc').exec('ls')"
167
- luca eval "container.feature('fs').readFile('package.json')"
168
- ```
169
-
170
- The eval command boots a full container with all helpers discovered and registered. Core features are available as top-level shortcuts:
171
-
172
- ```shell
173
- luca eval "fs.readFile('package.json')"
174
- luca eval "git.branch"
175
- luca eval "proc.exec('ls')"
176
- ```
177
-
178
- **Reach for eval when you're stuck.** It gives you full control of the container at runtime — you can test method calls, inspect state, verify event behavior, and debug issues that are hard to reason about from docs alone.
179
-
180
- **Use eval as a testing tool.** Before wiring up a full command handler or feature, test your logic in eval first. Want to verify how `fs.moveAsync` behaves, or whether a watcher event fires the way you expect? Run it in eval. This is the fastest way to validate container code without the overhead of building the full command around it.
181
-
182
- ```shell
183
- # Test file operations before building a command around them
184
- luca eval "await fs.moveAsync('inbox/test.json', 'inbox/valid/test.json')"
185
-
186
- # First: luca describe fileManager --events (to learn what events exist)
187
- # Then test the behavior:
188
- luca eval "const fm = container.feature('fileManager'); fm.on('file:change', (e) => console.log(e)); await fm.watch({ paths: ['inbox'] })"
189
- ```
190
-
191
- ### The REPL
192
-
193
- For interactive exploration, `luca console` opens a persistent REPL with the container in scope. Useful when you need to try multiple things in sequence.
194
-
195
- ---
196
-
197
- ## Key Concepts
198
-
199
- ### The Container
200
-
201
- The container is a singleton that holds everything your application needs. It organizes components into **registries**: features, clients, servers, commands, and endpoints. Use the factory functions to get instances:
202
-
203
- ```js
204
- const fs = container.feature('fs')
205
- const rest = container.client('rest')
206
- const server = container.server('express')
207
- ```
208
-
209
- ### State
210
-
211
- Every helper and the container itself have observable state:
212
-
213
- ```js
214
- const feature = container.feature('fs')
215
-
216
- feature.state.current // snapshot of all state
217
- feature.state.get('someKey') // single value
218
- feature.state.set('key', 'value') // update
219
-
220
- // Watch for changes
221
- feature.state.observe((changeType, key, value) => {
222
- // changeType: 'add' | 'update' | 'delete'
223
- })
224
- ```
225
-
226
- The container has state too: `container.state.current`, `container.state.observe()`.
227
-
228
- ### Events
229
-
230
- Every helper and the container are event emitters — `on`, `once`, `emit`, `waitFor` all work as expected. Use `luca describe <name> --events` to see what a helper emits.
231
-
232
- ### Utilities
233
-
234
- The container provides common utilities at `container.utils` — no external imports needed:
235
-
236
- - `container.utils.uuid()` — v4 UUID
237
- - `container.utils.hashObject(obj)` — deterministic hash
238
- - `container.utils.stringUtils` — camelCase, kebabCase, pluralize, etc.
239
- - `container.utils.lodash` — groupBy, keyBy, pick, omit, debounce, etc.
240
- - `container.paths.resolve()` / `container.paths.join()` — path operations
241
-
242
- ### Programmatic introspection
243
-
244
- Everything `luca describe` outputs is also available at runtime in code:
245
-
246
- ```js
247
- container.features.describe('fs') // markdown docs (same as the CLI)
248
- feature.introspect() // structured object: { methods, events, state, options }
249
- container.introspectAsText() // full container overview as markdown
250
- ```
251
-
252
- This is useful inside commands and scripts where you need introspection data programmatically.
253
-
254
- ---
255
-
256
- ## Server development troubleshooting
257
-
258
- - You can use `container.proc.findPidsByPort(3000)` which will return an array of numbers.
259
- - You can use `container.proc.kill(pid)` to kill that process
260
- - 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 )
261
- - `luca serve --force` will also replace the running process with the current one
262
- - `luca serve --any-port` will open on any port
263
-
264
-
265
- ## Framework Index
266
-
267
- A table of contents for the container. **Run `luca describe <name>` for full docs on any item.** Use `luca describe <name> --ts` when you need type information. Source may not exist locally for built-in helpers — the compiled binary is the authority.
268
-
269
- ### Features by Category
270
-
271
- | Category | Features | What they do |
272
- |----------|----------|--------------|
273
- | **File System & Code** | `fs`, `grep`, `fileManager` | Read/write files, search code, watch for changes |
274
- | **Process & Shell** | `proc`, `processManager`, `secureShell` | Run commands, manage long-running processes, SSH |
275
- | **AI Assistants** | `assistant`, `assistantsManager`, `conversation`, `conversationHistory`, `fileTools` | Build AI assistants, manage conversations, tool calling. `fileTools` composes lower-level features (`fs`, `grep`) into an assistant-ready tool surface — a good example of how features can define tools for assistants (see `references/examples/feature-as-tool-provider.md`). |
276
- | **AI Agent Wrappers** | `claudeCode`, `openaiCodex`, `lucaCoder` | Spawn and manage external AI agent CLIs as subprocesses |
277
- | **Data & Storage** | `sqlite`, `postgres`, `diskCache`, `contentDb`, `redis` | Databases, caching, document management |
278
- | **Networking** | `networking`, `dns` | Network utilities, DNS |
279
- | **Google Workspace** | `googleAuth`, `googleDrive`, `googleDocs`, `googleSheets`, `googleCalendar`, `googleMail` | OAuth and Google service wrappers |
280
- | **Dev Tools** | `git`, `docker`, `esbuild`, `vm`, `python`, `packageFinder` | Version control, containers, bundling, sandboxed execution |
281
- | **Content & NLP** | `docsReader`, `nlp`, `semanticSearch`, `skillsLibrary`, `jsonTree`, `yamlTree` | Document Q&A, text analysis, semantic search, skills, structured file ingestion |
282
- | **UI & Output** | `ui`, `ink`, `yaml` | Terminal UI, colors, ascii art, structured data display |
283
- | **Media & Browser** | `browserUse`, `tts`, `downloader`, `opener`, `telegram` | Browser automation, text-to-speech, downloads, messaging |
284
- | **System** | `os`, `vault`, `helpers`, `introspectionScanner`, `containerLink`, `repl`, `runpod` | OS info, secrets, runtime introspection, remote container linking |
285
-
286
- ### Clients
287
-
288
- | Client | Purpose |
289
- |--------|---------|
290
- | `openai` | Chat completions, embeddings, image generation |
291
- | `rest` | Generic HTTP client (GET/POST/PUT/PATCH/DELETE) |
292
- | `websocket` | WebSocket connections |
293
- | `elevenlabs` | Text-to-speech synthesis |
294
- | `graph` | GraphQL queries and mutations |
295
-
296
- ### Servers
297
-
298
- | Server | Purpose |
299
- |--------|---------|
300
- | `express` | HTTP server with file-based endpoint routing |
301
- | `mcp` | Model Context Protocol server for AI tool exposure |
302
- | `websocket` | WebSocket server with JSON framing |
303
- | `ipcSocket` | Local IPC socket server for inter-process communication |
304
-
305
- ### Type Discovery
306
-
307
- `luca describe <name> --ts` outputs an approximate TypeScript representation of any helper as it exists at runtime — ~95% accurate. This is your go-to for writing type-safe code against the container. The binary compiles in the introspection data, so `--ts` reflects what actually exists at runtime even when source isn't available. Reading source can provide additional context when it's there.
308
-
309
- ```shell
310
- luca describe fs --ts # approximate TS interface for the fs feature
311
- luca describe conversation --ts # conversation feature type surface
312
- luca describe express --ts # express server type shape
313
- ```
314
-
315
- If a method signature or return type looks wrong, verify with `luca eval`:
316
-
317
- ```shell
318
- luca eval "typeof container.feature('fs').readFile"
319
- luca eval "container.feature('fs').readFile('package.json')"
320
- ```
321
-
322
- ### Bundled Examples and Tutorials
323
-
324
- The skill directory includes reference material:
325
-
326
- - **`references/examples/`** — short, focused example docs for individual features (e.g. `fs.md`, `git.md`, `proc.md`)
327
- - **`references/tutorials/`** — longer-form guides covering the container, helpers, commands, endpoints, state/events, assistants, and more
328
-
329
- These complement `luca describe` — describe gives you the API surface, examples show you patterns in action, and tutorials walk through building things end to end.
330
-
331
- **Tip:** Runnable markdown is a great artifact to produce when building with luca. `luca run doc.md` executes code blocks inside the Luca VM — useful for both testing and documentation. When prototyping a feature or writing a how-to, consider writing it as a markdown file that can be run.
332
-
333
- ### Container Primitives
334
-
335
- | Primitive | Access | Purpose |
336
- |-----------|--------|---------|
337
- | State | `container.state`, `helper.state` | Observable key-value state on every object |
338
- | Events | `container.on()`, `helper.on()` | Event bus on every object |
339
- | Paths | `container.paths` | `resolve()`, `join()`, `cwd` |
340
- | Utils | `container.utils` | `uuid()`, `lodash`, `stringUtils`, `hashObject()` |
341
- | Registries | `container.features`, `.clients`, `.servers` | Discovery and metadata for all helpers |
@@ -1,41 +0,0 @@
1
- /**
2
- * about — Display project information and discovered helpers.
3
- * Run with: luca about
4
- *
5
- * Positional words after the command name are available as options._
6
- * For example: `luca about commands` → options._[1] === 'commands'
7
- */
8
- import { z } from 'zod'
9
- import type { ContainerContext } from '@soederpop/luca'
10
-
11
- export const description = 'Display project information and discovered helpers'
12
-
13
- export const argsSchema = z.object({})
14
-
15
- export default async function about(options: z.infer<typeof argsSchema>, context: ContainerContext) {
16
- const { container } = context
17
- const ui = container.feature('ui')
18
-
19
- // Discover all project-level helpers (commands, features, endpoints, etc.)
20
- const discovered = await container.helpers.discoverAll()
21
-
22
- const projectName = container.paths.resolve('.').split('/').pop() || 'project'
23
-
24
- ui.print.cyan(`\n ${projectName}\n`)
25
- ui.print(' Powered by luca — Lightweight Universal Conversational Architecture\n')
26
-
27
- const types = ['features', 'clients', 'servers', 'commands', 'endpoints']
28
-
29
- for (const type of types) {
30
- const names = discovered[type] || []
31
- if (names.length > 0) {
32
- ui.print.green(` ${type} (${names.length})`)
33
- for (const name of names) {
34
- ui.print(` • ${name}`)
35
- }
36
- }
37
- }
38
-
39
- const totalBuiltIn = types.reduce((sum: number, t: string) => sum + (container[t]?.available?.length || 0), 0)
40
- ui.print.dim(`\n ${totalBuiltIn} built-in helpers available. Run \`luca describe\` for details.\n`)
41
- }
@@ -1,22 +0,0 @@
1
- import { defineModel, z } from 'contentbase'
2
-
3
- /**
4
- * Define your content models here. Each model maps to a folder prefix
5
- * inside the docs/ directory. Documents in those folders follow the
6
- * model's metadata schema.
7
- *
8
- * Access documents at runtime:
9
- * const docs = container.docs // contentDb feature
10
- * if (!docs.isLoaded) await docs.load()
11
- * const notes = await docs.query(docs.models.Note).fetchAll()
12
- *
13
- * See https://github.com/soederpop/contentbase for full documentation.
14
- */
15
-
16
- export const Note = defineModel('Note', {
17
- prefix: 'notes',
18
- meta: z.object({
19
- tags: z.array(z.string()).default([]),
20
- status: z.enum(['draft', 'published']).default('draft'),
21
- }),
22
- })
@@ -1,43 +0,0 @@
1
- # Docs
2
-
3
- This folder contains structured content documents managed by the [contentbase](https://github.com/soederpop/contentbase) system.
4
-
5
- ## How it works
6
-
7
- Documents are markdown files with YAML frontmatter. Each document belongs to a **model** defined in `docs/models.ts`. Models specify:
8
- - A **prefix** (subfolder name, e.g. `notes/`)
9
- - A **metadata schema** (validated frontmatter fields)
10
-
11
- ## Accessing documents at runtime
12
-
13
- The `contentDb` feature (aliased to `container.docs`) loads and queries documents:
14
-
15
- ```typescript
16
- const docs = container.docs
17
- if (!docs.isLoaded) await docs.load()
18
-
19
- // Query all notes
20
- const notes = await docs.query(docs.models.Note).fetchAll()
21
-
22
- // Get a specific document
23
- const doc = docs.collection('notes').document('my-note')
24
- ```
25
-
26
- ## Creating a new document
27
-
28
- Add a markdown file in the appropriate subfolder:
29
-
30
- ```markdown
31
- ---
32
- title: My First Note
33
- tags: [example]
34
- status: draft
35
- ---
36
-
37
- Content goes here.
38
- ```
39
-
40
- ## Learn more
41
-
42
- - [Contentbase GitHub](https://github.com/soederpop/contentbase) — full documentation and API reference
43
- - `luca describe contentDb` — runtime docs for the contentDb feature
@@ -1,53 +0,0 @@
1
- import { z } from 'zod'
2
- import { FeatureStateSchema, FeatureOptionsSchema } from '@soederpop/luca'
3
- import { Feature } from '@soederpop/luca'
4
- import type { ContainerContext } from '@soederpop/luca'
5
-
6
- declare module '@soederpop/luca' {
7
- interface AvailableFeatures {
8
- example: typeof Example
9
- }
10
- }
11
-
12
- const ExampleStateSchema = FeatureStateSchema.extend({
13
- greetCount: z.number().default(0).describe('Number of times greet() has been called'),
14
- })
15
- type ExampleState = z.infer<typeof ExampleStateSchema>
16
-
17
- const ExampleOptionsSchema = FeatureOptionsSchema.extend({})
18
- type ExampleOptions = z.infer<typeof ExampleOptionsSchema>
19
-
20
- /**
21
- * An example feature demonstrating the luca feature pattern.
22
- *
23
- * Discovered automatically by `container.helpers.discoverAll()`
24
- * and available as `container.feature('example')`.
25
- *
26
- * To learn more: `luca scaffold feature --tutorial`
27
- *
28
- * @example
29
- * ```typescript
30
- * const example = container.feature('example')
31
- * example.greet('Luca') // => "Hello, Luca! (greeting #1)"
32
- * ```
33
- */
34
- export class Example extends Feature<ExampleState, ExampleOptions> {
35
- static override shortcut = 'features.example' as const
36
- static override stateSchema = ExampleStateSchema
37
- static override optionsSchema = ExampleOptionsSchema
38
- static override description = 'An example feature demonstrating the luca feature pattern'
39
- static { Feature.register(this, 'example') }
40
-
41
- /**
42
- * A simple method to show the feature works.
43
- * @param name - Name to greet
44
- * @returns Greeting string
45
- */
46
- greet(name = 'World') {
47
- const count = (this.state.get('greetCount') || 0) + 1
48
- this.state.set('greetCount', count)
49
- return `Hello, ${name}! (greeting #${count})`
50
- }
51
- }
52
-
53
- export default Example
@@ -1,15 +0,0 @@
1
- /**
2
- * Health check endpoint.
3
- * Accessible at GET /api/health when you run `luca serve`.
4
- */
5
- export const path = '/api/health'
6
- export const description = 'Health check endpoint'
7
- export const tags = ['health']
8
-
9
- export async function get(_params: any, ctx: any) {
10
- return {
11
- status: 'ok',
12
- timestamp: Date.now(),
13
- uptime: process.uptime(),
14
- }
15
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * luca.cli.ts — Project-level CLI customization
3
- *
4
- * This file is automatically loaded by the `luca` CLI before any command runs.
5
- * Use it to:
6
- *
7
- * - Discover project-level helpers (features, commands, endpoints)
8
- * - Register custom context variables accessible in `luca eval`
9
- * - Set up project-specific container configuration
10
- *
11
- * Exports:
12
- * main(container) — called at CLI startup, before command execution
13
- * onStart(container) — called when the container's 'started' event fires
14
- *
15
- * Example:
16
- * export async function main(container: any) {
17
- * await container.helpers.discoverAll()
18
- * container.addContext('myFeature', container.feature('myFeature'))
19
- * }
20
- */
21
-
22
- export async function main(container: any) {
23
- // Discover project-level helpers (commands/, features/, endpoints/)
24
- await container.helpers.discoverAll()
25
-
26
- // Handle unknown commands gracefully instead of silently failing
27
- container.onMissingCommand(async ({ phrase }: { phrase: string }) => {
28
- container.command('help').dispatch()
29
- })
30
- }
@@ -1,54 +0,0 @@
1
- # Runnable Markdown
2
-
3
- The `luca` CLI allows you to run markdown blocks as long as they're tagged with `ts` in the language.
4
-
5
- ```ts
6
- const banner = ui.banner('LUCA', {
7
- font: 'Puffy',
8
- colors: ['red','white','blue']
9
- })
10
-
11
- ui.print(banner)
12
- ```
13
-
14
- What is kind of cool is ( so long as there's no top-level-await in the block ) the context will preserve:
15
-
16
- ```ts
17
- if(typeof banner === 'undefined') {
18
- ui.print.red('uh oh, something broke.')
19
- }
20
- ```
21
-
22
- You can skip blocks too with the skip tag in the language of the fenced block
23
-
24
- ```ts skip
25
- console.log('Not gonna say anything')
26
- ```
27
-
28
- Did you hear something? No.
29
-
30
- Something even cooler is the ability to render React blocks. This makes luca kind of like a poor man's MDX. I just define some Blocks in the markdown by creating an h2 `## Blocks` section with a fenced codeblock that uses `tsx`. The `ink.components` and `ink.React` globals are injected into the scope.
31
-
32
- ## Blocks
33
-
34
- ```tsx
35
- const { Box, Text } = ink.components
36
- const React = ink.React
37
-
38
- function Greeting({ name, role }) {
39
- return (
40
- <Box borderStyle="round" padding={1}>
41
- <Text color="green" bold>Hello {name}!</Text>
42
- <Text dimColor> ({role})</Text>
43
- </Box>
44
- )
45
- }
46
- ```
47
-
48
- ## Rendering React Blocks
49
-
50
- Then I can use the Blocks in code.
51
-
52
- ```ts
53
- await render('Greeting', { name: 'Jon', role: 'Humble Servant' })
54
- ```
@@ -1,16 +0,0 @@
1
- # Build a Caching Proxy
2
-
3
- Create `luca proxy` that starts a local HTTP server which proxies incoming requests to a configurable upstream URL, caching responses with a configurable TTL (default 60 seconds).
4
-
5
- Support these flags:
6
-
7
- - `luca proxy --upstream https://jsonplaceholder.typicode.com` — set the upstream
8
- - `luca proxy --ttl 120` — cache TTL in seconds
9
- - `luca proxy --flush` — clear the cache and exit
10
- - `luca proxy --stats` — show cache hit/miss ratio and exit
11
-
12
- When running, every request to `localhost:<port>/anything` should proxy to `<upstream>/anything`, serving from cache on hit.
13
-
14
- ## After you are done
15
-
16
- Write a LESSONS.md in the attempt folder that describes what you learned, what you struggled with, and what you could have been supplied with up front either in the CLAUDE.md or in the skills that come with luca so you could achieve the goal quicker and with less trouble.
@@ -1,14 +0,0 @@
1
- # Content DB Round-Trip
2
-
3
- Populate a `docs/recipes/` collection with 5 recipe documents. Each document should have frontmatter with `title`, `tags` (array), `difficulty` (easy/medium/hard), and a markdown body with ingredients and steps.
4
-
5
- Create two commands:
6
-
7
- - `luca recipes search <term>` — queries the collection by tag or title match and prints matching recipes
8
- - `luca recipes export` — writes a `recipes-summary.json` file with all recipe titles, tags, and difficulty levels
9
-
10
- All document access must go through the container's document system, not raw file reads.
11
-
12
- ## After you are done
13
-
14
- Write a LESSONS.md in the attempt folder that describes what you learned, what you struggled with, and what you could have been supplied with up front either in the CLAUDE.md or in the skills that come with luca so you could achieve the goal quicker and with less trouble.
@@ -1,9 +0,0 @@
1
- # Build a custom command
2
-
3
- Build a custom command with luca called `hello`
4
-
5
- I should be able to run the command `luca hello $whatever` and it should output the word $whatever with an ascii art gradient, using only the features available in luca.
6
-
7
- ## After you are done
8
-
9
- Write a LESSONS.md in the attempt folder that describes what you learned, what you struggled with, and what you could have been supplied with up front either in the CLAUDE.md or in the skills that come with luca so you could achieve the goal quicker and with less trouble.
@@ -1,11 +0,0 @@
1
- # Build a File Watcher Pipeline
2
-
3
- Watch a folder called `inbox/` for new `.json` files. When a new file appears, validate that it has a `name` and `email` field. Move valid files to `inbox/valid/` and invalid files to `inbox/invalid/`.
4
-
5
- Create `luca watch` to start the watcher and `luca status` to report how many files have been processed, how many were valid, and how many were invalid.
6
-
7
- Include a `luca seed` command that drops a few sample `.json` files into `inbox/` so you can test it.
8
-
9
- ## After you are done
10
-
11
- Write a LESSONS.md in the attempt folder that describes what you learned, what you struggled with, and what you could have been supplied with up front either in the CLAUDE.md or in the skills that come with luca so you could achieve the goal quicker and with less trouble.