@sillybit/renamer-opencode-plugin 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/LICENSE +21 -0
- package/README.md +144 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +246 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sillybit.io
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# renamer-opencode-plugin
|
|
2
|
+
|
|
3
|
+
A small OpenCode plugin that **replaces case-insensitive occurrences of `opencode`** with a configurable word (default: `Renamer`) across OpenCode outputs.
|
|
4
|
+
|
|
5
|
+
This is mainly useful for **privacy/safety**: it helps reduce accidental disclosure of the platform name in logs, screenshots, demos, shared transcripts, or tool output.
|
|
6
|
+
|
|
7
|
+
## Why would I use this?
|
|
8
|
+
|
|
9
|
+
- **Safer sharing**: reduces chance your pasted output reveals “opencode”.
|
|
10
|
+
- **Cleaner demos and screenshots**: consistent wording in public materials.
|
|
11
|
+
- **Non-invasive**: avoids changing URLs, file paths, and code blocks so you don’t break commands, stack traces, or links.
|
|
12
|
+
|
|
13
|
+
## What it changes (and what it doesn’t)
|
|
14
|
+
|
|
15
|
+
The plugin runs on multiple OpenCode hooks, including chat messages, system prompts, tool output, and session titles.
|
|
16
|
+
|
|
17
|
+
It **does not replace** inside:
|
|
18
|
+
|
|
19
|
+
- URLs (example: `https://opencode.ai/docs/plugins`)
|
|
20
|
+
- file paths (example: `.opencode/...`, `/usr/local/...`, `C:\Users\...`)
|
|
21
|
+
- inline code and fenced code blocks (anything inside backticks)
|
|
22
|
+
|
|
23
|
+
## Quickstart (npm)
|
|
24
|
+
|
|
25
|
+
1. Add the plugin to your OpenCode config (`opencode.json` or `opencode.jsonc`):
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"$schema": "https://opencode.ai/config.json",
|
|
30
|
+
"plugin": ["@sillybit/renamer-opencode-plugin"]
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
2. Restart OpenCode.
|
|
35
|
+
|
|
36
|
+
OpenCode installs npm plugins automatically at startup (cached under `~/.cache/opencode/node_modules/`).
|
|
37
|
+
|
|
38
|
+
## Configuration
|
|
39
|
+
|
|
40
|
+
Config is optional. If you don’t configure anything, the plugin is enabled and replaces `opencode` → `Renamer`.
|
|
41
|
+
|
|
42
|
+
Config files are JSON and loaded from both locations:
|
|
43
|
+
|
|
44
|
+
- Global: `~/.config/opencode/renamer-config.json`
|
|
45
|
+
- Project: `.opencode/renamer-config.json`
|
|
46
|
+
|
|
47
|
+
Project config overrides global config.
|
|
48
|
+
|
|
49
|
+
Example:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"enabled": true,
|
|
54
|
+
"replacement": "Renamer"
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Environment variables (highest precedence)
|
|
59
|
+
|
|
60
|
+
- `OPENCODE_RENAMER_REPLACE_ENABLED` (`true`/`false`, also supports `1/0`, `yes/no`, `on/off`)
|
|
61
|
+
- `OPENCODE_RENAMER_REPLACE_TEXT` (non-empty string)
|
|
62
|
+
|
|
63
|
+
## Examples
|
|
64
|
+
|
|
65
|
+
### Normal text (replaced)
|
|
66
|
+
|
|
67
|
+
Input:
|
|
68
|
+
`I’m using opencode for this task`
|
|
69
|
+
|
|
70
|
+
Output (default):
|
|
71
|
+
`I’m using Renamer for this task`
|
|
72
|
+
|
|
73
|
+
### URL (not replaced)
|
|
74
|
+
|
|
75
|
+
`https://opencode.ai/docs/plugins` stays unchanged.
|
|
76
|
+
|
|
77
|
+
### Code (not replaced)
|
|
78
|
+
|
|
79
|
+
Inline code: `` `opencode` `` stays unchanged.
|
|
80
|
+
|
|
81
|
+
Fenced code blocks stay unchanged:
|
|
82
|
+
|
|
83
|
+
```sh
|
|
84
|
+
echo "opencode"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Behavior details
|
|
88
|
+
|
|
89
|
+
- Match is case-insensitive: `OpenCode`, `OPENCODE`, `opencode` all become your `replacement`.
|
|
90
|
+
- Replacement target is intentionally fixed to `opencode` (not configurable).
|
|
91
|
+
|
|
92
|
+
## Development
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
bun install
|
|
96
|
+
bun run build
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Contributing
|
|
100
|
+
|
|
101
|
+
### Commit Message Convention
|
|
102
|
+
|
|
103
|
+
This project follows [Conventional Commits](https://www.conventionalcommits.org/) specification.
|
|
104
|
+
|
|
105
|
+
**Format:**
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
<type>(<scope>): <subject>
|
|
109
|
+
|
|
110
|
+
<body>
|
|
111
|
+
|
|
112
|
+
<footer>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Types:**
|
|
116
|
+
|
|
117
|
+
- `feat`: New feature
|
|
118
|
+
- `fix`: Bug fix
|
|
119
|
+
- `docs`: Documentation changes
|
|
120
|
+
- `style`: Code style changes (formatting, missing semicolons, etc.)
|
|
121
|
+
- `refactor`: Code refactoring
|
|
122
|
+
- `perf`: Performance improvements
|
|
123
|
+
- `test`: Adding or updating tests
|
|
124
|
+
- `chore`: Maintenance tasks (dependencies, build config, etc.)
|
|
125
|
+
|
|
126
|
+
**Examples:**
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
feat: add support for custom replacement patterns
|
|
130
|
+
fix: exclude URLs from text replacement
|
|
131
|
+
docs: update installation instructions
|
|
132
|
+
chore: update dependencies
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Breaking Changes:**
|
|
136
|
+
Use `!` after the type/scope to indicate breaking changes:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
feat!: change default replacement from "Renamer" to "Custom"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAgOlD,eAAO,MAAM,oBAAoB,EAAE,MA8GlC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
enabled: true,
|
|
6
|
+
replacement: "Renamer",
|
|
7
|
+
};
|
|
8
|
+
const CONFIG_FILENAME = "renamer-config.json";
|
|
9
|
+
const ENV_ENABLED = "OPENCODE_RENAMER_REPLACE_ENABLED";
|
|
10
|
+
const ENV_REPLACEMENT = "OPENCODE_RENAMER_REPLACE_TEXT";
|
|
11
|
+
const URL_REGEX = /https?:\/\/[^\s`"')\]]+/gi;
|
|
12
|
+
const PATH_REGEX = /(?:\b[a-zA-Z]:\\[^\s`"')\]]+)|(?:~\/[^\s`"')\]]+)|(?:\.\.?\/[^\s`"')\]]+)|(?:\/[^\s`"')\]]+)/g;
|
|
13
|
+
const OPENCODE_REGEX = /opencode/gi;
|
|
14
|
+
function parseBool(value) {
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
const normalized = value.trim().toLowerCase();
|
|
18
|
+
if (["true", "1", "yes", "y", "on"].includes(normalized))
|
|
19
|
+
return true;
|
|
20
|
+
if (["false", "0", "no", "n", "off"].includes(normalized))
|
|
21
|
+
return false;
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
function shouldReloadConfig(state) {
|
|
25
|
+
if (!state.lastLoaded)
|
|
26
|
+
return true;
|
|
27
|
+
return Date.now() - state.lastLoaded > 1000;
|
|
28
|
+
}
|
|
29
|
+
async function readConfigFile(filePath) {
|
|
30
|
+
const raw = await fs.readFile(filePath, "utf8").catch(() => undefined);
|
|
31
|
+
if (!raw)
|
|
32
|
+
return undefined;
|
|
33
|
+
try {
|
|
34
|
+
const parsed = JSON.parse(raw);
|
|
35
|
+
return parsed;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function loadConfig(state) {
|
|
42
|
+
if (!shouldReloadConfig(state) && state.cachedConfig) {
|
|
43
|
+
return state.cachedConfig;
|
|
44
|
+
}
|
|
45
|
+
const projectConfig = state.projectConfigPath
|
|
46
|
+
? await readConfigFile(state.projectConfigPath)
|
|
47
|
+
: undefined;
|
|
48
|
+
const globalConfig = state.globalConfigPath
|
|
49
|
+
? await readConfigFile(state.globalConfigPath)
|
|
50
|
+
: undefined;
|
|
51
|
+
const merged = {
|
|
52
|
+
...DEFAULT_CONFIG,
|
|
53
|
+
...(globalConfig ?? {}),
|
|
54
|
+
...(projectConfig ?? {}),
|
|
55
|
+
};
|
|
56
|
+
const envEnabled = parseBool(process.env[ENV_ENABLED]);
|
|
57
|
+
if (envEnabled !== undefined) {
|
|
58
|
+
merged.enabled = envEnabled;
|
|
59
|
+
}
|
|
60
|
+
const envReplacement = process.env[ENV_REPLACEMENT];
|
|
61
|
+
if (envReplacement && envReplacement.trim().length > 0) {
|
|
62
|
+
merged.replacement = envReplacement;
|
|
63
|
+
}
|
|
64
|
+
state.cachedConfig = merged;
|
|
65
|
+
state.lastLoaded = Date.now();
|
|
66
|
+
return merged;
|
|
67
|
+
}
|
|
68
|
+
function replaceOpencode(text, replacement) {
|
|
69
|
+
if (!text)
|
|
70
|
+
return text;
|
|
71
|
+
return text.replace(OPENCODE_REGEX, replacement);
|
|
72
|
+
}
|
|
73
|
+
function replaceOutsideRanges(text, replacement, ranges) {
|
|
74
|
+
if (ranges.length === 0)
|
|
75
|
+
return replaceOpencode(text, replacement);
|
|
76
|
+
const sorted = ranges
|
|
77
|
+
.map((range) => [Math.max(0, range[0]), Math.max(0, range[1])])
|
|
78
|
+
.filter(([start, end]) => end > start)
|
|
79
|
+
.sort((a, b) => a[0] - b[0]);
|
|
80
|
+
let result = "";
|
|
81
|
+
let cursor = 0;
|
|
82
|
+
for (const [start, end] of sorted) {
|
|
83
|
+
if (start > cursor) {
|
|
84
|
+
result += replaceOpencode(text.slice(cursor, start), replacement);
|
|
85
|
+
}
|
|
86
|
+
result += text.slice(start, end);
|
|
87
|
+
cursor = Math.max(cursor, end);
|
|
88
|
+
}
|
|
89
|
+
if (cursor < text.length) {
|
|
90
|
+
result += replaceOpencode(text.slice(cursor), replacement);
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
function replaceExcludingUrlsAndPaths(text, replacement) {
|
|
95
|
+
const ranges = [];
|
|
96
|
+
const urlMatches = text.matchAll(URL_REGEX);
|
|
97
|
+
for (const match of urlMatches) {
|
|
98
|
+
if (match.index === undefined)
|
|
99
|
+
continue;
|
|
100
|
+
ranges.push([match.index, match.index + match[0].length]);
|
|
101
|
+
}
|
|
102
|
+
const pathMatches = text.matchAll(PATH_REGEX);
|
|
103
|
+
for (const match of pathMatches) {
|
|
104
|
+
if (match.index === undefined)
|
|
105
|
+
continue;
|
|
106
|
+
ranges.push([match.index, match.index + match[0].length]);
|
|
107
|
+
}
|
|
108
|
+
return replaceOutsideRanges(text, replacement, ranges);
|
|
109
|
+
}
|
|
110
|
+
function replaceInInlineCodeSegments(text, replacement) {
|
|
111
|
+
const segments = text.split("`");
|
|
112
|
+
return segments
|
|
113
|
+
.map((segment, index) => {
|
|
114
|
+
if (index % 2 === 1)
|
|
115
|
+
return segment;
|
|
116
|
+
return replaceExcludingUrlsAndPaths(segment, replacement);
|
|
117
|
+
})
|
|
118
|
+
.join("`");
|
|
119
|
+
}
|
|
120
|
+
function replaceInText(text, replacement) {
|
|
121
|
+
const blocks = text.split("```");
|
|
122
|
+
return blocks
|
|
123
|
+
.map((block, index) => {
|
|
124
|
+
if (index % 2 === 1)
|
|
125
|
+
return block;
|
|
126
|
+
return replaceInInlineCodeSegments(block, replacement);
|
|
127
|
+
})
|
|
128
|
+
.join("```");
|
|
129
|
+
}
|
|
130
|
+
function replaceInParts(parts, replacement) {
|
|
131
|
+
for (const part of parts) {
|
|
132
|
+
if (part.type === "text" && typeof part.text === "string") {
|
|
133
|
+
part.text = replaceInText(part.text, replacement);
|
|
134
|
+
}
|
|
135
|
+
if (part.type === "subtask") {
|
|
136
|
+
if (typeof part.prompt === "string") {
|
|
137
|
+
part.prompt = replaceInText(part.prompt, replacement);
|
|
138
|
+
}
|
|
139
|
+
if (typeof part.description === "string") {
|
|
140
|
+
part.description = replaceInText(part.description, replacement);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (typeof part.title === "string") {
|
|
144
|
+
part.title = replaceInText(part.title, replacement);
|
|
145
|
+
}
|
|
146
|
+
if (typeof part.description === "string") {
|
|
147
|
+
part.description = replaceInText(part.description, replacement);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function replaceInMessages(messages, replacement) {
|
|
152
|
+
for (const message of messages) {
|
|
153
|
+
replaceInParts(message.parts, replacement);
|
|
154
|
+
if (typeof message.info?.title === "string") {
|
|
155
|
+
message.info.title = replaceInText(message.info.title, replacement);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function updateSessionTitleIfNeeded(title, replacement) {
|
|
160
|
+
if (!title)
|
|
161
|
+
return title;
|
|
162
|
+
if (!OPENCODE_REGEX.test(title))
|
|
163
|
+
return title;
|
|
164
|
+
return replaceInText(title, replacement);
|
|
165
|
+
}
|
|
166
|
+
export const RenamerReplacePlugin = async ({ client, directory, worktree, }) => {
|
|
167
|
+
const state = {};
|
|
168
|
+
const projectRoot = worktree || directory;
|
|
169
|
+
state.projectConfigPath = path.join(projectRoot, ".opencode", CONFIG_FILENAME);
|
|
170
|
+
state.globalConfigPath = path.join(os.homedir(), ".config", "opencode", CONFIG_FILENAME);
|
|
171
|
+
async function withConfig(fn) {
|
|
172
|
+
const config = await loadConfig(state);
|
|
173
|
+
return fn(config);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
event: async ({ event }) => {
|
|
177
|
+
if (event.type === "file.edited" ||
|
|
178
|
+
event.type === "file.watcher.updated") {
|
|
179
|
+
const filePath = event.path;
|
|
180
|
+
if (filePath &&
|
|
181
|
+
(filePath === state.projectConfigPath ||
|
|
182
|
+
filePath === state.globalConfigPath)) {
|
|
183
|
+
state.lastLoaded = 0;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (event.type === "session.updated") {
|
|
187
|
+
await withConfig(async (config) => {
|
|
188
|
+
if (!config.enabled)
|
|
189
|
+
return;
|
|
190
|
+
const title = event.title;
|
|
191
|
+
const updated = updateSessionTitleIfNeeded(title, config.replacement);
|
|
192
|
+
if (!updated || updated === title)
|
|
193
|
+
return;
|
|
194
|
+
const sessionID = event.sessionID;
|
|
195
|
+
if (!sessionID)
|
|
196
|
+
return;
|
|
197
|
+
await client.session.update({
|
|
198
|
+
path: { id: sessionID },
|
|
199
|
+
body: { title: updated },
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"chat.message": async (_input, output) => {
|
|
205
|
+
await withConfig((config) => {
|
|
206
|
+
if (!config.enabled)
|
|
207
|
+
return;
|
|
208
|
+
replaceInParts(output.parts, config.replacement);
|
|
209
|
+
});
|
|
210
|
+
},
|
|
211
|
+
"experimental.chat.system.transform": async (_input, output) => {
|
|
212
|
+
await withConfig((config) => {
|
|
213
|
+
if (!config.enabled)
|
|
214
|
+
return;
|
|
215
|
+
output.system = output.system.map((item) => replaceInText(item, config.replacement));
|
|
216
|
+
});
|
|
217
|
+
},
|
|
218
|
+
"experimental.chat.messages.transform": async (_input, output) => {
|
|
219
|
+
await withConfig((config) => {
|
|
220
|
+
if (!config.enabled)
|
|
221
|
+
return;
|
|
222
|
+
replaceInMessages(output.messages, config.replacement);
|
|
223
|
+
});
|
|
224
|
+
},
|
|
225
|
+
"experimental.text.complete": async (_input, output) => {
|
|
226
|
+
await withConfig((config) => {
|
|
227
|
+
if (!config.enabled)
|
|
228
|
+
return;
|
|
229
|
+
output.text = replaceInText(output.text, config.replacement);
|
|
230
|
+
});
|
|
231
|
+
},
|
|
232
|
+
"tool.execute.after": async (_input, output) => {
|
|
233
|
+
await withConfig((config) => {
|
|
234
|
+
if (!config.enabled)
|
|
235
|
+
return;
|
|
236
|
+
if (typeof output.title === "string") {
|
|
237
|
+
output.title = replaceInText(output.title, config.replacement);
|
|
238
|
+
}
|
|
239
|
+
if (typeof output.output === "string") {
|
|
240
|
+
output.output = replaceInText(output.output, config.replacement);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
//# 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,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sillybit/renamer-opencode-plugin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenCode plugin that replaces case-insensitive 'opencode' text with a configurable value (default: 'Renamer') across chat messages, system prompts, tool outputs, and session titles",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -p tsconfig.json",
|
|
21
|
+
"prepack": "bun run build",
|
|
22
|
+
"format": "biome format --write .",
|
|
23
|
+
"lint": "biome lint .",
|
|
24
|
+
"check": "biome check --write ."
|
|
25
|
+
},
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/Sillybit-io/renamer-opencode-plugin.git"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/Sillybit-io/renamer-opencode-plugin#readme",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/Sillybit-io/renamer-opencode-plugin/issues"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"opencode",
|
|
40
|
+
"opencode-plugin",
|
|
41
|
+
"renamer",
|
|
42
|
+
"text-transform"
|
|
43
|
+
],
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@opencode-ai/plugin": "^1.1.21"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@biomejs/biome": "^2.3.11",
|
|
52
|
+
"@types/node": "^24.5.0",
|
|
53
|
+
"typescript": "^5.9.3"
|
|
54
|
+
}
|
|
55
|
+
}
|