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