Browse Source

Fix Claude Desktop plugin discovery (v2.10.2)

Siqi Chen 3 tuần trước cách đây
mục cha
commit
3b54ba7496
6 tập tin đã thay đổi với 13 bổ sung2 xóa
  1. 1 1
      .claude-plugin/plugin.json
  2. 1 0
      AGENTS.md
  3. 3 0
      README.md
  4. 1 1
      SKILL.md
  5. 6 0
      scripts/validate-package.py
  6. 1 0
      skills/humanizer/SKILL.md

+ 1 - 1
.claude-plugin/plugin.json

@@ -2,7 +2,7 @@
   "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
   "name": "humanizer",
   "description": "Remove signs of AI-generated writing from text, making it sound more natural and human. Based on Wikipedia's \"Signs of AI writing\" guide.",
-  "version": "2.10.1",
+  "version": "2.10.2",
   "author": {
     "name": "blader",
     "url": "https://github.com/blader"

+ 1 - 0
AGENTS.md

@@ -9,6 +9,7 @@ A portable agent skill implemented entirely as Markdown. The runtime artifact is
 ## Key files
 
 - `SKILL.md` — the skill itself. Portable YAML frontmatter (`name`, `description`, `license`, `metadata.version`) followed by the canonical, numbered pattern list with before/after examples. **This is the source of truth.**
+- `skills/humanizer/SKILL.md` — relative link to the canonical root skill for Claude Desktop and older plugin loaders. Never replace it with a second copy or edit it as a separate authority.
 - `README.md` — for humans: installation, usage, a summary table of the patterns, and a version history.
 - `.claude-plugin/plugin.json` — optional Claude Code plugin manifest.
 - `.claude-plugin/marketplace.json` — optional single-repo marketplace entry so `/plugin marketplace add blader/humanizer` works.

+ 3 - 0
README.md

@@ -45,6 +45,8 @@ Claude Code users can also install Humanizer as a plugin:
 
 The skill is then invoked as `/humanizer:humanizer`.
 
+The plugin also exposes the canonical root `SKILL.md` through `skills/humanizer/SKILL.md`. That internal link supports Claude Desktop and older plugin loaders without maintaining a second copy of the prompt.
+
 ### Manual
 
 Any agent harness can use the skill directly because the runtime artifact is `SKILL.md`. Install it wherever your harness expects skill directories, or copy `SKILL.md` into an existing skill folder.
@@ -209,6 +211,7 @@ Rewrites follow a no-fabrication rule: they never add facts, names, dates, or ci
 
 ## Version History
 
+- **2.10.2** - Exposed the canonical root `SKILL.md` through the standard `skills/humanizer/` plugin layout so Claude Desktop and pre-2.1.142 loaders discover it without a duplicated prompt copy (fixes #202). No change to the 35 patterns.
 - **2.10.1** - Added `gate` / `gated` / `gating` to §7 when used figuratively as the default metaphor for ordinary prerequisites, while preserving established technical uses such as feature gating and CI quality gates. No change to the 35 patterns.
 - **2.10.0** - Added patterns #34 (shadowboxing) and #35 (editorial scar tissue) for drafting-conversation residue: unattributed meta-level negations answering objections nobody raised, and phantom "tempting alternative" rebuttals recycled from the model's own corrected mistakes. Both come with false-positive guards protecting real disclaimers, scoping statements, engaged objections, and alternatives a reader would actually weigh (fixes #198). Also expanded #24 to catch accumulated fairness clauses from iterative editing, and changed the revision step to rewrite from the point rather than patch flagged phrases, since patches are how scar tissue forms. 35 patterns total.
 - **2.9.2** - Extended pattern #11 to cover repeated sentence openings, with a deliberate-anaphora guard (fixes #206). Broadened §28 so casual rewordings of signposting are still treated as announcements rather than fixes. No change to the 33 patterns.

+ 1 - 1
SKILL.md

@@ -9,7 +9,7 @@ description: |
   voice, negative parallelisms, and filler phrases.
 license: MIT
 metadata:
-  version: "2.10.1"
+  version: "2.10.2"
 ---
 
 # Humanizer: Remove AI Writing Patterns

+ 6 - 0
scripts/validate-package.py

@@ -12,6 +12,7 @@ ROOT = Path(__file__).resolve().parent.parent
 SKILL = (ROOT / "SKILL.md").read_text(encoding="utf-8")
 README = (ROOT / "README.md").read_text(encoding="utf-8")
 PLUGIN = json.loads((ROOT / ".claude-plugin" / "plugin.json").read_text(encoding="utf-8"))
+PLUGIN_SKILL = ROOT / "skills" / "humanizer" / "SKILL.md"
 
 
 def require(match: re.Match[str] | None, message: str) -> re.Match[str]:
@@ -42,6 +43,11 @@ versions = {skill_version, readme_version, str(PLUGIN.get("version", ""))}
 if len(versions) != 1:
     raise SystemExit(f"Version mismatch: {sorted(versions)}")
 
+if not PLUGIN_SKILL.is_symlink():
+    raise SystemExit("skills/humanizer/SKILL.md must link to the canonical root SKILL.md")
+if PLUGIN_SKILL.resolve() != (ROOT / "SKILL.md").resolve():
+    raise SystemExit("skills/humanizer/SKILL.md must resolve to the root SKILL.md")
+
 pattern_numbers = [
     int(number)
     for number in re.findall(r"(?m)^### ([0-9]+)\. ", SKILL)

+ 1 - 0
skills/humanizer/SKILL.md

@@ -0,0 +1 @@
+../../SKILL.md