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 +31 -13
- package/package.json +1 -1
- package/skills/.claude-plugin/plugin.json +1 -1
- package/skills/package.json +1 -1
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
|
-
|
|
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
|
|
2975
|
-
|
|
2976
|
-
|
|
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
|
-
|
|
2979
|
-
"
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
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("
|
|
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
|
-
|
|
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.
|
|
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": {
|