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.
- package/.sisyphus/boulder.json +8 -0
- package/.sisyphus/notepads/opencode-repos/decisions.md +15 -0
- package/.sisyphus/notepads/opencode-repos/learnings.md +384 -0
- package/.sisyphus/plans/opencode-repos.md +987 -0
- package/.tmux-sessionizer +8 -0
- package/CLAUDE.md +111 -0
- package/README.md +395 -0
- package/bun.lock +119 -0
- package/index.ts +806 -0
- package/package.json +32 -0
- package/src/__tests__/git.test.ts +141 -0
- package/src/__tests__/manifest.test.ts +249 -0
- package/src/__tests__/setup.test.ts +5 -0
- package/src/agents/repo-explorer.ts +52 -0
- package/src/git.ts +90 -0
- package/src/manifest.ts +116 -0
- package/src/scanner.ts +126 -0
- package/tsconfig.json +16 -0
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
|
+
}
|