skillwiki 0.2.2 → 0.2.4

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.
@@ -14,7 +14,7 @@ if (!home || !currentVersion) process.exit(0);
14
14
  var cacheFile = join(home, ".skillwiki", ".update-cache.json");
15
15
  setTimeout(() => process.exit(0), 3e4);
16
16
  try {
17
- const latest = execSync("npm view skillwiki@beta version", {
17
+ const latest = execSync("npm view skillwiki@latest version", {
18
18
  encoding: "utf8",
19
19
  timeout: 15e3
20
20
  }).trim();
@@ -25,7 +25,7 @@ try {
25
25
  currentVersion
26
26
  };
27
27
  if (semverGt(latest, currentVersion)) {
28
- execSync("npm install -g skillwiki@beta", {
28
+ execSync("npm install -g skillwiki@latest", {
29
29
  stdio: "ignore",
30
30
  timeout: 6e4
31
31
  });
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);
@@ -3001,7 +3015,7 @@ function checkPluginVersionDrift(home, currentVersion) {
3001
3015
  if (pluginVersion === currentVersion) {
3002
3016
  return check("pass", "plugin_version_drift", "Plugin/CLI version", `Both at v${currentVersion}`);
3003
3017
  }
3004
- const updateCmd = semverGt(pluginVersion, currentVersion) ? "npm install -g skillwiki@beta" : "claude plugin update skillwiki@llm-wiki";
3018
+ const updateCmd = semverGt(pluginVersion, currentVersion) ? "npm install -g skillwiki@latest" : "claude plugin update skillwiki@llm-wiki";
3005
3019
  return check(
3006
3020
  "warn",
3007
3021
  "plugin_version_drift",
@@ -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
  }
@@ -3649,7 +3667,7 @@ async function runUpdate(input) {
3649
3667
  readFileSync6(new URL("../../package.json", import.meta.url), "utf8")
3650
3668
  );
3651
3669
  const currentVersion = pkg2.version;
3652
- const tag = input.distTag ?? "beta";
3670
+ const tag = input.distTag ?? "latest";
3653
3671
  const target = join23(input.home, ".claude", "skills");
3654
3672
  let latest;
3655
3673
  try {
@@ -3743,7 +3761,7 @@ async function runSelfUpdate(input) {
3743
3761
  } else {
3744
3762
  source = "npm";
3745
3763
  try {
3746
- availableVersion = execSync3("npm view skillwiki@beta version", {
3764
+ availableVersion = execSync3("npm view skillwiki@latest version", {
3747
3765
  encoding: "utf8",
3748
3766
  timeout: 15e3
3749
3767
  }).trim();
@@ -3813,7 +3831,7 @@ async function runSelfUpdate(input) {
3813
3831
  }
3814
3832
  let latestVersion;
3815
3833
  try {
3816
- latestVersion = execSync3("npm view skillwiki@beta version", {
3834
+ latestVersion = execSync3("npm view skillwiki@latest version", {
3817
3835
  encoding: "utf8",
3818
3836
  timeout: 15e3
3819
3837
  }).trim();
@@ -3831,12 +3849,12 @@ async function runSelfUpdate(input) {
3831
3849
  currentVersion,
3832
3850
  availableVersion: latestVersion,
3833
3851
  updateAvailable: false,
3834
- humanHint: `Already on latest beta: v${currentVersion}`
3852
+ humanHint: `Already on latest: v${currentVersion}`
3835
3853
  })
3836
3854
  };
3837
3855
  }
3838
3856
  try {
3839
- execSync3("npm install -g skillwiki@beta", {
3857
+ execSync3("npm install -g skillwiki@latest", {
3840
3858
  stdio: "pipe",
3841
3859
  timeout: 6e4
3842
3860
  });
@@ -3854,7 +3872,7 @@ async function runSelfUpdate(input) {
3854
3872
  availableVersion: latestVersion,
3855
3873
  updateAvailable: true,
3856
3874
  newVersion: latestVersion,
3857
- humanHint: `Updated skillwiki ${currentVersion} \u2192 ${latestVersion} via npm@beta`
3875
+ humanHint: `Updated skillwiki ${currentVersion} \u2192 ${latestVersion} via npm@latest`
3858
3876
  })
3859
3877
  };
3860
3878
  }
@@ -5955,11 +5973,11 @@ program.command("frontmatter-fix [vault]").description("fix common frontmatter i
5955
5973
  if (!v.ok) emit({ exitCode: v.exitCode, result: v.payload });
5956
5974
  else emit(await runFrontmatterFix({ vault: v.vault, dryRun: !!opts.dryRun }), v.vault);
5957
5975
  });
5958
- program.command("update").description("update skillwiki CLI to the latest version").option("--tag <tag>", "npm dist-tag", "beta").action(async (opts) => emit(await runUpdate({
5976
+ program.command("update").description("update skillwiki CLI to the latest version").option("--tag <tag>", "npm dist-tag", "latest").action(async (opts) => emit(await runUpdate({
5959
5977
  home: process.env.HOME ?? "",
5960
5978
  distTag: opts.tag
5961
5979
  })));
5962
- program.command("self-update").description("update skillwiki CLI from local source or npm@beta").option("--check", "check for updates without installing", false).action(async (opts) => emit(await runSelfUpdate({
5980
+ program.command("self-update").description("update skillwiki CLI from local source or npm@latest").option("--check", "check for updates without installing", false).action(async (opts) => emit(await runSelfUpdate({
5963
5981
  home: process.env.HOME ?? "",
5964
5982
  check: !!opts.check
5965
5983
  })));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
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.4",
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": {
@@ -2,4 +2,4 @@
2
2
  # skillwiki CLI wrapper — delegates to npx so the CLI is available
3
3
  # automatically when this plugin is enabled (Claude Code adds bin/ to PATH).
4
4
  set -euo pipefail
5
- exec npx -y skillwiki@beta "$@"
5
+ exec npx -y skillwiki@latest "$@"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillwiki/skills",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "private": true,
5
5
  "files": [
6
6
  "wiki-*",