@hasna/skills 0.1.10 → 0.1.12

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 (3) hide show
  1. package/bin/index.js +81 -39
  2. package/bin/mcp.js +24 -24
  3. package/package.json +1 -1
package/bin/index.js CHANGED
@@ -1878,7 +1878,7 @@ var package_default;
1878
1878
  var init_package = __esm(() => {
1879
1879
  package_default = {
1880
1880
  name: "@hasna/skills",
1881
- version: "0.1.10",
1881
+ version: "0.1.12",
1882
1882
  description: "Skills library for AI coding agents",
1883
1883
  type: "module",
1884
1884
  bin: {
@@ -34809,8 +34809,8 @@ var init_mcp2 = __esm(() => {
34809
34809
  title: "List Skills",
34810
34810
  description: "List skills. Returns {name,category} by default; detail:true for full objects.",
34811
34811
  inputSchema: {
34812
- category: exports_external.string().optional().describe("Filter by category"),
34813
- detail: exports_external.boolean().optional().describe("Return full objects (default: false)")
34812
+ category: exports_external.string().optional(),
34813
+ detail: exports_external.boolean().optional()
34814
34814
  }
34815
34815
  }, async ({ category, detail }) => {
34816
34816
  const skills = category ? getSkillsByCategory(category) : SKILLS;
@@ -34823,8 +34823,8 @@ var init_mcp2 = __esm(() => {
34823
34823
  title: "Search Skills",
34824
34824
  description: "Search skills by name, description, or tags. Returns compact list by default.",
34825
34825
  inputSchema: {
34826
- query: exports_external.string().describe("Search query (fuzzy-matched)"),
34827
- detail: exports_external.boolean().optional().describe("Return full objects (default: false)")
34826
+ query: exports_external.string(),
34827
+ detail: exports_external.boolean().optional()
34828
34828
  }
34829
34829
  }, async ({ query, detail }) => {
34830
34830
  const results = searchSkills(query);
@@ -34837,7 +34837,7 @@ var init_mcp2 = __esm(() => {
34837
34837
  title: "Get Skill Info",
34838
34838
  description: "Get skill metadata, env vars, and dependencies.",
34839
34839
  inputSchema: {
34840
- name: exports_external.string().describe("Skill name (e.g. 'image')")
34840
+ name: exports_external.string()
34841
34841
  }
34842
34842
  }, async ({ name }) => {
34843
34843
  const skill = getSkill(name);
@@ -34854,7 +34854,7 @@ var init_mcp2 = __esm(() => {
34854
34854
  title: "Get Skill Docs",
34855
34855
  description: "Get skill documentation (SKILL.md > README.md > CLAUDE.md).",
34856
34856
  inputSchema: {
34857
- name: exports_external.string().describe("Skill name")
34857
+ name: exports_external.string()
34858
34858
  }
34859
34859
  }, async ({ name }) => {
34860
34860
  const doc2 = getSkillBestDoc(name);
@@ -34867,9 +34867,9 @@ var init_mcp2 = __esm(() => {
34867
34867
  title: "Install Skill",
34868
34868
  description: "Install a skill to .skills/ or to an agent dir (for: claude|codex|gemini|all).",
34869
34869
  inputSchema: {
34870
- name: exports_external.string().describe("Skill name to install"),
34871
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
34872
- scope: exports_external.string().optional().describe("Install scope: global or project (default: global)")
34870
+ name: exports_external.string(),
34871
+ for: exports_external.string().optional(),
34872
+ scope: exports_external.string().optional()
34873
34873
  }
34874
34874
  }, async ({ name, for: agentArg, scope }) => {
34875
34875
  if (agentArg) {
@@ -34898,9 +34898,9 @@ var init_mcp2 = __esm(() => {
34898
34898
  title: "Install Category",
34899
34899
  description: "Install all skills in a category, optionally for a specific agent.",
34900
34900
  inputSchema: {
34901
- category: exports_external.string().describe("Category name (case-insensitive, e.g. 'Event Management')"),
34902
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
34903
- scope: exports_external.string().optional().describe("Install scope: global or project (default: global)")
34901
+ category: exports_external.string(),
34902
+ for: exports_external.string().optional(),
34903
+ scope: exports_external.string().optional()
34904
34904
  }
34905
34905
  }, async ({ category, for: agentArg, scope }) => {
34906
34906
  const matchedCategory = CATEGORIES.find((c) => c.toLowerCase() === category.toLowerCase());
@@ -34944,9 +34944,9 @@ var init_mcp2 = __esm(() => {
34944
34944
  title: "Remove Skill",
34945
34945
  description: "Remove a skill from .skills/ or from an agent dir.",
34946
34946
  inputSchema: {
34947
- name: exports_external.string().describe("Skill name to remove"),
34948
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
34949
- scope: exports_external.string().optional().describe("Remove scope: global or project (default: global)")
34947
+ name: exports_external.string(),
34948
+ for: exports_external.string().optional(),
34949
+ scope: exports_external.string().optional()
34950
34950
  }
34951
34951
  }, async ({ name, for: agentArg, scope }) => {
34952
34952
  if (agentArg) {
@@ -35000,7 +35000,7 @@ var init_mcp2 = __esm(() => {
35000
35000
  title: "Get Requirements",
35001
35001
  description: "Get env vars, system deps, and npm dependencies for a skill.",
35002
35002
  inputSchema: {
35003
- name: exports_external.string().describe("Skill name")
35003
+ name: exports_external.string()
35004
35004
  }
35005
35005
  }, async ({ name }) => {
35006
35006
  const reqs = getSkillRequirements(name);
@@ -35013,8 +35013,8 @@ var init_mcp2 = __esm(() => {
35013
35013
  title: "Run Skill",
35014
35014
  description: "Run a skill by name with optional arguments.",
35015
35015
  inputSchema: {
35016
- name: exports_external.string().describe("Skill name to run"),
35017
- args: exports_external.array(exports_external.string()).optional().describe("Arguments to pass to the skill")
35016
+ name: exports_external.string(),
35017
+ args: exports_external.array(exports_external.string()).optional()
35018
35018
  }
35019
35019
  }, async ({ name, args }) => {
35020
35020
  const skill = getSkill(name);
@@ -35048,9 +35048,9 @@ var init_mcp2 = __esm(() => {
35048
35048
  title: "Import Skills",
35049
35049
  description: "Install skills from an export payload. Supports agent installs via 'for'.",
35050
35050
  inputSchema: {
35051
- skills: exports_external.array(exports_external.string()).describe("List of skill names to install"),
35052
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
35053
- scope: exports_external.string().optional().describe("Install scope: global or project (default: global)")
35051
+ skills: exports_external.array(exports_external.string()),
35052
+ for: exports_external.string().optional(),
35053
+ scope: exports_external.string().optional()
35054
35054
  }
35055
35055
  }, async ({ skills: skillList, for: agentArg, scope }) => {
35056
35056
  if (!skillList || skillList.length === 0) {
@@ -35146,7 +35146,7 @@ var init_mcp2 = __esm(() => {
35146
35146
  server.registerTool("search_tools", {
35147
35147
  title: "Search Tools",
35148
35148
  description: "List tool names, optionally filtered by keyword.",
35149
- inputSchema: { query: exports_external.string().optional().describe("Keyword filter") }
35149
+ inputSchema: { query: exports_external.string().optional() }
35150
35150
  }, async ({ query }) => {
35151
35151
  const all = [
35152
35152
  "list_skills",
@@ -35172,7 +35172,7 @@ var init_mcp2 = __esm(() => {
35172
35172
  server.registerTool("describe_tools", {
35173
35173
  title: "Describe Tools",
35174
35174
  description: "Get descriptions for specific tools by name.",
35175
- inputSchema: { names: exports_external.array(exports_external.string()).describe("Tool names from search_tools") }
35175
+ inputSchema: { names: exports_external.array(exports_external.string()) }
35176
35176
  }, async ({ names }) => {
35177
35177
  const descriptions = {
35178
35178
  list_skills: "List skills {name,category}. Params: category?, detail?",
@@ -35253,6 +35253,18 @@ function json2(data, status = 200) {
35253
35253
  function isValidSkillName(name) {
35254
35254
  return /^[a-z0-9-]+$/.test(name);
35255
35255
  }
35256
+ function pickFields(obj, fields) {
35257
+ if (fields.length === 0)
35258
+ return obj;
35259
+ const rec = obj;
35260
+ return Object.fromEntries(fields.filter((f) => (f in rec)).map((f) => [f, rec[f]]));
35261
+ }
35262
+ function parseFields(searchParams) {
35263
+ const raw = searchParams.get("fields");
35264
+ if (!raw)
35265
+ return [];
35266
+ return raw.split(",").map((f) => f.trim()).filter(Boolean);
35267
+ }
35256
35268
  function getAllSkillsWithStatus() {
35257
35269
  const installed = new Set(getInstalledSkills());
35258
35270
  return SKILLS.map((meta3) => {
@@ -35289,7 +35301,9 @@ function createFetchHandler(options) {
35289
35301
  const path = url2.pathname;
35290
35302
  const method = req.method;
35291
35303
  if (path === "/api/skills" && method === "GET") {
35292
- return json2(getAllSkillsWithStatus());
35304
+ const fields = parseFields(url2.searchParams);
35305
+ const skills = getAllSkillsWithStatus();
35306
+ return json2(fields.length ? skills.map((s) => pickFields(s, fields)) : skills);
35293
35307
  }
35294
35308
  if (path === "/api/categories" && method === "GET") {
35295
35309
  const counts = CATEGORIES.map((cat) => ({
@@ -35312,12 +35326,13 @@ function createFetchHandler(options) {
35312
35326
  const query = url2.searchParams.get("q") || "";
35313
35327
  if (!query.trim())
35314
35328
  return json2([]);
35329
+ const fields = parseFields(url2.searchParams);
35315
35330
  const results = searchSkills(query);
35316
35331
  const installed = new Set(getInstalledSkills());
35317
- return json2(results.map((meta3) => {
35332
+ const mapped = results.map((meta3) => {
35318
35333
  const reqs = getSkillRequirements(meta3.name);
35319
35334
  const envVars = reqs?.envVars || [];
35320
- return {
35335
+ const obj = {
35321
35336
  name: meta3.name,
35322
35337
  displayName: meta3.displayName,
35323
35338
  description: meta3.description,
@@ -35329,7 +35344,9 @@ function createFetchHandler(options) {
35329
35344
  systemDeps: reqs?.systemDeps || [],
35330
35345
  cliCommand: reqs?.cliCommand || null
35331
35346
  };
35332
- }));
35347
+ return fields.length ? pickFields(obj, fields) : obj;
35348
+ });
35349
+ return json2(mapped);
35333
35350
  }
35334
35351
  const singleMatch = path.match(/^\/api\/skills\/([^/]+)$/);
35335
35352
  if (singleMatch && method === "GET") {
@@ -35339,11 +35356,12 @@ function createFetchHandler(options) {
35339
35356
  const meta3 = getSkill(name);
35340
35357
  if (!meta3)
35341
35358
  return json2({ error: `Skill '${name}' not found` }, 404);
35359
+ const fields = parseFields(url2.searchParams);
35342
35360
  const reqs = getSkillRequirements(name);
35343
35361
  const docs = getSkillBestDoc(name);
35344
35362
  const installed = new Set(getInstalledSkills());
35345
35363
  const envVars = reqs?.envVars || [];
35346
- return json2({
35364
+ const obj = {
35347
35365
  name: meta3.name,
35348
35366
  displayName: meta3.displayName,
35349
35367
  description: meta3.description,
@@ -35355,7 +35373,8 @@ function createFetchHandler(options) {
35355
35373
  systemDeps: reqs?.systemDeps || [],
35356
35374
  cliCommand: reqs?.cliCommand || null,
35357
35375
  docs: docs || null
35358
- });
35376
+ };
35377
+ return json2(fields.length ? pickFields(obj, fields) : obj);
35359
35378
  }
35360
35379
  const docsMatch = path.match(/^\/api\/skills\/([^/]+)\/docs$/);
35361
35380
  if (docsMatch && method === "GET") {
@@ -35383,18 +35402,13 @@ function createFetchHandler(options) {
35383
35402
  const results = agents.map((agent) => installSkillForAgent(name, { agent, scope }, generateSkillMd));
35384
35403
  const allSuccess = results.every((r) => r.success);
35385
35404
  const errors4 = results.filter((r) => !r.success).map((r) => r.error);
35386
- return json2({
35387
- skill: name,
35388
- success: allSuccess,
35389
- results,
35390
- ...errors4.length > 0 ? { error: errors4.join("; ") } : {}
35391
- }, allSuccess ? 200 : 400);
35405
+ return json2(allSuccess ? { skill: name, success: true } : { skill: name, success: false, results, error: errors4.join("; ") }, allSuccess ? 200 : 400);
35392
35406
  } catch (e) {
35393
35407
  return json2({ skill: name, success: false, error: e instanceof Error ? e.message : "Unknown error" }, 400);
35394
35408
  }
35395
35409
  } else {
35396
35410
  const result = installSkill(name);
35397
- return json2(result, result.success ? 200 : 400);
35411
+ return json2(result.success ? { skill: name, success: true } : { skill: name, success: false, error: result.error }, result.success ? 200 : 400);
35398
35412
  }
35399
35413
  }
35400
35414
  if (path === "/api/skills/install-category" && method === "POST") {
@@ -36859,8 +36873,9 @@ Skills installed to .skills/`));
36859
36873
  process.exitCode = 1;
36860
36874
  }
36861
36875
  });
36862
- program2.command("list").alias("ls").option("-c, --category <category>", "Filter by category").option("-i, --installed", "Show only installed skills", false).option("-t, --tags <tags>", "Filter by comma-separated tags (OR logic, case-insensitive)").option("--json", "Output as JSON", false).option("--brief", "One line per skill: name \u2014 description [category]", false).description("List available or installed skills").action((options) => {
36876
+ program2.command("list").alias("ls").option("-c, --category <category>", "Filter by category").option("-i, --installed", "Show only installed skills", false).option("-t, --tags <tags>", "Filter by comma-separated tags (OR logic, case-insensitive)").option("--json", "Output as JSON", false).option("--brief", "One line per skill: name \u2014 description [category]", false).option("--format <format>", "Output format: compact (names only) or csv (name,category,description)").description("List available or installed skills").action((options) => {
36863
36877
  const brief = options.brief && !options.json;
36878
+ const fmt = !options.json ? options.format : undefined;
36864
36879
  if (options.installed) {
36865
36880
  const installed = getInstalledSkills();
36866
36881
  if (options.json) {
@@ -36940,6 +36955,19 @@ Skills matching tags [${tagFilter.join(", ")}] (${skills.length}):
36940
36955
  console.log(JSON.stringify(SKILLS, null, 2));
36941
36956
  return;
36942
36957
  }
36958
+ if (fmt === "compact") {
36959
+ for (const s of SKILLS)
36960
+ console.log(s.name);
36961
+ return;
36962
+ }
36963
+ if (fmt === "csv") {
36964
+ console.log("name,category,description");
36965
+ for (const s of SKILLS) {
36966
+ const desc = s.description.replace(/"/g, '""');
36967
+ console.log(`${s.name},${s.category},"${desc}"`);
36968
+ }
36969
+ return;
36970
+ }
36943
36971
  if (brief) {
36944
36972
  const sorted = [...SKILLS].sort((a, b) => {
36945
36973
  const catCmp = a.category.localeCompare(b.category);
@@ -36962,7 +36990,7 @@ Available skills (${SKILLS.length}):
36962
36990
  console.log();
36963
36991
  }
36964
36992
  });
36965
- program2.command("search").argument("<query>", "Search term").option("--json", "Output as JSON", false).option("--brief", "One line per skill: name \u2014 description [category]", false).option("-c, --category <category>", "Filter results by category").option("-t, --tags <tags>", "Filter results by comma-separated tags (OR logic, case-insensitive)").description("Search for skills").action((query, options) => {
36993
+ program2.command("search").argument("<query>", "Search term").option("--json", "Output as JSON", false).option("--brief", "One line per skill: name \u2014 description [category]", false).option("--format <format>", "Output format: compact (names only) or csv (name,category,description)").option("-c, --category <category>", "Filter results by category").option("-t, --tags <tags>", "Filter results by comma-separated tags (OR logic, case-insensitive)").description("Search for skills").action((query, options) => {
36966
36994
  let results = searchSkills(query);
36967
36995
  if (options.category) {
36968
36996
  const category = CATEGORIES.find((c) => c.toLowerCase() === options.category.toLowerCase());
@@ -36979,6 +37007,7 @@ program2.command("search").argument("<query>", "Search term").option("--json", "
36979
37007
  results = results.filter((s) => s.tags.some((tag) => tagFilter.includes(tag.toLowerCase())));
36980
37008
  }
36981
37009
  const brief = options.brief && !options.json;
37010
+ const fmt = !options.json ? options.format : undefined;
36982
37011
  if (options.json) {
36983
37012
  console.log(JSON.stringify(results, null, 2));
36984
37013
  return;
@@ -36987,6 +37016,19 @@ program2.command("search").argument("<query>", "Search term").option("--json", "
36987
37016
  console.log(chalk2.dim(`No skills found for "${query}"`));
36988
37017
  return;
36989
37018
  }
37019
+ if (fmt === "compact") {
37020
+ for (const s of results)
37021
+ console.log(s.name);
37022
+ return;
37023
+ }
37024
+ if (fmt === "csv") {
37025
+ console.log("name,category,description");
37026
+ for (const s of results) {
37027
+ const desc = s.description.replace(/"/g, '""');
37028
+ console.log(`${s.name},${s.category},"${desc}"`);
37029
+ }
37030
+ return;
37031
+ }
36990
37032
  if (brief) {
36991
37033
  for (const s of results) {
36992
37034
  console.log(`${s.name} \u2014 ${s.description} [${s.category}]`);
package/bin/mcp.js CHANGED
@@ -28604,7 +28604,7 @@ import { homedir as homedir2 } from "os";
28604
28604
  // package.json
28605
28605
  var package_default = {
28606
28606
  name: "@hasna/skills",
28607
- version: "0.1.10",
28607
+ version: "0.1.12",
28608
28608
  description: "Skills library for AI coding agents",
28609
28609
  type: "module",
28610
28610
  bin: {
@@ -30637,8 +30637,8 @@ server.registerTool("list_skills", {
30637
30637
  title: "List Skills",
30638
30638
  description: "List skills. Returns {name,category} by default; detail:true for full objects.",
30639
30639
  inputSchema: {
30640
- category: exports_external.string().optional().describe("Filter by category"),
30641
- detail: exports_external.boolean().optional().describe("Return full objects (default: false)")
30640
+ category: exports_external.string().optional(),
30641
+ detail: exports_external.boolean().optional()
30642
30642
  }
30643
30643
  }, async ({ category, detail }) => {
30644
30644
  const skills = category ? getSkillsByCategory(category) : SKILLS;
@@ -30651,8 +30651,8 @@ server.registerTool("search_skills", {
30651
30651
  title: "Search Skills",
30652
30652
  description: "Search skills by name, description, or tags. Returns compact list by default.",
30653
30653
  inputSchema: {
30654
- query: exports_external.string().describe("Search query (fuzzy-matched)"),
30655
- detail: exports_external.boolean().optional().describe("Return full objects (default: false)")
30654
+ query: exports_external.string(),
30655
+ detail: exports_external.boolean().optional()
30656
30656
  }
30657
30657
  }, async ({ query, detail }) => {
30658
30658
  const results = searchSkills(query);
@@ -30665,7 +30665,7 @@ server.registerTool("get_skill_info", {
30665
30665
  title: "Get Skill Info",
30666
30666
  description: "Get skill metadata, env vars, and dependencies.",
30667
30667
  inputSchema: {
30668
- name: exports_external.string().describe("Skill name (e.g. 'image')")
30668
+ name: exports_external.string()
30669
30669
  }
30670
30670
  }, async ({ name }) => {
30671
30671
  const skill = getSkill(name);
@@ -30682,7 +30682,7 @@ server.registerTool("get_skill_docs", {
30682
30682
  title: "Get Skill Docs",
30683
30683
  description: "Get skill documentation (SKILL.md > README.md > CLAUDE.md).",
30684
30684
  inputSchema: {
30685
- name: exports_external.string().describe("Skill name")
30685
+ name: exports_external.string()
30686
30686
  }
30687
30687
  }, async ({ name }) => {
30688
30688
  const doc2 = getSkillBestDoc(name);
@@ -30695,9 +30695,9 @@ server.registerTool("install_skill", {
30695
30695
  title: "Install Skill",
30696
30696
  description: "Install a skill to .skills/ or to an agent dir (for: claude|codex|gemini|all).",
30697
30697
  inputSchema: {
30698
- name: exports_external.string().describe("Skill name to install"),
30699
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
30700
- scope: exports_external.string().optional().describe("Install scope: global or project (default: global)")
30698
+ name: exports_external.string(),
30699
+ for: exports_external.string().optional(),
30700
+ scope: exports_external.string().optional()
30701
30701
  }
30702
30702
  }, async ({ name, for: agentArg, scope }) => {
30703
30703
  if (agentArg) {
@@ -30726,9 +30726,9 @@ server.registerTool("install_category", {
30726
30726
  title: "Install Category",
30727
30727
  description: "Install all skills in a category, optionally for a specific agent.",
30728
30728
  inputSchema: {
30729
- category: exports_external.string().describe("Category name (case-insensitive, e.g. 'Event Management')"),
30730
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
30731
- scope: exports_external.string().optional().describe("Install scope: global or project (default: global)")
30729
+ category: exports_external.string(),
30730
+ for: exports_external.string().optional(),
30731
+ scope: exports_external.string().optional()
30732
30732
  }
30733
30733
  }, async ({ category, for: agentArg, scope }) => {
30734
30734
  const matchedCategory = CATEGORIES.find((c) => c.toLowerCase() === category.toLowerCase());
@@ -30772,9 +30772,9 @@ server.registerTool("remove_skill", {
30772
30772
  title: "Remove Skill",
30773
30773
  description: "Remove a skill from .skills/ or from an agent dir.",
30774
30774
  inputSchema: {
30775
- name: exports_external.string().describe("Skill name to remove"),
30776
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
30777
- scope: exports_external.string().optional().describe("Remove scope: global or project (default: global)")
30775
+ name: exports_external.string(),
30776
+ for: exports_external.string().optional(),
30777
+ scope: exports_external.string().optional()
30778
30778
  }
30779
30779
  }, async ({ name, for: agentArg, scope }) => {
30780
30780
  if (agentArg) {
@@ -30828,7 +30828,7 @@ server.registerTool("get_requirements", {
30828
30828
  title: "Get Requirements",
30829
30829
  description: "Get env vars, system deps, and npm dependencies for a skill.",
30830
30830
  inputSchema: {
30831
- name: exports_external.string().describe("Skill name")
30831
+ name: exports_external.string()
30832
30832
  }
30833
30833
  }, async ({ name }) => {
30834
30834
  const reqs = getSkillRequirements(name);
@@ -30841,8 +30841,8 @@ server.registerTool("run_skill", {
30841
30841
  title: "Run Skill",
30842
30842
  description: "Run a skill by name with optional arguments.",
30843
30843
  inputSchema: {
30844
- name: exports_external.string().describe("Skill name to run"),
30845
- args: exports_external.array(exports_external.string()).optional().describe("Arguments to pass to the skill")
30844
+ name: exports_external.string(),
30845
+ args: exports_external.array(exports_external.string()).optional()
30846
30846
  }
30847
30847
  }, async ({ name, args }) => {
30848
30848
  const skill = getSkill(name);
@@ -30876,9 +30876,9 @@ server.registerTool("import_skills", {
30876
30876
  title: "Import Skills",
30877
30877
  description: "Install skills from an export payload. Supports agent installs via 'for'.",
30878
30878
  inputSchema: {
30879
- skills: exports_external.array(exports_external.string()).describe("List of skill names to install"),
30880
- for: exports_external.string().optional().describe("Agent target: claude, codex, gemini, or all"),
30881
- scope: exports_external.string().optional().describe("Install scope: global or project (default: global)")
30879
+ skills: exports_external.array(exports_external.string()),
30880
+ for: exports_external.string().optional(),
30881
+ scope: exports_external.string().optional()
30882
30882
  }
30883
30883
  }, async ({ skills: skillList, for: agentArg, scope }) => {
30884
30884
  if (!skillList || skillList.length === 0) {
@@ -30974,7 +30974,7 @@ server.registerResource("Skill Info", new ResourceTemplate("skills://{name}", {
30974
30974
  server.registerTool("search_tools", {
30975
30975
  title: "Search Tools",
30976
30976
  description: "List tool names, optionally filtered by keyword.",
30977
- inputSchema: { query: exports_external.string().optional().describe("Keyword filter") }
30977
+ inputSchema: { query: exports_external.string().optional() }
30978
30978
  }, async ({ query }) => {
30979
30979
  const all = [
30980
30980
  "list_skills",
@@ -31000,7 +31000,7 @@ server.registerTool("search_tools", {
31000
31000
  server.registerTool("describe_tools", {
31001
31001
  title: "Describe Tools",
31002
31002
  description: "Get descriptions for specific tools by name.",
31003
- inputSchema: { names: exports_external.array(exports_external.string()).describe("Tool names from search_tools") }
31003
+ inputSchema: { names: exports_external.array(exports_external.string()) }
31004
31004
  }, async ({ names }) => {
31005
31005
  const descriptions = {
31006
31006
  list_skills: "List skills {name,category}. Params: category?, detail?",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {