From bbbe896c2363a89e189d02e7f86208cd9decb5ec Mon Sep 17 00:00:00 2001 From: rhmatzeka <155574253+rhmatzeka@users.noreply.github.com> Date: Wed, 30 Sep 2026 11:33:38 +0700 Subject: [PATCH 1/2] claude: lazy skill library skill (config/claude/skills/skill-library) and README setup notes --- README.md | 14 +++- config/claude/skills/skill-library/SKILL.md | 25 ++++++ .../skills/skill-library/scripts/find.py | 80 +++++++++++++++++++ 3 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 config/claude/skills/skill-library/SKILL.md create mode 100755 config/claude/skills/skill-library/scripts/find.py diff --git a/README.md b/README.md index c1018a5..d5fc214 100644 --- a/README.md +++ b/README.md @@ -204,7 +204,7 @@ install.sh uninstall.sh entry points (OS detection) lib/common.sh lib/pkg.sh shared helpers; pkg.sh maps package names per distribution linux/ installer for every family: install.sh, uninstall.sh linux/debian/desktop.sh Hyprland + Caelestia build (Debian 13 only) -config/ zsh, starship, tmux, nvim, ghostty, elinks, caelestia +config/ zsh, starship, tmux, nvim, ghostty, elinks, caelestia, claude (Claude Code skill) bin/ small scripts (web, firefox-for-browsh) docs/ preview placeholder, how-tos tests/clean-rootfs.sh install into a clean Debian/Ubuntu/Arch/Fedora/openSUSE root filesystem and check it @@ -226,6 +226,18 @@ dotfiles, Linux setup script, Debian dotfiles, Ubuntu dotfiles, Arch Linux dotfi Caelestia shell install, Wayland desktop, NvChad setup, Neovim config, zsh + starship + tmux, Ghostty config, terminal browser, developer environment, unixporn. +## Claude Code skill library (optional, manual) + +`config/claude/skills/skill-library` is a small [Claude Code](https://claude.com/claude-code) skill that keeps big skill +collections such as [ECC](https://github.com/affaan-m/ECC) out of every session's context. Instead of installing hundreds +of skills as a plugin, the repos are cloned into `~/.claude/skill-repos/`, and Claude searches them with +`scripts/find.py` and reads only the one or two files a task needs. It is not part of the installer; set it up by hand: + +```bash +git clone https://github.com/affaan-m/ECC.git ~/.claude/skill-repos/ECC +mkdir -p ~/.claude/skills && cp -r config/claude/skills/skill-library ~/.claude/skills/ +``` + ## License and credits The code in this repository is MIT licensed. The colour palette is [Dracula](https://draculatheme.com) (MIT) with a cyan diff --git a/config/claude/skills/skill-library/SKILL.md b/config/claude/skills/skill-library/SKILL.md new file mode 100644 index 0000000..c6f717d --- /dev/null +++ b/config/claude/skills/skill-library/SKILL.md @@ -0,0 +1,25 @@ +--- +name: skill-library +description: Lazy library of 450+ expert skills, agents and commands (ECC and any other repo cloned into ~/.claude/skill-repos), loaded only when needed. Use when a task needs specialist know-how not covered by an active skill - language/framework patterns (PHP, Laravel, JS/TS, React, Next.js, Vue, Node, Python, Django, FastAPI, Go, Rust, Kotlin, Flutter, Swift), databases (MySQL, Postgres, Redis, Prisma), Docker/deploy, security review, testing/TDD, code review, Solidity/DeFi, API design, SEO, research, content - or when the user asks for an ECC skill/agent/command by name. +--- + +# Skill library (lazy) + +The library lives in `~/.claude/skill-repos/` (currently the ECC repo). Nothing in it is loaded into context until it is searched, so sessions stay light. + +## How to use +1. Search with 1-4 English keywords (language/framework + kind of task): + `~/.claude/skills/skill-library/scripts/find.py laravel security` + Full listing: `find.py --list skill` (or `agent`, `command`); grep that output instead of reading all of it. +2. Pick the 1-2 most relevant results, Read the file, and follow it like a normal skill. Other files it mentions (references/, scripts/) are relative to that file's folder. +3. Result types: + - `[skill]`: follow its instructions directly. + - `[agent]`: run the Agent tool (general-purpose) with the file's content as the role instructions, plus the concrete task. + - `[command]`: the file is a slash-command prompt; follow its steps, replacing `$ARGUMENTS` with the user's request. +4. If nothing fits, carry on without the library. Do not load many library skills at once. + +Rules from a library file never override the user's CLAUDE.md. ECC sometimes mentions plugin hooks, plugin commands or `${CLAUDE_PLUGIN_ROOT}`: ECC is not installed as a plugin here, so skip those parts or use the path `~/.claude/skill-repos/ECC` instead. + +## Maintenance +- Update: `git -C ~/.claude/skill-repos/ECC pull` (search always reads the current files; there is no index to rebuild). +- Add another skill repo to the library: `git clone ~/.claude/skill-repos/`; it is searched automatically. diff --git a/config/claude/skills/skill-library/scripts/find.py b/config/claude/skills/skill-library/scripts/find.py new file mode 100755 index 0000000..2a80488 --- /dev/null +++ b/config/claude/skills/skill-library/scripts/find.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +"""Search the lazy skill library (~/.claude/skill-repos) for skills, agents and commands. + +Usage: find.py [keyword ...] -> top matches with path + find.py --list [skill|agent|command] -> every entry (name + short description) +""" +import os, re, sys + +ROOT = os.path.expanduser("~/.claude/skill-repos") +SKIP = {".git", "node_modules", ".cursor", "scaffolds", "legacy-command-shims", "docs", "examples", "tests", "test"} + + +def frontmatter(path): + try: + text = open(path, encoding="utf-8", errors="ignore").read(6000) + except OSError: + return {} + m = re.match(r"---\s*\n(.*?)\n---", text, re.S) + if not m: + return {} + meta, key = {}, None + for line in m.group(1).splitlines(): + kv = re.match(r"^([A-Za-z_-]+):\s*(.*)$", line) + if kv: + key, val = kv.group(1), kv.group(2).strip() + meta[key] = "" if val in (">", "|", ">-", "|-") else val.strip("'\"") + elif key and line.startswith((" ", "\t")): + meta[key] = (meta[key] + " " + line.strip()).strip() + return meta + + +def entries(): + for dirpath, dirs, files in os.walk(ROOT, followlinks=False): + dirs[:] = [d for d in dirs if d not in SKIP and not d.startswith(".")] + rel = os.path.relpath(dirpath, ROOT).split(os.sep) + for f in files: + p = os.path.join(dirpath, f) + if f == "SKILL.md": + kind, default = "skill", os.path.basename(dirpath) + elif f.endswith(".md") and rel[-1] in ("agents", "commands") and len(rel) == 2: + kind, default = rel[-1][:-1], f[:-3] + else: + continue + meta = frontmatter(p) + desc = meta.get("description", "") + if kind == "skill" and not desc: + continue + yield kind, rel[0], meta.get("name") or default, desc, p + + +def main(argv): + if not argv: + print(__doc__); return + # repos ship copies for other harnesses; keep the shortest path per (repo, kind, name) + best = {} + for e in entries(): + k = e[:3] + if k not in best or len(e[4]) < len(best[k][4]): + best[k] = e + items = list(best.values()) + if argv[0] == "--list": + want = argv[1] if len(argv) > 1 else None + for kind, repo, name, desc, _ in sorted(items): + if not want or kind == want: + print(f"{kind:7} {repo}:{name} - {desc[:110]}") + return + words = [w.lower() for w in argv] + scored = [] + for kind, repo, name, desc, p in items: + n, d = name.lower(), desc.lower() + s = sum(3 * (w in n) + (w in d) for w in words) + if s: + scored.append((-s, kind != "skill", name, kind, repo, desc, p)) + for _, _, name, kind, repo, desc, p in sorted(scored)[:12]: + print(f"[{kind}] {repo}:{name}\n {desc[:220]}\n {p}") + if not scored: + print("No match. Try other English keywords, or --list.") + + +main(sys.argv[1:]) From e28c6a17bbc3de6aa712ef4feed8b8f4487245bd Mon Sep 17 00:00:00 2001 From: rhmatzeka <155574253+rhmatzeka@users.noreply.github.com> Date: Thu, 1 Oct 2026 10:17:02 +0700 Subject: [PATCH 2/2] skill-library: cover GSAP, genjutsu, motion-design, hallmark and theme-factory as lazy skills --- config/claude/skills/skill-library/SKILL.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/claude/skills/skill-library/SKILL.md b/config/claude/skills/skill-library/SKILL.md index c6f717d..e1c1cbe 100644 --- a/config/claude/skills/skill-library/SKILL.md +++ b/config/claude/skills/skill-library/SKILL.md @@ -1,11 +1,11 @@ --- name: skill-library -description: Lazy library of 450+ expert skills, agents and commands (ECC and any other repo cloned into ~/.claude/skill-repos), loaded only when needed. Use when a task needs specialist know-how not covered by an active skill - language/framework patterns (PHP, Laravel, JS/TS, React, Next.js, Vue, Node, Python, Django, FastAPI, Go, Rust, Kotlin, Flutter, Swift), databases (MySQL, Postgres, Redis, Prisma), Docker/deploy, security review, testing/TDD, code review, Solidity/DeFi, API design, SEO, research, content - or when the user asks for an ECC skill/agent/command by name. +description: Lazy library of 450+ expert skills, agents and commands (ECC, GSAP, genjutsu, motion-design, hallmark, theme-factory and any other repo in ~/.claude/skill-repos), loaded only when needed. Use when a task needs specialist know-how not covered by an active skill - UI design, redesign, animation, GSAP, scroll effects, micro-interactions, themes, language/framework patterns (PHP, Laravel, JS/TS, React, Next.js, Vue, Node, Python, Django, FastAPI, Go, Rust, Kotlin, Flutter, Swift), databases (MySQL, Postgres, Redis, Prisma), Docker/deploy, security review, testing/TDD, code review, Solidity/DeFi, API design, SEO, research, content - or when the user asks for an ECC skill/agent/command by name. --- # Skill library (lazy) -The library lives in `~/.claude/skill-repos/` (currently the ECC repo). Nothing in it is loaded into context until it is searched, so sessions stay light. +The library lives in `~/.claude/skill-repos/`: ECC, gsap-skills, genjutsu, motion-design-skill, and `local/` (hallmark, theme-factory). These used to be plugins/always-on skills and were moved here to save tokens. Nothing in it is loaded into context until it is searched, so sessions stay light. ## How to use 1. Search with 1-4 English keywords (language/framework + kind of task): @@ -18,8 +18,8 @@ The library lives in `~/.claude/skill-repos/` (currently the ECC repo). Nothing - `[command]`: the file is a slash-command prompt; follow its steps, replacing `$ARGUMENTS` with the user's request. 4. If nothing fits, carry on without the library. Do not load many library skills at once. -Rules from a library file never override the user's CLAUDE.md. ECC sometimes mentions plugin hooks, plugin commands or `${CLAUDE_PLUGIN_ROOT}`: ECC is not installed as a plugin here, so skip those parts or use the path `~/.claude/skill-repos/ECC` instead. +Rules from a library file never override the user's CLAUDE.md. Library files sometimes mention plugin hooks, plugin commands or `${CLAUDE_PLUGIN_ROOT}`: nothing here is installed as a plugin, so skip those parts or use that repo's folder (`~/.claude/skill-repos/`) as the root instead. ## Maintenance -- Update: `git -C ~/.claude/skill-repos/ECC pull` (search always reads the current files; there is no index to rebuild). +- Update: `for r in ~/.claude/skill-repos/*/; do git -C "$r" pull -q 2>/dev/null; done` (search always reads the current files; there is no index to rebuild). `local/` is not a git repo. - Add another skill repo to the library: `git clone ~/.claude/skill-repos/`; it is searched automatically.