opencode-snippets 1.5.0 → 1.7.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 +72 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +144 -56
- package/dist/index.js.map +1 -1
- package/dist/src/config.d.ts +13 -2
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +30 -9
- package/dist/src/config.js.map +1 -1
- package/dist/src/constants.d.ts +7 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +7 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/expander.d.ts +13 -4
- package/dist/src/expander.d.ts.map +1 -1
- package/dist/src/expander.js +29 -11
- package/dist/src/expander.js.map +1 -1
- package/dist/src/hook-types.d.ts +39 -0
- package/dist/src/hook-types.d.ts.map +1 -0
- package/dist/src/hook-types.js +5 -0
- package/dist/src/hook-types.js.map +1 -0
- package/dist/src/injection-manager.d.ts +20 -0
- package/dist/src/injection-manager.d.ts.map +1 -0
- package/dist/src/injection-manager.js +36 -0
- package/dist/src/injection-manager.js.map +1 -0
- package/dist/src/shell.d.ts +6 -1
- package/dist/src/shell.d.ts.map +1 -1
- package/dist/src/shell.js +3 -3
- package/dist/src/shell.js.map +1 -1
- package/dist/src/skill-loader.d.ts +35 -0
- package/dist/src/skill-loader.d.ts.map +1 -0
- package/dist/src/skill-loader.js +118 -0
- package/dist/src/skill-loader.js.map +1 -0
- package/dist/src/skill-renderer.d.ts +14 -0
- package/dist/src/skill-renderer.d.ts.map +1 -0
- package/dist/src/skill-renderer.js +42 -0
- package/dist/src/skill-renderer.js.map +1 -0
- package/dist/src/types.d.ts +4 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/skill/snippets/SKILL.md +69 -5
package/README.md
CHANGED
|
@@ -120,6 +120,7 @@ Snippets can be global (`~/.config/opencode/snippet/*.md`) or project-specific (
|
|
|
120
120
|
|
|
121
121
|
Define multiple triggers for the same snippet:
|
|
122
122
|
|
|
123
|
+
`~/.config/opencode/snippet/cherry-pick.md`:
|
|
123
124
|
```markdown
|
|
124
125
|
---
|
|
125
126
|
aliases:
|
|
@@ -151,7 +152,7 @@ Last commit: !`git log -1 --oneline`
|
|
|
151
152
|
Working directory: !`pwd`
|
|
152
153
|
```
|
|
153
154
|
|
|
154
|
-
> **Note:**
|
|
155
|
+
> **Note:** By default, snippets show both the command and its output (unlike OpenCode's slash commands which only show output):
|
|
155
156
|
> ``!`ls` `` →
|
|
156
157
|
> ```
|
|
157
158
|
> $ ls
|
|
@@ -159,7 +160,7 @@ Working directory: !`pwd`
|
|
|
159
160
|
> ```
|
|
160
161
|
> This tells the LLM which command was actually run and makes failures visible (empty output would otherwise be indistinguishable from success).
|
|
161
162
|
>
|
|
162
|
-
>
|
|
163
|
+
> To match OpenCode's slash command behavior (output only), set `hideCommandInOutput: true` in your config.
|
|
163
164
|
|
|
164
165
|
### Recursive Includes
|
|
165
166
|
|
|
@@ -232,6 +233,70 @@ Use `<prepend>` for content that should appear at the top of your message. Multi
|
|
|
232
233
|
- Unclosed tags are handled leniently (rest of content becomes the block)
|
|
233
234
|
- Nested blocks are not allowed—the hashtag is left unchanged
|
|
234
235
|
|
|
236
|
+
### Inject Blocks (Experimental)
|
|
237
|
+
|
|
238
|
+
Add persistent context that the LLM sees throughout the entire agentic loop, without cluttering your visible message:
|
|
239
|
+
|
|
240
|
+
```markdown
|
|
241
|
+
---
|
|
242
|
+
aliases: safe
|
|
243
|
+
---
|
|
244
|
+
Think step by step.
|
|
245
|
+
<inject>
|
|
246
|
+
IMPORTANT: Double-check all code for security vulnerabilities.
|
|
247
|
+
Always suggest tests for any implementation.
|
|
248
|
+
</inject>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Input:** `Review this code #safe`
|
|
252
|
+
|
|
253
|
+
**What happens:**
|
|
254
|
+
- Your message shows: `Review this code Think step by step.`
|
|
255
|
+
- The LLM also receives the inject content as a separate context message
|
|
256
|
+
- This context persists for the entire conversation turn (agentic loop)
|
|
257
|
+
|
|
258
|
+
Use inject blocks for rules, constraints, or instructions that should influence all LLM responses without appearing inline in your message.
|
|
259
|
+
|
|
260
|
+
**Enable in config:**
|
|
261
|
+
|
|
262
|
+
```jsonc
|
|
263
|
+
{
|
|
264
|
+
"experimental": {
|
|
265
|
+
"injectBlocks": true
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Skill Rendering (Experimental)
|
|
271
|
+
|
|
272
|
+
Inline OpenCode skills directly into your messages using XML-style tags:
|
|
273
|
+
|
|
274
|
+
```markdown
|
|
275
|
+
Create a Jira ticket. <skill>jira</skill>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Or use the self-closing format:
|
|
279
|
+
|
|
280
|
+
```markdown
|
|
281
|
+
<skill name="jira" /> Create a ticket for the bug.
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**Enable in config:**
|
|
285
|
+
|
|
286
|
+
```jsonc
|
|
287
|
+
{
|
|
288
|
+
"experimental": {
|
|
289
|
+
"skillRendering": true
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Skills are loaded from OpenCode's standard skill directories:
|
|
295
|
+
- **Global**: `~/.config/opencode/skill/<name>/SKILL.md`
|
|
296
|
+
- **Project**: `.opencode/skill/<name>/SKILL.md`
|
|
297
|
+
|
|
298
|
+
When a skill tag is found, it's replaced with the skill's content body (frontmatter stripped). Unknown skills leave the tag unchanged.
|
|
299
|
+
|
|
235
300
|
## Example Snippets
|
|
236
301
|
|
|
237
302
|
### `~/.config/opencode/snippet/context.md`
|
|
@@ -296,7 +361,11 @@ A default config file is created automatically on first run.
|
|
|
296
361
|
"logging": {
|
|
297
362
|
"debug": false // Enable debug logging (logs: ~/.config/opencode/logs/snippets/daily/)
|
|
298
363
|
},
|
|
299
|
-
"
|
|
364
|
+
"experimental": {
|
|
365
|
+
"injectBlocks": false, // Enable <inject>...</inject> blocks for persistent context
|
|
366
|
+
"skillRendering": false // Enable <skill>name</skill> tag expansion
|
|
367
|
+
},
|
|
368
|
+
"hideCommandInOutput": false // Show only output for shell commands (hides "$ cmd\n-->")
|
|
300
369
|
}
|
|
301
370
|
```
|
|
302
371
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAqDlD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,MAmO5B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,44 +1,45 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { rmdir, unlink } from "node:fs/promises";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { createCommandExecuteHandler } from "./src/commands.js";
|
|
5
5
|
import { loadConfig } from "./src/config.js";
|
|
6
6
|
import { assembleMessage, expandHashtags } from "./src/expander.js";
|
|
7
|
+
import { InjectionManager } from "./src/injection-manager.js";
|
|
7
8
|
import { loadSnippets } from "./src/loader.js";
|
|
8
9
|
import { logger } from "./src/logger.js";
|
|
9
10
|
import { executeShellCommands } from "./src/shell.js";
|
|
11
|
+
import { loadSkills } from "./src/skill-loader.js";
|
|
12
|
+
import { expandSkillTags } from "./src/skill-renderer.js";
|
|
10
13
|
const __filename = fileURLToPath(import.meta.url);
|
|
11
14
|
const __dirname = dirname(__filename);
|
|
12
15
|
const PLUGIN_ROOT = join(__dirname, "..");
|
|
13
16
|
const SKILL_DIR = join(PLUGIN_ROOT, "skill");
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Clean up legacy skill installation from pre-v1.7.0
|
|
19
|
+
* We used to force-install SKILL.md to ~/.config/opencode/skill/snippets/
|
|
20
|
+
* Now we register the skill path instead, so we remove the orphaned file.
|
|
21
|
+
*
|
|
22
|
+
* TODO: Remove this cleanup code around mid-2026 when most users have upgraded.
|
|
23
|
+
*/
|
|
24
|
+
async function cleanupLegacySkillInstall() {
|
|
16
25
|
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
26
|
+
if (!home)
|
|
27
|
+
return;
|
|
28
|
+
const legacySkillDir = join(home, ".config", "opencode", "skill", "snippets");
|
|
29
|
+
const legacySkillPath = join(legacySkillDir, "SKILL.md");
|
|
20
30
|
try {
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const existing = await globalFile.text();
|
|
30
|
-
const source = await sourceFile.text();
|
|
31
|
-
if (existing === source) {
|
|
32
|
-
logger.debug("Skill already installed", { path: globalSkillPath });
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
31
|
+
const file = Bun.file(legacySkillPath);
|
|
32
|
+
if (await file.exists()) {
|
|
33
|
+
await unlink(legacySkillPath);
|
|
34
|
+
logger.debug("Cleaned up legacy skill file", { path: legacySkillPath });
|
|
35
|
+
// Try to remove the empty directory too
|
|
36
|
+
await rmdir(legacySkillDir).catch(() => {
|
|
37
|
+
// Directory not empty or doesn't exist - that's fine
|
|
38
|
+
});
|
|
35
39
|
}
|
|
36
|
-
mkdirSync(globalSkillDir, { recursive: true });
|
|
37
|
-
await Bun.write(globalSkillPath, sourceFile);
|
|
38
|
-
logger.debug("Installed snippets skill", { path: globalSkillPath });
|
|
39
40
|
}
|
|
40
41
|
catch (err) {
|
|
41
|
-
logger.debug("Failed to
|
|
42
|
+
logger.debug("Failed to cleanup legacy skill", { error: String(err) });
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
@@ -54,97 +55,184 @@ export const SnippetsPlugin = async (ctx) => {
|
|
|
54
55
|
const config = loadConfig(ctx.directory);
|
|
55
56
|
// Apply config settings
|
|
56
57
|
logger.debugEnabled = config.logging.debug;
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
await installSkillToGlobal();
|
|
60
|
-
}
|
|
58
|
+
// Clean up legacy skill installation (pre-v1.7.0)
|
|
59
|
+
cleanupLegacySkillInstall();
|
|
61
60
|
// Load all snippets at startup (global + project directory)
|
|
62
61
|
const startupStart = performance.now();
|
|
63
62
|
const snippets = await loadSnippets(ctx.directory);
|
|
63
|
+
// Load skills if skill rendering is enabled
|
|
64
|
+
let skills = new Map();
|
|
65
|
+
if (config.experimental.skillRendering) {
|
|
66
|
+
skills = await loadSkills(ctx.directory);
|
|
67
|
+
}
|
|
64
68
|
const startupTime = performance.now() - startupStart;
|
|
65
69
|
logger.debug("Plugin startup complete", {
|
|
66
70
|
startupTimeMs: startupTime.toFixed(2),
|
|
67
71
|
snippetCount: snippets.size,
|
|
68
|
-
|
|
72
|
+
skillCount: skills.size,
|
|
73
|
+
skillRenderingEnabled: config.experimental.skillRendering,
|
|
74
|
+
injectBlocksEnabled: config.experimental.injectBlocks,
|
|
69
75
|
debugLogging: config.logging.debug,
|
|
70
76
|
});
|
|
71
77
|
// Create command handler
|
|
72
78
|
const commandHandler = createCommandExecuteHandler(ctx.client, snippets, ctx.directory);
|
|
79
|
+
const injectionManager = new InjectionManager();
|
|
73
80
|
/**
|
|
74
|
-
* Processes text parts for snippet expansion and shell command execution
|
|
81
|
+
* Processes text parts for snippet expansion, skill rendering, and shell command execution.
|
|
82
|
+
* Returns collected inject blocks from expanded snippets.
|
|
75
83
|
*/
|
|
76
84
|
const processTextParts = async (parts) => {
|
|
77
85
|
const messageStart = performance.now();
|
|
78
86
|
let expandTimeTotal = 0;
|
|
87
|
+
let skillTimeTotal = 0;
|
|
79
88
|
let shellTimeTotal = 0;
|
|
80
89
|
let processedParts = 0;
|
|
90
|
+
const allInjected = [];
|
|
91
|
+
const expandOptions = {
|
|
92
|
+
extractInject: config.experimental.injectBlocks,
|
|
93
|
+
};
|
|
81
94
|
for (const part of parts) {
|
|
82
95
|
if (part.type === "text" && part.text) {
|
|
83
|
-
// 1. Expand
|
|
96
|
+
// 1. Expand skill tags if skill rendering is enabled
|
|
97
|
+
if (config.experimental.skillRendering && skills.size > 0) {
|
|
98
|
+
const skillStart = performance.now();
|
|
99
|
+
part.text = expandSkillTags(part.text, skills);
|
|
100
|
+
skillTimeTotal += performance.now() - skillStart;
|
|
101
|
+
}
|
|
102
|
+
// 2. Expand hashtags recursively with loop detection
|
|
84
103
|
const expandStart = performance.now();
|
|
85
|
-
const expansionResult = expandHashtags(part.text, snippets);
|
|
104
|
+
const expansionResult = expandHashtags(part.text, snippets, new Map(), expandOptions);
|
|
86
105
|
part.text = assembleMessage(expansionResult);
|
|
87
|
-
|
|
88
|
-
expandTimeTotal +=
|
|
89
|
-
//
|
|
106
|
+
allInjected.push(...expansionResult.inject);
|
|
107
|
+
expandTimeTotal += performance.now() - expandStart;
|
|
108
|
+
// 3. Execute shell commands: !`command`
|
|
90
109
|
const shellStart = performance.now();
|
|
91
|
-
part.text = await executeShellCommands(part.text, ctx
|
|
92
|
-
|
|
93
|
-
|
|
110
|
+
part.text = await executeShellCommands(part.text, ctx, {
|
|
111
|
+
hideCommandInOutput: config.hideCommandInOutput,
|
|
112
|
+
});
|
|
113
|
+
shellTimeTotal += performance.now() - shellStart;
|
|
94
114
|
processedParts += 1;
|
|
95
115
|
}
|
|
96
116
|
}
|
|
97
|
-
const totalTime = performance.now() - messageStart;
|
|
98
117
|
if (processedParts > 0) {
|
|
118
|
+
const totalTime = performance.now() - messageStart;
|
|
99
119
|
logger.debug("Text parts processing complete", {
|
|
100
120
|
totalTimeMs: totalTime.toFixed(2),
|
|
121
|
+
skillTimeMs: skillTimeTotal.toFixed(2),
|
|
101
122
|
snippetExpandTimeMs: expandTimeTotal.toFixed(2),
|
|
102
123
|
shellTimeMs: shellTimeTotal.toFixed(2),
|
|
103
124
|
processedParts,
|
|
125
|
+
injectedCount: allInjected.length,
|
|
104
126
|
});
|
|
105
127
|
}
|
|
128
|
+
return allInjected;
|
|
106
129
|
};
|
|
107
130
|
return {
|
|
108
|
-
// Register /snippet command
|
|
131
|
+
// Register /snippet command and skill path
|
|
109
132
|
config: async (opencodeConfig) => {
|
|
133
|
+
// Register skill folder path for automatic discovery
|
|
134
|
+
const cfg = opencodeConfig;
|
|
135
|
+
cfg.skills ??= {};
|
|
136
|
+
cfg.skills.paths ??= [];
|
|
137
|
+
cfg.skills.paths.push(SKILL_DIR);
|
|
138
|
+
// Register /snippet command
|
|
110
139
|
opencodeConfig.command ??= {};
|
|
111
140
|
opencodeConfig.command.snippet = {
|
|
112
141
|
template: "",
|
|
113
142
|
description: "Manage text snippets (add, delete, list, help)",
|
|
114
143
|
};
|
|
115
144
|
},
|
|
116
|
-
// Handle /snippet command execution
|
|
117
145
|
"command.execute.before": commandHandler,
|
|
118
|
-
"chat.message": async (
|
|
119
|
-
// Only process user messages, never assistant messages
|
|
146
|
+
"chat.message": async (input, output) => {
|
|
120
147
|
if (output.message.role !== "user")
|
|
121
148
|
return;
|
|
122
|
-
|
|
123
|
-
if (output.parts.some((part) => "ignored" in part && part.ignored))
|
|
149
|
+
if (output.parts.some((part) => part.ignored))
|
|
124
150
|
return;
|
|
125
|
-
await processTextParts(output.parts);
|
|
151
|
+
const injected = await processTextParts(output.parts);
|
|
152
|
+
output.parts.forEach((part) => {
|
|
153
|
+
if (part.type === "text") {
|
|
154
|
+
part.snippetsProcessed = true;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
if (injected.length > 0) {
|
|
158
|
+
injectionManager.addInjections(input.sessionID, injected);
|
|
159
|
+
}
|
|
126
160
|
},
|
|
127
|
-
|
|
128
|
-
|
|
161
|
+
"experimental.chat.messages.transform": async (input, output) => {
|
|
162
|
+
const sessionID = input.sessionID || input.session?.id || output.messages[0]?.info?.sessionID;
|
|
163
|
+
logger.debug("Transform hook called", {
|
|
164
|
+
inputSessionID: input.sessionID,
|
|
165
|
+
extractedSessionID: sessionID,
|
|
166
|
+
messageCount: output.messages.length,
|
|
167
|
+
hasSessionID: !!sessionID,
|
|
168
|
+
});
|
|
129
169
|
for (const message of output.messages) {
|
|
130
|
-
// Only process user messages
|
|
131
170
|
if (message.info.role === "user") {
|
|
132
|
-
|
|
133
|
-
|
|
171
|
+
if (message.parts.some((part) => part.snippetsProcessed))
|
|
172
|
+
continue;
|
|
173
|
+
if (message.parts.some((part) => part.ignored))
|
|
134
174
|
continue;
|
|
135
|
-
await processTextParts(message.parts);
|
|
175
|
+
const injected = await processTextParts(message.parts);
|
|
176
|
+
if (injected.length > 0 && sessionID) {
|
|
177
|
+
injectionManager.addInjections(sessionID, injected);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (sessionID) {
|
|
182
|
+
const injections = injectionManager.getInjections(sessionID);
|
|
183
|
+
logger.debug("Transform hook - checking for injections", {
|
|
184
|
+
sessionID,
|
|
185
|
+
hasInjections: !!injections,
|
|
186
|
+
injectionCount: injections?.length || 0,
|
|
187
|
+
messageTexts: output.messages.map((m) => ({
|
|
188
|
+
role: m.info.role,
|
|
189
|
+
text: m.parts
|
|
190
|
+
.filter((p) => p.type === "text")
|
|
191
|
+
.map((p) => (p.text || "").slice(0, 50))
|
|
192
|
+
.join(" | "),
|
|
193
|
+
snippetsProcessed: m.parts.some((p) => p.snippetsProcessed),
|
|
194
|
+
})),
|
|
195
|
+
});
|
|
196
|
+
if (injections && injections.length > 0) {
|
|
197
|
+
const beforeCount = output.messages.length;
|
|
198
|
+
for (const injectText of injections) {
|
|
199
|
+
output.messages.push({
|
|
200
|
+
info: {
|
|
201
|
+
role: "user",
|
|
202
|
+
sessionID: sessionID,
|
|
203
|
+
},
|
|
204
|
+
parts: [{ type: "text", text: injectText }],
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
logger.debug("Injected ephemeral user messages", {
|
|
208
|
+
sessionID,
|
|
209
|
+
injectionCount: injections.length,
|
|
210
|
+
messagesBefore: beforeCount,
|
|
211
|
+
messagesAfter: output.messages.length,
|
|
212
|
+
});
|
|
136
213
|
}
|
|
137
214
|
}
|
|
138
215
|
},
|
|
139
|
-
|
|
216
|
+
"session.idle": async (event) => {
|
|
217
|
+
injectionManager.clearSession(event.sessionID);
|
|
218
|
+
},
|
|
219
|
+
// Process skill tool output to expand snippets and skill tags in skill content
|
|
140
220
|
"tool.execute.after": async (input, output) => {
|
|
141
|
-
// Only process the skill tool
|
|
142
221
|
if (input.tool !== "skill")
|
|
143
222
|
return;
|
|
144
223
|
// The skill tool returns markdown content in its output
|
|
145
|
-
// Expand hashtags in the skill content
|
|
224
|
+
// Expand skill tags and hashtags in the skill content
|
|
146
225
|
if (typeof output.output === "string" && output.output.trim()) {
|
|
147
|
-
|
|
226
|
+
let processed = output.output;
|
|
227
|
+
// First expand skill tags if enabled
|
|
228
|
+
if (config.experimental.skillRendering && skills.size > 0) {
|
|
229
|
+
processed = expandSkillTags(processed, skills);
|
|
230
|
+
}
|
|
231
|
+
// Then expand hashtag snippets
|
|
232
|
+
const expandOptions = {
|
|
233
|
+
extractInject: config.experimental.injectBlocks,
|
|
234
|
+
};
|
|
235
|
+
const expansionResult = expandHashtags(processed, snippets, new Map(), expandOptions);
|
|
148
236
|
output.output = assembleMessage(expansionResult);
|
|
149
237
|
logger.debug("Skill content expanded", {
|
|
150
238
|
tool: input.tool,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -9,14 +9,25 @@ export interface LoggingConfig {
|
|
|
9
9
|
/** Enable debug logging to file */
|
|
10
10
|
debug: boolean;
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Experimental features configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface ExperimentalConfig {
|
|
16
|
+
/** Enable skill rendering with <skill>name</skill> or <skill name="name" /> syntax */
|
|
17
|
+
skillRendering: boolean;
|
|
18
|
+
/** Enable <inject>...</inject> blocks for persistent context messages */
|
|
19
|
+
injectBlocks: boolean;
|
|
20
|
+
}
|
|
12
21
|
/**
|
|
13
22
|
* Configuration schema for the snippets plugin
|
|
14
23
|
*/
|
|
15
24
|
export interface SnippetsConfig {
|
|
16
25
|
/** Logging settings */
|
|
17
26
|
logging: LoggingConfig;
|
|
18
|
-
/**
|
|
19
|
-
|
|
27
|
+
/** Experimental features */
|
|
28
|
+
experimental: ExperimentalConfig;
|
|
29
|
+
/** Hide shell command in output, showing only the result */
|
|
30
|
+
hideCommandInOutput: boolean;
|
|
20
31
|
}
|
|
21
32
|
/**
|
|
22
33
|
* Load and merge configuration from global and project-specific config files
|
package/dist/src/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,OAAO,EAAE,aAAa,CAAC;IAEvB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sFAAsF;IACtF,cAAc,EAAE,OAAO,CAAC;IACxB,yEAAyE;IACzE,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,OAAO,EAAE,aAAa,CAAC;IAEvB,4BAA4B;IAC5B,YAAY,EAAE,kBAAkB,CAAC;IAEjC,4DAA4D;IAC5D,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAoHD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CA+B9D;AA0BD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D"}
|
package/dist/src/config.js
CHANGED
|
@@ -9,7 +9,11 @@ const DEFAULT_CONFIG = {
|
|
|
9
9
|
logging: {
|
|
10
10
|
debug: false,
|
|
11
11
|
},
|
|
12
|
-
|
|
12
|
+
experimental: {
|
|
13
|
+
skillRendering: false,
|
|
14
|
+
injectBlocks: false,
|
|
15
|
+
},
|
|
16
|
+
hideCommandInOutput: false,
|
|
13
17
|
};
|
|
14
18
|
/**
|
|
15
19
|
* Default config file content with comments explaining all options
|
|
@@ -27,12 +31,22 @@ const DEFAULT_CONFIG_CONTENT = `{
|
|
|
27
31
|
"debug": false
|
|
28
32
|
},
|
|
29
33
|
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
// Experimental features (may change or be removed)
|
|
35
|
+
"experimental": {
|
|
36
|
+
// Enable skill rendering with <skill>name</skill> or <skill name="name" /> syntax
|
|
37
|
+
// When enabled, skill tags are replaced with the skill's content body
|
|
38
|
+
// Skills are loaded from OpenCode's standard skill directories
|
|
39
|
+
// Values: true, false, "enabled", "disabled"
|
|
40
|
+
// Default: false
|
|
41
|
+
"skillRendering": false
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
// Hide shell command in snippet output
|
|
45
|
+
// When false (default), shell commands show as "$ command\\n--> output"
|
|
46
|
+
// When true, only the output is shown (matching OpenCode's slash command behavior)
|
|
33
47
|
// Values: true, false, "enabled", "disabled"
|
|
34
|
-
// Default:
|
|
35
|
-
"
|
|
48
|
+
// Default: false
|
|
49
|
+
"hideCommandInOutput": false
|
|
36
50
|
}
|
|
37
51
|
`;
|
|
38
52
|
/**
|
|
@@ -118,7 +132,8 @@ export function loadConfig(projectDir) {
|
|
|
118
132
|
}
|
|
119
133
|
logger.debug("Final config", {
|
|
120
134
|
loggingDebug: config.logging.debug,
|
|
121
|
-
|
|
135
|
+
experimentalSkillRendering: config.experimental.skillRendering,
|
|
136
|
+
hideCommandInOutput: config.hideCommandInOutput,
|
|
122
137
|
});
|
|
123
138
|
return config;
|
|
124
139
|
}
|
|
@@ -127,12 +142,18 @@ export function loadConfig(projectDir) {
|
|
|
127
142
|
*/
|
|
128
143
|
function mergeConfig(base, raw) {
|
|
129
144
|
const debugValue = normalizeBooleanSetting(raw.logging?.debug);
|
|
130
|
-
const
|
|
145
|
+
const skillRenderingValue = normalizeBooleanSetting(raw.experimental?.skillRendering);
|
|
146
|
+
const injectBlocksValue = normalizeBooleanSetting(raw.experimental?.injectBlocks);
|
|
147
|
+
const hideCommandValue = normalizeBooleanSetting(raw.hideCommandInOutput);
|
|
131
148
|
return {
|
|
132
149
|
logging: {
|
|
133
150
|
debug: debugValue !== undefined ? debugValue : base.logging.debug,
|
|
134
151
|
},
|
|
135
|
-
|
|
152
|
+
experimental: {
|
|
153
|
+
skillRendering: skillRenderingValue !== undefined ? skillRenderingValue : base.experimental.skillRendering,
|
|
154
|
+
injectBlocks: injectBlocksValue !== undefined ? injectBlocksValue : base.experimental.injectBlocks,
|
|
155
|
+
},
|
|
156
|
+
hideCommandInOutput: hideCommandValue !== undefined ? hideCommandValue : base.hideCommandInOutput,
|
|
136
157
|
};
|
|
137
158
|
}
|
|
138
159
|
/**
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/src/constants.d.ts
CHANGED
|
@@ -6,6 +6,13 @@ export declare const PATTERNS: {
|
|
|
6
6
|
readonly HASHTAG: RegExp;
|
|
7
7
|
/** Matches shell commands like !`command` */
|
|
8
8
|
readonly SHELL_COMMAND: RegExp;
|
|
9
|
+
/**
|
|
10
|
+
* Matches skill tags in two formats:
|
|
11
|
+
* 1. Self-closing: <skill name="skill-name" /> or <skill name='skill-name'/>
|
|
12
|
+
* 2. Block format: <skill>skill-name</skill>
|
|
13
|
+
*/
|
|
14
|
+
readonly SKILL_TAG_SELF_CLOSING: RegExp;
|
|
15
|
+
readonly SKILL_TAG_BLOCK: RegExp;
|
|
9
16
|
};
|
|
10
17
|
/**
|
|
11
18
|
* File system paths
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,QAAQ;IACnB,0CAA0C;;IAG1C,6CAA6C;;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,QAAQ;IACnB,0CAA0C;;IAG1C,6CAA6C;;IAG7C;;;;OAIG;;;CAGK,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,KAAK;IAChB,uCAAuC;;IAGvC,yBAAyB;;IAGzB,yBAAyB;;CAEjB,CAAC;AAEX;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM;;;EAMjD;AAED;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB,uCAAuC;;CAE/B,CAAC"}
|
package/dist/src/constants.js
CHANGED
|
@@ -8,6 +8,13 @@ export const PATTERNS = {
|
|
|
8
8
|
HASHTAG: /#([a-z0-9\-_]+)/gi,
|
|
9
9
|
/** Matches shell commands like !`command` */
|
|
10
10
|
SHELL_COMMAND: /!`([^`]+)`/g,
|
|
11
|
+
/**
|
|
12
|
+
* Matches skill tags in two formats:
|
|
13
|
+
* 1. Self-closing: <skill name="skill-name" /> or <skill name='skill-name'/>
|
|
14
|
+
* 2. Block format: <skill>skill-name</skill>
|
|
15
|
+
*/
|
|
16
|
+
SKILL_TAG_SELF_CLOSING: /<skill\s+name=["']([^"']+)["']\s*\/>/gi,
|
|
17
|
+
SKILL_TAG_BLOCK: /<skill>([^<]+)<\/skill>/gi,
|
|
11
18
|
};
|
|
12
19
|
/**
|
|
13
20
|
* File system paths
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,0CAA0C;IAC1C,OAAO,EAAE,mBAAmB;IAE5B,6CAA6C;IAC7C,aAAa,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,0CAA0C;IAC1C,OAAO,EAAE,mBAAmB;IAE5B,6CAA6C;IAC7C,aAAa,EAAE,aAAa;IAE5B;;;;OAIG;IACH,sBAAsB,EAAE,wCAAwC;IAChE,eAAe,EAAE,2BAA2B;CACpC,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,uCAAuC;IACvC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;IAElD,yBAAyB;IACzB,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC;IAE/D,yBAAyB;IACzB,kBAAkB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC;CAC7E,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5D,OAAO;QACL,YAAY,EAAE,UAAU;QACxB,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,uCAAuC;IACvC,iBAAiB,EAAE,KAAK;CAChB,CAAC"}
|