oh-my-opencode-slim 0.1.0 → 0.2.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.
Files changed (49) hide show
  1. package/README.md +269 -70
  2. package/dist/agents/index.d.ts +46 -3
  3. package/dist/cli/config-manager.d.ts +10 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +581 -0
  6. package/dist/cli/install.d.ts +2 -0
  7. package/dist/cli/types.d.ts +24 -0
  8. package/dist/config/constants.d.ts +6 -0
  9. package/dist/config/index.d.ts +1 -0
  10. package/dist/config/schema.d.ts +9 -2
  11. package/dist/index.d.ts +4 -3
  12. package/dist/index.js +2238 -52
  13. package/dist/mcp/context7.d.ts +6 -0
  14. package/dist/mcp/grep-app.d.ts +6 -0
  15. package/dist/mcp/index.d.ts +6 -0
  16. package/dist/mcp/types.d.ts +5 -0
  17. package/dist/mcp/websearch.d.ts +6 -0
  18. package/dist/shared/index.d.ts +1 -0
  19. package/dist/shared/zip-extractor.d.ts +1 -0
  20. package/dist/tools/ast-grep/cli.d.ts +15 -0
  21. package/dist/tools/ast-grep/constants.d.ts +25 -0
  22. package/dist/tools/ast-grep/downloader.d.ts +5 -0
  23. package/dist/tools/ast-grep/index.d.ts +10 -0
  24. package/dist/tools/ast-grep/napi.d.ts +13 -0
  25. package/dist/tools/ast-grep/tools.d.ts +3 -0
  26. package/dist/tools/ast-grep/types.d.ts +30 -0
  27. package/dist/tools/ast-grep/utils.d.ts +4 -0
  28. package/dist/tools/grep/cli.d.ts +3 -0
  29. package/dist/tools/grep/constants.d.ts +17 -0
  30. package/dist/tools/grep/downloader.d.ts +3 -0
  31. package/dist/tools/grep/index.d.ts +5 -0
  32. package/dist/tools/grep/tools.d.ts +2 -0
  33. package/dist/tools/grep/types.d.ts +35 -0
  34. package/dist/tools/grep/utils.d.ts +2 -0
  35. package/dist/tools/index.d.ts +4 -0
  36. package/dist/tools/lsp/client.d.ts +52 -0
  37. package/dist/tools/lsp/config.d.ts +4 -0
  38. package/dist/tools/lsp/constants.d.ts +8 -0
  39. package/dist/tools/lsp/index.d.ts +3 -0
  40. package/dist/tools/lsp/tools.d.ts +5 -0
  41. package/dist/tools/lsp/types.d.ts +109 -0
  42. package/dist/tools/lsp/utils.d.ts +21 -0
  43. package/dist/tools/quota/api.d.ts +5 -0
  44. package/dist/tools/quota/command.d.ts +1 -0
  45. package/dist/tools/quota/index.d.ts +21 -0
  46. package/dist/tools/quota/types.d.ts +41 -0
  47. package/dist/utils/index.d.ts +1 -0
  48. package/dist/utils/polling.d.ts +21 -0
  49. package/package.json +13 -6
package/README.md CHANGED
@@ -1,8 +1,16 @@
1
+ <div align="center">
2
+
1
3
  # oh-my-opencode-slim
2
4
 
3
- A lightweight, powerful agent orchestration plugin for **OpenCode**. This is a slimmed-down fork of [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode), focused on core agent orchestration without the extra bells and whistles.
5
+ **A lightweight, powerful agent orchestration plugin for OpenCode**
6
+
7
+ <img src="img/team.png" alt="The Pantheon - Agent Team" width="600">
8
+
9
+ *Transform your AI assistant into a manager capable of delegating complex tasks to specialized sub-agents, running searches in the background, and managing multi-step workflows with ease.*
4
10
 
5
- It transforms your AI assistant into a manager capable of delegating complex tasks to specialized sub-agents, running searches in the background, and managing multi-step workflows with ease.
11
+ </div>
12
+
13
+ > Slimmed-down fork of [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) — focused on core agent orchestration without the extra bells and whistles.
6
14
 
7
15
  ---
8
16
 
@@ -10,86 +18,125 @@ It transforms your AI assistant into a manager capable of delegating complex tas
10
18
 
