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 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
@@ -0,0 +1,5 @@
1
+ ---
2
+ description: Add an external directory to the session context
3
+ ---
4
+ Add the directory at path $ARGUMENTS to this session's context.
5
+ Use the add_dir tool to read all files from the specified directory.
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from '@opencode-ai/plugin';
2
+ declare const addDirPlugin: Plugin;
3
+ export default addDirPlugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
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
+ }