@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,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "fs"
|
|
3
|
+
tags: [fs, filesystem, core]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# fs
|
|
9
|
+
|
|
10
|
+
File system utilities for reading, writing, checking, and walking files and directories.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `fs` feature is a core feature, meaning it is auto-enabled on every container. You can access it directly as a global or via `container.feature('fs')`. It provides synchronous and asynchronous methods for common filesystem operations. All paths are resolved relative to the container's working directory.
|
|
15
|
+
|
|
16
|
+
## Reading Files
|
|
17
|
+
|
|
18
|
+
Use `readFile()` to read a file as a string. This is the simplest way to get file contents.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const content = fs.readFile('README.md')
|
|
22
|
+
console.log('README.md length:', content.length, 'characters')
|
|
23
|
+
console.log('First line:', content.split('\n')[0])
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The returned value is always a string, ready for processing.
|
|
27
|
+
|
|
28
|
+
## Reading JSON
|
|
29
|
+
|
|
30
|
+
Use `readJson()` to read and parse a JSON file in one step. No need for manual `JSON.parse()`.
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
const pkg = fs.readJson('package.json')
|
|
34
|
+
console.log('Package name:', pkg.name)
|
|
35
|
+
console.log('Version:', pkg.version)
|
|
36
|
+
console.log('Dependencies:', Object.keys(pkg.dependencies || {}).length, 'packages')
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
This is especially handy for configuration files and manifests.
|
|
40
|
+
|
|
41
|
+
## Checking Existence
|
|
42
|
+
|
|
43
|
+
Use `exists()` to check whether a file or directory is present before operating on it.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
console.log('README.md exists:', fs.exists('README.md'))
|
|
47
|
+
console.log('package.json exists:', fs.exists('package.json'))
|
|
48
|
+
console.log('nonexistent.txt exists:', fs.exists('nonexistent.txt'))
|
|
49
|
+
console.log('src/ exists:', fs.exists('src'))
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Returns a simple boolean. There is also an `existsAsync()` variant.
|
|
53
|
+
|
|
54
|
+
## Walking a Directory
|
|
55
|
+
|
|
56
|
+
Use `walk()` to recursively list all files under a directory tree. You can filter to just files or just directories.
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
const result = fs.walk('src', { files: true, directories: false, exclude: ['node_modules'] })
|
|
60
|
+
console.log('Total files in src/:', result.files.length)
|
|
61
|
+
console.log('First 5 files:')
|
|
62
|
+
result.files.slice(0, 5).forEach(f => console.log(' ', f))
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Walk returns an object with `files` and `directories` arrays of relative paths.
|
|
66
|
+
|
|
67
|
+
## Finding Files Upward
|
|
68
|
+
|
|
69
|
+
Use `findUp()` to search for a file by walking up the directory tree from the current working directory. This is useful for locating project root markers.
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
const tsconfig = fs.findUp('tsconfig.json')
|
|
73
|
+
console.log('tsconfig.json found at:', tsconfig)
|
|
74
|
+
|
|
75
|
+
const packageJson = fs.findUp('package.json')
|
|
76
|
+
console.log('package.json found at:', packageJson)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Returns the absolute path if found, or `null` if the file is not in any ancestor directory.
|
|
80
|
+
|
|
81
|
+
## Summary
|
|
82
|
+
|
|
83
|
+
This demo covered reading files as strings and JSON, checking existence, recursively walking directories, and searching upward for project configuration files. These are the bread-and-butter operations for any script that needs to interact with the filesystem.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "git"
|
|
3
|
+
tags: [git, version-control, core]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# git
|
|
9
|
+
|
|
10
|
+
Git repository operations including branch info, commit history, and file listing.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `git` feature is a core feature, auto-enabled on every container. You can access it directly as a global or via `container.feature('git')`. It provides getters for quick repo metadata and methods for querying commit history and tracked files. All operations use the repository that contains the container's working directory.
|
|
15
|
+
|
|
16
|
+
## Repository Info
|
|
17
|
+
|
|
18
|
+
The basic getters give you quick access to the current repository state without any arguments.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
console.log('Is a git repo:', git.isRepo)
|
|
22
|
+
console.log('Repo root:', git.repoRoot)
|
|
23
|
+
console.log('Current branch:', git.branch)
|
|
24
|
+
console.log('Current SHA:', git.sha)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
These are synchronous getters, so you can use them inline anywhere.
|
|
28
|
+
|
|
29
|
+
## Listing Tracked Files
|
|
30
|
+
|
|
31
|
+
Use `lsFiles()` to list files tracked by git. This wraps `git ls-files` with structured options.
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
const files = await git.lsFiles()
|
|
35
|
+
console.log('Total tracked files:', files.length)
|
|
36
|
+
console.log('First 5 files:')
|
|
37
|
+
files.slice(0, 5).forEach(f => console.log(' ', f))
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
You can filter for modified, deleted, or untracked files by passing options.
|
|
41
|
+
|
|
42
|
+
## Filtered File Listing
|
|
43
|
+
|
|
44
|
+
Pass options to `lsFiles()` to narrow down the results by file status or pattern.
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
const tsFiles = await git.lsFiles({ include: '*.ts' })
|
|
48
|
+
console.log('Tracked .ts files:', tsFiles.length)
|
|
49
|
+
|
|
50
|
+
const srcFiles = await git.lsFiles({ baseDir: 'src' })
|
|
51
|
+
console.log('Files in src/:', srcFiles.length)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The `include`, `exclude`, and `baseDir` options let you scope the listing precisely.
|
|
55
|
+
|
|
56
|
+
## Latest Commits
|
|
57
|
+
|
|
58
|
+
Use `getLatestChanges()` to retrieve recent commit metadata. Each entry has a `title`, `message`, and `author`.
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
const changes = await git.getLatestChanges(3)
|
|
62
|
+
changes.forEach((c, i) => {
|
|
63
|
+
console.log(`${i + 1}. [${c.author}] ${c.title}`)
|
|
64
|
+
})
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
This is useful for generating changelogs, displaying recent activity, or auditing history.
|
|
68
|
+
|
|
69
|
+
## File History
|
|
70
|
+
|
|
71
|
+
Use `fileLog()` to see the commit history for a specific file.
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const log = git.fileLog('package.json')
|
|
75
|
+
console.log('Commits touching package.json:', log.length)
|
|
76
|
+
log.slice(0, 3).forEach(entry => {
|
|
77
|
+
console.log(` ${entry.sha.slice(0, 8)} ${entry.message}`)
|
|
78
|
+
})
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Each entry contains the commit `sha` and `message`. This is a synchronous method.
|
|
82
|
+
|
|
83
|
+
## Summary
|
|
84
|
+
|
|
85
|
+
This demo covered checking repository status, listing tracked files with filters, viewing recent commit history, and inspecting per-file commit logs. These tools give scripts full visibility into the git state of a project.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Google Auth"
|
|
3
|
+
tags: [googleAuth, google, oauth2, authentication, service-account]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# googleAuth
|
|
9
|
+
|
|
10
|
+
Google authentication feature supporting OAuth2 browser flow and service account auth. Handles the complete OAuth2 lifecycle including token refresh and secure storage via diskCache.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
Use the `googleAuth` feature to authenticate with Google APIs. It supports two modes: OAuth2 (opens a browser for user consent) and service account (non-interactive, uses a JSON key file). Other Google features (drive, sheets, calendar, docs) depend on this feature automatically.
|
|
15
|
+
|
|
16
|
+
Requires either `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` environment variables for OAuth2, or a service account key file.
|
|
17
|
+
|
|
18
|
+
## Enabling the Feature
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const auth = container.feature('googleAuth')
|
|
22
|
+
console.log('Auth mode:', auth.authMode)
|
|
23
|
+
console.log('Authenticated:', auth.isAuthenticated)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The feature reads `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` from the environment automatically. You can also pass `clientId` and `clientSecret` as options.
|
|
27
|
+
|
|
28
|
+
## API Documentation
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
const info = await container.features.describe('googleAuth')
|
|
32
|
+
console.log(info)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## OAuth2 Authorization Flow
|
|
36
|
+
|
|
37
|
+
The `authorize()` method starts the full OAuth2 browser flow: it spins up a local callback server, opens the consent page, exchanges the code for tokens, and caches the refresh token.
|
|
38
|
+
|
|
39
|
+
```ts skip
|
|
40
|
+
const auth = container.feature('googleAuth', {
|
|
41
|
+
scopes: ['https://www.googleapis.com/auth/drive.readonly']
|
|
42
|
+
})
|
|
43
|
+
await auth.authorize()
|
|
44
|
+
console.log('Authenticated:', auth.isAuthenticated)
|
|
45
|
+
console.log('Scopes:', auth.state.scopes)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
When running with valid credentials, this opens a browser to Google's consent page. After approval, tokens are stored in diskCache and automatically refreshed on expiry.
|
|
49
|
+
|
|
50
|
+
## Service Account Authentication
|
|
51
|
+
|
|
52
|
+
For server-to-server auth without a browser, use a service account JSON key file.
|
|
53
|
+
|
|
54
|
+
```ts skip
|
|
55
|
+
const auth = container.feature('googleAuth', {
|
|
56
|
+
mode: 'service-account',
|
|
57
|
+
serviceAccountKeyPath: '/path/to/service-account-key.json',
|
|
58
|
+
scopes: ['https://www.googleapis.com/auth/spreadsheets.readonly']
|
|
59
|
+
})
|
|
60
|
+
await auth.authenticateServiceAccount()
|
|
61
|
+
console.log('Service account email:', auth.state.email)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Service accounts are ideal for automation, CI/CD, and background services that need Google API access without user interaction.
|
|
65
|
+
|
|
66
|
+
## Token Management
|
|
67
|
+
|
|
68
|
+
Tokens are cached automatically and restored on subsequent runs. You can also revoke credentials.
|
|
69
|
+
|
|
70
|
+
```ts skip
|
|
71
|
+
// Attempt to restore from cache (called automatically)
|
|
72
|
+
const restored = await auth.tryRestoreTokens()
|
|
73
|
+
console.log('Restored from cache:', restored)
|
|
74
|
+
|
|
75
|
+
// Get the auth client for passing to Google API constructors
|
|
76
|
+
const client = await auth.getAuthClient()
|
|
77
|
+
console.log('Auth client ready')
|
|
78
|
+
|
|
79
|
+
// Revoke and clear cached tokens
|
|
80
|
+
await auth.revoke()
|
|
81
|
+
console.log('Credentials revoked')
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The `tokenRefreshed` event fires when tokens are automatically refreshed, and `authenticated` fires after successful authentication.
|
|
85
|
+
|
|
86
|
+
## Summary
|
|
87
|
+
|
|
88
|
+
The `googleAuth` feature provides the authentication layer for all Google API features. It supports OAuth2 browser flow and service accounts, with automatic token refresh and diskCache storage. Other Google features (drive, sheets, calendar, docs) use it automatically. Key methods: `authorize()`, `authenticateServiceAccount()`, `getAuthClient()`, `revoke()`.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Google Calendar"
|
|
3
|
+
tags: [googleCalendar, google, calendar, events, scheduling]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# googleCalendar
|
|
9
|
+
|
|
10
|
+
Google Calendar feature for listing calendars and reading events. Creates a Calendar v3 API client and depends on `googleAuth` for authentication.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
Use the `googleCalendar` feature when you need to read calendar data: list calendars, fetch today's events, look ahead at upcoming days, or search events by text. Provides convenience methods for common time-based queries alongside the full `listEvents()` for custom ranges.
|
|
15
|
+
|
|
16
|
+
Requires Google OAuth2 credentials or a service account with Calendar access.
|
|
17
|
+
|
|
18
|
+
## Enabling the Feature
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const calendar = container.feature('googleCalendar', {
|
|
22
|
+
defaultCalendarId: 'primary',
|
|
23
|
+
timeZone: 'America/Chicago'
|
|
24
|
+
})
|
|
25
|
+
console.log('Google Calendar feature created')
|
|
26
|
+
console.log('Default calendar:', calendar.defaultCalendarId)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## API Documentation
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
const info = await container.features.describe('googleCalendar')
|
|
33
|
+
console.log(info)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Listing Calendars
|
|
37
|
+
|
|
38
|
+
Discover all calendars accessible to the authenticated user.
|
|
39
|
+
|
|
40
|
+
```ts skip
|
|
41
|
+
const calendars = await calendar.listCalendars()
|
|
42
|
+
calendars.forEach(c => console.log(` ${c.summary} (${c.id})`))
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Returns calendar metadata including ID, summary, time zone, and access role. Use the ID to target specific calendars in other methods.
|
|
46
|
+
|
|
47
|
+
## Today's Events and Upcoming
|
|
48
|
+
|
|
49
|
+
Quick methods for the most common queries.
|
|
50
|
+
|
|
51
|
+
```ts skip
|
|
52
|
+
const today = await calendar.getToday()
|
|
53
|
+
console.log(`Today: ${today.length} events`)
|
|
54
|
+
today.forEach(e => console.log(` ${e.start} - ${e.summary}`))
|
|
55
|
+
|
|
56
|
+
const upcoming = await calendar.getUpcoming(7)
|
|
57
|
+
console.log(`Next 7 days: ${upcoming.length} events`)
|
|
58
|
+
upcoming.forEach(e => console.log(` ${e.start} - ${e.summary}`))
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`getToday()` returns events from midnight to midnight in the configured timezone. `getUpcoming(days)` looks ahead the specified number of days from now.
|
|
62
|
+
|
|
63
|
+
## Searching Events
|
|
64
|
+
|
|
65
|
+
Search across event summaries, descriptions, and locations.
|
|
66
|
+
|
|
67
|
+
```ts skip
|
|
68
|
+
const meetings = await calendar.searchEvents('standup')
|
|
69
|
+
console.log(`Found ${meetings.length} standup events`)
|
|
70
|
+
meetings.forEach(e => console.log(` ${e.start} - ${e.summary}`))
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The search is freetext and matches against multiple event fields. Combine with time range options for more precise results.
|
|
74
|
+
|
|
75
|
+
## Custom Time Range Queries
|
|
76
|
+
|
|
77
|
+
Use `listEvents()` for full control over the query parameters.
|
|
78
|
+
|
|
79
|
+
```ts skip
|
|
80
|
+
const events = await calendar.listEvents({
|
|
81
|
+
timeMin: '2026-03-01T00:00:00Z',
|
|
82
|
+
timeMax: '2026-03-31T23:59:59Z',
|
|
83
|
+
maxResults: 50,
|
|
84
|
+
orderBy: 'startTime',
|
|
85
|
+
singleEvents: true
|
|
86
|
+
})
|
|
87
|
+
console.log(`March events: ${events.items.length}`)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Supports pagination via `pageToken`, ordering by `startTime` or `updated`, and filtering by calendar ID.
|
|
91
|
+
|
|
92
|
+
## Summary
|
|
93
|
+
|
|
94
|
+
The `googleCalendar` feature provides read access to Google Calendar events. Use the convenience methods `getToday()` and `getUpcoming()` for quick lookups, `searchEvents()` for text search, or `listEvents()` for full query control. Authentication is handled by `googleAuth`. Key methods: `listCalendars()`, `getToday()`, `getUpcoming()`, `searchEvents()`, `listEvents()`.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Google Docs"
|
|
3
|
+
tags: [googleDocs, google, docs, documents, markdown]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# googleDocs
|
|
9
|
+
|
|
10
|
+
Google Docs feature for reading documents and converting them to Markdown. Depends on `googleAuth` for authentication and optionally `googleDrive` for listing documents.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
Use the `googleDocs` feature when you need to read Google Docs content. Its standout capability is converting Google Docs to well-formatted Markdown, handling headings, bold/italic/strikethrough, links, code, lists, tables, and images. Also supports plain text extraction and raw document structure access.
|
|
15
|
+
|
|
16
|
+
Requires Google OAuth2 credentials or a service account with Docs access.
|
|
17
|
+
|
|
18
|
+
## Enabling the Feature
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const docs = container.feature('googleDocs')
|
|
22
|
+
console.log('Google Docs feature created')
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## API Documentation
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
const info = await container.features.describe('googleDocs')
|
|
29
|
+
console.log(info)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Reading as Markdown
|
|
33
|
+
|
|
34
|
+
Convert a Google Doc into clean Markdown with full formatting support.
|
|
35
|
+
|
|
36
|
+
```ts skip
|
|
37
|
+
const markdown = await docs.getAsMarkdown('1abc_document_id')
|
|
38
|
+
console.log(markdown)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The converter handles headings (H1-H6), bold, italic, strikethrough, links, code fonts, ordered/unordered lists with nesting, tables, images, and section breaks. This is the primary method for extracting document content.
|
|
42
|
+
|
|
43
|
+
## Plain Text and Raw Structure
|
|
44
|
+
|
|
45
|
+
```ts skip
|
|
46
|
+
const text = await docs.getAsText('1abc_document_id')
|
|
47
|
+
console.log('Plain text length:', text.length)
|
|
48
|
+
|
|
49
|
+
const rawDoc = await docs.getDocument('1abc_document_id')
|
|
50
|
+
console.log('Document title:', rawDoc.title)
|
|
51
|
+
console.log('Sections:', rawDoc.body.content.length)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Use `getAsText()` when you only need the words without any formatting. Use `getDocument()` when you need the full Docs API structure for custom processing.
|
|
55
|
+
|
|
56
|
+
## Saving to Files
|
|
57
|
+
|
|
58
|
+
```ts skip
|
|
59
|
+
const path = await docs.saveAsMarkdown('1abc_document_id', './output/doc.md')
|
|
60
|
+
console.log('Saved to:', path)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Downloads and converts a doc to Markdown in one step. The path is resolved relative to the container's working directory.
|
|
64
|
+
|
|
65
|
+
## Listing and Searching Docs
|
|
66
|
+
|
|
67
|
+
Uses Google Drive under the hood to find Google Docs by name or content.
|
|
68
|
+
|
|
69
|
+
```ts skip
|
|
70
|
+
const allDocs = await docs.listDocs()
|
|
71
|
+
console.log(`Found ${allDocs.length} Google Docs`)
|
|
72
|
+
allDocs.slice(0, 5).forEach(d => console.log(` ${d.name} (${d.id})`))
|
|
73
|
+
|
|
74
|
+
const results = await docs.searchDocs('meeting notes')
|
|
75
|
+
console.log(`Search returned ${results.length} docs`)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Both methods filter Drive results to the Google Docs MIME type automatically.
|
|
79
|
+
|
|
80
|
+
## Summary
|
|
81
|
+
|
|
82
|
+
The `googleDocs` feature reads Google Docs and converts them to Markdown, plain text, or raw API structures. The Markdown converter handles all common formatting elements. Uses `googleDrive` for listing and searching documents. Key methods: `getAsMarkdown()`, `getAsText()`, `getDocument()`, `saveAsMarkdown()`, `listDocs()`, `searchDocs()`.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Google Drive"
|
|
3
|
+
tags: [googleDrive, google, drive, files, storage]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# googleDrive
|
|
9
|
+
|
|
10
|
+
Google Drive feature for listing, searching, browsing, and downloading files. Creates a Drive v3 API client and depends on `googleAuth` for authentication.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
Use the `googleDrive` feature when you need to interact with Google Drive: list files, search by name or content, browse folder hierarchies, download files, or export Google Workspace documents. Authentication is handled automatically via the `googleAuth` feature.
|
|
15
|
+
|
|
16
|
+
Requires Google OAuth2 credentials or a service account with Drive access.
|
|
17
|
+
|
|
18
|
+
## Enabling the Feature
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const drive = container.feature('googleDrive', {
|
|
22
|
+
pageSize: 50
|
|
23
|
+
})
|
|
24
|
+
console.log('Google Drive feature created')
|
|
25
|
+
console.log('Default page size:', 50)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API Documentation
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
const info = await container.features.describe('googleDrive')
|
|
32
|
+
console.log(info)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Listing and Searching Files
|
|
36
|
+
|
|
37
|
+
List recent files or search by name, content, or MIME type.
|
|
38
|
+
|
|
39
|
+
```ts skip
|
|
40
|
+
const { files } = await drive.listFiles()
|
|
41
|
+
console.log(`Found ${files.length} files:`)
|
|
42
|
+
files.slice(0, 5).forEach(f => console.log(` ${f.name} (${f.mimeType})`))
|
|
43
|
+
|
|
44
|
+
const { files: pdfs } = await drive.search('quarterly report', {
|
|
45
|
+
mimeType: 'application/pdf'
|
|
46
|
+
})
|
|
47
|
+
console.log(`Found ${pdfs.length} matching PDFs`)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The `listFiles()` method accepts an optional Drive query string for filtering. The `search()` method provides a simpler interface for text-based searches.
|
|
51
|
+
|
|
52
|
+
## Browsing Folders
|
|
53
|
+
|
|
54
|
+
Browse a folder to see its files and subfolders separately.
|
|
55
|
+
|
|
56
|
+
```ts skip
|
|
57
|
+
const root = await drive.browse()
|
|
58
|
+
console.log('Root folders:', root.folders.length)
|
|
59
|
+
console.log('Root files:', root.files.length)
|
|
60
|
+
|
|
61
|
+
const sub = await drive.browse('folder-id-here')
|
|
62
|
+
sub.folders.forEach(f => console.log(` [dir] ${f.name}`))
|
|
63
|
+
sub.files.forEach(f => console.log(` [file] ${f.name}`))
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The `browse()` method defaults to the root folder and separates the results into `folders` and `files` for easy navigation.
|
|
67
|
+
|
|
68
|
+
## Downloading and Exporting
|
|
69
|
+
|
|
70
|
+
Download files to disk or export Google Workspace documents to other formats.
|
|
71
|
+
|
|
72
|
+
```ts skip
|
|
73
|
+
await drive.downloadTo('file-id', './downloads/report.pdf')
|
|
74
|
+
console.log('File downloaded')
|
|
75
|
+
|
|
76
|
+
const buffer = await drive.download('file-id')
|
|
77
|
+
console.log('Downloaded', buffer.length, 'bytes')
|
|
78
|
+
|
|
79
|
+
const csv = await drive.exportFile('sheet-id', 'text/csv')
|
|
80
|
+
console.log('Exported sheet as CSV:', csv.length, 'bytes')
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Use `download()` for binary files and `exportFile()` for converting Google Docs, Sheets, or Slides to formats like PDF, CSV, or plain text.
|
|
84
|
+
|
|
85
|
+
## Shared Drives
|
|
86
|
+
|
|
87
|
+
```ts skip
|
|
88
|
+
const drives = await drive.listDrives()
|
|
89
|
+
drives.forEach(d => console.log(` ${d.name} (${d.id})`))
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
List all shared drives the authenticated user has access to.
|
|
93
|
+
|
|
94
|
+
## Summary
|
|
95
|
+
|
|
96
|
+
The `googleDrive` feature provides complete Drive v3 API access for file management. Browse folders, search by content or type, download files, and export Workspace documents. Authentication is handled by `googleAuth`. Key methods: `listFiles()`, `search()`, `browse()`, `download()`, `downloadTo()`, `exportFile()`.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Google Sheets"
|
|
3
|
+
tags: [googleSheets, google, sheets, spreadsheet, data]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# googleSheets
|
|
9
|
+
|
|
10
|
+
Google Sheets feature for reading spreadsheet data as JSON, CSV, or raw arrays. Creates a Sheets v4 API client and depends on `googleAuth` for authentication.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
Use the `googleSheets` feature when you need to read data from Google Sheets. It provides convenient methods for reading ranges, converting rows to JSON objects (using the first row as headers), and exporting as CSV. You can set a default spreadsheet ID to avoid passing it on every call.
|
|
15
|
+
|
|
16
|
+
Requires Google OAuth2 credentials or a service account with Sheets access.
|
|
17
|
+
|
|
18
|
+
## Enabling the Feature
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const sheets = container.feature('googleSheets', {
|
|
22
|
+
defaultSpreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms'
|
|
23
|
+
})
|
|
24
|
+
console.log('Google Sheets feature created')
|
|
25
|
+
console.log('Default spreadsheet configured:', !!sheets.options.defaultSpreadsheetId)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API Documentation
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
const info = await container.features.describe('googleSheets')
|
|
32
|
+
console.log(info)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Reading Data as JSON
|
|
36
|
+
|
|
37
|
+
The `getAsJson()` method treats the first row as headers and returns an array of objects.
|
|
38
|
+
|
|
39
|
+
```ts skip
|
|
40
|
+
const data = await sheets.getAsJson('Sheet1')
|
|
41
|
+
console.log(`Read ${data.length} rows`)
|
|
42
|
+
data.slice(0, 3).forEach(row => console.log(row))
|
|
43
|
+
// => [{ name: 'Alice', age: '30' }, { name: 'Bob', age: '25' }, ...]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
With a valid spreadsheet, this reads the first sheet tab and converts each row into a keyed object using the header row. Numeric values come through as strings by default.
|
|
47
|
+
|
|
48
|
+
## Reading Specific Ranges
|
|
49
|
+
|
|
50
|
+
Use A1 notation to read a precise cell range.
|
|
51
|
+
|
|
52
|
+
```ts skip
|
|
53
|
+
const values = await sheets.getRange('Sheet1!A1:D10')
|
|
54
|
+
console.log(`Got ${values.length} rows, ${values[0]?.length} columns`)
|
|
55
|
+
values.forEach(row => console.log(row.join(' | ')))
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Returns a 2D array of strings. Useful when you need raw cell data without header interpretation.
|
|
59
|
+
|
|
60
|
+
## Exporting as CSV
|
|
61
|
+
|
|
62
|
+
```ts skip
|
|
63
|
+
const csv = await sheets.getAsCsv('Revenue')
|
|
64
|
+
console.log(csv)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Returns the entire sheet as a CSV-formatted string, ready for piping to files or other tools.
|
|
68
|
+
|
|
69
|
+
## Saving to Local Files
|
|
70
|
+
|
|
71
|
+
```ts skip
|
|
72
|
+
await sheets.saveAsJson('./data/export.json', 'Sheet1')
|
|
73
|
+
console.log('Saved JSON export')
|
|
74
|
+
|
|
75
|
+
await sheets.saveAsCsv('./data/export.csv', 'Revenue')
|
|
76
|
+
console.log('Saved CSV export')
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Both methods write the file and return the resolved path. Paths are relative to the container's working directory.
|
|
80
|
+
|
|
81
|
+
## Spreadsheet Metadata
|
|
82
|
+
|
|
83
|
+
```ts skip
|
|
84
|
+
const meta = await sheets.getSpreadsheet()
|
|
85
|
+
console.log('Title:', meta.title)
|
|
86
|
+
|
|
87
|
+
const tabs = await sheets.listSheets()
|
|
88
|
+
tabs.forEach(t => console.log(` Tab: ${t.title} (${t.rowCount} rows)`))
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Inspect the spreadsheet structure before reading data.
|
|
92
|
+
|
|
93
|
+
## Summary
|
|
94
|
+
|
|
95
|
+
The `googleSheets` feature reads Google Sheets data in three formats: JSON objects, raw 2D arrays, and CSV strings. Set a default spreadsheet ID for convenience. Authentication is handled by `googleAuth`. Key methods: `getAsJson()`, `getRange()`, `getAsCsv()`, `saveAsJson()`, `saveAsCsv()`, `listSheets()`.
|