opencode-repos 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ tmux rename-window -t 1 "nvim"
2
+ tmux send-keys -t 1 "nvim" C-m
3
+ tmux new-window -t 2 -n "cmd"
4
+ tmux new-window -t 3 -n "run"
5
+ tmux split-window -t 3 -h
6
+ tmux new-window -t 4 -n "ai"
7
+ tmux send-keys -t 4 "opencode ." C-m
8
+ tmux select-window -t 1
package/CLAUDE.md ADDED
@@ -0,0 +1,111 @@
1
+ ---
2
+ description: Use Bun instead of Node.js, npm, pnpm, or vite.
3
+ globs: "*.ts, *.tsx, *.html, *.css, *.js, *.jsx, package.json"
4
+ alwaysApply: false
5
+ ---
6
+
7
+ Default to using Bun instead of Node.js.
8
+
9
+ - Use `bun <file>` instead of `node <file>` or `ts-node <file>`
10
+ - Use `bun test` instead of `jest` or `vitest`
11
+ - Use `bun build <file.html|file.ts|file.css>` instead of `webpack` or `esbuild`
12
+ - Use `bun install` instead of `npm install` or `yarn install` or `pnpm install`
13
+ - Use `bun run <script>` instead of `npm run <script>` or `yarn run <script>` or `pnpm run <script>`
14
+ - Use `bunx <package> <command>` instead of `npx <package> <command>`
15
+ - Bun automatically loads .env, so don't use dotenv.
16
+
17
+ ## APIs
18
+
19
+ - `Bun.serve()` supports WebSockets, HTTPS, and routes. Don't use `express`.
20
+ - `bun:sqlite` for SQLite. Don't use `better-sqlite3`.
21
+ - `Bun.redis` for Redis. Don't use `ioredis`.
22
+ - `Bun.sql` for Postgres. Don't use `pg` or `postgres.js`.
23
+ - `WebSocket` is built-in. Don't use `ws`.
24
+ - Prefer `Bun.file` over `node:fs`'s readFile/writeFile
25
+ - Bun.$`ls` instead of execa.
26
+
27
+ ## Testing
28
+
29
+ Use `bun test` to run tests.
30
+
31
+ ```ts#index.test.ts
32
+ import { test, expect } from "bun:test";
33
+
34
+ test("hello world", () => {
35
+ expect(1).toBe(1);
36
+ });
37
+ ```
38
+
39
+ ## Frontend
40
+
41
+ Use HTML imports with `Bun.serve()`. Don't use `vite`. HTML imports fully support React, CSS, Tailwind.
42
+
43
+ Server:
44
+
45
+ ```ts#index.ts
46
+ import index from "./index.html"
47
+
48
+ Bun.serve({
49
+ routes: {
50
+ "/": index,
51
+ "/api/users/:id": {
52
+ GET: (req) => {
53
+ return new Response(JSON.stringify({ id: req.params.id }));
54
+ },
55
+ },
56
+ },
57
+ // optional websocket support
58
+ websocket: {
59
+ open: (ws) => {
60
+ ws.send("Hello, world!");
61
+ },
62
+ message: (ws, message) => {
63
+ ws.send(message);
64
+ },
65
+ close: (ws) => {
66
+ // handle close
67
+ }
68
+ },
69
+ development: {
70
+ hmr: true,
71
+ console: true,
72
+ }
73
+ })
74
+ ```
75
+
76
+ HTML files can import .tsx, .jsx or .js files directly and Bun's bundler will transpile & bundle automatically. `<link>` tags can point to stylesheets and Bun's CSS bundler will bundle.
77
+
78
+ ```html#index.html
79
+ <html>
80
+ <body>
81
+ <h1>Hello, world!</h1>
82
+ <script type="module" src="./frontend.tsx"></script>
83
+ </body>
84
+ </html>
85
+ ```
86
+
87
+ With the following `frontend.tsx`:
88
+
89
+ ```tsx#frontend.tsx
90
+ import React from "react";
91
+ import { createRoot } from "react-dom/client";
92
+
93
+ // import .css files directly and it works
94
+ import './index.css';
95
+
96
+ const root = createRoot(document.body);
97
+
98
+ export default function Frontend() {
99
+ return <h1>Hello, world!</h1>;
100
+ }
101
+
102
+ root.render(<Frontend />);
103
+ ```
104
+
105
+ Then, run index.ts
106
+
107
+ ```sh
108
+ bun --hot ./index.ts
109
+ ```
110
+
111
+ For more information, read the Bun API docs in `node_modules/bun-types/docs/**.mdx`.
package/README.md ADDED
@@ -0,0 +1,395 @@
1
+ # opencode-repos
2
+
3
+ Repository cache, registry, and cross-codebase intelligence for OpenCode agents.
4
+
5
+ ## Features
6
+
7
+ - **Clone and cache** - Clone repositories to local cache for fast repeated access
8
+ - **Local repo scanning** - Discover and register existing local repositories
9
+ - **Cross-repo exploration** - Use AI agents to understand external codebases
10
+ - **Unified registry** - Single manifest tracks both cached and local repos
11
+ - **Glob pattern support** - Read multiple files with glob patterns
12
+
13
+ ## Installation
14
+
15
+ ### From npm (when published)
16
+
17
+ ```bash
18
+ npm install opencode-repos
19
+ ```
20
+
21
+ ### Local development
22
+
23
+ ```bash
24
+ git clone https://github.com/liamjv1/opencode-repos
25
+ cd opencode-repos
26
+ bun install
27
+ ```
28
+
29
+ ### Configuration
30
+
31
+ Add to your OpenCode config (`~/.config/opencode/opencode.jsonc` or `.opencode/config.jsonc`):
32
+
33
+ ```json
34
+ {
35
+ "plugins": [
36
+ "file:///absolute/path/to/opencode-repos/index.ts"
37
+ ]
38
+ }
39
+ ```
40
+
41
+ ## Quick Start
42
+
43
+ ```typescript
44
+ // Clone a repository
45
+ repo_clone({ repo: "vercel/next.js" })
46
+
47
+ // List all registered repositories
48
+ repo_list()
49
+
50
+ // Read files from a repository
51
+ repo_read({ repo: "vercel/next.js", path: "README.md" })
52
+
53
+ // Explore a repository to understand it
54
+ repo_explore({
55
+ repo: "vercel/next.js",
56
+ question: "How does the App Router work?"
57
+ })
58
+ ```
59
+
60
+ ## Configuration
61
+
62
+ Create `~/.config/opencode/opencode-repos.json` to configure local repository scanning:
63
+
64
+ ```json
65
+ {
66
+ "localSearchPaths": [
67
+ "~/projects",
68
+ "~/personal/projects",
69
+ "~/code"
70
+ ]
71
+ }
72
+ ```
73
+
74
+ ## Tools
75
+
76
+ ### repo_find
77
+
78
+ Search for a repository locally and on GitHub. Use this before cloning to check if a repo already exists locally or to find the correct GitHub repo.
79
+
80
+ **Arguments:**
81
+ - `query` (string, required): Repository name or owner/repo format. Examples: `"next.js"`, `"vercel/next.js"`, `"react"`
82
+
83
+ **Examples:**
84
+ ```typescript
85
+ // Search by name (fuzzy)
86
+ repo_find({ query: "next.js" })
87
+
88
+ // Search by exact owner/repo
89
+ repo_find({ query: "vercel/next.js" })
90
+
91
+ // Find a library
92
+ repo_find({ query: "react" })
93
+ ```
94
+
95
+ **Returns:** Results grouped by location:
96
+ - **Already Registered** - Repos in manifest (cached or local)
97
+ - **Found Locally** - Repos on filesystem not yet registered
98
+ - **Found on GitHub** - Repos available to clone
99
+
100
+ **Note:** Requires `gh` CLI for GitHub search. Configure `localSearchPaths` in config for local filesystem search.
101
+
102
+ ---
103
+
104
+ ### repo_clone
105
+
106
+ Clone a repository to local cache or return path if already cached.
107
+
108
+ **Arguments:**
109
+ - `repo` (string, required): Repository in format `owner/repo` or `owner/repo@branch`
110
+ - `force` (boolean, optional): Force re-clone even if cached. Default: `false`
111
+
112
+ **Examples:**
113
+ ```typescript
114
+ // Clone a repository (default branch)
115
+ repo_clone({ repo: "vercel/next.js" })
116
+
117
+ // Clone a specific branch
118
+ repo_clone({ repo: "vercel/next.js@canary" })
119
+
120
+ // Force re-clone
121
+ repo_clone({ repo: "vercel/next.js", force: true })
122
+ ```
123
+
124
+ **Returns:** Path to the cached repository
125
+
126
+ ---
127
+
128
+ ### repo_list
129
+
130
+ List all registered repositories (cached and local).
131
+
132
+ **Arguments:**
133
+ - `type` (enum, optional): Filter by repository type. Options: `"all"`, `"cached"`, `"local"`. Default: `"all"`
134
+
135
+ **Examples:**
136
+ ```typescript
137
+ // List all repositories
138
+ repo_list()
139
+
140
+ // List only cached repositories
141
+ repo_list({ type: "cached" })
142
+
143
+ // List only local repositories
144
+ repo_list({ type: "local" })
145
+ ```
146
+
147
+ **Returns:** Markdown table with repository metadata (type, branch, last accessed, size)
148
+
149
+ ---
150
+
151
+ ### repo_read
152
+
153
+ Read files from a registered repository.
154
+
155
+ **Arguments:**
156
+ - `repo` (string, required): Repository in format `owner/repo` or `owner/repo@branch`
157
+ - `path` (string, required): File path within repo, supports glob patterns
158
+ - `maxLines` (number, optional): Max lines per file to return. Default: `500`
159
+
160
+ **Examples:**
161
+ ```typescript
162
+ // Read a single file
163
+ repo_read({ repo: "vercel/next.js", path: "README.md" })
164
+
165
+ // Read multiple files with glob
166
+ repo_read({ repo: "vercel/next.js", path: "src/*.ts" })
167
+
168
+ // Custom line limit
169
+ repo_read({ repo: "vercel/next.js", path: "package.json", maxLines: 100 })
170
+ ```
171
+
172
+ **Returns:** File contents as markdown code blocks
173
+
174
+ ---
175
+
176
+ ### repo_scan
177
+
178
+ Scan local filesystem for git repositories and register them.
179
+
180
+ **Arguments:**
181
+ - `paths` (string[], optional): Override search paths. Default: from config file
182
+
183
+ **Examples:**
184
+ ```typescript
185
+ // Scan configured paths
186
+ repo_scan()
187
+
188
+ // Scan custom paths
189
+ repo_scan({ paths: ["~/work", "~/projects"] })
190
+ ```
191
+
192
+ **Returns:** Summary of found repositories (new vs existing)
193
+
194
+ ---
195
+
196
+ ### repo_update
197
+
198
+ Update a cached repository to latest commit.
199
+
200
+ **Arguments:**
201
+ - `repo` (string, required): Repository in format `owner/repo` or `owner/repo@branch`
202
+
203
+ **Examples:**
204
+ ```typescript
205
+ // Update a cached repository
206
+ repo_update({ repo: "vercel/next.js@canary" })
207
+ ```
208
+
209
+ **Returns:** Update status with latest commit hash
210
+
211
+ **Note:** Local repositories show git status only (files are never modified by the plugin).
212
+
213
+ ---
214
+
215
+ ### repo_remove
216
+
217
+ Remove a repository (delete cached, unregister local).
218
+
219
+ **Arguments:**
220
+ - `repo` (string, required): Repository in format `owner/repo` or `owner/repo@branch`
221
+ - `confirm` (boolean, optional): Confirm deletion for cached repos. Default: `false`
222
+
223
+ **Examples:**
224
+ ```typescript
225
+ // Unregister a local repository (files preserved)
226
+ repo_remove({ repo: "my-org/my-project" })
227
+
228
+ // Delete a cached repository (requires confirmation)
229
+ repo_remove({ repo: "vercel/next.js", confirm: true })
230
+ ```
231
+
232
+ **Returns:** Removal status
233
+
234
+ ---
235
+
236
+ ### repo_explore
237
+
238
+ Explore a repository to understand its codebase using AI agent.
239
+
240
+ **Arguments:**
241
+ - `repo` (string, required): Repository in format `owner/repo` or `owner/repo@branch`
242
+ - `question` (string, required): What you want to understand about the codebase
243
+
244
+ **Examples:**
245
+ ```typescript
246
+ // Understand architecture
247
+ repo_explore({
248
+ repo: "vercel/next.js",
249
+ question: "How does the App Router work?"
250
+ })
251
+
252
+ // Find API usage
253
+ repo_explore({
254
+ repo: "facebook/react",
255
+ question: "How do I use useEffect with cleanup?"
256
+ })
257
+
258
+ // Understand patterns
259
+ repo_explore({
260
+ repo: "acme/firmware",
261
+ question: "What patterns does this use for error handling?"
262
+ })
263
+ ```
264
+
265
+ **Returns:** Detailed analysis with file paths and code examples
266
+
267
+ ---
268
+
269
+ ## Custom Agent: repo-explorer
270
+
271
+ The plugin registers a specialized `repo-explorer` agent for deep codebase analysis.
272
+
273
+ **Capabilities:**
274
+ - Read and analyze source code across any programming language
275
+ - Search for patterns and implementations using grep, glob, and AST tools
276
+ - Understand project structure and architecture
277
+ - Identify APIs, interfaces, and integration points
278
+ - Trace code paths and data flows
279
+ - Explain complex implementations in simple terms
280
+
281
+ **Permissions:** Read-only (cannot modify, create, or delete files)
282
+
283
+ **Use Cases:**
284
+ - Understanding how to integrate with another project
285
+ - Learning from open-source implementations
286
+ - Debugging cross-project issues
287
+ - API discovery and documentation
288
+ - Understanding unfamiliar codebases before contributing
289
+
290
+ ---
291
+
292
+ ## Use Cases
293
+
294
+ ### Cross-project integration
295
+
296
+ Working on Project A (backend) and need to integrate with Project B (firmware):
297
+
298
+ ```typescript
299
+ repo_explore({
300
+ repo: "acme/firmware@main",
301
+ question: "How does the sensor calibration API work?"
302
+ })
303
+ ```
304
+
305
+ The explorer agent analyzes the firmware codebase and explains the API with file references and examples.
306
+
307
+ ### Understanding dependencies
308
+
309
+ Learn how a library works internally:
310
+
311
+ ```typescript
312
+ repo_explore({
313
+ repo: "facebook/react",
314
+ question: "How does React's reconciliation algorithm work?"
315
+ })
316
+ ```
317
+
318
+ ### Firmware/backend exploration
319
+
320
+ Frontend developer needs to understand backend API:
321
+
322
+ ```typescript
323
+ repo_explore({
324
+ repo: "company/backend@develop",
325
+ question: "What's the API for user authentication?"
326
+ })
327
+ ```
328
+
329
+ ### Multi-repo development
330
+
331
+ Register all your local projects for quick access:
332
+
333
+ ```typescript
334
+ // Configure search paths once
335
+ // ~/.config/opencode/opencode-repos.json
336
+ {
337
+ "localSearchPaths": ["~/work", "~/personal"]
338
+ }
339
+
340
+ // Scan and register
341
+ repo_scan()
342
+
343
+ // Now access any local repo
344
+ repo_read({ repo: "my-org/api-service", path: "src/routes/*.ts" })
345
+ ```
346
+
347
+ ---
348
+
349
+ ## Limitations
350
+
351
+ - **No submodules**: Git submodules are not cloned or supported
352
+ - **No LFS**: Git Large File Storage is not supported
353
+ - **Shallow clones only**: All cached repos use `--depth=1` for fast cloning
354
+ - **GitHub only**: Remote URL parsing only supports GitHub (SSH and HTTPS formats)
355
+ - **Read-only for local repos**: The plugin never modifies local repositories (type: "local")
356
+ - **No diff/blame**: Use git directly for advanced git operations
357
+
358
+ ---
359
+
360
+ ## Development
361
+
362
+ ### Running tests
363
+
364
+ ```bash
365
+ bun test
366
+ ```
367
+
368
+ ### Type checking
369
+
370
+ ```bash
371
+ bunx tsc --noEmit
372
+ ```
373
+
374
+ ### Project structure
375
+
376
+ ```
377
+ opencode-repos/
378
+ ├── index.ts # Main plugin file with all tools
379
+ ├── src/
380
+ │ ├── manifest.ts # Manifest operations (load, save, lock)
381
+ │ ├── git.ts # Git operations (clone, update, parse)
382
+ │ ├── scanner.ts # Local repo scanner
383
+ │ └── agents/
384
+ │ └── repo-explorer.ts # Explorer agent definition
385
+ ├── src/__tests__/ # Test files
386
+ ├── package.json
387
+ ├── tsconfig.json
388
+ └── README.md
389
+ ```
390
+
391
+ ---
392
+
393
+ ## License
394
+
395
+ MIT
package/bun.lock ADDED
@@ -0,0 +1,119 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "configVersion": 1,
4
+ "workspaces": {
5
+ "": {
6
+ "name": "opencode-repos",
7
+ "dependencies": {
8
+ "glob": "^10.0.0",
9
+ },
10
+ "devDependencies": {
11
+ "@opencode-ai/plugin": "^1.1.25",
12
+ "@types/bun": "^1.2.0",
13
+ "typescript": "^5.0.0",
14
+ },
15
+ "peerDependencies": {
16
+ "@opencode-ai/plugin": "*",
17
+ },
18
+ },
19
+ },
20
+ "packages": {
21
+ "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
22
+
23
+ "@opencode-ai/plugin": ["@opencode-ai/plugin@1.1.27", "", { "dependencies": { "@opencode-ai/sdk": "1.1.27", "zod": "4.1.8" } }, "sha512-EevLVaEhQ1jTLNRbQJj18tFZaVNJcZZcVqvZEbDSe17CfmVRv3FQNKRAjD/QHwb+Kym7sn+LAZxD7aYIPPelvQ=="],
24
+
25
+ "@opencode-ai/sdk": ["@opencode-ai/sdk@1.1.27", "", {}, "sha512-ssRZpET3zUNdk1GuF6HwFkNHhCXSTG0lhuPmw9HjifTwv1EVrn8gz7jAuME2OCvUSBvRTesH6Lb0Xt78Qbhzww=="],
26
+
27
+ "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
28
+
29
+ "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="],
30
+
31
+ "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="],
32
+
33
+ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
34
+
35
+ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
36
+
37
+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
38
+
39
+ "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
40
+
41
+ "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="],
42
+
43
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
44
+
45
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
46
+
47
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
48
+
49
+ "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
50
+
51
+ "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
52
+
53
+ "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
54
+
55
+ "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
56
+
57
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
58
+
59
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
60
+
61
+ "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
62
+
63
+ "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
64
+
65
+ "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
66
+
67
+ "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
68
+
69
+ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
70
+
71
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
72
+
73
+ "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
74
+
75
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
76
+
77
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
78
+
79
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
80
+
81
+ "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
82
+
83
+ "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
84
+
85
+ "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
86
+
87
+ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
88
+
89
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
90
+
91
+ "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
92
+
93
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
94
+
95
+ "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
96
+
97
+ "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
98
+
99
+ "zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="],
100
+
101
+ "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
102
+
103
+ "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
104
+
105
+ "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
106
+
107
+ "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
108
+
109
+ "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
110
+
111
+ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
112
+
113
+ "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
114
+
115
+ "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
116
+
117
+ "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
118
+ }
119
+ }