luca 2.0.0 → 3.0.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.
- package/.github/workflows/release.yaml +169 -0
- package/AGENTS.md +99 -0
- package/CLAUDE.md +115 -0
- package/CNAME +1 -0
- package/README.md +257 -9
- package/RUNME.md +56 -0
- package/assistants/codingAssistant/ABOUT.md +5 -0
- package/assistants/codingAssistant/CORE.md +28 -0
- package/assistants/codingAssistant/hooks.ts +21 -0
- package/assistants/codingAssistant/tools.ts +12 -0
- package/assistants/inkbot/ABOUT.md +16 -0
- package/assistants/inkbot/CORE.md +330 -0
- package/assistants/inkbot/hooks.ts +6 -0
- package/assistants/inkbot/tools.ts +53 -0
- package/assistants/researcher/ABOUT.md +5 -0
- package/assistants/researcher/CORE.md +46 -0
- package/assistants/researcher/hooks.ts +16 -0
- package/assistants/researcher/tools.ts +237 -0
- package/bun.lock +2769 -0
- package/bunfig.toml +3 -0
- package/commands/audit-docs.ts +740 -0
- package/commands/build-bootstrap.ts +118 -0
- package/commands/build-python-bridge.ts +43 -0
- package/commands/build-scaffolds.ts +176 -0
- package/commands/generate-api-docs.ts +114 -0
- package/commands/inkbot.ts +874 -0
- package/commands/release.ts +80 -0
- package/commands/try-all-challenges.ts +543 -0
- package/commands/try-challenge.ts +100 -0
- package/dist/agi/container.server.d.ts +63 -0
- package/dist/agi/container.server.d.ts.map +1 -0
- package/dist/agi/endpoints/ask.d.ts +20 -0
- package/dist/agi/endpoints/ask.d.ts.map +1 -0
- package/dist/agi/endpoints/conversations/[id].d.ts +27 -0
- package/dist/agi/endpoints/conversations/[id].d.ts.map +1 -0
- package/dist/agi/endpoints/conversations.d.ts +18 -0
- package/dist/agi/endpoints/conversations.d.ts.map +1 -0
- package/dist/agi/endpoints/experts.d.ts +8 -0
- package/dist/agi/endpoints/experts.d.ts.map +1 -0
- package/dist/agi/feature.d.ts +9 -0
- package/dist/agi/feature.d.ts.map +1 -0
- package/dist/agi/features/assistant.d.ts +509 -0
- package/dist/agi/features/assistant.d.ts.map +1 -0
- package/dist/agi/features/assistants-manager.d.ts +236 -0
- package/dist/agi/features/assistants-manager.d.ts.map +1 -0
- package/dist/agi/features/autonomous-assistant.d.ts +281 -0
- package/dist/agi/features/autonomous-assistant.d.ts.map +1 -0
- package/dist/agi/features/browser-use.d.ts +479 -0
- package/dist/agi/features/browser-use.d.ts.map +1 -0
- package/dist/agi/features/claude-code.d.ts +824 -0
- package/dist/agi/features/claude-code.d.ts.map +1 -0
- package/dist/agi/features/conversation-history.d.ts +245 -0
- package/dist/agi/features/conversation-history.d.ts.map +1 -0
- package/dist/agi/features/conversation.d.ts +464 -0
- package/dist/agi/features/conversation.d.ts.map +1 -0
- package/dist/agi/features/docs-reader.d.ts +72 -0
- package/dist/agi/features/docs-reader.d.ts.map +1 -0
- package/dist/agi/features/file-tools.d.ts +110 -0
- package/dist/agi/features/file-tools.d.ts.map +1 -0
- package/dist/agi/features/luca-coder.d.ts +323 -0
- package/dist/agi/features/luca-coder.d.ts.map +1 -0
- package/dist/agi/features/openai-codex.d.ts +381 -0
- package/dist/agi/features/openai-codex.d.ts.map +1 -0
- package/dist/agi/features/openapi.d.ts +200 -0
- package/dist/agi/features/openapi.d.ts.map +1 -0
- package/dist/agi/features/skills-library.d.ts +167 -0
- package/dist/agi/features/skills-library.d.ts.map +1 -0
- package/dist/agi/index.d.ts +5 -0
- package/dist/agi/index.d.ts.map +1 -0
- package/dist/agi/lib/interceptor-chain.d.ts +44 -0
- package/dist/agi/lib/interceptor-chain.d.ts.map +1 -0
- package/dist/agi/lib/token-counter.d.ts +13 -0
- package/dist/agi/lib/token-counter.d.ts.map +1 -0
- package/dist/bootstrap/generated.d.ts +5 -0
- package/dist/bootstrap/generated.d.ts.map +1 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/bus.d.ts +29 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/cli/build-info.d.ts +4 -0
- package/dist/cli/build-info.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +3 -12
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/client.d.ts +60 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/clients/civitai/index.d.ts +472 -0
- package/dist/clients/civitai/index.d.ts.map +1 -0
- package/dist/clients/client-template.d.ts +30 -0
- package/dist/clients/client-template.d.ts.map +1 -0
- package/dist/clients/comfyui/index.d.ts +281 -0
- package/dist/clients/comfyui/index.d.ts.map +1 -0
- package/dist/clients/elevenlabs/index.d.ts +197 -0
- package/dist/clients/elevenlabs/index.d.ts.map +1 -0
- package/dist/clients/graph.d.ts +64 -0
- package/dist/clients/graph.d.ts.map +1 -0
- package/dist/clients/openai/index.d.ts +247 -0
- package/dist/clients/openai/index.d.ts.map +1 -0
- package/dist/clients/rest.d.ts +92 -0
- package/dist/clients/rest.d.ts.map +1 -0
- package/dist/clients/supabase/index.d.ts +176 -0
- package/dist/clients/supabase/index.d.ts.map +1 -0
- package/dist/clients/websocket.d.ts +127 -0
- package/dist/clients/websocket.d.ts.map +1 -0
- package/dist/command.d.ts +163 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/commands/bootstrap.d.ts +20 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/chat.d.ts +37 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/code.d.ts +28 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/console.d.ts +22 -0
- package/dist/commands/console.d.ts.map +1 -0
- package/dist/commands/describe.d.ts +50 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/eval.d.ts +23 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/help.d.ts +25 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/index.d.ts +18 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/introspect.d.ts +24 -0
- package/dist/commands/introspect.d.ts.map +1 -0
- package/dist/commands/mcp.d.ts +35 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/prompt.d.ts +38 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/run.d.ts +24 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/sandbox-mcp.d.ts +34 -0
- package/dist/commands/sandbox-mcp.d.ts.map +1 -0
- package/dist/commands/save-api-docs.d.ts +21 -0
- package/dist/commands/save-api-docs.d.ts.map +1 -0
- package/dist/commands/scaffold.d.ts +24 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/select.d.ts +22 -0
- package/dist/commands/select.d.ts.map +1 -0
- package/dist/commands/serve.d.ts +29 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/container-describer.d.ts +144 -0
- package/dist/container-describer.d.ts.map +1 -0
- package/dist/container.d.ts +451 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/endpoint.d.ts +113 -0
- package/dist/endpoint.d.ts.map +1 -0
- package/dist/feature.d.ts +47 -0
- package/dist/feature.d.ts.map +1 -0
- package/dist/graft.d.ts +29 -0
- package/dist/graft.d.ts.map +1 -0
- package/dist/hash-object.d.ts +8 -0
- package/dist/hash-object.d.ts.map +1 -0
- package/dist/helper.d.ts +209 -0
- package/dist/helper.d.ts.map +1 -0
- package/dist/introspection/generated.node.d.ts +44623 -0
- package/dist/introspection/generated.node.d.ts.map +1 -0
- package/dist/introspection/generated.web.d.ts +1412 -0
- package/dist/introspection/generated.web.d.ts.map +1 -0
- package/dist/introspection/index.d.ts +156 -0
- package/dist/introspection/index.d.ts.map +1 -0
- package/dist/introspection/scan.d.ts +147 -0
- package/dist/introspection/scan.d.ts.map +1 -0
- package/dist/node/container.d.ts +256 -0
- package/dist/node/container.d.ts.map +1 -0
- package/dist/node/feature.d.ts +9 -0
- package/dist/node/feature.d.ts.map +1 -0
- package/dist/node/features/container-link.d.ts +213 -0
- package/dist/node/features/container-link.d.ts.map +1 -0
- package/dist/node/features/content-db.d.ts +354 -0
- package/dist/node/features/content-db.d.ts.map +1 -0
- package/dist/node/features/disk-cache.d.ts +236 -0
- package/dist/node/features/disk-cache.d.ts.map +1 -0
- package/dist/node/features/dns.d.ts +511 -0
- package/dist/node/features/dns.d.ts.map +1 -0
- package/dist/node/features/docker.d.ts +485 -0
- package/dist/node/features/docker.d.ts.map +1 -0
- package/dist/node/features/downloader.d.ts +73 -0
- package/dist/node/features/downloader.d.ts.map +1 -0
- package/dist/node/features/figlet-fonts.d.ts +4 -0
- package/dist/node/features/figlet-fonts.d.ts.map +1 -0
- package/dist/node/features/file-manager.d.ts +177 -0
- package/dist/node/features/file-manager.d.ts.map +1 -0
- package/dist/node/features/fs.d.ts +635 -0
- package/dist/node/features/fs.d.ts.map +1 -0
- package/dist/node/features/git.d.ts +329 -0
- package/dist/node/features/git.d.ts.map +1 -0
- package/dist/node/features/google-auth.d.ts +200 -0
- package/dist/node/features/google-auth.d.ts.map +1 -0
- package/dist/node/features/google-calendar.d.ts +194 -0
- package/dist/node/features/google-calendar.d.ts.map +1 -0
- package/dist/node/features/google-docs.d.ts +138 -0
- package/dist/node/features/google-docs.d.ts.map +1 -0
- package/dist/node/features/google-drive.d.ts +202 -0
- package/dist/node/features/google-drive.d.ts.map +1 -0
- package/dist/node/features/google-mail.d.ts +221 -0
- package/dist/node/features/google-mail.d.ts.map +1 -0
- package/dist/node/features/google-sheets.d.ts +157 -0
- package/dist/node/features/google-sheets.d.ts.map +1 -0
- package/dist/node/features/grep.d.ts +207 -0
- package/dist/node/features/grep.d.ts.map +1 -0
- package/dist/node/features/helpers.d.ts +236 -0
- package/dist/node/features/helpers.d.ts.map +1 -0
- package/dist/node/features/ink.d.ts +332 -0
- package/dist/node/features/ink.d.ts.map +1 -0
- package/dist/node/features/ipc-socket.d.ts +298 -0
- package/dist/node/features/ipc-socket.d.ts.map +1 -0
- package/dist/node/features/json-tree.d.ts +140 -0
- package/dist/node/features/json-tree.d.ts.map +1 -0
- package/dist/node/features/networking.d.ts +373 -0
- package/dist/node/features/networking.d.ts.map +1 -0
- package/dist/node/features/nlp.d.ts +125 -0
- package/dist/node/features/nlp.d.ts.map +1 -0
- package/dist/node/features/opener.d.ts +93 -0
- package/dist/node/features/opener.d.ts.map +1 -0
- package/dist/node/features/os.d.ts +168 -0
- package/dist/node/features/os.d.ts.map +1 -0
- package/dist/node/features/package-finder.d.ts +419 -0
- package/dist/node/features/package-finder.d.ts.map +1 -0
- package/dist/node/features/postgres.d.ts +173 -0
- package/dist/node/features/postgres.d.ts.map +1 -0
- package/dist/node/features/proc.d.ts +285 -0
- package/dist/node/features/proc.d.ts.map +1 -0
- package/dist/node/features/process-manager.d.ts +427 -0
- package/dist/node/features/process-manager.d.ts.map +1 -0
- package/dist/node/features/python.d.ts +477 -0
- package/dist/node/features/python.d.ts.map +1 -0
- package/dist/node/features/redis.d.ts +247 -0
- package/dist/node/features/redis.d.ts.map +1 -0
- package/dist/node/features/repl.d.ts +84 -0
- package/dist/node/features/repl.d.ts.map +1 -0
- package/dist/node/features/runpod.d.ts +527 -0
- package/dist/node/features/runpod.d.ts.map +1 -0
- package/dist/node/features/secure-shell.d.ts +145 -0
- package/dist/node/features/secure-shell.d.ts.map +1 -0
- package/dist/node/features/semantic-search.d.ts +207 -0
- package/dist/node/features/semantic-search.d.ts.map +1 -0
- package/dist/node/features/sqlite.d.ts +180 -0
- package/dist/node/features/sqlite.d.ts.map +1 -0
- package/dist/node/features/telegram.d.ts +173 -0
- package/dist/node/features/telegram.d.ts.map +1 -0
- package/dist/node/features/transpiler.d.ts +51 -0
- package/dist/node/features/transpiler.d.ts.map +1 -0
- package/dist/node/features/tts.d.ts +108 -0
- package/dist/node/features/tts.d.ts.map +1 -0
- package/dist/node/features/ui.d.ts +562 -0
- package/dist/node/features/ui.d.ts.map +1 -0
- package/dist/node/features/vault.d.ts +90 -0
- package/dist/node/features/vault.d.ts.map +1 -0
- package/dist/node/features/vm.d.ts +285 -0
- package/dist/node/features/vm.d.ts.map +1 -0
- package/dist/node/features/yaml-tree.d.ts +118 -0
- package/dist/node/features/yaml-tree.d.ts.map +1 -0
- package/dist/node/features/yaml.d.ts +127 -0
- package/dist/node/features/yaml.d.ts.map +1 -0
- package/dist/node.d.ts +67 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/python/generated.d.ts +2 -0
- package/dist/python/generated.d.ts.map +1 -0
- package/dist/react/index.d.ts +36 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/registry.d.ts +97 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/scaffolds/generated.d.ts +13 -0
- package/dist/scaffolds/generated.d.ts.map +1 -0
- package/dist/scaffolds/template.d.ts +11 -0
- package/dist/scaffolds/template.d.ts.map +1 -0
- package/dist/schemas/base.d.ts +254 -0
- package/dist/schemas/base.d.ts.map +1 -0
- package/dist/selector.d.ts +130 -0
- package/dist/selector.d.ts.map +1 -0
- package/dist/server.d.ts +89 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/servers/express.d.ts +104 -0
- package/dist/servers/express.d.ts.map +1 -0
- package/dist/servers/mcp.d.ts +201 -0
- package/dist/servers/mcp.d.ts.map +1 -0
- package/dist/servers/socket.d.ts +121 -0
- package/dist/servers/socket.d.ts.map +1 -0
- package/dist/state.d.ts +24 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/web/clients/socket.d.ts +37 -0
- package/dist/web/clients/socket.d.ts.map +1 -0
- package/dist/web/container.d.ts +55 -0
- package/dist/web/container.d.ts.map +1 -0
- package/dist/web/extension.d.ts +4 -0
- package/dist/web/extension.d.ts.map +1 -0
- package/dist/web/feature.d.ts +8 -0
- package/dist/web/feature.d.ts.map +1 -0
- package/dist/web/features/asset-loader.d.ts +35 -0
- package/dist/web/features/asset-loader.d.ts.map +1 -0
- package/dist/web/features/container-link.d.ts +167 -0
- package/dist/web/features/container-link.d.ts.map +1 -0
- package/dist/web/features/esbuild.d.ts +51 -0
- package/dist/web/features/esbuild.d.ts.map +1 -0
- package/dist/web/features/helpers.d.ts +140 -0
- package/dist/web/features/helpers.d.ts.map +1 -0
- package/dist/web/features/network.d.ts +69 -0
- package/dist/web/features/network.d.ts.map +1 -0
- package/dist/web/features/speech.d.ts +71 -0
- package/dist/web/features/speech.d.ts.map +1 -0
- package/dist/web/features/vault.d.ts +62 -0
- package/dist/web/features/vault.d.ts.map +1 -0
- package/dist/web/features/vm.d.ts +48 -0
- package/dist/web/features/vm.d.ts.map +1 -0
- package/dist/web/features/voice-recognition.d.ts +96 -0
- package/dist/web/features/voice-recognition.d.ts.map +1 -0
- package/dist/web/shims/isomorphic-vm.d.ts +22 -0
- package/dist/web/shims/isomorphic-vm.d.ts.map +1 -0
- package/docs/CLI.md +335 -0
- package/docs/CNAME +1 -0
- package/docs/README.md +60 -0
- package/docs/TABLE-OF-CONTENTS.md +183 -0
- package/docs/apis/clients/elevenlabs.md +308 -0
- package/docs/apis/clients/graph.md +107 -0
- package/docs/apis/clients/openai.md +429 -0
- package/docs/apis/clients/rest.md +161 -0
- package/docs/apis/clients/websocket.md +174 -0
- package/docs/apis/features/agi/assistant.md +625 -0
- package/docs/apis/features/agi/assistants-manager.md +282 -0
- package/docs/apis/features/agi/auto-assistant.md +279 -0
- package/docs/apis/features/agi/browser-use.md +802 -0
- package/docs/apis/features/agi/claude-code.md +884 -0
- package/docs/apis/features/agi/conversation-history.md +364 -0
- package/docs/apis/features/agi/conversation.md +548 -0
- package/docs/apis/features/agi/docs-reader.md +99 -0
- package/docs/apis/features/agi/file-tools.md +163 -0
- package/docs/apis/features/agi/luca-coder.md +407 -0
- package/docs/apis/features/agi/openai-codex.md +396 -0
- package/docs/apis/features/agi/openapi.md +138 -0
- package/docs/apis/features/agi/semantic-search.md +387 -0
- package/docs/apis/features/agi/skills-library.md +239 -0
- package/docs/apis/features/node/container-link.md +192 -0
- package/docs/apis/features/node/content-db.md +450 -0
- package/docs/apis/features/node/disk-cache.md +379 -0
- package/docs/apis/features/node/dns.md +652 -0
- package/docs/apis/features/node/docker.md +706 -0
- package/docs/apis/features/node/downloader.md +81 -0
- package/docs/apis/features/node/esbuild.md +60 -0
- package/docs/apis/features/node/file-manager.md +191 -0
- package/docs/apis/features/node/fs.md +1217 -0
- package/docs/apis/features/node/git.md +371 -0
- package/docs/apis/features/node/google-auth.md +193 -0
- package/docs/apis/features/node/google-calendar.md +202 -0
- package/docs/apis/features/node/google-docs.md +173 -0
- package/docs/apis/features/node/google-drive.md +246 -0
- package/docs/apis/features/node/google-mail.md +214 -0
- package/docs/apis/features/node/google-sheets.md +194 -0
- package/docs/apis/features/node/grep.md +292 -0
- package/docs/apis/features/node/helpers.md +164 -0
- package/docs/apis/features/node/ink.md +334 -0
- package/docs/apis/features/node/ipc-socket.md +249 -0
- package/docs/apis/features/node/json-tree.md +86 -0
- package/docs/apis/features/node/networking.md +316 -0
- package/docs/apis/features/node/nlp.md +133 -0
- package/docs/apis/features/node/opener.md +97 -0
- package/docs/apis/features/node/os.md +146 -0
- package/docs/apis/features/node/package-finder.md +392 -0
- package/docs/apis/features/node/postgres.md +234 -0
- package/docs/apis/features/node/proc.md +399 -0
- package/docs/apis/features/node/process-manager.md +305 -0
- package/docs/apis/features/node/python.md +604 -0
- package/docs/apis/features/node/redis.md +380 -0
- package/docs/apis/features/node/repl.md +88 -0
- package/docs/apis/features/node/runpod.md +674 -0
- package/docs/apis/features/node/secure-shell.md +176 -0
- package/docs/apis/features/node/semantic-search.md +408 -0
- package/docs/apis/features/node/sqlite.md +233 -0
- package/docs/apis/features/node/telegram.md +279 -0
- package/docs/apis/features/node/transpiler.md +74 -0
- package/docs/apis/features/node/tts.md +133 -0
- package/docs/apis/features/node/ui.md +701 -0
- package/docs/apis/features/node/vault.md +59 -0
- package/docs/apis/features/node/vm.md +75 -0
- package/docs/apis/features/node/yaml-tree.md +85 -0
- package/docs/apis/features/node/yaml.md +176 -0
- package/docs/apis/features/web/asset-loader.md +59 -0
- package/docs/apis/features/web/container-link.md +192 -0
- package/docs/apis/features/web/esbuild.md +54 -0
- package/docs/apis/features/web/helpers.md +164 -0
- package/docs/apis/features/web/network.md +44 -0
- package/docs/apis/features/web/speech.md +69 -0
- package/docs/apis/features/web/vault.md +59 -0
- package/docs/apis/features/web/vm.md +75 -0
- package/docs/apis/features/web/voice.md +84 -0
- package/docs/apis/servers/express.md +171 -0
- package/docs/apis/servers/mcp.md +238 -0
- package/docs/apis/servers/websocket.md +170 -0
- package/docs/bootstrap/CLAUDE.md +101 -0
- package/docs/bootstrap/SKILL.md +341 -0
- package/docs/bootstrap/templates/about-command.ts +41 -0
- package/docs/bootstrap/templates/docs-models.ts +22 -0
- package/docs/bootstrap/templates/docs-readme.md +43 -0
- package/docs/bootstrap/templates/example-feature.ts +53 -0
- package/docs/bootstrap/templates/health-endpoint.ts +15 -0
- package/docs/bootstrap/templates/luca-cli.ts +30 -0
- package/docs/bootstrap/templates/runme.md +54 -0
- package/docs/challenges/caching-proxy.md +16 -0
- package/docs/challenges/content-db-round-trip.md +14 -0
- package/docs/challenges/custom-command.md +9 -0
- package/docs/challenges/file-watcher-pipeline.md +11 -0
- package/docs/challenges/grep-audit-report.md +15 -0
- package/docs/challenges/multi-feature-dashboard.md +14 -0
- package/docs/challenges/process-orchestrator.md +17 -0
- package/docs/challenges/rest-api-server-with-client.md +12 -0
- package/docs/challenges/script-runner-with-vm.md +11 -0
- package/docs/challenges/simple-rest-api.md +15 -0
- package/docs/challenges/websocket-serve-and-client.md +11 -0
- package/docs/challenges/yaml-config-system.md +14 -0
- package/docs/command-system-overhaul.md +94 -0
- package/docs/documentation-audit.md +134 -0
- package/docs/examples/assistant/CORE.md +18 -0
- package/docs/examples/assistant/hooks.ts +3 -0
- package/docs/examples/assistant/tools.ts +10 -0
- package/docs/examples/assistant-hooks-reference.ts +171 -0
- package/docs/examples/assistant-with-process-manager.md +84 -0
- package/docs/examples/content-db.md +77 -0
- package/docs/examples/disk-cache.md +83 -0
- package/docs/examples/docker.md +101 -0
- package/docs/examples/downloader.md +70 -0
- package/docs/examples/entity.md +124 -0
- package/docs/examples/esbuild.md +80 -0
- package/docs/examples/feature-as-tool-provider.md +143 -0
- package/docs/examples/file-manager.md +82 -0
- package/docs/examples/fs.md +83 -0
- package/docs/examples/git.md +85 -0
- package/docs/examples/google-auth.md +88 -0
- package/docs/examples/google-calendar.md +94 -0
- package/docs/examples/google-docs.md +82 -0
- package/docs/examples/google-drive.md +96 -0
- package/docs/examples/google-sheets.md +95 -0
- package/docs/examples/grep.md +85 -0
- package/docs/examples/ink-blocks.md +75 -0
- package/docs/examples/ink-renderer.md +41 -0
- package/docs/examples/ink.md +103 -0
- package/docs/examples/ipc-socket.md +103 -0
- package/docs/examples/json-tree.md +91 -0
- package/docs/examples/networking.md +58 -0
- package/docs/examples/nlp.md +91 -0
- package/docs/examples/opener.md +78 -0
- package/docs/examples/os.md +72 -0
- package/docs/examples/package-finder.md +89 -0
- package/docs/examples/postgres.md +91 -0
- package/docs/examples/proc.md +81 -0
- package/docs/examples/process-manager.md +79 -0
- package/docs/examples/python.md +132 -0
- package/docs/examples/repl.md +93 -0
- package/docs/examples/runpod.md +119 -0
- package/docs/examples/secure-shell.md +92 -0
- package/docs/examples/sqlite.md +86 -0
- package/docs/examples/structured-output-with-assistants.md +144 -0
- package/docs/examples/telegram.md +77 -0
- package/docs/examples/tts.md +86 -0
- package/docs/examples/ui.md +80 -0
- package/docs/examples/vault.md +70 -0
- package/docs/examples/vm.md +86 -0
- package/docs/examples/websocket-ask-and-reply-example.md +128 -0
- package/docs/examples/yaml-tree.md +93 -0
- package/docs/examples/yaml.md +104 -0
- package/docs/ideas/assistant-factory-pattern.md +142 -0
- package/docs/in-memory-fs.md +4 -0
- package/docs/introspection-audit.md +49 -0
- package/docs/introspection.md +164 -0
- package/docs/mcp/readme.md +162 -0
- package/docs/models.ts +41 -0
- package/docs/philosophy.md +86 -0
- package/docs/principles.md +7 -0
- package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
- package/docs/prompts/check-for-undocumented-features.md +27 -0
- package/docs/prompts/mcp-test-easy-command.md +27 -0
- package/docs/scaffolds/client.md +149 -0
- package/docs/scaffolds/command.md +120 -0
- package/docs/scaffolds/endpoint.md +171 -0
- package/docs/scaffolds/feature.md +158 -0
- package/docs/scaffolds/selector.md +91 -0
- package/docs/scaffolds/server.md +196 -0
- package/docs/selectors.md +115 -0
- package/docs/sessions/custom-command/attempt-log-2.md +195 -0
- package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +728 -0
- package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +555 -0
- package/docs/sessions/grep-audit-report/attempt-log-1.md +289 -0
- package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +679 -0
- package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +1 -0
- package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +920 -0
- package/docs/sessions/simple-rest-api/attempt-log-1.md +593 -0
- package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +995 -0
- package/docs/tutorials/00-bootstrap.md +166 -0
- package/docs/tutorials/01-getting-started.md +106 -0
- package/docs/tutorials/02-container.md +210 -0
- package/docs/tutorials/03-scripts.md +194 -0
- package/docs/tutorials/04-features-overview.md +196 -0
- package/docs/tutorials/05-state-and-events.md +171 -0
- package/docs/tutorials/06-servers.md +157 -0
- package/docs/tutorials/07-endpoints.md +198 -0
- package/docs/tutorials/08-commands.md +252 -0
- package/docs/tutorials/09-clients.md +162 -0
- package/docs/tutorials/10-creating-features.md +203 -0
- package/docs/tutorials/11-contentbase.md +191 -0
- package/docs/tutorials/12-assistants.md +215 -0
- package/docs/tutorials/13-introspection.md +157 -0
- package/docs/tutorials/14-type-system.md +174 -0
- package/docs/tutorials/15-project-patterns.md +222 -0
- package/docs/tutorials/16-google-features.md +534 -0
- package/docs/tutorials/17-tui-blocks.md +530 -0
- package/docs/tutorials/18-semantic-search.md +334 -0
- package/docs/tutorials/19-python-sessions.md +401 -0
- package/docs/tutorials/20-browser-esm.md +234 -0
- package/index.html +1430 -0
- package/index.ts +1 -0
- package/install.sh +84 -0
- package/luca.cli.ts +16 -0
- package/luca.console.ts +9 -0
- package/main.py +6 -0
- package/package.json +219 -58
- package/public/index.html +1430 -0
- package/public/slides-ai-native.html +902 -0
- package/public/slides-intro.html +974 -0
- package/pyproject.toml +7 -0
- package/scripts/build-web.ts +28 -0
- package/scripts/examples/ask-luca-expert.ts +42 -0
- package/scripts/examples/assistant-questions.ts +12 -0
- package/scripts/examples/excalidraw-expert.ts +75 -0
- package/scripts/examples/expert-chat.ts +0 -0
- package/scripts/examples/file-manager.ts +14 -0
- package/scripts/examples/ideas.ts +12 -0
- package/scripts/examples/interactive-chat.ts +20 -0
- package/scripts/examples/openai-tool-calls.ts +113 -0
- package/scripts/examples/opening-a-web-browser.ts +5 -0
- package/scripts/examples/telegram-bot.ts +79 -0
- package/scripts/examples/using-assistant-with-mcp.ts +555 -0
- package/scripts/examples/using-claude-code.ts +10 -0
- package/scripts/examples/using-contentdb.ts +35 -0
- package/scripts/examples/using-conversations.ts +35 -0
- package/scripts/examples/using-disk-cache.ts +10 -0
- package/scripts/examples/using-docker-shell.ts +75 -0
- package/scripts/examples/using-elevenlabs.ts +25 -0
- package/scripts/examples/using-google-calendar.ts +57 -0
- package/scripts/examples/using-google-docs.ts +74 -0
- package/scripts/examples/using-google-drive.ts +74 -0
- package/scripts/examples/using-google-sheets.ts +89 -0
- package/scripts/examples/using-nlp.ts +55 -0
- package/scripts/examples/using-ollama.ts +11 -0
- package/scripts/examples/using-postgres.ts +55 -0
- package/scripts/examples/using-runpod.ts +32 -0
- package/scripts/examples/using-tts.ts +40 -0
- package/scripts/scaffold.ts +391 -0
- package/scripts/scratch.ts +15 -0
- package/scripts/stamp-build.sh +12 -0
- package/scripts/test-assistant-hooks.ts +13 -0
- package/scripts/test-docs-reader.ts +10 -0
- package/scripts/test-linux-binary.sh +80 -0
- package/scripts/update-introspection-data.ts +58 -0
- package/src/agi/README.md +14 -0
- package/src/agi/container.server.ts +152 -0
- package/src/agi/endpoints/ask.ts +60 -0
- package/src/agi/endpoints/conversations/[id].ts +45 -0
- package/src/agi/endpoints/conversations.ts +31 -0
- package/src/agi/endpoints/experts.ts +37 -0
- package/src/agi/feature.ts +13 -0
- package/src/agi/features/agent-memory.ts +694 -0
- package/src/agi/features/assistant.ts +1624 -0
- package/src/agi/features/assistants-manager.ts +418 -0
- package/src/agi/features/autonomous-assistant.ts +431 -0
- package/src/agi/features/browser-use.ts +653 -0
- package/src/agi/features/claude-code.ts +1538 -0
- package/src/agi/features/coding-tools.ts +175 -0
- package/src/agi/features/conversation-history.ts +495 -0
- package/src/agi/features/conversation.ts +1323 -0
- package/src/agi/features/docs-reader.ts +167 -0
- package/src/agi/features/file-tools.ts +293 -0
- package/src/agi/features/luca-coder.ts +639 -0
- package/src/agi/features/openai-codex.ts +651 -0
- package/src/agi/features/openapi.ts +445 -0
- package/src/agi/features/skills-library.ts +478 -0
- package/src/agi/index.ts +6 -0
- package/src/agi/lib/interceptor-chain.ts +89 -0
- package/src/agi/lib/token-counter.ts +122 -0
- package/src/bootstrap/generated.ts +9792 -0
- package/src/browser.ts +25 -0
- package/src/bus.ts +122 -0
- package/src/cli/build-info.ts +4 -0
- package/src/cli/cli.ts +355 -0
- package/src/client.ts +170 -0
- package/src/clients/civitai/index.ts +537 -0
- package/src/clients/client-template.ts +41 -0
- package/src/clients/comfyui/index.ts +604 -0
- package/src/clients/elevenlabs/index.ts +317 -0
- package/src/clients/graph.ts +87 -0
- package/src/clients/openai/index.ts +456 -0
- package/src/clients/rest.ts +207 -0
- package/src/clients/supabase/index.ts +357 -0
- package/src/clients/voicebox/index.ts +300 -0
- package/src/clients/websocket.ts +251 -0
- package/src/command.ts +505 -0
- package/src/commands/bootstrap.ts +244 -0
- package/src/commands/chat.ts +308 -0
- package/src/commands/code.ts +371 -0
- package/src/commands/console.ts +189 -0
- package/src/commands/describe.ts +243 -0
- package/src/commands/eval.ts +121 -0
- package/src/commands/help.ts +240 -0
- package/src/commands/index.ts +19 -0
- package/src/commands/introspect.ts +218 -0
- package/src/commands/mcp.ts +64 -0
- package/src/commands/prompt.ts +982 -0
- package/src/commands/run.ts +278 -0
- package/src/commands/sandbox-mcp.ts +343 -0
- package/src/commands/save-api-docs.ts +51 -0
- package/src/commands/scaffold.ts +225 -0
- package/src/commands/select.ts +99 -0
- package/src/commands/serve.ts +208 -0
- package/src/container-describer.ts +1084 -0
- package/src/container.ts +1186 -0
- package/src/endpoint.ts +365 -0
- package/src/entity.ts +173 -0
- package/src/feature.ts +118 -0
- package/src/graft.ts +181 -0
- package/src/hash-object.ts +97 -0
- package/src/helper.ts +849 -0
- package/src/introspection/generated.agi.ts +40208 -0
- package/src/introspection/generated.node.ts +28686 -0
- package/src/introspection/generated.web.ts +2251 -0
- package/src/introspection/index.ts +296 -0
- package/src/introspection/scan.ts +1131 -0
- package/src/node/container.ts +409 -0
- package/src/node/feature.ts +13 -0
- package/src/node/features/container-link.ts +559 -0
- package/src/node/features/content-db.ts +812 -0
- package/src/node/features/disk-cache.ts +388 -0
- package/src/node/features/dns.ts +669 -0
- package/src/node/features/docker.ts +921 -0
- package/src/node/features/downloader.ts +79 -0
- package/src/node/features/figlet-fonts.ts +600 -0
- package/src/node/features/file-manager.ts +535 -0
- package/src/node/features/fs.ts +1050 -0
- package/src/node/features/git.ts +592 -0
- package/src/node/features/google-auth.ts +504 -0
- package/src/node/features/google-calendar.ts +306 -0
- package/src/node/features/google-docs.ts +412 -0
- package/src/node/features/google-drive.ts +346 -0
- package/src/node/features/google-mail.ts +540 -0
- package/src/node/features/google-sheets.ts +286 -0
- package/src/node/features/grep.ts +427 -0
- package/src/node/features/helpers.ts +735 -0
- package/src/node/features/ink.ts +490 -0
- package/src/node/features/ipc-socket.ts +649 -0
- package/src/node/features/json-tree.ts +170 -0
- package/src/node/features/networking.ts +961 -0
- package/src/node/features/nlp.ts +212 -0
- package/src/node/features/opener.ts +180 -0
- package/src/node/features/os.ts +403 -0
- package/src/node/features/package-finder.ts +540 -0
- package/src/node/features/postgres.ts +289 -0
- package/src/node/features/proc.ts +503 -0
- package/src/node/features/process-manager.ts +844 -0
- package/src/node/features/python.ts +906 -0
- package/src/node/features/redis.ts +446 -0
- package/src/node/features/repl.ts +212 -0
- package/src/node/features/runpod.ts +811 -0
- package/src/node/features/secure-shell.ts +267 -0
- package/src/node/features/semantic-search.ts +935 -0
- package/src/node/features/sqlite.ts +289 -0
- package/src/node/features/telegram.ts +343 -0
- package/src/node/features/transpiler.ts +161 -0
- package/src/node/features/tts.ts +185 -0
- package/src/node/features/ui.ts +786 -0
- package/src/node/features/vault.ts +153 -0
- package/src/node/features/vm.ts +462 -0
- package/src/node/features/yaml-tree.ts +148 -0
- package/src/node/features/yaml.ts +133 -0
- package/src/node.ts +76 -0
- package/src/python/bridge.py +220 -0
- package/src/python/generated.ts +227 -0
- package/src/react/index.ts +175 -0
- package/src/registry.ts +210 -0
- package/src/scaffolds/generated.ts +1815 -0
- package/src/scaffolds/template.ts +46 -0
- package/src/schemas/base.ts +296 -0
- package/src/selector.ts +352 -0
- package/src/server.ts +229 -0
- package/src/servers/express.ts +283 -0
- package/src/servers/mcp.ts +802 -0
- package/src/servers/socket.ts +258 -0
- package/src/state.ts +101 -0
- package/src/web/clients/socket.ts +99 -0
- package/src/web/container.ts +75 -0
- package/src/web/extension.ts +30 -0
- package/src/web/feature.ts +12 -0
- package/src/web/features/asset-loader.ts +72 -0
- package/src/web/features/container-link.ts +382 -0
- package/src/web/features/esbuild.ts +93 -0
- package/src/web/features/helpers.ts +269 -0
- package/src/web/features/network.ts +85 -0
- package/src/web/features/speech.ts +104 -0
- package/src/web/features/vault.ts +207 -0
- package/src/web/features/vm.ts +85 -0
- package/src/web/features/voice-recognition.ts +161 -0
- package/src/web/shims/isomorphic-vm.ts +149 -0
- package/test/assistant-hooks.test.ts +306 -0
- package/test/assistant.test.ts +81 -0
- package/test/bus.test.ts +134 -0
- package/test/clients-servers.test.ts +217 -0
- package/test/command.test.ts +267 -0
- package/test/container-link.test.ts +274 -0
- package/test/conversation.test.ts +220 -0
- package/test/features.test.ts +160 -0
- package/test/fork-and-research.test.ts +450 -0
- package/test/integration.test.ts +787 -0
- package/test/interceptor-chain.test.ts +61 -0
- package/test/node-container.test.ts +121 -0
- package/test/python-session.test.ts +105 -0
- package/test/rate-limit.test.ts +272 -0
- package/test/semantic-search.test.ts +550 -0
- package/test/state.test.ts +121 -0
- package/test/vm-context.test.ts +146 -0
- package/test/vm-loadmodule.test.ts +213 -0
- package/test/websocket-ask.test.ts +101 -0
- package/test-integration/assistant.test.ts +138 -0
- package/test-integration/assistants-manager.test.ts +113 -0
- package/test-integration/claude-code.test.ts +98 -0
- package/test-integration/conversation-history.test.ts +205 -0
- package/test-integration/conversation.test.ts +137 -0
- package/test-integration/elevenlabs.test.ts +55 -0
- package/test-integration/google-services.test.ts +80 -0
- package/test-integration/helpers.ts +89 -0
- package/test-integration/memory.test.ts +204 -0
- package/test-integration/openai-codex.test.ts +93 -0
- package/test-integration/runpod.test.ts +58 -0
- package/test-integration/server-endpoints.test.ts +97 -0
- package/test-integration/telegram.test.ts +46 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +58 -0
- package/uv.lock +8 -0
- package/LICENSE +0 -21
- package/dist/cli/cli.js +0 -48
- package/dist/cli/common.d.ts +0 -2
- package/dist/cli/common.js +0 -6
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.js +0 -5
- package/dist/cli/run.d.ts +0 -1
- package/dist/cli/run.js +0 -38
- package/dist/core/index.d.ts +0 -4
- package/dist/core/index.js +0 -32
- package/dist/core/read.d.ts +0 -2
- package/dist/core/read.js +0 -29
- package/dist/core/request.d.ts +0 -1
- package/dist/core/request.js +0 -2
- package/dist/core/write.d.ts +0 -2
- package/dist/core/write.js +0 -21
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -5
- package/dist/utils/common.d.ts +0 -9
- package/dist/utils/common.js +0 -57
- package/dist/utils/consts.d.ts +0 -3
- package/dist/utils/consts.js +0 -11
- package/dist/utils/dict.d.ts +0 -1
- package/dist/utils/dict.js +0 -7
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.js +0 -21
- package/dist/utils/log.d.ts +0 -1
- package/dist/utils/log.js +0 -5
- package/dist/utils/types.d.ts +0 -1
- package/dist/utils/types.js +0 -2
- package/dist/utils/utils.test.d.ts +0 -1
- package/dist/utils/utils.test.js +0 -7
|
@@ -0,0 +1,341 @@
|
|
|
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 |
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
})
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
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.
|
|
@@ -0,0 +1,14 @@
|
|
|
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.
|
|
@@ -0,0 +1,9 @@
|
|
|
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.
|
|
@@ -0,0 +1,11 @@
|
|
|
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.
|