ccski 1.0.1 → 1.0.3

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 CHANGED
@@ -50,7 +50,12 @@ Interactive pickers across install/enable/disable share the same layout, colors,
50
50
  - **openskills** — established the SKILL.md authoring pattern; we align with that spec for compatibility.
51
51
  - **universal-skills** — offers a curated, ready-to-use skill set; ccski focuses on management and transport, not bundling content.
52
52
 
53
- Key differences: ccski is a manager/server (no baked-in skill corpus), MCP-first, and optimized for multi-root discovery plus install/enable/disable ergonomics.
53
+ Key differences and what we fused:
54
+ - We blend **universal-skills’ MCP-first philosophy** with **openskills’ CLI ergonomics** so the same tool serves both agents and humans.
55
+ - ccski uniquely **scans skills shipped inside Claude Code plugins**, which universal-skills and openskills don’t cover.
56
+ - The `install` command accepts flexible sources (git URLs, marketplace, SKILL.md paths) and `-i` provides an interactive picker with a live one-shot command preview.
57
+
58
+ Bottom line: ccski is a manager/server (no baked-in corpus), MCP-first, multi-root-aware, with a friendlier install/enable/disable workflow.
54
59
 
55
60
  ## 4) Contributing & architecture at a glance
56
61
 
package/dist/cli.mjs CHANGED
@@ -22775,33 +22775,40 @@ async function startMCPServer(options = {}) {
22775
22775
  });
22776
22776
  }
22777
22777
  function buildSkillDescription(registry) {
22778
- return `Execute a skill within the main conversation
22778
+ const skills = registry.getAll();
22779
+ const diagnostics = registry.getDiagnostics();
22780
+ const exampleCommands = skills.slice(0, 2).map((skill) => ` - command: "${skill.name}"`);
22781
+ const skillBlocks = skills.map((skill) => {
22782
+ const location = skill.location === "user" ? "global" : skill.location;
22783
+ return [
22784
+ "<skill>",
22785
+ `<name>${skill.name}</name>`,
22786
+ `<description>${skill.description}</description>`,
22787
+ `<location>${location}</location>`,
22788
+ "</skill>"
22789
+ ].join("\n");
22790
+ }).join("\n");
22791
+ const discoveryLines = ["- `<available_skills>` is generated from the skills discovered on this machine at runtime.", "- Discovery scans project and user skill directories"];
22792
+ if (diagnostics.pluginSources.length > 0) discoveryLines.push(`- Plugin skills loaded from: ${diagnostics.pluginSources.join(", ")}`);
22793
+ const exampleSection = exampleCommands.length > 0 ? ["- Examples:", ...exampleCommands].join("\n") : "";
22794
+ return `${`Execute a skill within the main conversation
22779
22795
 
22780
22796
  <skills_instructions>
22781
22797
  When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
22782
22798
 
22799
+ Source of truth:
22800
+ ${discoveryLines.join("\n")}
22801
+
22783
22802
  How to use skills:
22784
- - Invoke skills using this tool with the skill name only (no arguments)
22803
+ - Invoke this tool with the skill name only (case-insensitive)
22785
22804
  - The skill's prompt will expand and provide detailed instructions on how to complete the task
22786
- - Examples:
22787
- - command: "pdf" - invoke the pdf skill
22788
- - command: "xlsx" - invoke the xlsx skill
22789
- - command: "plugin:pdf" - invoke using fully qualified name
22805
+ ${exampleSection}
22790
22806
 
22791
22807
  Important:
22792
- - Only use skills listed in <available_skills> below
22808
+ - Only use skills listed in <available_skills> below (this list reflects what is actually installed)
22793
22809
  - Do not invoke a skill that is already running
22794
22810
  - Do not use this tool for built-in CLI commands (like /help, /clear, etc.)
22795
- </skills_instructions>\n\n${`<available_skills>\n${registry.getAll().map((skill) => {
22796
- const location = skill.location === "user" ? "global" : skill.location;
22797
- return [
22798
- "<skill>",
22799
- `<name>${skill.name}</name>`,
22800
- `<description>${skill.description}</description>`,
22801
- `<location>${location}</location>`,
22802
- "</skill>"
22803
- ].join("\n");
22804
- }).join("\n") || "<skill>\n<name>none</name>\n<description>No skills discovered</description>\n<location>none</location>\n</skill>"}\n</available_skills>`}`;
22811
+ </skills_instructions>`}\n\n${`<available_skills>\n${skillBlocks || "<skill>\n<name>none</name>\n<description>No skills discovered</description>\n<location>none</location>\n</skill>"}\n</available_skills>`}`;
22805
22812
  }
22806
22813
  function formatSkillContent(skill) {
22807
22814
  return `${[