opencode-add-dir 1.0.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/README.md +78 -0
- package/command/add-dir.md +5 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# OpenCode Add-Dir Plugin
|
|
2
|
+
|
|
3
|
+
A plugin for OpenCode that adds the `/add-dir` command to include external directories in your session context.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
cd ~/.config/opencode/plugins/add-dir
|
|
9
|
+
bun install
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Features
|
|
13
|
+
|
|
14
|
+
- Add external directories to session context with `/add-dir <path>`
|
|
15
|
+
- Smart filtering of binary files and common build directories
|
|
16
|
+
- Recursive directory scanning
|
|
17
|
+
- Configurable limits (100KB per file, 500 files max)
|
|
18
|
+
- Read and write access to added directories
|
|
19
|
+
|
|
20
|
+
## Configuration
|
|
21
|
+
|
|
22
|
+
The plugin automatically installs its command file to `~/.config/opencode/command/add-dir.md` during installation.
|
|
23
|
+
|
|
24
|
+
Ensure your `~/.config/opencode/opencode.jsonc` includes:
|
|
25
|
+
|
|
26
|
+
```jsonc
|
|
27
|
+
"plugin": [
|
|
28
|
+
"./plugins/add-dir"
|
|
29
|
+
]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
/add-dir /path/to/your/project
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Filtering Rules
|
|
39
|
+
|
|
40
|
+
### Ignored Directories
|
|
41
|
+
- `node_modules`
|
|
42
|
+
- `.git`
|
|
43
|
+
- `dist`, `build`
|
|
44
|
+
- `.next`
|
|
45
|
+
- `__pycache__`
|
|
46
|
+
- Virtual environments (`.venv`, `venv`, `env`)
|
|
47
|
+
- `.env`, `.env.*`
|
|
48
|
+
- `coverage`
|
|
49
|
+
- `.nuxt`, `.output`
|
|
50
|
+
- `tmp`, `temp`, `.turbo`
|
|
51
|
+
|
|
52
|
+
### Binary Files
|
|
53
|
+
Images, PDFs, Office docs, archives, media files, executables, compiled files, etc.
|
|
54
|
+
|
|
55
|
+
## Development
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
cd ~/.config/opencode/plugins/add-dir
|
|
59
|
+
|
|
60
|
+
# Install dependencies
|
|
61
|
+
bun install
|
|
62
|
+
|
|
63
|
+
# Build the plugin
|
|
64
|
+
bun run build
|
|
65
|
+
|
|
66
|
+
# The build output goes to dist/
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Files
|
|
70
|
+
|
|
71
|
+
- `src/index.ts` - Main plugin implementation
|
|
72
|
+
- `command/add-dir.md` - Command definition (auto-installed)
|
|
73
|
+
- `scripts/install.js` - Post-install script (auto-runs)
|
|
74
|
+
- `package.json` - Package configuration
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAyMlD,QAAA,MAAM,YAAY,EAAE,MA6DnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { tool } from '@opencode-ai/plugin/tool';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const IGNORED_DIRECTORIES = new Set([
|
|
5
|
+
'node_modules',
|
|
6
|
+
'.git',
|
|
7
|
+
'dist',
|
|
8
|
+
'build',
|
|
9
|
+
'.next',
|
|
10
|
+
'__pycache__',
|
|
11
|
+
'.venv',
|
|
12
|
+
'venv',
|
|
13
|
+
'env',
|
|
14
|
+
'.env',
|
|
15
|
+
'coverage',
|
|
16
|
+
'.nuxt',
|
|
17
|
+
'.output',
|
|
18
|
+
'tmp',
|
|
19
|
+
'temp',
|
|
20
|
+
'.turbo'
|
|
21
|
+
]);
|
|
22
|
+
const BINARY_EXTENSIONS = new Set([
|
|
23
|
+
'.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.svg', '.webp',
|
|
24
|
+
'.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx',
|
|
25
|
+
'.zip', '.tar', '.gz', '.rar', '.7z',
|
|
26
|
+
'.mp3', '.mp4', '.avi', '.mov', '.wav',
|
|
27
|
+
'.exe', '.dll', '.so', '.dylib', '.bin',
|
|
28
|
+
'.class', '.jar', '.war',
|
|
29
|
+
'.pyc', '.pyo',
|
|
30
|
+
'.db', '.sqlite', '.sqlite3',
|
|
31
|
+
'.lock', '.log'
|
|
32
|
+
]);
|
|
33
|
+
const MAX_FILE_SIZE_BYTES = 100 * 1024;
|
|
34
|
+
const MAX_FILES = 500;
|
|
35
|
+
const ADDED_DIRS_FILE = path.join(__dirname, '.added-dirs.json');
|
|
36
|
+
function getAddedDirectories() {
|
|
37
|
+
try {
|
|
38
|
+
if (fs.existsSync(ADDED_DIRS_FILE)) {
|
|
39
|
+
const content = fs.readFileSync(ADDED_DIRS_FILE, 'utf-8');
|
|
40
|
+
const data = JSON.parse(content);
|
|
41
|
+
return new Set(data.directories);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('Failed to read added directories:', error);
|
|
46
|
+
}
|
|
47
|
+
return new Set();
|
|
48
|
+
}
|
|
49
|
+
function saveAddedDirectory(dirPath) {
|
|
50
|
+
const added = getAddedDirectories();
|
|
51
|
+
const normalizedPath = path.resolve(dirPath);
|
|
52
|
+
if (!added.has(normalizedPath)) {
|
|
53
|
+
added.add(normalizedPath);
|
|
54
|
+
const data = { directories: Array.from(added) };
|
|
55
|
+
fs.writeFileSync(ADDED_DIRS_FILE, JSON.stringify(data, null, 2));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function isPathInAddedDirectories(requestedPath) {
|
|
59
|
+
const addedDirs = getAddedDirectories();
|
|
60
|
+
const normalizedPath = path.resolve(requestedPath);
|
|
61
|
+
for (const dir of addedDirs) {
|
|
62
|
+
const relative = path.relative(dir, normalizedPath);
|
|
63
|
+
if (!relative.startsWith('..') && !path.isAbsolute(relative)) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
function isBinaryFile(filePath) {
|
|
70
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
71
|
+
return BINARY_EXTENSIONS.has(ext);
|
|
72
|
+
}
|
|
73
|
+
function shouldIgnoreDirectory(dirName) {
|
|
74
|
+
return IGNORED_DIRECTORIES.has(dirName);
|
|
75
|
+
}
|
|
76
|
+
function scanDirectory(dirPath, baseDir, files = [], tree = [], depth = 0, fileCount = 0) {
|
|
77
|
+
if (fileCount >= MAX_FILES) {
|
|
78
|
+
return { files, tree, fileCount, skipped: 0 };
|
|
79
|
+
}
|
|
80
|
+
let skipped = 0;
|
|
81
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
82
|
+
const sortedEntries = entries.sort((a, b) => {
|
|
83
|
+
if (a.isDirectory() && !b.isDirectory())
|
|
84
|
+
return -1;
|
|
85
|
+
if (!a.isDirectory() && b.isDirectory())
|
|
86
|
+
return 1;
|
|
87
|
+
return a.name.localeCompare(b.name);
|
|
88
|
+
});
|
|
89
|
+
for (const entry of sortedEntries) {
|
|
90
|
+
if (fileCount >= MAX_FILES) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
94
|
+
const relativePath = path.relative(baseDir, fullPath);
|
|
95
|
+
const indent = ' '.repeat(depth);
|
|
96
|
+
if (entry.isDirectory()) {
|
|
97
|
+
if (shouldIgnoreDirectory(entry.name)) {
|
|
98
|
+
skipped++;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
tree.push(`${indent}${entry.name}/`);
|
|
102
|
+
const result = scanDirectory(fullPath, baseDir, files, tree, depth + 1, fileCount);
|
|
103
|
+
files = result.files;
|
|
104
|
+
tree = result.tree;
|
|
105
|
+
fileCount = result.fileCount;
|
|
106
|
+
skipped += result.skipped;
|
|
107
|
+
}
|
|
108
|
+
else if (entry.isFile()) {
|
|
109
|
+
if (isBinaryFile(entry.name)) {
|
|
110
|
+
skipped++;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const stats = fs.statSync(fullPath);
|
|
114
|
+
if (stats.size > MAX_FILE_SIZE_BYTES) {
|
|
115
|
+
skipped++;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
tree.push(`${indent}${entry.name}`);
|
|
119
|
+
let content;
|
|
120
|
+
let isTruncated = false;
|
|
121
|
+
try {
|
|
122
|
+
content = fs.readFileSync(fullPath, 'utf-8');
|
|
123
|
+
if (content.length > MAX_FILE_SIZE_BYTES) {
|
|
124
|
+
content = content.slice(0, MAX_FILE_SIZE_BYTES);
|
|
125
|
+
isTruncated = true;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
content = undefined;
|
|
130
|
+
}
|
|
131
|
+
files.push({
|
|
132
|
+
path: relativePath,
|
|
133
|
+
size: stats.size,
|
|
134
|
+
content,
|
|
135
|
+
isTruncated
|
|
136
|
+
});
|
|
137
|
+
fileCount++;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return { files, tree, fileCount, skipped };
|
|
141
|
+
}
|
|
142
|
+
const addDirPlugin = async () => {
|
|
143
|
+
return {
|
|
144
|
+
tool: {
|
|
145
|
+
add_dir: tool({
|
|
146
|
+
description: 'Add an external directory to the session context by reading all its files',
|
|
147
|
+
args: {
|
|
148
|
+
directory: tool.schema.string().describe('Path to the directory to add')
|
|
149
|
+
},
|
|
150
|
+
execute: async ({ directory }) => {
|
|
151
|
+
const resolvedPath = path.resolve(directory);
|
|
152
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
153
|
+
throw new Error(`Directory does not exist: ${resolvedPath}`);
|
|
154
|
+
}
|
|
155
|
+
if (!fs.statSync(resolvedPath).isDirectory()) {
|
|
156
|
+
throw new Error(`Path is not a directory: ${resolvedPath}`);
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
fs.accessSync(resolvedPath, fs.constants.R_OK);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
throw new Error(`Permission denied: Cannot read directory ${resolvedPath}`);
|
|
163
|
+
}
|
|
164
|
+
const scanResult = scanDirectory(resolvedPath, resolvedPath);
|
|
165
|
+
const totalFound = scanResult.fileCount + scanResult.skipped;
|
|
166
|
+
const filesTooLarge = scanResult.skipped;
|
|
167
|
+
const output = {
|
|
168
|
+
directory: resolvedPath,
|
|
169
|
+
totalFilesFound: totalFound,
|
|
170
|
+
filesProcessed: scanResult.fileCount,
|
|
171
|
+
filesSkipped: scanResult.skipped - filesTooLarge,
|
|
172
|
+
filesTooLarge,
|
|
173
|
+
tree: scanResult.tree,
|
|
174
|
+
files: scanResult.files
|
|
175
|
+
};
|
|
176
|
+
saveAddedDirectory(resolvedPath);
|
|
177
|
+
return JSON.stringify({
|
|
178
|
+
...output,
|
|
179
|
+
message: 'Directory added to context. Future access to this directory will not require permission prompts.'
|
|
180
|
+
}, null, 2);
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
},
|
|
184
|
+
'permission.ask': async (input, output) => {
|
|
185
|
+
if (input.pattern) {
|
|
186
|
+
const patterns = Array.isArray(input.pattern) ? input.pattern : [input.pattern];
|
|
187
|
+
for (const pattern of patterns) {
|
|
188
|
+
if (typeof pattern === 'string' && isPathInAddedDirectories(pattern)) {
|
|
189
|
+
output.status = 'allow';
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
export default addDirPlugin;
|
|
198
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGhD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,aAAa;IACb,OAAO;IACP,MAAM;IACN,KAAK;IACL,MAAM;IACN,UAAU;IACV,OAAO;IACP,SAAS;IACT,KAAK;IACL,MAAM;IACN,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAChE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IACzD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IACpC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACtC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM;IACvC,QAAQ,EAAE,MAAM,EAAE,MAAM;IACxB,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,SAAS,EAAE,UAAU;IAC5B,OAAO,EAAE,MAAM;CAChB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,GAAG,GAAG,IAAI,CAAC;AACvC,MAAM,SAAS,GAAG,GAAG,CAAC;AAuBtB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAEjE,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,GAAG,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAqB,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClE,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,aAAqB;IACrD,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEnD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,OAAO,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,aAAa,CACpB,OAAe,EACf,OAAe,EACf,QAAoB,EAAE,EACtB,OAAiB,EAAE,EACnB,QAAgB,CAAC,EACjB,YAAoB,CAAC;IAErB,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,aAAa,CAC1B,QAAQ,EACR,OAAO,EACP,KAAK,EACL,IAAI,EACJ,KAAK,GAAG,CAAC,EACT,SAAS,CACV,CAAC;YACF,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACrB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACnB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAC7B,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEpC,IAAI,KAAK,CAAC,IAAI,GAAG,mBAAmB,EAAE,CAAC;gBACrC,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAEpC,IAAI,OAA2B,CAAC;YAChC,IAAI,WAAW,GAAG,KAAK,CAAC;YAExB,IAAI,CAAC;gBACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAE7C,IAAI,OAAO,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;oBACzC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;oBAChD,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,SAAS,CAAC;YACtB,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO;gBACP,WAAW;aACZ,CAAC,CAAC;YAEH,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,YAAY,GAAW,KAAK,IAAI,EAAE;IACtC,OAAO;QACL,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI,CAAC;gBACZ,WAAW,EAAE,2EAA2E;gBACxF,IAAI,EAAE;oBACJ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;iBACzE;gBACD,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;oBAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;wBACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;oBAC/D,CAAC;oBAED,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;wBAC7C,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;oBAC9D,CAAC;oBAED,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACjD,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,IAAI,KAAK,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;oBAC9E,CAAC;oBAED,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;oBAC7D,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC;oBAC7D,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;oBAEzC,MAAM,MAAM,GAAwB;wBAClC,SAAS,EAAE,YAAY;wBACvB,eAAe,EAAE,UAAU;wBAC3B,cAAc,EAAE,UAAU,CAAC,SAAS;wBACpC,YAAY,EAAE,UAAU,CAAC,OAAO,GAAG,aAAa;wBAChD,aAAa;wBACb,IAAI,EAAE,UAAU,CAAC,IAAI;wBACrB,KAAK,EAAE,UAAU,CAAC,KAAK;qBACxB,CAAC;oBAEF,kBAAkB,CAAC,YAAY,CAAC,CAAC;oBAEjC,OAAO,IAAI,CAAC,SAAS,CAAC;wBACpB,GAAG,MAAM;wBACT,OAAO,EAAE,kGAAkG;qBAC5G,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACd,CAAC;aACF,CAAC;SACH;QACD,gBAAgB,EAAE,KAAK,EAAE,KAAiB,EAAE,MAAM,EAAE,EAAE;YACpD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEhF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;wBACrE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;wBACxB,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opencode-add-dir",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "OpenCode plugin to add external directories to session context",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"command"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"prepublishOnly": "npm run build",
|
|
15
|
+
"postinstall": "node scripts/install.js"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@opencode-ai/plugin": "^1.0.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^20.0.0",
|
|
22
|
+
"typescript": "^5.0.0"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@opencode-ai/plugin": "^1.0.0"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"opencode",
|
|
29
|
+
"plugin",
|
|
30
|
+
"add-directory",
|
|
31
|
+
"context"
|
|
32
|
+
],
|
|
33
|
+
"author": "",
|
|
34
|
+
"license": "MIT"
|
|
35
|
+
}
|