skillwiki 0.2.2 → 0.2.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/dist/cli.js CHANGED
@@ -2966,21 +2966,35 @@ function checkSkillsInstalled(home, cwd) {
2966
2966
  function checkDuplicateSkills(home) {
2967
2967
  const plugin = findPlugin(home);
2968
2968
  const skillsDir = join21(home, ".claude", "skills");
2969
- if (!plugin || !existsSync5(skillsDir)) {
2969
+ const agentSkillDirs = [
2970
+ { label: "~/.codex/skills/", path: join21(home, ".codex", "skills") },
2971
+ { label: "~/.agents/skills/", path: join21(home, ".agents", "skills") }
2972
+ ];
2973
+ if (!plugin) {
2970
2974
  return check("pass", "skills_duplicate", "Skills not duplicated", "Single install channel");
2971
2975
  }
2972
2976
  const pluginSkills = findSkillNames(plugin.installPath);
2973
2977
  const cliSkills = findSkillNames(skillsDir);
2974
- const duplicates = pluginSkills.filter((name) => cliSkills.includes(name));
2975
- if (duplicates.length === 0) {
2976
- return check("pass", "skills_duplicate", "Skills not duplicated", "No overlap between plugin and CLI install");
2978
+ const cliDuplicates = cliSkills.filter((name) => pluginSkills.includes(name));
2979
+ const agentDuplicates = [];
2980
+ for (const { label, path } of agentSkillDirs) {
2981
+ const overlap = findSkillNames(path).filter((name) => pluginSkills.includes(name));
2982
+ if (overlap.length > 0) {
2983
+ agentDuplicates.push({ dir: label, names: overlap });
2984
+ }
2977
2985
  }
2978
- return check(
2979
- "warn",
2980
- "skills_duplicate",
2981
- "Skills not duplicated",
2982
- `${duplicates.length} skill(s) in both plugin and ~/.claude/skills/ \u2014 remove CLI copies: rm -r ~/.claude/skills/{${duplicates.slice(0, 3).join(",")}${duplicates.length > 3 ? ",\u2026" : ""}}`
2983
- );
2986
+ if (cliDuplicates.length === 0 && agentDuplicates.length === 0) {
2987
+ return check("pass", "skills_duplicate", "Skills not duplicated", "No overlap between plugin and other channels");
2988
+ }
2989
+ const parts = [];
2990
+ if (cliDuplicates.length > 0) {
2991
+ parts.push(`${cliDuplicates.length} skill(s) in both plugin and ~/.claude/skills/ \u2014 remove CLI copies: rm -r ~/.claude/skills/{${cliDuplicates.slice(0, 3).join(",")}${cliDuplicates.length > 3 ? ",\u2026" : ""}}`);
2992
+ }
2993
+ for (const { dir, names } of agentDuplicates) {
2994
+ parts.push(`${names.length} stale skill(s) in ${dir} \u2014 plugin provides: ${names.slice(0, 3).join(", ")}${names.length > 3 ? ", \u2026" : ""}`);
2995
+ }
2996
+ const status = cliDuplicates.length > 0 ? "warn" : "info";
2997
+ return check(status, "skills_duplicate", "Skills not duplicated", parts.join("; "));
2984
2998
  }
2985
2999
  function checkNpmUpdate(home, currentVersion) {
2986
3000
  const { hasUpdate, latest } = latestFromCache(home, currentVersion);
@@ -3099,7 +3113,7 @@ function checkDotStoreClean(resolvedPath) {
3099
3113
  if (found.length === 0) {
3100
3114
  return check("pass", "dsstore_clean", "No .DS_Store in raw/", "No .DS_Store files found");
3101
3115
  }
3102
- return check("warn", "dsstore_clean", "No .DS_Store in raw/", `${found.length} .DS_Store file(s) found \u2014 remove with: find ${rawDir} -name .DS_Store -delete`);
3116
+ return check("info", "dsstore_clean", "No .DS_Store in raw/", `${found.length} .DS_Store file(s) found \u2014 remove with: find ${rawDir} -name .DS_Store -delete`);
3103
3117
  }
3104
3118
  function checkSyncLastPush(resolvedPath) {
3105
3119
  if (resolvedPath === void 0) {
@@ -3195,18 +3209,22 @@ async function runDoctor(input) {
3195
3209
  checks.push(checkPluginVersionDrift(input.home, input.currentVersion));
3196
3210
  const summary = {
3197
3211
  pass: checks.filter((c) => c.status === "pass").length,
3212
+ info: checks.filter((c) => c.status === "info").length,
3198
3213
  warn: checks.filter((c) => c.status === "warn").length,
3199
3214
  error: checks.filter((c) => c.status === "error").length
3200
3215
  };
3201
3216
  const exitCode = summary.error > 0 ? ExitCode.DOCTOR_HAS_ERRORS : summary.warn > 0 ? ExitCode.DOCTOR_HAS_WARNINGS : ExitCode.OK;
3202
- const statusIcon = { pass: "\u2713", warn: "\u26A0", error: "\u2717" };
3217
+ const statusIcon = { pass: "\u2713", info: "i", warn: "\u26A0", error: "\u2717" };
3203
3218
  const lines = checks.map((c) => {
3204
3219
  const icon = statusIcon[c.status];
3205
3220
  const padded = c.label.padEnd(24);
3206
3221
  return ` ${icon} ${padded} ${c.detail}`;
3207
3222
  });
3208
3223
  lines.push("");
3209
- lines.push(`${summary.pass} pass \xB7 ${summary.warn} warn \xB7 ${summary.error} error`);
3224
+ const summaryParts = [`${summary.pass} pass`];
3225
+ if (summary.info > 0) summaryParts.push(`${summary.info} info`);
3226
+ summaryParts.push(`${summary.warn} warn`, `${summary.error} error`);
3227
+ lines.push(summaryParts.join(" \xB7 "));
3210
3228
  const humanHint = lines.join("\n");
3211
3229
  return { exitCode, result: ok({ checks, summary, humanHint }) };
3212
3230
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "skillwiki": "dist/cli.js"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "skills": "./",
5
5
  "description": "Project-aware Karpathy-style knowledge base for Claude Code: 18 prompt-only skills (wiki-*, proj-*, using-skillwiki) backed by the deterministic `skillwiki` CLI.",
6
6
  "author": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillwiki/skills",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "private": true,
5
5
  "files": [
6
6
  "wiki-*",