@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.
Files changed (2) hide show
  1. package/dist/index.js +214 -28
  2. 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 format = "json";
22998
- const render = (data, rootElement = "root") => {
22999
- return JSON.stringify({ [rootElement]: data }, null, 2);
23000
- };
23001
- return {
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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
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 format = "xml";
23040
- const render = (data, rootElement = "root") => {
23041
- return jsonToXml(data, rootElement);
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
- return {
23044
- format,
23045
- render
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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
23116
23276
  };
23117
- const render = (data, rootElement = "Prompt") => {
23118
- const { content, ...restData } = data;
23119
- return `# ${rootElement}
23277
+ const renderSkill = (skill) => {
23278
+ return dedent_default`
23279
+ # ${skill.name}
23280
+
23281
+ ${skill.content}
23120
23282
 
23121
- ${renderObject(restData, 3)}
23283
+ ## Metadata
23122
23284
 
23123
- ${content && `---
23285
+ ${skill.metadata ? renderObject(skill.metadata, 3) : ""}
23286
+
23287
+ ## References
23124
23288
 
23125
- ### Content
23289
+ ${skill.references ? renderArray(resourceMapToArray(skill.references), 1) : ""}
23126
23290
 
23127
- ${content}
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
- return {
23133
- format,
23134
- render
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, "Resource"), {
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.1",
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",