@zenobius/opencode-skillful 1.2.1 → 1.2.2
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/dist/index.js +214 -28
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -22994,22 +22994,27 @@ async function getPluginConfig(ctx) {
|
|
|
22994
22994
|
|
|
22995
22995
|
// src/lib/renderers/JsonPromptRenderer.ts
|
|
22996
22996
|
var createJsonPromptRenderer = () => {
|
|
22997
|
-
const
|
|
22998
|
-
|
|
22999
|
-
|
|
23000
|
-
|
|
23001
|
-
|
|
23002
|
-
format,
|
|
23003
|
-
render
|
|
22997
|
+
const renderer = {
|
|
22998
|
+
format: "json",
|
|
22999
|
+
render(args) {
|
|
23000
|
+
return JSON.stringify({ [args.type]: args.data }, null, 2);
|
|
23001
|
+
}
|
|
23004
23002
|
};
|
|
23003
|
+
return renderer;
|
|
23005
23004
|
};
|
|
23006
23005
|
|
|
23007
23006
|
// src/lib/xml.ts
|
|
23008
23007
|
function escapeXml(str2) {
|
|
23009
23008
|
return String(str2).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
23010
23009
|
}
|
|
23010
|
+
function mapToObject(map2) {
|
|
23011
|
+
return Object.fromEntries(map2.entries());
|
|
23012
|
+
}
|
|
23011
23013
|
function jsonToXml(json2, rootElement = "root") {
|
|
23012
23014
|
let xml = `<${rootElement}>`;
|
|
23015
|
+
if (json2 instanceof Map) {
|
|
23016
|
+
return jsonToXml(mapToObject(json2), rootElement);
|
|
23017
|
+
}
|
|
23013
23018
|
for (const key in json2) {
|
|
23014
23019
|
if (!Object.hasOwn(json2, key)) {
|
|
23015
23020
|
continue;
|
|
@@ -23022,6 +23027,8 @@ function jsonToXml(json2, rootElement = "root") {
|
|
|
23022
23027
|
for (const item of value) {
|
|
23023
23028
|
xml += jsonToXml(item, key);
|
|
23024
23029
|
}
|
|
23030
|
+
} else if (value instanceof Map) {
|
|
23031
|
+
xml += jsonToXml(mapToObject(value), key);
|
|
23025
23032
|
} else if (typeof value === "object" && value !== null) {
|
|
23026
23033
|
xml += jsonToXml(value, key);
|
|
23027
23034
|
} else if (value !== undefined && value !== null) {
|
|
@@ -23034,21 +23041,174 @@ function jsonToXml(json2, rootElement = "root") {
|
|
|
23034
23041
|
return xml;
|
|
23035
23042
|
}
|
|
23036
23043
|
|
|
23044
|
+
// src/lib/renderers/resourceMapToArray.ts
|
|
23045
|
+
var resourceMapToArray = (resources) => {
|
|
23046
|
+
return Array.from(resources.entries()).map(([relativePath, data]) => ({
|
|
23047
|
+
relativePath,
|
|
23048
|
+
...data
|
|
23049
|
+
}));
|
|
23050
|
+
};
|
|
23051
|
+
|
|
23037
23052
|
// src/lib/renderers/XmlPromptRenderer.ts
|
|
23038
23053
|
var createXmlPromptRenderer = () => {
|
|
23039
|
-
const
|
|
23040
|
-
|
|
23041
|
-
|
|
23054
|
+
const prepareSkill = (skill) => {
|
|
23055
|
+
return {
|
|
23056
|
+
...skill,
|
|
23057
|
+
references: resourceMapToArray(skill.references),
|
|
23058
|
+
scripts: resourceMapToArray(skill.scripts),
|
|
23059
|
+
assets: resourceMapToArray(skill.assets)
|
|
23060
|
+
};
|
|
23042
23061
|
};
|
|
23043
|
-
|
|
23044
|
-
|
|
23045
|
-
|
|
23062
|
+
const prepareResource = (resource) => {
|
|
23063
|
+
return resource;
|
|
23064
|
+
};
|
|
23065
|
+
const prepareSearchResult = (result) => {
|
|
23066
|
+
return result;
|
|
23067
|
+
};
|
|
23068
|
+
const renderer = {
|
|
23069
|
+
format: "xml",
|
|
23070
|
+
render(args) {
|
|
23071
|
+
const rootElement = args.type || "root";
|
|
23072
|
+
if (args.type === "Skill") {
|
|
23073
|
+
return jsonToXml(prepareSkill(args.data), rootElement);
|
|
23074
|
+
}
|
|
23075
|
+
if (args.type === "SkillResource") {
|
|
23076
|
+
return jsonToXml(prepareResource(args.data), rootElement);
|
|
23077
|
+
}
|
|
23078
|
+
if (args.type === "SkillSearchResults") {
|
|
23079
|
+
return jsonToXml(prepareSearchResult(args.data), rootElement);
|
|
23080
|
+
}
|
|
23081
|
+
return jsonToXml({}, rootElement);
|
|
23082
|
+
}
|
|
23046
23083
|
};
|
|
23084
|
+
return renderer;
|
|
23047
23085
|
};
|
|
23048
23086
|
|
|
23087
|
+
// node_modules/dedent/dist/dedent.mjs
|
|
23088
|
+
function ownKeys(object2, enumerableOnly) {
|
|
23089
|
+
var keys = Object.keys(object2);
|
|
23090
|
+
if (Object.getOwnPropertySymbols) {
|
|
23091
|
+
var symbols = Object.getOwnPropertySymbols(object2);
|
|
23092
|
+
enumerableOnly && (symbols = symbols.filter(function(sym) {
|
|
23093
|
+
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
|
|
23094
|
+
})), keys.push.apply(keys, symbols);
|
|
23095
|
+
}
|
|
23096
|
+
return keys;
|
|
23097
|
+
}
|
|
23098
|
+
function _objectSpread(target) {
|
|
23099
|
+
for (var i = 1;i < arguments.length; i++) {
|
|
23100
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
23101
|
+
i % 2 ? ownKeys(Object(source), true).forEach(function(key) {
|
|
23102
|
+
_defineProperty(target, key, source[key]);
|
|
23103
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key) {
|
|
23104
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
23105
|
+
});
|
|
23106
|
+
}
|
|
23107
|
+
return target;
|
|
23108
|
+
}
|
|
23109
|
+
function _defineProperty(obj, key, value) {
|
|
23110
|
+
key = _toPropertyKey(key);
|
|
23111
|
+
if (key in obj) {
|
|
23112
|
+
Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
|
|
23113
|
+
} else {
|
|
23114
|
+
obj[key] = value;
|
|
23115
|
+
}
|
|
23116
|
+
return obj;
|
|
23117
|
+
}
|
|
23118
|
+
function _toPropertyKey(arg) {
|
|
23119
|
+
var key = _toPrimitive(arg, "string");
|
|
23120
|
+
return typeof key === "symbol" ? key : String(key);
|
|
23121
|
+
}
|
|
23122
|
+
function _toPrimitive(input, hint) {
|
|
23123
|
+
if (typeof input !== "object" || input === null)
|
|
23124
|
+
return input;
|
|
23125
|
+
var prim = input[Symbol.toPrimitive];
|
|
23126
|
+
if (prim !== undefined) {
|
|
23127
|
+
var res = prim.call(input, hint || "default");
|
|
23128
|
+
if (typeof res !== "object")
|
|
23129
|
+
return res;
|
|
23130
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
23131
|
+
}
|
|
23132
|
+
return (hint === "string" ? String : Number)(input);
|
|
23133
|
+
}
|
|
23134
|
+
var dedent = createDedent({});
|
|
23135
|
+
var dedent_default = dedent;
|
|
23136
|
+
function createDedent(options3) {
|
|
23137
|
+
dedent2.withOptions = (newOptions) => createDedent(_objectSpread(_objectSpread({}, options3), newOptions));
|
|
23138
|
+
return dedent2;
|
|
23139
|
+
function dedent2(strings, ...values) {
|
|
23140
|
+
const raw = typeof strings === "string" ? [strings] : strings.raw;
|
|
23141
|
+
const {
|
|
23142
|
+
alignValues = false,
|
|
23143
|
+
escapeSpecialCharacters = Array.isArray(strings),
|
|
23144
|
+
trimWhitespace = true
|
|
23145
|
+
} = options3;
|
|
23146
|
+
let result = "";
|
|
23147
|
+
for (let i = 0;i < raw.length; i++) {
|
|
23148
|
+
let next = raw[i];
|
|
23149
|
+
if (escapeSpecialCharacters) {
|
|
23150
|
+
next = next.replace(/\\\n[ \t]*/g, "").replace(/\\`/g, "`").replace(/\\\$/g, "$").replace(/\\\{/g, "{");
|
|
23151
|
+
}
|
|
23152
|
+
result += next;
|
|
23153
|
+
if (i < values.length) {
|
|
23154
|
+
const value = alignValues ? alignValue(values[i], result) : values[i];
|
|
23155
|
+
result += value;
|
|
23156
|
+
}
|
|
23157
|
+
}
|
|
23158
|
+
const lines = result.split(`
|
|
23159
|
+
`);
|
|
23160
|
+
let mindent = null;
|
|
23161
|
+
for (const l of lines) {
|
|
23162
|
+
const m = l.match(/^(\s+)\S+/);
|
|
23163
|
+
if (m) {
|
|
23164
|
+
const indent = m[1].length;
|
|
23165
|
+
if (!mindent) {
|
|
23166
|
+
mindent = indent;
|
|
23167
|
+
} else {
|
|
23168
|
+
mindent = Math.min(mindent, indent);
|
|
23169
|
+
}
|
|
23170
|
+
}
|
|
23171
|
+
}
|
|
23172
|
+
if (mindent !== null) {
|
|
23173
|
+
const m = mindent;
|
|
23174
|
+
result = lines.map((l) => l[0] === " " || l[0] === "\t" ? l.slice(m) : l).join(`
|
|
23175
|
+
`);
|
|
23176
|
+
}
|
|
23177
|
+
if (trimWhitespace) {
|
|
23178
|
+
result = result.trim();
|
|
23179
|
+
}
|
|
23180
|
+
if (escapeSpecialCharacters) {
|
|
23181
|
+
result = result.replace(/\\n/g, `
|
|
23182
|
+
`);
|
|
23183
|
+
}
|
|
23184
|
+
if (typeof Bun !== "undefined") {
|
|
23185
|
+
result = result.replace(/\\u(?:\{([\da-fA-F]{1,6})\}|([\da-fA-F]{4}))/g, (_, braced, unbraced) => {
|
|
23186
|
+
var _ref;
|
|
23187
|
+
const hex3 = (_ref = braced !== null && braced !== undefined ? braced : unbraced) !== null && _ref !== undefined ? _ref : "";
|
|
23188
|
+
return String.fromCodePoint(parseInt(hex3, 16));
|
|
23189
|
+
});
|
|
23190
|
+
}
|
|
23191
|
+
return result;
|
|
23192
|
+
}
|
|
23193
|
+
}
|
|
23194
|
+
function alignValue(value, precedingText) {
|
|
23195
|
+
if (typeof value !== "string" || !value.includes(`
|
|
23196
|
+
`)) {
|
|
23197
|
+
return value;
|
|
23198
|
+
}
|
|
23199
|
+
const currentLine = precedingText.slice(precedingText.lastIndexOf(`
|
|
23200
|
+
`) + 1);
|
|
23201
|
+
const indentMatch = currentLine.match(/^(\s+)/);
|
|
23202
|
+
if (indentMatch) {
|
|
23203
|
+
const indent = indentMatch[1];
|
|
23204
|
+
return value.replace(/\n/g, `
|
|
23205
|
+
${indent}`);
|
|
23206
|
+
}
|
|
23207
|
+
return value;
|
|
23208
|
+
}
|
|
23209
|
+
|
|
23049
23210
|
// src/lib/renderers/MdPromptRenderer.ts
|
|
23050
23211
|
var createMdPromptRenderer = () => {
|
|
23051
|
-
const format = "md";
|
|
23052
23212
|
const renderObject = (obj, headingLevel, indentLevel = 0) => {
|
|
23053
23213
|
const entries = Object.entries(obj);
|
|
23054
23214
|
let output = "";
|
|
@@ -23114,25 +23274,51 @@ var createMdPromptRenderer = () => {
|
|
|
23114
23274
|
const htmlEscape = (value) => {
|
|
23115
23275
|
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
23116
23276
|
};
|
|
23117
|
-
const
|
|
23118
|
-
|
|
23119
|
-
|
|
23277
|
+
const renderSkill = (skill) => {
|
|
23278
|
+
return dedent_default`
|
|
23279
|
+
# ${skill.name}
|
|
23280
|
+
|
|
23281
|
+
${skill.content}
|
|
23120
23282
|
|
|
23121
|
-
|
|
23283
|
+
## Metadata
|
|
23122
23284
|
|
|
23123
|
-
${
|
|
23285
|
+
${skill.metadata ? renderObject(skill.metadata, 3) : ""}
|
|
23286
|
+
|
|
23287
|
+
## References
|
|
23124
23288
|
|
|
23125
|
-
|
|
23289
|
+
${skill.references ? renderArray(resourceMapToArray(skill.references), 1) : ""}
|
|
23126
23290
|
|
|
23127
|
-
|
|
23291
|
+
## Scripts
|
|
23128
23292
|
|
|
23129
|
-
|
|
23293
|
+
${skill.scripts ? renderArray(resourceMapToArray(skill.scripts), 1) : ""}
|
|
23294
|
+
|
|
23295
|
+
## Assets
|
|
23296
|
+
|
|
23297
|
+
${skill.assets ? renderArray(resourceMapToArray(skill.assets), 1) : ""}
|
|
23130
23298
|
`;
|
|
23131
23299
|
};
|
|
23132
|
-
|
|
23133
|
-
|
|
23134
|
-
|
|
23300
|
+
const renderResource = (resource) => {
|
|
23301
|
+
return renderObject(resource, 3);
|
|
23302
|
+
};
|
|
23303
|
+
const renderSearchResult = (result) => {
|
|
23304
|
+
return renderObject(result, 3);
|
|
23305
|
+
};
|
|
23306
|
+
const renderer = {
|
|
23307
|
+
format: "md",
|
|
23308
|
+
render(args) {
|
|
23309
|
+
if (args.type === "Skill") {
|
|
23310
|
+
return renderSkill(args.data);
|
|
23311
|
+
}
|
|
23312
|
+
if (args.type === "SkillResource") {
|
|
23313
|
+
return renderResource(args.data);
|
|
23314
|
+
}
|
|
23315
|
+
if (args.type === "SkillSearchResults") {
|
|
23316
|
+
return renderSearchResult(args.data);
|
|
23317
|
+
}
|
|
23318
|
+
return renderObject({}, 3);
|
|
23319
|
+
}
|
|
23135
23320
|
};
|
|
23321
|
+
return renderer;
|
|
23136
23322
|
};
|
|
23137
23323
|
|
|
23138
23324
|
// src/lib/createPromptRenderer.ts
|
|
@@ -23264,7 +23450,7 @@ var SkillsPlugin = async (ctx) => {
|
|
|
23264
23450
|
const renderer = promptRenderer.getFormatter(format);
|
|
23265
23451
|
const results = await api2.loadSkill(args.skill_names);
|
|
23266
23452
|
for await (const skill of results.loaded) {
|
|
23267
|
-
await sendPrompt(renderer(skill, "Skill"), {
|
|
23453
|
+
await sendPrompt(renderer({ data: skill, type: "Skill" }), {
|
|
23268
23454
|
sessionId: toolCtx.sessionID
|
|
23269
23455
|
});
|
|
23270
23456
|
}
|
|
@@ -23290,7 +23476,7 @@ var SkillsPlugin = async (ctx) => {
|
|
|
23290
23476
|
});
|
|
23291
23477
|
const renderer = promptRenderer.getFormatter(format);
|
|
23292
23478
|
const results = await api2.findSkills(args);
|
|
23293
|
-
const output = renderer(results, "SkillSearchResults");
|
|
23479
|
+
const output = renderer({ data: results, type: "SkillSearchResults" });
|
|
23294
23480
|
return output;
|
|
23295
23481
|
}
|
|
23296
23482
|
}),
|
|
@@ -23314,7 +23500,7 @@ var SkillsPlugin = async (ctx) => {
|
|
|
23314
23500
|
if (!result.injection) {
|
|
23315
23501
|
throw new Error("Failed to read resource");
|
|
23316
23502
|
}
|
|
23317
|
-
await sendPrompt(renderer(result.injection, "
|
|
23503
|
+
await sendPrompt(renderer({ data: result.injection, type: "SkillResource" }), {
|
|
23318
23504
|
sessionId: toolCtx.sessionID
|
|
23319
23505
|
});
|
|
23320
23506
|
return JSON.stringify({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenobius/opencode-skillful",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "OpenCode Skills Plugin - Anthropic Agent Skills Specification implementation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "src/index.ts",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@opencode-ai/plugin": "1.0.85",
|
|
23
23
|
"bunfig": "^0.15.6",
|
|
24
|
+
"dedent": "^1.7.1",
|
|
24
25
|
"env-paths": "^3.0.0",
|
|
25
26
|
"gray-matter": "^4.0.3",
|
|
26
27
|
"mime": "^4.1.0",
|