11
19
  ### For Humans
12
20
 
13
- > **Prerequisite: [Bun](https://bun.sh/) is required**
21
+ Run the interactive installer:
14
22
 
15
- 1. **Install OpenCode** (if not already installed):
16
- ```bash
17
- # Check if installed
18
- opencode --version
19
-
20
- # If not, see: https://opencode.ai/docs
21
- ```
23
+ ```bash
24
+ bunx oh-my-opencode-slim install
25
+ ```
22
26
 
23
- 2. **Add the plugin to your OpenCode config** (`~/.config/opencode/opencode.json`):
24
- ```json
25
- {
26
- "plugin": [
27
- "oh-my-opencode-slim"
28
- ]
29
- }
30
- ```
27
+ Or use non-interactive mode:
31
28
 
32
- 3. **Verify setup**:
33
- ```bash
34
- opencode
35
- ```
29
+ ```bash
30
+ bunx oh-my-opencode-slim install --no-tui --antigravity=yes --openai=yes --cerebras=no
31
+ ```
32
+
33
+ **Alternative: Ask any coding agent**
34
+
35
+ Paste this into Claude Code, AmpCode, Cursor, or any coding agent:
36
+
37
+ ```
38
+ Install and configure by following the instructions here:
39
+ https://raw.githubusercontent.com/alvinunreal/oh-my-opencode-slim/refs/heads/master/README.md
40
+ ```
36
41
 
37
42
  ### For LLM Agents
38
43
 
39
44
  <details>
40
45
  <summary>Instructions for LLM Agents (click to expand)</summary>
41
46
 
42
- If you're an LLM Agent helping set up oh-my-opencode-slim, follow these steps:
47
+ If you're an LLM Agent helping set up oh-my-opencode-slim, follow these steps.
48
+
49
+ ---
43
50
 
44
51
  #### Step 1: Check OpenCode Installation
45
52
 
46
53
  ```bash
47
- if command -v opencode &> /dev/null; then
48
- echo "OpenCode $(opencode --version) is installed"
49
- else
50
- echo "OpenCode is not installed. Please install it first."
51
- echo "Ref: https://opencode.ai/docs"
52
- fi
54
+ opencode --version
53
55
  ```
54
56
 
55
- #### Step 2: Add Plugin to Config
57
+ If not installed, direct the user to https://opencode.ai/docs first.
56
58
 
57
- Edit `~/.config/opencode/opencode.json` and add `"oh-my-opencode-slim"` to the plugin array:
59
+ ---
58
60
 
59
- ```json
60
- {
61
- "plugin": [
62
- "oh-my-opencode-slim"
63
- ]
64
- }
65
- ```
61
+ #### Step 2: Ask About Provider Access
62
+
63
+ Ask these questions **one at a time**, waiting for responses:
64
+
65
+ 1. "Do you have an **Antigravity** subscription?" *(Provides Claude + Gemini via `google/` prefix)*
66
+ 2. "Do you have access to **OpenAI** API?" *(Enables `openai/` models)*
67
+ 3. "Do you have access to **Cerebras** API?" *(Enables `cerebras/` for fast exploration)*
66
68
 
67
- #### Step 3: Verify Setup
69
+ ---
70
+
71
+ #### Step 3: Run the Installer
72
+
73
+ Based on answers, run:
68
74
 
69
75
  ```bash
70
- opencode --version # Should be 1.0.150 or higher
71
- cat ~/.config/opencode/opencode.json # Should contain "oh-my-opencode-slim" in plugin array
76
+ bunx oh-my-opencode-slim install --no-tui --antigravity=<yes|no> --openai=<yes|no> --cerebras=<yes|no>
72
77
  ```
73
78
 
74
- #### Step 4: Configure Authentication
79
+ **Examples:**
80
+ ```bash
81
+ # Antigravity + OpenAI
82
+ bunx oh-my-opencode-slim install --no-tui --antigravity=yes --openai=yes --cerebras=no
75
83
 
76
- Add the Antigravity auth plugin to your config:
77
- ```json
78
- {
79
- "plugin": [
80
- "oh-my-opencode-slim",
81
- "opencode-antigravity-auth@latest"
82
- ]
83
- }
84
+ # OpenAI only
85
+ bunx oh-my-opencode-slim install --no-tui --antigravity=no --openai=yes --cerebras=no
86
+
87
+ # All providers
88
+ bunx oh-my-opencode-slim install --no-tui --antigravity=yes --openai=yes --cerebras=yes
84
89
  ```
85
90
 
86
- Then authenticate:
91
+ The installer automatically:
92
+ - Adds the plugin to `~/.config/opencode/opencode.json`
93
+ - Adds `opencode-antigravity-auth` plugin (if Antigravity enabled)
94
+ - Configures Google provider with model definitions
95
+ - Generates agent model mappings in `~/.config/opencode/oh-my-opencode-slim.json`
96
+
97
+ ---
98
+
99
+ #### Step 4: Authentication
100
+
101
+ After installation, guide the user:
102
+
103
+ **For Antigravity:**
87
104
  ```bash
88
105
  opencode auth login
89
- # Select Provider: Google
90
- # Select Login method: OAuth with Google (Antigravity)
106
+ # Select: Google → OAuth with Google (Antigravity)
107
+ ```
108
+
109
+ **For OpenAI:**
110
+ ```bash
111
+ export OPENAI_API_KEY="sk-..."
112
+ ```
113
+
114
+ **For Cerebras:**
115
+ ```bash
116
+ export CEREBRAS_API_KEY="..."
91
117
  ```
92
118
 
119
+ ---
120
+
121
+ #### Step 5: Verify
122
+
123
+ ```bash
124
+ opencode
125
+ ```
126
+
127
+ ---
128
+
129
+ #### Troubleshooting
130
+
131
+ If the installer fails, check the expected config format:
132
+ ```bash
133
+ bunx oh-my-opencode-slim install --help
134
+ ```
135
+
136
+ Then manually create the config files at:
137
+ - `~/.config/opencode/opencode.json`
138
+ - `~/.config/opencode/oh-my-opencode-slim.json`
139
+
93
140
  </details>
94
141
 
95
142
  ---
@@ -114,18 +161,119 @@ The plugin follows a "Hub and Spoke" model:
114
161
 
115
162
  ---
116
163
 
117
- ## Agents
164
+ ## Meet the Pantheon
165
+
166
+ <br clear="both">
167
+
168
+ ### The Orchestrator — *Architect of Realms*
169
+
170
+ <a href="src/agents/orchestrator.ts"><img src="img/orchestrator.png" alt="The Orchestrator" align="right" width="240"></a>
171
+
172
+ > **The Orchestrator** was born when the first codebase collapsed under its own complexity. Neither god nor mortal would claim responsibility—so The Orchestrator emerged from the void, forging order from chaos. They don't merely command armies; they fight alongside them. Every line of code passes through their hands before they decide which lesser deity deserves a piece of the puzzle.
173
+
174
+ **Role:** Supreme executor, delegator, and overseer — **Model:** `google/claude-opus-4-5-thinking`
175
+
176
+ Write and execute code, orchestrate multi-agent workflows, parse the unspoken from the spoken, summon specialists mid-battle. Shape reality directly—and assign realms to others when the universe grows too vast.
177
+
178
+ <br clear="both">
179
+
180
+ ---
181
+
182
+ ### The Explorer — *Pathfinder*
183
+
184
+ <a href="src/agents/explore.ts"><img src="img/explorer.png" alt="The Explorer" align="right" width="240"></a>
185
+
186
+ > **The Explorer** moves through codebases like wind through trees—swift, silent, everywhere at once. When The Orchestrator whispers "find me the auth module," The Explorer has already returned with forty file paths and a map. They were born from the first `grep` command, evolved beyond it, and now see patterns mortals miss.
187
+
188
+ **Role:** Codebase reconnaissance — **Model:** `cerebras/zai-glm-4.6`
189
+
190
+ Regex search, AST pattern matching, file discovery, parallel exploration. Read-only: they chart the territory; others conquer it.
191
+
192
+ <br clear="both">
193
+
194
+ ---
195
+
196
+ ### The Oracle — *Seer Beyond the Stack Trace*
197
+
198
+ <a href="src/agents/oracle.ts"><img src="img/oracle.png" alt="The Oracle" align="right" width="240"></a>
199
+
200
+ > **The Oracle** does not code—they *know*. When bugs defy logic and architectures crumble, The Oracle gazes into the abyss of your codebase and speaks truth. They've seen a thousand systems rise and fall. They'll tell you which path leads to ruin, and which to production.
201
+
202
+ **Role:** Strategic advisor and debugger of last resort — **Model:** `openai/gpt-5.2-codex`
203
+
204
+ Root cause analysis, architecture review, debugging guidance, tradeoff analysis. Read-only: Oracles advise; they don't intervene.
205
+
206
+ <br clear="both">
207
+
208
+ ---
209
+
210
+ ### The Librarian — *Keeper of Infinite Scrolls*
211
+
212
+ <a href="src/agents/librarian.ts"><img src="img/librarian.png" alt="The Librarian" align="right" width="240"></a>
213
+
214
+ > **The Librarian** guards a library with no walls—every GitHub repo, every npm package, every StackOverflow answer ever written. Ask them "how does React handle concurrent rendering?" and they'll return with official docs, real-world examples, and a warning about the footgun you're about to step on.
215
+
216
+ **Role:** External knowledge retrieval — **Model:** `google/gemini-3-flash`
217
+
218
+ Documentation lookup, GitHub code search, library research, best practice retrieval. Read-only: they fetch wisdom; implementation is for others.
219
+
220
+ <br clear="both">
221
+
222
+ ---
223
+
224
+ ### The Designer — *Artisan of Interfaces*
225
+
226
+ <a href="src/agents/frontend.ts"><img src="img/designer.png" alt="The Designer" align="right" width="240"></a>
227
+
228
+ > **The Designer** believes code should be beautiful—and so should everything it renders. Born from the frustration of a thousand ugly MVPs, they wield CSS like a brush and components like clay. Hand them a feature request; receive a masterpiece. They don't do "good enough."
229
+
230
+ **Role:** UI/UX implementation and visual excellence — **Model:** `google/gemini-3-flash`
231
+
232
+ Modern responsive design, CSS/Tailwind mastery, micro-animations, component architecture. Visual excellence over code perfection—beauty is the priority.
233
+
234
+ <br clear="both">
235
+
236
+ ---
237
+
238
+ ### The Scribe — *Chronicle Keeper*
239
+
240
+ <a href="src/agents/document-writer.ts"><img src="img/scribe.png" alt="The Scribe" align="right" width="240"></a>
241
+
242
+ > **The Scribe** was there when the first README was written—and wept, for it was incomplete. They have devoted eternity to the sacred art of documentation: clear, scannable, honest. While others ship features, The Scribe ensures those features are understood. Every code example works. Every explanation enlightens.
118
243
 
119
- | Agent | Role | Default Model | Best Used For |
120
- | :--- | :--- | :--- | :--- |
121
- | **orchestrator** | Manager | `google/antigravity-claude-opus-4-5-thinking-high` | Planning, task delegation, and overall coordination. |
122
- | **oracle** | Architect | `openai/gpt-5.2-codex` | Complex debugging, architectural decisions, and code reviews. |
123
- | **explore** | Searcher | `cerebras/zai-glm-4.6` | Fast codebase grep, finding patterns, and locating definitions. |
124
- | **librarian** | Researcher | `google/gemini-3-flash` | External library docs, GitHub examples, and API research. |
125
- | **frontend-ui-ux-engineer** | Designer | `google/gemini-3-flash` | Visual changes, CSS/styling, and React/Vue component polish. |
126
- | **document-writer** | Scribe | `google/gemini-3-flash` | Technical documentation, READMEs, and inline code comments. |
127
- | **multimodal-looker** | Visionary | `google/gemini-3-flash` | Analyzing screenshots, wireframes, or UI designs. |
128
- | **code-simplicity-reviewer** | Minimalist | `google/antigravity-claude-opus-4-5-thinking-high` | Ruthless code simplification and YAGNI principle enforcement. |
244
+ **Role:** Technical documentation and knowledge capture **Model:** `google/gemini-3-flash`
245
+
246
+ README crafting, API documentation, architecture docs, inline comments that don't insult your intelligence. Match existing style; focus on "why," not just "what."
247
+
248
+ <br clear="both">
249
+
250
+ ---
251
+
252
+ ### The Visionary *Reader of Pixels*
253
+
254
+ <a href="src/agents/multimodal.ts"><img src="img/multimodal.png" alt="The Visionary" align="right" width="240"></a>
255
+
256
+ > **The Visionary** sees what others cannot—literally. Screenshots, wireframes, diagrams, PDFs: all are text to them. When a designer throws a Figma mockup at the team and vanishes, The Visionary translates vision into specification. They read the unreadable and describe the indescribable.
257
+
258
+ **Role:** Image and visual content analysis — **Model:** `google/gemini-3-flash`
259
+
260
+ Extract text from images, interpret diagrams, analyze UI screenshots, summarize visual documents. Report what they observe; inference is for others.
261
+
262
+ <br clear="both">
263
+
264
+ ---
265
+
266
+ ### The Minimalist — *Destroyer of Bloat*
267
+
268
+ <a href="src/agents/simplicity-reviewer.ts"><img src="img/code-simplicity.png" alt="The Minimalist" align="right" width="240"></a>
269
+
270
+ > **The Minimalist** has one sacred truth: every line of code is a liability. They hunt abstractions that serve no purpose, defensive checks that defend nothing, and "clever" solutions that will haunt you in six months. Where others add, The Minimalist subtracts—ruthlessly, joyfully, necessarily.
271
+
272
+ **Role:** Code simplification and YAGNI enforcement — **Model:** `google/claude-opus-4-5-thinking`
273
+
274
+ Identify unnecessary complexity, challenge premature abstractions, estimate LOC reduction, enforce minimalism. Read-only: they judge; The Orchestrator executes the sentence.
275
+
276
+ <br clear="both">
129
277
 
130
278
  ---
131
279
 
@@ -133,13 +281,64 @@ The plugin follows a "Hub and Spoke" model:
133
281
 
134
282
  ### Background Tasks
135
283
 
136
- The plugin provides three core tools to manage asynchronous work:
284
+ The plugin provides tools to manage asynchronous work:
285
+
286
+ | Tool | Description |
287
+ |------|-------------|
288
+ | `background_task` | Launch an agent in a new session (`sync=true` blocks, `sync=false` runs in background) |
289
+ | `background_output` | Fetch the result of a background task by ID |
290
+ | `background_cancel` | Abort running tasks |
291
+
292
+ ### LSP Tools
293
+
294
+ Language Server Protocol integration for code intelligence:
295
+
296
+ | Tool | Description |
297
+ |------|-------------|
298
+ | `lsp_goto_definition` | Jump to symbol definition |
299
+ | `lsp_find_references` | Find all usages of a symbol across the workspace |
300
+ | `lsp_diagnostics` | Get errors/warnings from the language server |
301
+ | `lsp_rename` | Rename a symbol across all files |
137
302
 
138
- - `background_task`: Launches an agent in a new session.
139
- - `sync=true`: Blocks until the agent finishes (ideal for quick sub-tasks).
140
- - `sync=false`: Runs in the background (ideal for long searches or research).
141
- - `background_output`: Fetches the result of a background task using its ID.
142
- - `background_cancel`: Aborts running tasks if they are no longer needed.
303
+ ### Code Search Tools
304
+
305
+ Fast code search and refactoring:
306
+
307
+ | Tool | Description |
308
+ |------|-------------|
309
+ | `grep` | Fast content search using ripgrep |
310
+ | `ast_grep_search` | AST-aware code pattern matching (25 languages) |
311
+ | `ast_grep_replace` | AST-aware code refactoring with dry-run support |
312
+
313
+ ### Quota Tool
314
+
315
+ For Antigravity users:
316
+
317
+ | Tool | Description |
318
+ |------|-------------|
319
+ | `antigravity_quota` | Check API quota for all Antigravity accounts (compact view with progress bars) |
320
+
321
+ ---
322
+
323
+ ## MCP Servers
324
+
325
+ Built-in Model Context Protocol servers (enabled by default):
326
+
327
+ | MCP | Purpose | URL |
328
+ |-----|---------|-----|
329
+ | `websearch` | Real-time web search via Exa AI | `https://mcp.exa.ai/mcp` |
330
+ | `context7` | Official library documentation | `https://mcp.context7.com/mcp` |
331
+ | `grep_app` | GitHub code search via grep.app | `https://mcp.grep.app` |
332
+
333
+ ### Disabling MCPs
334
+
335
+ You can disable specific MCP servers in your config:
336
+
337
+ ```json
338
+ {
339
+ "disabled_mcps": ["websearch", "grep_app"]
340
+ }
341
+ ```
143
342
 
144
343
  ---
145
344
 
@@ -1,6 +1,49 @@
1
- import type { AgentConfig } from "@opencode-ai/sdk";
2
- import { type PluginConfig } from "../config";
1
+ import type { AgentConfig as SDKAgentConfig } from "@opencode-ai/sdk";
2
+ import { type AgentName, type PluginConfig } from "../config";
3
3
  import { type AgentDefinition } from "./orchestrator";
4
+ import { createOracleAgent } from "./oracle";
5
+ import { createLibrarianAgent } from "./librarian";
6
+ import { createExploreAgent } from "./explore";
7
+ import { createFrontendAgent } from "./frontend";
8
+ import { createDocumentWriterAgent } from "./document-writer";
9
+ import { createMultimodalAgent } from "./multimodal";
10
+ import { createSimplicityReviewerAgent } from "./simplicity-reviewer";
4
11
  export type { AgentDefinition } from "./orchestrator";
12
+ type SubagentName = Exclude<AgentName, "orchestrator">;
13
+ /** Short descriptions for each subagent (used in tool descriptions) */
14
+ export declare const SUBAGENT_INFO: {
15
+ readonly explore: {
16
+ readonly factory: typeof createExploreAgent;
17
+ readonly shortDesc: "codebase grep";
18
+ };
19
+ readonly librarian: {
20
+ readonly factory: typeof createLibrarianAgent;
21
+ readonly shortDesc: "docs/GitHub";
22
+ };
23
+ readonly oracle: {
24
+ readonly factory: typeof createOracleAgent;
25
+ readonly shortDesc: "strategy";
26
+ };
27
+ readonly "frontend-ui-ux-engineer": {
28
+ readonly factory: typeof createFrontendAgent;
29
+ readonly shortDesc: "UI/UX";
30
+ };
31
+ readonly "document-writer": {
32
+ readonly factory: typeof createDocumentWriterAgent;
33
+ readonly shortDesc: "docs";
34
+ };
35
+ readonly "multimodal-looker": {
36
+ readonly factory: typeof createMultimodalAgent;
37
+ readonly shortDesc: "image/visual analysis";
38
+ };
39
+ readonly "code-simplicity-reviewer": {
40
+ readonly factory: typeof createSimplicityReviewerAgent;
41
+ readonly shortDesc: "code review";
42
+ };
43
+ };
44
+ /** Generate agent list string for tool descriptions */
45
+ export declare function getAgentListDescription(): string;
46
+ /** Get list of agent names */
47
+ export declare function getAgentNames(): SubagentName[];
5
48
  export declare function createAgents(config?: PluginConfig): AgentDefinition[];
6
- export declare function getAgentConfigs(config?: PluginConfig): Record<string, AgentConfig>;
49
+ export declare function getAgentConfigs(config?: PluginConfig): Record<string, SDKAgentConfig>;
@@ -0,0 +1,10 @@
1
+ import type { ConfigMergeResult, DetectedConfig, InstallConfig } from "./types";
2
+ export declare function isOpenCodeInstalled(): Promise<boolean>;
3
+ export declare function getOpenCodeVersion(): Promise<string | null>;
4
+ export declare function fetchLatestVersion(packageName: string): Promise<string | null>;
5
+ export declare function addPluginToOpenCodeConfig(): Promise<ConfigMergeResult>;
6
+ export declare function addAuthPlugins(installConfig: InstallConfig): Promise<ConfigMergeResult>;
7
+ export declare function addProviderConfig(installConfig: InstallConfig): ConfigMergeResult;
8
+ export declare function generateLiteConfig(installConfig: InstallConfig): Record<string, unknown>;
9
+ export declare function writeLiteConfig(installConfig: InstallConfig): ConfigMergeResult;
10
+ export declare function detectCurrentConfig(): DetectedConfig;
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bun
2
+ export {};