diff --git a/README.md b/README.md index 6a3a142..15aec61 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,6 @@ flowchart LR skills --> skills_tune[kvb-skills-tune] skills --> skills_auto[kvb-skills-auto] skills --> skills_essence[kvb-skills-essence] - skills --> skills_shortcuts[kvb-skills-shortcuts] none --> cleanup[kvb-cleanup] none --> help[kvb-help] ``` @@ -137,7 +136,6 @@ flowchart LR autotune[kvb-skills-tune] autoskill[kvb-skills-auto] essence[kvb-skills-essence] - shortcuts[kvb-skills-shortcuts] end subgraph cat_none [no category] cleanup[kvb-cleanup] @@ -210,7 +208,6 @@ flowchart LR dream --> autotune dream --> autoskill autoskill --> autotune - autoskill --> shortcuts autotune --> essence test --> triage diff --git a/skills/kvb-code-no-comments/SKILL.md b/skills/kvb-code-no-comments/SKILL.md index f7124a3..95407b3 100644 --- a/skills/kvb-code-no-comments/SKILL.md +++ b/skills/kvb-code-no-comments/SKILL.md @@ -3,8 +3,8 @@ name: kvb-code-no-comments description: > Purge explanatory comments from staged and unstaged changes. Run AUTOMATICALLY before every commit or stage request (commit, commit - no-verify, stage next, socon, sobu, socobu, "commite ..."); also on - /kvb-code-no-comments or comment complaints. + no-verify, stage next, "commite ..."); also on /kvb-code-no-comments or + comment complaints. --- When the operator asks to commit or stage, run this audit first and only diff --git a/skills/kvb-skills-auto/SKILL.md b/skills/kvb-skills-auto/SKILL.md index edc7db9..895ee43 100644 --- a/skills/kvb-skills-auto/SKILL.md +++ b/skills/kvb-skills-auto/SKILL.md @@ -18,15 +18,13 @@ vary), do the following: 2. Then propose, in one short paragraph: the repeated pattern you observed, a skill name suggestion, the trigger phrasing, and what the skill would do. Ask whether to create it. -3. On approval, write the skill: - - a conversation shortcut or expansion: add it to the `kvb-skills-shortcuts` skill - table instead of creating a new skill. - - anything else: persist it exactly as the `kvb-skills-tune` skill's - **Persistence** section specifies — locate the operator's skills - repository, write `skills//SKILL.md` there (or in the current - project for project-specific behavior), then mirror the skill directory - into `~/.claude/skills/` and `~/.agents/skills/`, plus the project's - `.claude/skills/` and `.agents/skills/` when it is project-specific. +3. On approval, write the skill: persist it exactly as the + `kvb-skills-tune` skill's **Persistence** section specifies — locate the + operator's skills repository, write `skills//SKILL.md` there (or in + the current project for project-specific behavior), then mirror the skill + directory into `~/.claude/skills/` and `~/.agents/skills/`, plus the + project's `.claude/skills/` and `.agents/skills/` when it is + project-specific. Follow the local naming conventions and keep the skill a thin, single-purpose instruction; route to an authoritative doc when one exists instead of duplicating it. diff --git a/skills/kvb-skills-shortcuts/SKILL.md b/skills/kvb-skills-shortcuts/SKILL.md deleted file mode 100644 index 5a4bfca..0000000 --- a/skills/kvb-skills-shortcuts/SKILL.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: kvb-skills-shortcuts -description: > - Operator conversation shortcuts. Trigger when the message is exactly one of - these tokens, optionally with arguments: sobu, soco, socobu, socon, sona, - sote. Expand it and act on the expanded instruction. ---- - -When an operator message is one of the shortcuts below, expand it to the meaning and act on it. - -| Shortcut | Meaning | -| --- | --- | -| `sobu` | Stage next bundle: stage the next logical bundle of verified changes, explain what it does, and list what still remains uncommitted. | -| `soco` | Commit: commit the currently staged changes (pre-commit hooks run). | -| `socobu` | Commit no-verify, then stage next bundle: run `socon` followed by `sobu`. | -| `socon` | Commit no-verify: commit the currently staged changes with `--no-verify`. | -| `sona` | New alias: add the shortcut the operator states to the appropriate table, keeping it sorted. | -| `sote` | Run `make test`. | diff --git a/skills/kvb-skills-tune/SKILL.md b/skills/kvb-skills-tune/SKILL.md index 550ac9d..2cef335 100644 --- a/skills/kvb-skills-tune/SKILL.md +++ b/skills/kvb-skills-tune/SKILL.md @@ -81,8 +81,8 @@ Ask in this order, at most four questions per call: 2. **Target** - which finding becomes a skill, or which existing skill gets optimized. One option per candidate, each with its measured cost in the description. -3. **Shape** - for a new skill: `Standalone skill`, `Row in the - kvb-skills-shortcuts skill`, `Extend an existing skill`, `Memory entry instead of a skill`. +3. **Shape** - for a new skill: `Standalone skill`, `Extend an existing + skill`, `Memory entry instead of a skill`. For an optimization: `Tighten wording only`, `Change the trigger`, `Add rules`, `Split into two skills`, `Merge into another skill`. 4. **Placement** - `Operator skills repository (portable)` or diff --git a/tests/test_shortcuts.py b/tests/test_shortcuts.py deleted file mode 100644 index 0c2295a..0000000 --- a/tests/test_shortcuts.py +++ /dev/null @@ -1,59 +0,0 @@ -"""Validate the kvb-skills-shortcuts skill table: rows present, sorted, ``soc``-prefixed, -no two adjacent consonants.""" - -from __future__ import annotations - -import re -import unittest -from pathlib import Path - -REPO_ROOT = Path(__file__).resolve().parents[1] -SKILL = REPO_ROOT / "skills" / "kvb-skills-shortcuts" / "SKILL.md" - -ROW_RE = re.compile(r"^\|\s*`(?P[^`]+)`\s*\|") -VOWELS = frozenset("aeiou") - - -def _has_consonant_cluster(name: str) -> bool: - prev_consonant = False - for char in name: - if not char.isalpha(): - prev_consonant = False - continue - is_consonant = char.lower() not in VOWELS - if is_consonant and prev_consonant: - return True - prev_consonant = is_consonant - return False - - -class TestShortcuts(unittest.TestCase): - def setUp(self): - self.assertTrue(SKILL.is_file(), f"missing {SKILL}") - self.shortcuts = [ - match.group("shortcut") - for line in SKILL.read_text(encoding="utf-8").splitlines() - if (match := ROW_RE.match(line)) - ] - - def test_shortcuts_present(self): - self.assertTrue(self.shortcuts, "no shortcut rows found in kvb-skills-shortcuts skill") - - def test_shortcuts_sorted_ascending(self): - self.assertEqual( - self.shortcuts, - sorted(self.shortcuts), - f"shortcuts table not sorted; expected {sorted(self.shortcuts)}", - ) - - def test_shortcuts_start_with_so(self): - bad = [s for s in self.shortcuts if not s.startswith("so")] - self.assertFalse(bad, f"shortcuts not starting with 'so': {bad}") - - def test_no_consecutive_consonants(self): - bad = [s for s in self.shortcuts if _has_consonant_cluster(s)] - self.assertFalse(bad, f"shortcuts with two adjacent consonants: {bad}") - - -if __name__ == "__main__": - unittest.main()