@lmzhen/dsh-tool-skill-manage 0.3.62 → 0.3.64

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 (2) hide show
  1. package/lib/index.js +12 -12
  2. package/package.json +10 -8
package/lib/index.js CHANGED
@@ -69,11 +69,6 @@ function apply(ctx, rawConfig = {}) {
69
69
  message: await buildSkillReviewText(),
70
70
  skills: []
71
71
  };
72
- if (action === "skip") return {
73
- ok: true,
74
- message: "Skipped; no skill changes this pass.",
75
- skills: []
76
- };
77
72
  if (action === "list") {
78
73
  const list = await library.list();
79
74
  return {
@@ -116,7 +111,7 @@ function apply(ctx, rawConfig = {}) {
116
111
  };
117
112
  if (result.ok) {
118
113
  if (result.normalizedFrontmatterFields && result.normalizedFrontmatterFields.length > 0) feedbackLines.push(`frontmatter auto-quoted (YAML compatibility): ${result.normalizedFrontmatterFields.join(", ")}`);
119
- const mutating = action !== "list" && action !== "review" && action !== "skip" && action !== "pin" && action !== "unpin";
114
+ const mutating = action !== "list" && action !== "review" && action !== "pin" && action !== "unpin";
120
115
  if (name && action === "create") await ctx.skillUsage.ensureRecordCreated(name, origin !== "foreground");
121
116
  if (name && action === "delete") await ctx.skillUsage.markArchived(name);
122
117
  else if (name && mutating && action !== "create" && result.noop !== true) await ctx.skillUsage.record(name, "patch");
@@ -130,14 +125,20 @@ function apply(ctx, rawConfig = {}) {
130
125
  async function buildSkillReviewText() {
131
126
  const list = await library.list();
132
127
  const report = await ctx.skillUsage.report();
128
+ const warnedFlag = (name) => {
129
+ const record = report.get(name);
130
+ return record?.quality_warn === true || record?.feedback_warn === true;
131
+ };
133
132
  const lines = list.map((summary) => {
134
133
  const record = report.get(summary.name);
135
- const quality = record?.quality_score !== void 0 ? ` quality:${record.quality_score.toFixed(2)}${record.quality_warn ? "⚠" : ""}` : "";
136
- return `- ${summary.name} | ${record?.state ?? "active"} | use:${record?.use_count ?? 0} view:${record?.view_count ?? 0} patch:${record?.patch_count ?? 0}${quality}${summary.protectedBy ? ` [${summary.protectedBy}]` : ""}`;
134
+ const warned = warnedFlag(summary.name);
135
+ const quality = record?.quality_score !== void 0 ? ` quality:${record.quality_score.toFixed(2)}${warned ? "⚠" : ""}` : warned ? " quality:⚠" : "";
136
+ const protection = summary.protectionUnknown ? " [protection:unknown]" : summary.protectedBy ? ` [${summary.protectedBy}]` : "";
137
+ return `- ${summary.name} | ${record?.state ?? "active"} | use:${record?.use_count ?? 0} view:${record?.view_count ?? 0} patch:${record?.patch_count ?? 0}${quality}${protection}`;
137
138
  });
138
139
  const groups = computeDedupGroups({ contents: new Map(await Promise.all(list.map(async (summary) => [summary.name, await library.read(summary.name) ?? ""]))) });
139
140
  const dedupLines = groups.slice(0, MAX_DEDUP_GROUPS_IN_REVIEW).map((group) => `- ${group.join(" ~ ")}`);
140
- const warned = list.filter((summary) => report.get(summary.name)?.quality_warn === true).map((summary) => summary.name);
141
+ const warned = list.filter((summary) => warnedFlag(summary.name)).map((summary) => summary.name);
141
142
  const warningLine = warned.length === 0 ? "" : `\nWarning skills (${warned.length}): ${warned.join(", ")} — low quality; consider consolidating them before authoring new skills.`;
142
143
  return [
143
144
  list.length === 0 ? "No skills yet. Create one with action=create, or it is safe to author a new class-level umbrella." : `Skills: ${list.length} total. Below each name: state, use/view/patch counts, quality (0-1, ⚠ = low) and protection.${groups.length > 0 ? `\n\nNear-duplicate groups (${groups.length}):` : ""}`,
@@ -149,7 +150,7 @@ function apply(ctx, rawConfig = {}) {
149
150
  }
150
151
  ctx.tools.register(defineTool({
151
152
  name: "skill_manage",
152
- description: "Manage reusable skills. review returns the library review text (state/usage/quality per skill); list returns names only; create/edit take full SKILL.md content; patch applies old_string -> new_string; delete archives to .archive; pin protects a skill from deletion, background review, and the lifecycle (pin/unpin are never allowed from a background review — foreground and delegated subagents may). Protected bundled/hub skills reject any mutation; pinned skills reject deletion and are read-only to the background review.Prefer patching an umbrella over creating narrow skills. restructure moves entire body sections (by their exact \"## heading\" line, via restructure: [{heading, to_file: \"references/<topic>.md\"}]) into a references/ file and replaces each with a pointer line — the skill name and directory never change.Created/edited SKILL.md MUST start with YAML frontmatter (a name/description block), or creation is rejected. " + DSH_AUTHORING_STANDARDS,
153
+ description: "Manage reusable skills. review returns the library review text (state/usage/quality per skill); list returns names only; create/edit/update take full SKILL.md content (edit is an alias of update); patch applies old_string -> new_string; delete archives to .archive (absorbed_into names an umbrella skill); write_file/remove_file add or remove one support file under references/ or scripts/; pin protects a skill from deletion, background review, and the lifecycle (pin/unpin are never allowed from a background review — foreground and delegated subagents may). Protected bundled/hub skills reject any mutation; pinned skills reject deletion and are read-only to the background review.Prefer patching an umbrella over creating narrow skills. restructure moves entire body sections (by their exact \"## heading\" line, via restructure: [{heading, to_file: \"references/<topic>.md\"}]) into a references/ file and replaces each with a pointer line — the skill name and directory never change.Created/edited SKILL.md MUST start with YAML frontmatter (a name/description block), or creation is rejected. " + DSH_AUTHORING_STANDARDS,
153
154
  parameters: {
154
155
  action: {
155
156
  type: "string",
@@ -165,7 +166,6 @@ function apply(ctx, rawConfig = {}) {
165
166
  "write_file",
166
167
  "remove_file",
167
168
  "restructure",
168
- "skip",
169
169
  "pin",
170
170
  "unpin"
171
171
  ]
@@ -223,7 +223,7 @@ function apply(ctx, rawConfig = {}) {
223
223
  const libraryOrigin = origins.library;
224
224
  const sessionPolicy = effectiveSessionPolicy(ctx, exec.agent?.session);
225
225
  const approval = ctx.get("evolutionApproval");
226
- if (approval && args.action !== "list" && args.action !== "review" && args.action !== "skip" && args.action !== "pin" && args.action !== "unpin") {
226
+ if (approval && args.action !== "list" && args.action !== "review" && args.action !== "pin" && args.action !== "unpin") {
227
227
  const decision = await approval.request({
228
228
  kind: "skill",
229
229
  summary: `skill ${args.action ?? "?"} ${args.name ?? ""}`.trim(),
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmzhen/dsh-tool-skill-manage",
3
3
  "description": "Model-facing skill_manage tool (community build)",
4
- "version": "0.3.62",
4
+ "version": "0.3.64",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -31,22 +31,24 @@
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
33
  "@deepseek-ai/schemastery": "^3.18.1",
34
- "@lmzhen/dsh-evolution-approval": "^0.3.62",
35
- "@lmzhen/dsh-evolution-core": "^0.3.62"
34
+ "@lmzhen/dsh-evolution-approval": "^0.3.64",
35
+ "@lmzhen/dsh-evolution-core": "^0.3.64"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@deepseek-ai/cordis": "^4.0.1",
39
39
  "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
40
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
40
41
  "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
41
- "@lmzhen/dsh-evolution-io": "^0.3.62",
42
- "@lmzhen/dsh-skill-usage": "^0.3.62"
42
+ "@lmzhen/dsh-evolution-io": "^0.3.64",
43
+ "@lmzhen/dsh-skill-usage": "^0.3.64"
43
44
  },
44
45
  "devDependencies": {
45
46
  "@deepseek-ai/dsh-agent-loop-testkit": "^0.1.1-rc.2",
46
47
  "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
48
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
47
49
  "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
48
- "@lmzhen/dsh-evolution-core": "^0.3.62",
49
- "@lmzhen/dsh-evolution-io": "^0.3.62",
50
- "@lmzhen/dsh-skill-usage": "^0.3.62"
50
+ "@lmzhen/dsh-evolution-core": "^0.3.64",
51
+ "@lmzhen/dsh-evolution-io": "^0.3.64",
52
+ "@lmzhen/dsh-skill-usage": "^0.3.64"
51
53
  }
52
54
  }