feat(kvb-release): release brief method with article and post channels
kvb-release listens once, writes one brief since the previous tag and hands each channel its slice; kvb-release-article writes the long form and kvb-release-post the short posts, each listening before it brainstorms. A project's own release skill sets file names, title and post structure, and an empty channel list means every channel the project covers. kvb-release-changelog moves its lint steps into lint.md. 🎯 Fix: 92 % 💥 Break: 3 % 💸 Cost: 279 % ⏱️ Time: 100 % 🛡️ Security: 100 % 🏆 Score: 32 🚦 Gate: ⚠️ cost 279 % > 100: operator approved the commit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
57ab29eb0d
commit
df3cb4e4d6
8 files changed
+238
-12
No files matched your search
@@ -17,6 +17,7 @@ UNCATEGORIZED = frozenset(
|
||||
"kvb-dream",
|
||||
"kvb-help",
|
||||
"kvb-optimize",
|
||||
"kvb-release",
|
||||
"kvb-transcend",
|
||||
}
|
||||
)
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
"""Pin the operator order of 2026-11-10: every release skill listens, then brainstorms, before it writes."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
SKILLS = Path(__file__).resolve().parents[1] / "skills"
|
||||
RELEASE = ["kvb-release", "kvb-release-article", "kvb-release-changelog", "kvb-release-post"]
|
||||
|
||||
|
||||
def body(name: str) -> str:
|
||||
return (SKILLS / name / "SKILL.md").read_text(encoding="utf-8").split("---", 2)[2]
|
||||
|
||||
|
||||
class TestReleaseSkills(unittest.TestCase):
|
||||
def test_the_release_skills_are_exactly_the_four_methods(self):
|
||||
self.assertEqual(sorted(path.parent.name for path in SKILLS.glob("kvb-release*/SKILL.md")), RELEASE)
|
||||
|
||||
def test_every_release_skill_listens_before_it_brainstorms(self):
|
||||
for name in RELEASE:
|
||||
with self.subTest(skill=name):
|
||||
text = body(name)
|
||||
listen, brainstorm = text.find("kvb-think-listen"), text.find("kvb-think-brainstorm")
|
||||
self.assertGreaterEqual(listen, 0)
|
||||
self.assertGreater(brainstorm, listen)
|
||||
|
||||
def test_the_collector_hands_every_form_to_its_method(self):
|
||||
text = body("kvb-release")
|
||||
for method in RELEASE[1:]:
|
||||
with self.subTest(method=method):
|
||||
self.assertIn(f"`{method}`", text)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user