From research-papers
Adds 2-5 tags to untagged papers by reading notes.md and description.md. Prefers existing tags from index.md or tags.yaml. Run on single directory or --all.
npx claudepluginhub ctoth/research-papers-plugin --plugin research-papersThis skill uses the workspace's default tool permissions.
Add tags to papers in the collection that don't have them yet.
Assigns 1-4 topic tags from a controlled vocabulary to seed content using keyword and weighted title matching. Logs near-miss proposals to pending-tags for review.
Audits paper directories for required files like notes.md and PDF, YAML frontmatter validity, tags, wikilinks usage, cross-references section, and index consistency. Run on single paper or --all.
Analyzes Obsidian vault tags: identifies unused, orphan, near-duplicate, over-used, under-used tags. Suggests merges and cleanup actions. Triggers on multilingual phrases like 'tag garden'.
Share bugs, ideas, or general feedback.
Add tags to papers in the collection that don't have them yet.
Parse $ARGUMENTS:
--all: list all paper directories and process each oneif [[ "$ARGUMENTS" == "--all" ]]; then
ls -d papers/*/ | sort
else
paper_dir="$ARGUMENTS"
fi
Read papers/index.md and extract all tags currently in use:
cat ./papers/index.md
Parse the (tag1, tag2) suffixes to build a list of existing tags and their frequencies. These are your preferred vocabulary — reuse existing tags when they fit rather than inventing synonyms.
Also read papers/tags.yaml if it exists:
cat ./papers/tags.yaml
This file is the canonical tag vocabulary. It lists all approved tags and their aliases. If it exists, you MUST use tags from this file. Do not invent new tags when an existing tag or its alias covers the topic.
If tags.yaml does not exist, fall back to the existing behavior of preferring tags already used in index.md.
For each paper directory, check if it already has tags.
Read description.md and check:
tags: field? → skipTags: line? → skipdescription.md not exist? → skip (run paper-reader first)notes.md not exist? → skip (run paper-reader first)Read the paper's notes.md and description.md to understand what it's about.
Pick 2-5 tags following these guidelines:
voice-quality, not Voice Qualityacoustics, perception, synthesis) plus one or two narrow ones (formant-transitions, lf-model)Add YAML frontmatter with tags to description.md. Read the file first, then:
---\ntags: [tag1, tag2, tag3]\n---\n before the existing contenttags: [tag1, tag2, tag3] inside the existing frontmatterTags: line exists at the end: remove it and add frontmatter insteadUse your editing tools to modify the file cleanly.
Example result:
---
tags: [acoustics, glottal-source, voice-quality]
---
This paper presents the LF model for parameterizing glottal flow...
Update the paper's line in index.md to include its new tags. Find the line starting with - PaperDirName and update it to - PaperDirName (tag1, tag2, tag3).
If the paper isn't in index.md yet, append it.
Output a summary:
Tagged: N papers
Skipped: M papers (already tagged or missing notes)
New tags introduced:
- new-tag-1 (used by: Paper1, Paper2)
- new-tag-2 (used by: Paper3)
Existing tags reused:
- acoustics (now N total papers)
Untagged papers remaining:
- Paper_Without_Notes (missing notes.md)
For --all mode, also output the full tag frequency list:
Tag summary:
acoustics: 5 papers
voice-quality: 3 papers
...
If you introduced any tags NOT in tags.yaml, list them:
Proposed new tags (add to tags.yaml):
- new-tag-name: "Brief description of what this tag covers"
After tagging, remind the user to run generate-paper-index.py to rebuild the tagged-papers/ symlinks.