opencode-snippets 2.0.1 → 2.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/README.md +49 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -2
- package/dist/index.js.map +1 -1
- package/dist/src/commands.js +15 -8
- package/dist/src/commands.js.map +1 -1
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +12 -2
- package/dist/src/config.js.map +1 -1
- package/dist/src/constants.d.ts +6 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +6 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/expander.d.ts.map +1 -1
- package/dist/src/expander.js +4 -1
- package/dist/src/expander.js.map +1 -1
- package/dist/src/hook-types.d.ts +3 -0
- package/dist/src/hook-types.d.ts.map +1 -1
- package/dist/src/loader.d.ts.map +1 -1
- package/dist/src/loader.js +61 -25
- package/dist/src/loader.js.map +1 -1
- package/dist/src/skill-load-manager.d.ts +10 -0
- package/dist/src/skill-load-manager.d.ts.map +1 -0
- package/dist/src/skill-load-manager.js +30 -0
- package/dist/src/skill-load-manager.js.map +1 -0
- package/dist/src/skill-loader.d.ts +8 -1
- package/dist/src/skill-loader.d.ts.map +1 -1
- package/dist/src/skill-loader.js +66 -17
- package/dist/src/skill-loader.js.map +1 -1
- package/dist/src/skill-loading.d.ts +11 -0
- package/dist/src/skill-loading.d.ts.map +1 -0
- package/dist/src/skill-loading.js +122 -0
- package/dist/src/skill-loading.js.map +1 -0
- package/dist/src/tui-search.d.ts +2 -0
- package/dist/src/tui-search.d.ts.map +1 -1
- package/dist/src/tui-search.js +61 -16
- package/dist/src/tui-search.js.map +1 -1
- package/dist/src/tui-trigger.d.ts +4 -0
- package/dist/src/tui-trigger.d.ts.map +1 -1
- package/dist/src/tui-trigger.js +28 -0
- package/dist/src/tui-trigger.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.jsx +85 -30
- package/dist/tui.jsx.map +1 -1
- package/package.json +1 -1
- package/skill/snippets/SKILL.md +38 -6
package/dist/src/expander.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expander.js","sourceRoot":"","sources":["../../src/expander.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;GAEG;AACH,MAAM,mBAAmB,GAAG,EAAE,CAAC;AA6B/B,SAAS,QAAQ,CACf,SAAyB,EACzB,IAAe,EACf,WAAmB,EACnB,OAAe,EACf,aAAgD;IAEhD,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,GAAG,GAAG,GAAG,IAAI,SAAS,WAAW,CAAC,WAAW,EAAE,SAAS,OAAO,EAAE,CAAC;IACxE,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAEpC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE9B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,IAAY,EACZ,QAAyB,EACzB,eAAoC,EACpC,SAAyB,EACzB,OAAsB;IAEtB,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClC,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,UAAU,GAAG,IAAI,CAAC;IAEtB,OAAO,UAAU,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAC1B,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,QAAQ,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QAE/B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"expander.js","sourceRoot":"","sources":["../../src/expander.ts"],"names":[],"mappings":"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"}
|
package/dist/src/hook-types.d.ts
CHANGED
|
@@ -6,9 +6,11 @@ export interface MessagePart {
|
|
|
6
6
|
text?: string;
|
|
7
7
|
ignored?: boolean;
|
|
8
8
|
snippetsProcessed?: boolean;
|
|
9
|
+
skillLoads?: string[];
|
|
9
10
|
}
|
|
10
11
|
export interface ChatMessageInput {
|
|
11
12
|
sessionID: string;
|
|
13
|
+
messageID?: string;
|
|
12
14
|
}
|
|
13
15
|
export interface ChatMessageOutput {
|
|
14
16
|
message: {
|
|
@@ -17,6 +19,7 @@ export interface ChatMessageOutput {
|
|
|
17
19
|
parts: MessagePart[];
|
|
18
20
|
}
|
|
19
21
|
export interface TransformMessageInfo {
|
|
22
|
+
id?: string;
|
|
20
23
|
role: string;
|
|
21
24
|
sessionID?: string;
|
|
22
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-types.d.ts","sourceRoot":"","sources":["../../src/hook-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"hook-types.d.ts","sourceRoot":"","sources":["../../src/hook-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/src/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAsB,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAsB,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmCnF;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAqHD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,WAAW,EAAE,CAYrE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5E;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,EAC1D,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8B7F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,eAAe,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
package/dist/src/loader.js
CHANGED
|
@@ -1,9 +1,38 @@
|
|
|
1
|
-
import { readdir, unlink } from "node:fs/promises";
|
|
1
|
+
import { access, mkdir, readdir, unlink } from "node:fs/promises";
|
|
2
2
|
import { basename, join } from "node:path";
|
|
3
3
|
import { importCjs } from "./cjs-interop.js";
|
|
4
4
|
const matter = await importCjs("gray-matter");
|
|
5
|
-
import { CONFIG, PATHS } from "./constants.js";
|
|
5
|
+
import { CONFIG, getProjectPaths, PATHS } from "./constants.js";
|
|
6
6
|
import { logger } from "./logger.js";
|
|
7
|
+
function getGlobalSnippetDirs(globalDir) {
|
|
8
|
+
if (globalDir)
|
|
9
|
+
return [globalDir];
|
|
10
|
+
return [PATHS.SNIPPETS_DIR_ALT, PATHS.SNIPPETS_DIR];
|
|
11
|
+
}
|
|
12
|
+
function getProjectSnippetDirs(projectDir) {
|
|
13
|
+
const paths = getProjectPaths(projectDir);
|
|
14
|
+
return [paths.SNIPPETS_DIR_ALT, paths.SNIPPETS_DIR];
|
|
15
|
+
}
|
|
16
|
+
async function pathExists(path) {
|
|
17
|
+
try {
|
|
18
|
+
await access(path);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function resolveWritableSnippetDir(projectDir) {
|
|
26
|
+
const paths = projectDir
|
|
27
|
+
? getProjectPaths(projectDir)
|
|
28
|
+
: { SNIPPETS_DIR: PATHS.SNIPPETS_DIR, SNIPPETS_DIR_ALT: PATHS.SNIPPETS_DIR_ALT };
|
|
29
|
+
// Support both snippet/ and snippets/. Reuse an existing directory first, then default to snippet/.
|
|
30
|
+
for (const dir of [paths.SNIPPETS_DIR, paths.SNIPPETS_DIR_ALT]) {
|
|
31
|
+
if (await pathExists(dir))
|
|
32
|
+
return dir;
|
|
33
|
+
}
|
|
34
|
+
return paths.SNIPPETS_DIR;
|
|
35
|
+
}
|
|
7
36
|
/**
|
|
8
37
|
* Loads all snippets from global and project directories
|
|
9
38
|
*
|
|
@@ -13,13 +42,15 @@ import { logger } from "./logger.js";
|
|
|
13
42
|
*/
|
|
14
43
|
export async function loadSnippets(projectDir, globalDir) {
|
|
15
44
|
const snippets = new Map();
|
|
16
|
-
//
|
|
17
|
-
const
|
|
18
|
-
|
|
45
|
+
// Support both snippet/ and snippets/. Load plural first so existing snippet/ files still win.
|
|
46
|
+
for (const dir of getGlobalSnippetDirs(globalDir)) {
|
|
47
|
+
await loadFromDirectory(dir, snippets, "global");
|
|
48
|
+
}
|
|
19
49
|
// Load from project directory if provided (overrides global)
|
|
20
50
|
if (projectDir) {
|
|
21
|
-
const
|
|
22
|
-
|
|
51
|
+
for (const dir of getProjectSnippetDirs(projectDir)) {
|
|
52
|
+
await loadFromDirectory(dir, snippets, "project");
|
|
53
|
+
}
|
|
23
54
|
}
|
|
24
55
|
return snippets;
|
|
25
56
|
}
|
|
@@ -143,8 +174,7 @@ export function listSnippets(registry) {
|
|
|
143
174
|
* Ensures the snippets directory exists
|
|
144
175
|
*/
|
|
145
176
|
export async function ensureSnippetsDir(projectDir) {
|
|
146
|
-
const dir =
|
|
147
|
-
const { mkdir } = await import("node:fs/promises");
|
|
177
|
+
const dir = await resolveWritableSnippetDir(projectDir);
|
|
148
178
|
await mkdir(dir, { recursive: true });
|
|
149
179
|
return dir;
|
|
150
180
|
}
|
|
@@ -190,27 +220,33 @@ export async function createSnippet(name, content, options = {}, projectDir) {
|
|
|
190
220
|
export async function deleteSnippet(name, projectDir) {
|
|
191
221
|
// Try project directory first if provided
|
|
192
222
|
if (projectDir) {
|
|
193
|
-
const
|
|
223
|
+
const paths = getProjectPaths(projectDir);
|
|
224
|
+
for (const dir of [paths.SNIPPETS_DIR, paths.SNIPPETS_DIR_ALT]) {
|
|
225
|
+
const filePath = join(dir, `${name}${CONFIG.SNIPPET_EXTENSION}`);
|
|
226
|
+
try {
|
|
227
|
+
await unlink(filePath);
|
|
228
|
+
logger.info("Deleted project snippet", { name, path: filePath });
|
|
229
|
+
return filePath;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Not found in this project directory, keep looking.
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Try global directory
|
|
237
|
+
for (const dir of [PATHS.SNIPPETS_DIR, PATHS.SNIPPETS_DIR_ALT]) {
|
|
238
|
+
const filePath = join(dir, `${name}${CONFIG.SNIPPET_EXTENSION}`);
|
|
194
239
|
try {
|
|
195
|
-
await unlink(
|
|
196
|
-
logger.info("Deleted
|
|
197
|
-
return
|
|
240
|
+
await unlink(filePath);
|
|
241
|
+
logger.info("Deleted global snippet", { name, path: filePath });
|
|
242
|
+
return filePath;
|
|
198
243
|
}
|
|
199
244
|
catch {
|
|
200
|
-
// Not found in
|
|
245
|
+
// Not found in this global directory, keep looking.
|
|
201
246
|
}
|
|
202
247
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
try {
|
|
206
|
-
await unlink(globalPath);
|
|
207
|
-
logger.info("Deleted global snippet", { name, path: globalPath });
|
|
208
|
-
return globalPath;
|
|
209
|
-
}
|
|
210
|
-
catch {
|
|
211
|
-
logger.warn("Snippet not found for deletion", { name });
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
248
|
+
logger.warn("Snippet not found for deletion", { name });
|
|
249
|
+
return null;
|
|
214
250
|
}
|
|
215
251
|
/**
|
|
216
252
|
* Reloads snippets into the registry from disk
|
package/dist/src/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class SkillLoadManager {
|
|
2
|
+
private loads;
|
|
3
|
+
private pending;
|
|
4
|
+
register(sessionID: string, messageID: string, payloads: string[]): void;
|
|
5
|
+
queue(sessionID: string, payloads: string[]): void;
|
|
6
|
+
get(sessionID: string, messageID: string): string[];
|
|
7
|
+
drainPending(sessionID: string): string[][];
|
|
8
|
+
private getOrCreateSession;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=skill-load-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-load-manager.d.ts","sourceRoot":"","sources":["../../src/skill-load-manager.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,OAAO,CAAiC;IAEhD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAKxE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAMlD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAInD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE;IAM3C,OAAO,CAAC,kBAAkB;CAQ3B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class SkillLoadManager {
|
|
2
|
+
loads = new Map();
|
|
3
|
+
pending = new Map();
|
|
4
|
+
register(sessionID, messageID, payloads) {
|
|
5
|
+
const session = this.getOrCreateSession(sessionID);
|
|
6
|
+
session.set(messageID, [...payloads]);
|
|
7
|
+
}
|
|
8
|
+
queue(sessionID, payloads) {
|
|
9
|
+
const session = this.pending.get(sessionID) || [];
|
|
10
|
+
session.push([...payloads]);
|
|
11
|
+
this.pending.set(sessionID, session);
|
|
12
|
+
}
|
|
13
|
+
get(sessionID, messageID) {
|
|
14
|
+
return [...(this.loads.get(sessionID)?.get(messageID) || [])];
|
|
15
|
+
}
|
|
16
|
+
drainPending(sessionID) {
|
|
17
|
+
const queued = this.pending.get(sessionID) || [];
|
|
18
|
+
this.pending.delete(sessionID);
|
|
19
|
+
return queued.map((payloads) => [...payloads]);
|
|
20
|
+
}
|
|
21
|
+
getOrCreateSession(sessionID) {
|
|
22
|
+
const existing = this.loads.get(sessionID);
|
|
23
|
+
if (existing)
|
|
24
|
+
return existing;
|
|
25
|
+
const created = new Map();
|
|
26
|
+
this.loads.set(sessionID, created);
|
|
27
|
+
return created;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=skill-load-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-load-manager.js","sourceRoot":"","sources":["../../src/skill-load-manager.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IACjD,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEhD,QAAQ,CAAC,SAAiB,EAAE,SAAiB,EAAE,QAAkB;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,QAAkB;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,SAAiB,EAAE,SAAiB;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACjD,CAAC;IAEO,kBAAkB,CAAC,SAAiB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -17,13 +17,20 @@ export interface SkillInfo {
|
|
|
17
17
|
* Skill registry that maps skill names to their info
|
|
18
18
|
*/
|
|
19
19
|
export type SkillRegistry = Map<string, SkillInfo>;
|
|
20
|
+
/**
|
|
21
|
+
* Loader options used by tests to point skill discovery at temp homes.
|
|
22
|
+
*/
|
|
23
|
+
export interface LoadSkillsOptions {
|
|
24
|
+
homeDir?: string;
|
|
25
|
+
}
|
|
20
26
|
/**
|
|
21
27
|
* Loads all skills from global and project directories
|
|
22
28
|
*
|
|
23
29
|
* @param projectDir - Optional project directory path
|
|
30
|
+
* @param options - Test-only overrides for discovery roots
|
|
24
31
|
* @returns A map of skill names (lowercase) to their SkillInfo
|
|
25
32
|
*/
|
|
26
|
-
export declare function loadSkills(projectDir?: string): Promise<SkillRegistry>;
|
|
33
|
+
export declare function loadSkills(projectDir?: string, options?: LoadSkillsOptions): Promise<SkillRegistry>;
|
|
27
34
|
/**
|
|
28
35
|
* Gets a skill by name from the registry
|
|
29
36
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+ED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,aAAa,CAAC,CAmBxB;AA2ED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAErF"}
|
package/dist/src/skill-loader.js
CHANGED
|
@@ -1,48 +1,97 @@
|
|
|
1
|
-
import { readdir } from "node:fs/promises";
|
|
1
|
+
import { readdir, stat } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { importCjs } from "./cjs-interop.js";
|
|
5
5
|
const matter = await importCjs("gray-matter");
|
|
6
6
|
import { logger } from "./logger.js";
|
|
7
7
|
/**
|
|
8
|
-
* OpenCode skill directory patterns
|
|
8
|
+
* OpenCode skill directory patterns.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* -
|
|
10
|
+
* User requirement: keep behavior aligned with current OpenCode skill discovery.
|
|
11
|
+
* During the 2026-04 parity audit, the archived `opencode-ai/opencode` repo did not
|
|
12
|
+
* contain the modern skill loader, so the authoritative reference was the live docs:
|
|
13
|
+
* https://opencode.ai/docs/skills/
|
|
14
|
+
*
|
|
15
|
+
* Official paths from current OpenCode docs:
|
|
12
16
|
* - ~/.config/opencode/skills/<name>/SKILL.md
|
|
17
|
+
* - ~/.claude/skills/<name>/SKILL.md
|
|
18
|
+
* - ~/.agents/skills/<name>/SKILL.md
|
|
19
|
+
* - .opencode/skills/<name>/SKILL.md
|
|
20
|
+
* - .claude/skills/<name>/SKILL.md
|
|
21
|
+
* - .agents/skills/<name>/SKILL.md
|
|
13
22
|
*
|
|
14
|
-
*
|
|
23
|
+
* Compatibility paths we intentionally keep because this repo and local setup still use them:
|
|
24
|
+
* - ~/.config/opencode/skill/<name>/SKILL.md
|
|
15
25
|
* - .opencode/skill/<name>/SKILL.md
|
|
16
|
-
*
|
|
17
|
-
*
|
|
26
|
+
*
|
|
27
|
+
* Compatibility paths are loaded before the official `.opencode/skills` variants so the
|
|
28
|
+
* documented OpenCode locations still win if both singular and plural exist side by side.
|
|
18
29
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
30
|
+
function getGlobalSkillDirs(homeDir = homedir()) {
|
|
31
|
+
return [
|
|
32
|
+
join(homeDir, ".config", "opencode", "skill"),
|
|
33
|
+
join(homeDir, ".config", "opencode", "skills"),
|
|
34
|
+
join(homeDir, ".claude", "skills"),
|
|
35
|
+
join(homeDir, ".agents", "skills"),
|
|
36
|
+
];
|
|
37
|
+
}
|
|
23
38
|
function getProjectSkillDirs(projectDir) {
|
|
24
39
|
return [
|
|
25
40
|
join(projectDir, ".opencode", "skill"),
|
|
26
41
|
join(projectDir, ".opencode", "skills"),
|
|
27
42
|
join(projectDir, ".claude", "skills"),
|
|
43
|
+
join(projectDir, ".agents", "skills"),
|
|
28
44
|
];
|
|
29
45
|
}
|
|
46
|
+
async function exists(path) {
|
|
47
|
+
try {
|
|
48
|
+
await stat(path);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* OpenCode walks upward from the current working directory until the git worktree.
|
|
57
|
+
* We mirror that so nested apps can inherit repo-root skills while still allowing
|
|
58
|
+
* closer directories to override farther ones.
|
|
59
|
+
*/
|
|
60
|
+
async function getProjectSearchRoots(projectDir) {
|
|
61
|
+
const roots = [];
|
|
62
|
+
let dir = resolve(projectDir);
|
|
63
|
+
while (true) {
|
|
64
|
+
roots.push(dir);
|
|
65
|
+
if (await exists(join(dir, ".git"))) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
const parent = dirname(dir);
|
|
69
|
+
if (parent === dir) {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
dir = parent;
|
|
73
|
+
}
|
|
74
|
+
return roots.reverse();
|
|
75
|
+
}
|
|
30
76
|
/**
|
|
31
77
|
* Loads all skills from global and project directories
|
|
32
78
|
*
|
|
33
79
|
* @param projectDir - Optional project directory path
|
|
80
|
+
* @param options - Test-only overrides for discovery roots
|
|
34
81
|
* @returns A map of skill names (lowercase) to their SkillInfo
|
|
35
82
|
*/
|
|
36
|
-
export async function loadSkills(projectDir) {
|
|
83
|
+
export async function loadSkills(projectDir, options = {}) {
|
|
37
84
|
const skills = new Map();
|
|
38
85
|
// Load from global directories first
|
|
39
|
-
for (const dir of
|
|
86
|
+
for (const dir of getGlobalSkillDirs(options.homeDir)) {
|
|
40
87
|
await loadFromDirectory(dir, skills, "global");
|
|
41
88
|
}
|
|
42
|
-
// Load from project directories
|
|
89
|
+
// Load from project directories from git root -> cwd so nearer paths override farther ones.
|
|
43
90
|
if (projectDir) {
|
|
44
|
-
for (const
|
|
45
|
-
|
|
91
|
+
for (const root of await getProjectSearchRoots(projectDir)) {
|
|
92
|
+
for (const dir of getProjectSkillDirs(root)) {
|
|
93
|
+
await loadFromDirectory(dir, skills, "project");
|
|
94
|
+
}
|
|
46
95
|
}
|
|
47
96
|
}
|
|
48
97
|
logger.debug("Skills loaded", { count: skills.size });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SkillRegistry } from "./skill-loader.js";
|
|
2
|
+
import type { SnippetRegistry } from "./types.js";
|
|
3
|
+
export interface SkillLoadResult {
|
|
4
|
+
text: string;
|
|
5
|
+
payloads: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function expandSkillLoads(text: string, registry: SkillRegistry, snippets: SnippetRegistry, options: {
|
|
8
|
+
expandSkillTagsInContent: boolean;
|
|
9
|
+
extractInject: boolean;
|
|
10
|
+
}): Promise<SkillLoadResult>;
|
|
11
|
+
//# sourceMappingURL=skill-loading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loading.d.ts","sourceRoot":"","sources":["../../src/skill-loading.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE;IACP,wBAAwB,EAAE,OAAO,CAAC;IAClC,aAAa,EAAE,OAAO,CAAC;CACxB,GACA,OAAO,CAAC,eAAe,CAAC,CAsC1B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { PATTERNS } from "./constants.js";
|
|
5
|
+
import { assembleMessage, expandHashtags } from "./expander.js";
|
|
6
|
+
import { logger } from "./logger.js";
|
|
7
|
+
import { getSkill } from "./skill-loader.js";
|
|
8
|
+
import { expandSkillTags } from "./skill-renderer.js";
|
|
9
|
+
const SKILL_FILE_LIMIT = 10;
|
|
10
|
+
function visibleSkillLoad(skill) {
|
|
11
|
+
return `↳ Loaded ${skill.name}`;
|
|
12
|
+
}
|
|
13
|
+
function pluginNote(skill, marker) {
|
|
14
|
+
return `Plugin note: \`${marker}\` is not instruction. Do not call \`skill\` again for ${skill.name}.`;
|
|
15
|
+
}
|
|
16
|
+
export async function expandSkillLoads(text, registry, snippets, options) {
|
|
17
|
+
PATTERNS.SKILL_LOAD.lastIndex = 0;
|
|
18
|
+
const matches = [...text.matchAll(PATTERNS.SKILL_LOAD)];
|
|
19
|
+
if (matches.length === 0) {
|
|
20
|
+
return { text, payloads: [] };
|
|
21
|
+
}
|
|
22
|
+
let result = "";
|
|
23
|
+
let lastIndex = 0;
|
|
24
|
+
const payloads = [];
|
|
25
|
+
for (const match of matches) {
|
|
26
|
+
const index = match.index ?? 0;
|
|
27
|
+
const token = match[0];
|
|
28
|
+
const parsed = parseSkillName(match[1]);
|
|
29
|
+
result += text.slice(lastIndex, index);
|
|
30
|
+
lastIndex = index + token.length;
|
|
31
|
+
if (!parsed) {
|
|
32
|
+
result += token;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const skill = getSkill(registry, parsed);
|
|
36
|
+
if (!skill) {
|
|
37
|
+
logger.warn(`Skill not found: '${parsed}', leaving syntax unchanged`);
|
|
38
|
+
result += token;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const marker = visibleSkillLoad(skill);
|
|
42
|
+
payloads.push(await buildSkillPayload(skill, registry, snippets, marker, options));
|
|
43
|
+
result += marker;
|
|
44
|
+
}
|
|
45
|
+
result += text.slice(lastIndex);
|
|
46
|
+
return { text: result, payloads };
|
|
47
|
+
}
|
|
48
|
+
function parseSkillName(input) {
|
|
49
|
+
if (!input)
|
|
50
|
+
return null;
|
|
51
|
+
const trimmed = input.trim();
|
|
52
|
+
if (!trimmed)
|
|
53
|
+
return null;
|
|
54
|
+
const quote = trimmed[0];
|
|
55
|
+
if ((quote === '"' || quote === "'") && trimmed.at(-1) === quote) {
|
|
56
|
+
const inner = trimmed.slice(1, -1).trim();
|
|
57
|
+
return inner || null;
|
|
58
|
+
}
|
|
59
|
+
return trimmed;
|
|
60
|
+
}
|
|
61
|
+
async function buildSkillPayload(skill, registry, snippets, marker, options) {
|
|
62
|
+
const dir = dirname(skill.filePath);
|
|
63
|
+
const base = pathToFileURL(dir).href;
|
|
64
|
+
const files = await listSkillFiles(dir, SKILL_FILE_LIMIT);
|
|
65
|
+
const content = renderSkillContent(skill.content, registry, snippets, options);
|
|
66
|
+
return [
|
|
67
|
+
`<skill_content name="${skill.name}">`,
|
|
68
|
+
// User requirement: repeat the exact visible marker in hidden context so the
|
|
69
|
+
// model treats `↳ Loaded ...` as already-resolved state, not as a new tool request.
|
|
70
|
+
pluginNote(skill, marker),
|
|
71
|
+
"",
|
|
72
|
+
`# Skill: ${skill.name}`,
|
|
73
|
+
"",
|
|
74
|
+
content,
|
|
75
|
+
"",
|
|
76
|
+
`Base directory for this skill: ${base}`,
|
|
77
|
+
"Relative paths in this skill (e.g., scripts/, reference/) are relative to this base directory.",
|
|
78
|
+
"Note: file list is sampled.",
|
|
79
|
+
"",
|
|
80
|
+
"<skill_files>",
|
|
81
|
+
files.map((file) => `<file>${file}</file>`).join("\n"),
|
|
82
|
+
"</skill_files>",
|
|
83
|
+
"</skill_content>",
|
|
84
|
+
].join("\n");
|
|
85
|
+
}
|
|
86
|
+
function renderSkillContent(content, registry, snippets, options) {
|
|
87
|
+
let processed = content;
|
|
88
|
+
if (options.expandSkillTagsInContent) {
|
|
89
|
+
processed = expandSkillTags(processed, registry);
|
|
90
|
+
}
|
|
91
|
+
const expandOptions = {
|
|
92
|
+
extractInject: options.extractInject,
|
|
93
|
+
};
|
|
94
|
+
return assembleMessage(expandHashtags(processed, snippets, new Map(), expandOptions));
|
|
95
|
+
}
|
|
96
|
+
async function listSkillFiles(dir, limit) {
|
|
97
|
+
const files = [];
|
|
98
|
+
await walkSkillFiles(dir, files, limit);
|
|
99
|
+
return files;
|
|
100
|
+
}
|
|
101
|
+
async function walkSkillFiles(dir, files, limit) {
|
|
102
|
+
if (files.length >= limit)
|
|
103
|
+
return;
|
|
104
|
+
const entries = await readdir(dir, { withFileTypes: true, encoding: "utf8" }).catch(() => null);
|
|
105
|
+
if (!entries)
|
|
106
|
+
return;
|
|
107
|
+
for (const entry of entries.toSorted((a, b) => a.name.localeCompare(b.name))) {
|
|
108
|
+
if (files.length >= limit)
|
|
109
|
+
return;
|
|
110
|
+
const filePath = resolve(dir, entry.name);
|
|
111
|
+
if (entry.isDirectory()) {
|
|
112
|
+
await walkSkillFiles(filePath, files, limit);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (!entry.isFile())
|
|
116
|
+
continue;
|
|
117
|
+
if (filePath.includes("SKILL.md"))
|
|
118
|
+
continue;
|
|
119
|
+
files.push(filePath);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=skill-loading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loading.js","sourceRoot":"","sources":["../../src/skill-loading.ts"],"names":[],"mappings":"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"}
|
package/dist/src/tui-search.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import type { SkillInfo } from "./skill-loader.js";
|
|
1
2
|
import type { SnippetInfo } from "./types.js";
|
|
2
3
|
export interface HighlightPart {
|
|
3
4
|
text: string;
|
|
4
5
|
match: boolean;
|
|
5
6
|
}
|
|
6
7
|
export declare function filterSnippets(snippets: SnippetInfo[], query: string): SnippetInfo[];
|
|
8
|
+
export declare function filterSkills(skills: SkillInfo[], query: string): SkillInfo[];
|
|
7
9
|
export declare function matchedAliases(snippet: SnippetInfo, query: string): string[];
|
|
8
10
|
export declare function snippetDescription(snippet: SnippetInfo): string;
|
|
9
11
|
export declare function highlightMatches(input: string, query: string): HighlightPart[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-search.d.ts","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"tui-search.d.ts","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AA+DD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBpF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAgB5E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CA0B9E"}
|