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,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Bootstrap: Learning the Container at Runtime"
|
|
3
|
+
tags:
|
|
4
|
+
- bootstrap
|
|
5
|
+
- introspection
|
|
6
|
+
- repl
|
|
7
|
+
- agent
|
|
8
|
+
- discovery
|
|
9
|
+
- quickstart
|
|
10
|
+
---
|
|
11
|
+
# Bootstrap: Learning the Container at Runtime
|
|
12
|
+
|
|
13
|
+
You don't need to memorize the Luca API. The container tells you everything it can do — at runtime. This tutorial teaches you the discovery pattern so you can explore any feature, client, server, or command without reading docs.
|
|
14
|
+
|
|
15
|
+
## Start with `luca eval`
|
|
16
|
+
|
|
17
|
+
The `eval` command runs JavaScript with the container in scope. All features are available as top-level variables.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# What features are available?
|
|
21
|
+
luca eval "container.features.available"
|
|
22
|
+
# => ['fs', 'git', 'proc', 'vm', 'networking', 'os', 'grep', ...]
|
|
23
|
+
|
|
24
|
+
# What clients?
|
|
25
|
+
luca eval "container.clients.available"
|
|
26
|
+
|
|
27
|
+
# What servers?
|
|
28
|
+
luca eval "container.servers.available"
|
|
29
|
+
|
|
30
|
+
# What commands?
|
|
31
|
+
luca eval "container.commands.available"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Describe Anything
|
|
35
|
+
|
|
36
|
+
The `luca describe` command generates API docs for any helper. It reads JSDoc, Zod schemas, and method signatures to produce markdown documentation.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Describe the container itself
|
|
40
|
+
luca describe
|
|
41
|
+
|
|
42
|
+
# Describe a feature
|
|
43
|
+
luca describe fs
|
|
44
|
+
|
|
45
|
+
# Describe multiple at once
|
|
46
|
+
luca describe git fs proc
|
|
47
|
+
|
|
48
|
+
# Show only specific sections
|
|
49
|
+
luca describe fs --methods --examples
|
|
50
|
+
|
|
51
|
+
# Describe all features
|
|
52
|
+
luca describe features
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
In code, the same works via registries:
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
container.features.describe('fs') // markdown docs for fs
|
|
59
|
+
container.features.describeAll() // condensed overview of all features
|
|
60
|
+
container.clients.describe('rest') // docs for the rest client
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## The Discovery Pattern
|
|
64
|
+
|
|
65
|
+
Every registry follows the same shape. Once you know the pattern, you can explore anything:
|
|
66
|
+
|
|
67
|
+
```js
|
|
68
|
+
// List what's available
|
|
69
|
+
container.features.available
|
|
70
|
+
container.clients.available
|
|
71
|
+
container.servers.available
|
|
72
|
+
container.commands.available
|
|
73
|
+
|
|
74
|
+
// Get docs for a specific helper
|
|
75
|
+
container.features.describe('fs')
|
|
76
|
+
container.clients.describe('rest')
|
|
77
|
+
container.servers.describe('express')
|
|
78
|
+
|
|
79
|
+
// Check if something exists
|
|
80
|
+
container.features.has('fs') // => true
|
|
81
|
+
|
|
82
|
+
// Get a helper instance
|
|
83
|
+
const fs = container.feature('fs')
|
|
84
|
+
const rest = container.client('rest')
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Instance Introspection
|
|
88
|
+
|
|
89
|
+
Once you have a helper instance, it can describe itself:
|
|
90
|
+
|
|
91
|
+
```js
|
|
92
|
+
const fs = container.feature('fs')
|
|
93
|
+
|
|
94
|
+
// Structured introspection (object with methods, getters, events, state, options)
|
|
95
|
+
fs.introspect()
|
|
96
|
+
|
|
97
|
+
// Human-readable markdown
|
|
98
|
+
fs.introspectAsText()
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The container itself is introspectable:
|
|
102
|
+
|
|
103
|
+
```js
|
|
104
|
+
container.introspect() // structured object with all registries, state, events
|
|
105
|
+
container.introspectAsText() // full markdown overview
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## The REPL
|
|
109
|
+
|
|
110
|
+
For interactive exploration, use `luca console`. It gives you a persistent REPL with the container and all features in scope:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
luca console
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Inside the REPL, you can tab-complete, call methods, and explore interactively. Variables survive across lines.
|
|
117
|
+
|
|
118
|
+
## Feature Shortcuts
|
|
119
|
+
|
|
120
|
+
In eval and REPL contexts, core features are available as top-level variables — no need to call `container.feature()`:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
luca eval "fs.readFile('package.json')"
|
|
124
|
+
luca eval "git.branch"
|
|
125
|
+
luca eval "proc.exec('ls')"
|
|
126
|
+
luca eval "grep.search('.', 'TODO')"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Quick Reference
|
|
130
|
+
|
|
131
|
+
| Want to know... | Ask |
|
|
132
|
+
|--------------------------------|----------------------------------------|
|
|
133
|
+
| What registries exist? | `container.registries` |
|
|
134
|
+
| What features are available? | `container.features.available` |
|
|
135
|
+
| Full docs for a feature? | `container.features.describe('fs')` |
|
|
136
|
+
| All features at a glance? | `container.features.describeAll()` |
|
|
137
|
+
| Structured introspection? | `feature.introspect()` |
|
|
138
|
+
| What state does it have? | `feature.state.current` |
|
|
139
|
+
| What events does it emit? | `feature.introspect().events` |
|
|
140
|
+
| Full container overview? | `container.introspectAsText()` |
|
|
141
|
+
| CLI docs for a helper? | `luca describe <name>` |
|
|
142
|
+
|
|
143
|
+
## Gotchas
|
|
144
|
+
|
|
145
|
+
### `paths.join()` vs `paths.resolve()`
|
|
146
|
+
|
|
147
|
+
`container.paths.join()` and `container.paths.resolve()` are Node's `path.join` and `path.resolve` curried with `container.cwd`. This means `paths.join()` always prepends `cwd` — even if you pass an absolute path as the first argument.
|
|
148
|
+
|
|
149
|
+
```js
|
|
150
|
+
// WRONG — paths.join will prepend cwd to the absolute tmpdir path
|
|
151
|
+
const bad = container.paths.join(os.tmpdir, 'mydir')
|
|
152
|
+
// => "/your/project/tmp/mydir" (not what you want)
|
|
153
|
+
|
|
154
|
+
// RIGHT — paths.resolve respects absolute first args
|
|
155
|
+
const good = container.paths.resolve(os.tmpdir, 'mydir')
|
|
156
|
+
// => "/tmp/mydir"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Rule of thumb:** Use `paths.join()` for project-relative paths, `paths.resolve()` when the base is already absolute.
|
|
160
|
+
|
|
161
|
+
## What's Next
|
|
162
|
+
|
|
163
|
+
- [The Container](./02-container.md) — deep dive into state, events, and lifecycle
|
|
164
|
+
- [Scripts](./03-scripts.md) — run scripts and executable markdown notebooks
|
|
165
|
+
- [Features Overview](./04-features-overview.md) — explore built-in features
|
|
166
|
+
- [Writing Commands](./08-commands.md) — add CLI commands to your project
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Getting Started with Luca
|
|
3
|
+
tags: [setup, quickstart, project, init]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Getting Started with Luca
|
|
7
|
+
|
|
8
|
+
## Prerequisites
|
|
9
|
+
|
|
10
|
+
- [Bun](https://bun.sh) installed (Luca's runtime)
|
|
11
|
+
- A new or existing bun project
|
|
12
|
+
|
|
13
|
+
## Create a New Project
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
mkdir my-app && cd my-app
|
|
17
|
+
bun init -y
|
|
18
|
+
bun add @soederpop/luca
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Project Structure
|
|
22
|
+
|
|
23
|
+
A typical Luca project looks like this:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
my-app/
|
|
27
|
+
├── package.json
|
|
28
|
+
├── endpoints/ # File-based HTTP routes (auto-discovered by `luca serve`)
|
|
29
|
+
│ ├── health.ts
|
|
30
|
+
│ └── users.ts
|
|
31
|
+
├── commands/ # Project-local CLI commands (auto-discovered by `luca`)
|
|
32
|
+
│ └── seed.ts
|
|
33
|
+
├── assistants/ # AI assistants (file-based convention)
|
|
34
|
+
│ └── my-helper/
|
|
35
|
+
│ ├── CORE.md
|
|
36
|
+
│ ├── tools.ts
|
|
37
|
+
│ ├── hooks.ts
|
|
38
|
+
│ └── docs/
|
|
39
|
+
├── public/ # Static files served by `luca serve`
|
|
40
|
+
│ └── index.html
|
|
41
|
+
└── scripts/ # Standalone scripts that use the container
|
|
42
|
+
└── migrate.ts
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## The Container
|
|
46
|
+
|
|
47
|
+
Everything in Luca revolves around the **container**. It is a per-process singleton that acts as your dependency injector, event bus, and state machine.
|
|
48
|
+
|
|
49
|
+
In scripts, you create one directly:
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import container from '@soederpop/luca/node'
|
|
53
|
+
|
|
54
|
+
// Now you have access to all features
|
|
55
|
+
const fs = container.fs // File system operations
|
|
56
|
+
const git = container.git // Git utilities (branch, sha, lsFiles, etc.)
|
|
57
|
+
const ui = container.ui // Terminal UI (colors, prompts, figlet)
|
|
58
|
+
const proc = container.feature('proc') // Process execution
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
In endpoints and commands, the container is provided for you via context:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// endpoints/health.ts
|
|
65
|
+
export const path = '/health'
|
|
66
|
+
|
|
67
|
+
export async function get(_params: any, ctx: EndpointContext) {
|
|
68
|
+
const { container } = ctx
|
|
69
|
+
return { status: 'ok', uptime: process.uptime() }
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Running Your Project
|
|
74
|
+
|
|
75
|
+
### Start the API server
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
luca serve
|
|
79
|
+
# or with options:
|
|
80
|
+
luca serve --port 4000 --endpointsDir src/endpoints
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
This auto-discovers your `endpoints/` directory, mounts all routes, and generates an OpenAPI spec at `/openapi.json`.
|
|
84
|
+
|
|
85
|
+
### Run a CLI command
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
luca seed --count 10
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
This auto-discovers `commands/seed.ts` from your project and runs it.
|
|
92
|
+
|
|
93
|
+
### Run a script
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
luca run scripts/migrate.ts
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## What's Next
|
|
100
|
+
|
|
101
|
+
- [The Container](./02-container.md) -- deep dive into the container
|
|
102
|
+
- [Scripts and Markdown Notebooks](./03-scripts.md) -- run scripts and executable markdown
|
|
103
|
+
- [Using Features](./04-features-overview.md) -- explore built-in features
|
|
104
|
+
- [Servers](./06-servers.md) -- set up Express and WebSocket servers
|
|
105
|
+
- [Writing Endpoints](./07-endpoints.md) -- build your API routes
|
|
106
|
+
- [Writing Commands](./08-commands.md) -- add CLI commands to your project
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: The Container
|
|
3
|
+
tags: [container, singleton, state, events, registries, dependency-injection]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# The Container
|
|
7
|
+
|
|
8
|
+
The container is the heart of every Luca application. It is a per-process singleton that provides:
|
|
9
|
+
|
|
10
|
+
- **Dependency injection** via factory methods and registries
|
|
11
|
+
- **Observable state** that you can watch for changes
|
|
12
|
+
- **Event bus** for decoupled communication
|
|
13
|
+
- **Registries** for discovering available helpers
|
|
14
|
+
|
|
15
|
+
## Getting the Container
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import container from '@soederpop/luca'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The import resolves automatically based on environment -- `@soederpop/luca` gives you a `NodeContainer` on the server and a `WebContainer` in browser builds. You can also be explicit:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import container from '@soederpop/luca/node' // Always NodeContainer
|
|
25
|
+
import container from '@soederpop/luca/web' // Always WebContainer
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The NodeContainer comes pre-loaded with registries for features, clients, servers, commands, and endpoints. Core features like `fs`, `git`, `proc`, `os`, `networking`, `ui`, and `vm` are auto-enabled.
|
|
29
|
+
|
|
30
|
+
## Registries
|
|
31
|
+
|
|
32
|
+
Every helper type has a registry. Registries let you discover what's available and create instances:
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// What features are available?
|
|
36
|
+
container.features.available
|
|
37
|
+
// => ['fs', 'git', 'proc', 'vm', 'ui', 'networking', 'os', 'diskCache', 'contentDb', ...]
|
|
38
|
+
|
|
39
|
+
// Get documentation for a feature
|
|
40
|
+
container.features.describe('fs')
|
|
41
|
+
|
|
42
|
+
// Get documentation for all features
|
|
43
|
+
container.features.describeAll()
|
|
44
|
+
|
|
45
|
+
// Check if something is registered
|
|
46
|
+
container.features.has('diskCache')
|
|
47
|
+
|
|
48
|
+
// Same pattern for all helper types:
|
|
49
|
+
container.servers.available // ['express', 'websocket']
|
|
50
|
+
container.clients.available // ['rest', 'graph', 'websocket']
|
|
51
|
+
container.commands.available // ['serve', 'run', ...]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Factory Methods
|
|
55
|
+
|
|
56
|
+
Create helper instances through the container's factory methods:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// Features (cached by id + options hash)
|
|
60
|
+
const fs = container.feature('fs')
|
|
61
|
+
const cache = container.feature('diskCache', { path: './cache' })
|
|
62
|
+
|
|
63
|
+
// Servers
|
|
64
|
+
const server = container.server('express', { port: 3000, cors: true })
|
|
65
|
+
|
|
66
|
+
// Clients
|
|
67
|
+
const api = container.client('rest', { baseURL: 'https://api.example.com' })
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Factory results are **cached**. Calling `container.feature('fs')` twice returns the same instance. Different options produce different instances.
|
|
71
|
+
|
|
72
|
+
## Enabled Features (Shortcuts)
|
|
73
|
+
|
|
74
|
+
Some features are "enabled" on the container, giving them shortcut access:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// These are equivalent:
|
|
78
|
+
container.feature('fs')
|
|
79
|
+
container.fs
|
|
80
|
+
|
|
81
|
+
// Auto-enabled features:
|
|
82
|
+
container.fs // File system
|
|
83
|
+
container.git // Git operations
|
|
84
|
+
container.proc // Process execution
|
|
85
|
+
container.vm // JavaScript VM
|
|
86
|
+
container.ui // Terminal UI
|
|
87
|
+
container.os // OS info
|
|
88
|
+
container.networking // Port finding, availability
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
To enable your own feature:
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
const myFeature = container.feature('myFeature', { enable: true })
|
|
95
|
+
// Now accessible as container.myFeature
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Observable State
|
|
99
|
+
|
|
100
|
+
The container (and every helper) has observable state:
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// Set state
|
|
104
|
+
container.state.set('ready', true)
|
|
105
|
+
|
|
106
|
+
// Get state
|
|
107
|
+
container.state.get('ready') // true
|
|
108
|
+
|
|
109
|
+
// Get a snapshot of all state
|
|
110
|
+
container.state.current
|
|
111
|
+
|
|
112
|
+
// Observe all changes (changeType is 'add' | 'update' | 'delete')
|
|
113
|
+
container.state.observe((changeType, key, value) => {
|
|
114
|
+
console.log(`${key} ${changeType}:`, value)
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
// State has a version counter
|
|
118
|
+
container.state.version // increments on every change
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Event Bus
|
|
122
|
+
|
|
123
|
+
The container has a built-in event bus for decoupled communication:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
// Listen for events
|
|
127
|
+
container.on('featureEnabled', (featureName) => {
|
|
128
|
+
console.log(`${featureName} was enabled`)
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
// Emit events
|
|
132
|
+
container.emit('myCustomEvent', { some: 'data' })
|
|
133
|
+
|
|
134
|
+
// One-time listener
|
|
135
|
+
container.once('ready', () => console.log('Container is ready'))
|
|
136
|
+
|
|
137
|
+
// Wait for an event (promise-based)
|
|
138
|
+
await container.waitFor('ready')
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Plugins and `.use()`
|
|
142
|
+
|
|
143
|
+
Extend the container with the `.use()` method:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// Enable a feature by name
|
|
147
|
+
container.use('diskCache')
|
|
148
|
+
|
|
149
|
+
// Attach a plugin
|
|
150
|
+
container.use(MyPlugin)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
A plugin is any class with a static `attach(container)` method:
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
class MyPlugin {
|
|
157
|
+
static attach(container) {
|
|
158
|
+
// Add registries, factories, whatever you need
|
|
159
|
+
container.myThing = new MyThing(container)
|
|
160
|
+
return container
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Utilities
|
|
166
|
+
|
|
167
|
+
The container provides common utilities so you don't need extra dependencies:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
container.utils.uuid() // Generate a v4 UUID
|
|
171
|
+
container.utils.hashObject({ foo: 'bar' }) // Deterministic hash
|
|
172
|
+
container.utils.stringUtils.camelCase('my-var') // 'myVar'
|
|
173
|
+
container.utils.stringUtils.kebabCase('MyVar') // 'my-var'
|
|
174
|
+
container.utils.stringUtils.pluralize('feature') // 'features'
|
|
175
|
+
|
|
176
|
+
// Lodash utilities
|
|
177
|
+
const { uniq, groupBy, keyBy, debounce, throttle } = container.utils.lodash
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Path Utilities
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
container.paths.resolve('relative/path') // Resolve from cwd
|
|
184
|
+
container.paths.join('a', 'b', 'c') // Join path segments
|
|
185
|
+
container.paths.relative('/absolute/path') // Make relative to cwd
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Package Manifest
|
|
189
|
+
|
|
190
|
+
Access the project's package.json:
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
container.manifest.name // "my-app"
|
|
194
|
+
container.manifest.version // "0.1.0"
|
|
195
|
+
container.manifest.dependencies
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Introspection
|
|
199
|
+
|
|
200
|
+
Discover everything about the container at runtime:
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// Structured introspection data
|
|
204
|
+
const info = container.introspect()
|
|
205
|
+
|
|
206
|
+
// Human-readable markdown
|
|
207
|
+
const docs = container.introspectAsText()
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
This is what makes Luca especially powerful for AI agents -- they can discover the entire API surface at runtime without reading documentation.
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Running Scripts and Markdown Notebooks
|
|
3
|
+
tags: [scripts, luca-run, automation, bun, standalone, markdown, codeblocks, notebook]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Running Scripts and Markdown Notebooks
|
|
7
|
+
|
|
8
|
+
`luca run` executes TypeScript/JavaScript files and markdown files. This is often the fastest way to try out Luca features, automate tasks, or build runnable documentation.
|
|
9
|
+
|
|
10
|
+
## Running a TypeScript Script
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
luca run scripts/hello.ts
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
// scripts/hello.ts
|
|
18
|
+
import container from '@soederpop/luca'
|
|
19
|
+
|
|
20
|
+
console.log('Available features:', container.features.available)
|
|
21
|
+
console.log('Git branch:', container.git.branch)
|
|
22
|
+
console.log('OS:', container.os.platform, container.os.arch)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The extension is optional -- `luca run scripts/hello` tries `.ts`, `.js`, and `.md` automatically.
|
|
26
|
+
|
|
27
|
+
## Running Markdown Files
|
|
28
|
+
|
|
29
|
+
This is one of Luca's most useful features. `luca run` can execute markdown files as runnable notebooks. It walks through the document, renders the prose to the terminal, and executes each `ts` or `js` fenced codeblock in sequence. All blocks share the same VM context, so variables defined in one block are available in the next.
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
luca run docs/tutorial.md
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### How It Works
|
|
36
|
+
|
|
37
|
+
Given a markdown file like this:
|
|
38
|
+
|
|
39
|
+
````markdown
|
|
40
|
+
# Setup Tutorial
|
|
41
|
+
|
|
42
|
+
First, let's see what's available (container is provided automatically):
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
console.log(container.features.available)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Now let's use the file system feature:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
const { files } = container.fs.walk('./src', { include: ['*.ts'] })
|
|
52
|
+
console.log(`Found ${files.length} TypeScript files`)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
This block won't run because it's Python:
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
print("I'm skipped -- only ts and js blocks run")
|
|
59
|
+
```
|
|
60
|
+
````
|
|
61
|
+
|
|
62
|
+
When you run `luca run docs/tutorial.md`, it:
|
|
63
|
+
|
|
64
|
+
1. Renders "# Setup Tutorial" and the prose as formatted markdown in your terminal
|
|
65
|
+
2. Displays the first codeblock, then executes it
|
|
66
|
+
3. Renders the next paragraph
|
|
67
|
+
4. Displays and executes the second codeblock (which can reference `container` from block 1)
|
|
68
|
+
5. Skips the Python block entirely (only `ts` and `js` blocks execute)
|
|
69
|
+
|
|
70
|
+
### Skipping Blocks
|
|
71
|
+
|
|
72
|
+
Add `skip` in the code fence meta to prevent a block from running:
|
|
73
|
+
|
|
74
|
+
````markdown
|
|
75
|
+
```ts skip
|
|
76
|
+
// This block is shown but NOT executed
|
|
77
|
+
dangerousOperation()
|
|
78
|
+
```
|
|
79
|
+
````
|
|
80
|
+
|
|
81
|
+
### Safe Mode
|
|
82
|
+
|
|
83
|
+
Use `--safe` to require manual approval before each block runs:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
luca run docs/tutorial.md --safe
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The runner will prompt "Run this block? (y/n)" before executing each codeblock. Great for walkthroughs where you want to pause and observe.
|
|
90
|
+
|
|
91
|
+
### Shared Context
|
|
92
|
+
|
|
93
|
+
All codeblocks in a markdown file share a VM context. The context includes `console` and the full container context, so you can use container features without importing:
|
|
94
|
+
|
|
95
|
+
````markdown
|
|
96
|
+
```ts
|
|
97
|
+
// Block 1: container is already available in the context
|
|
98
|
+
const { files } = container.fs.walk('./src')
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
// Block 2: `files` from block 1 is still in scope
|
|
103
|
+
console.log(`Found ${files.length} files in src/`)
|
|
104
|
+
```
|
|
105
|
+
````
|
|
106
|
+
|
|
107
|
+
### Use Cases for Markdown Scripts
|
|
108
|
+
|
|
109
|
+
- **Runnable tutorials** -- documentation that actually executes
|
|
110
|
+
- **Onboarding guides** -- new developers run the guide and see real output
|
|
111
|
+
- **Demo scripts** -- explain and execute in the same document
|
|
112
|
+
- **Literate DevOps** -- annotated operational runbooks
|
|
113
|
+
|
|
114
|
+
## TypeScript Script Examples
|
|
115
|
+
|
|
116
|
+
### File Processor
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
// scripts/process-images.ts
|
|
120
|
+
import container from '@soederpop/luca'
|
|
121
|
+
|
|
122
|
+
const { fs, proc } = container
|
|
123
|
+
|
|
124
|
+
const { files: images } = fs.walk('./uploads', { include: ['*.png', '*.jpg'] })
|
|
125
|
+
console.log(`Processing ${images.length} images...`)
|
|
126
|
+
|
|
127
|
+
for (const image of images) {
|
|
128
|
+
console.log(` Optimizing: ${image}`)
|
|
129
|
+
proc.exec(`optipng ${image}`)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
console.log('Done.')
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Data Migration
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// scripts/migrate-data.ts
|
|
139
|
+
import container from '@soederpop/luca'
|
|
140
|
+
|
|
141
|
+
const { fs } = container
|
|
142
|
+
|
|
143
|
+
const api = container.client('rest', {
|
|
144
|
+
baseURL: 'https://api.example.com',
|
|
145
|
+
})
|
|
146
|
+
await api.connect()
|
|
147
|
+
|
|
148
|
+
const oldData = fs.readJson('./data/legacy-users.json')
|
|
149
|
+
console.log(`Migrating ${oldData.length} users...`)
|
|
150
|
+
|
|
151
|
+
for (const user of oldData) {
|
|
152
|
+
await api.post('/users', {
|
|
153
|
+
name: user.full_name,
|
|
154
|
+
email: user.email_address,
|
|
155
|
+
role: 'user',
|
|
156
|
+
})
|
|
157
|
+
console.log(` Migrated: ${user.full_name}`)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
console.log('Migration complete.')
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Generate Report
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
// scripts/weekly-report.ts
|
|
167
|
+
import container from '@soederpop/luca'
|
|
168
|
+
|
|
169
|
+
const { git, fs } = container
|
|
170
|
+
|
|
171
|
+
const branch = git.branch // getter, not a method
|
|
172
|
+
const sha = git.sha // getter, not a method
|
|
173
|
+
const files = await git.lsFiles()
|
|
174
|
+
const { files: srcFiles } = fs.walk('./src', { include: ['*.ts'] })
|
|
175
|
+
|
|
176
|
+
const report = `# Weekly Report
|
|
177
|
+
|
|
178
|
+
- Branch: ${branch}
|
|
179
|
+
- Commit: ${sha}
|
|
180
|
+
- Tracked files: ${files.length}
|
|
181
|
+
- Source files: ${srcFiles.length}
|
|
182
|
+
|
|
183
|
+
Generated: ${new Date().toISOString()}
|
|
184
|
+
`
|
|
185
|
+
|
|
186
|
+
await fs.writeFile('./reports/weekly.md', report)
|
|
187
|
+
console.log('Report generated: reports/weekly.md')
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Tips
|
|
191
|
+
|
|
192
|
+
- **Use the container** -- don't import `fs` from Node directly. `container.fs` gives you the same operations with the benefit of working within the container ecosystem.
|
|
193
|
+
- **Markdown scripts are great for prototyping** -- write a markdown file, mix explanation with code, run it, iterate.
|
|
194
|
+
- **Use `--safe` for unfamiliar scripts** -- review each block before it runs.
|