Compare commits

...
2 Commits
Author SHA1 Message Date
Julian lechnerandClaude Opus 5.5 3285055d80 fix(validate): check flat Claude rule skills
CI / CI configuration security checks (push) Successful in 5s
CI / Capabilities and shell quality (push) Successful in 14s
CI / Python tests and compilation (push) Successful in 18s
CI / Build and inspect generated packages (push) Successful in 16s
CI / PowerShell tests on Ubuntu (push) Successful in 1m2s
CI / Installed client configuration smoke tests (push) Successful in 34s
CI / Bash integration and installation guards (push) Successful in 1m5s
CI / Qwen retrieval integration (push) Successful in 14m22s
Look for rule skills under skills/rules-*/ and fail when none exist, so a
layout change cannot silently skip their frontmatter validation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 11:13:01 +02:00
Julian lechnerandClaude Opus 5.5 6d53597dbf fix(budget): read flat Claude rule skills
The flat Claude layout moved rule skills to skills/rules-*/, which made the
prompt budget fail to find rules-security.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 11:13:00 +02:00
2 changed files with 6 additions and 3 deletions

No files matched your search

+4 -1
View File
@@ -65,7 +65,10 @@ def validate_claude(path: Path) -> None:
def validate_rule_skills(package: Path) -> None:
for path in (package / "skills" / "rules").glob("*/SKILL.md"):
paths = sorted((package / "skills").glob("rules-*/SKILL.md"))
if not paths:
fail(f"{package}: no generated rules-* skills found")
for path in paths:
lines = path.read_text(encoding="utf-8-sig").splitlines()
if len(lines) < 4 or lines[0] != "---" or lines[3] != "---" or not lines[1].startswith("name: ") or not lines[2].startswith("description: "):
fail(f"{path}: invalid generated skill frontmatter")
+2 -2
View File
@@ -40,8 +40,8 @@ def measure_package(package, client):
)
if client == 'claude':
rule_files = (package / 'skills' / 'rules').glob('rules-*/SKILL.md')
security_rule = package / 'skills' / 'rules' / 'rules-security' / 'SKILL.md'
rule_files = (package / 'skills').glob('rules-*/SKILL.md')
security_rule = package / 'skills' / 'rules-security' / 'SKILL.md'
security_content = security_rule.read_text(encoding='utf-8-sig')
security_header = re.match(r'\A---\r?\n.*?^---[ \t]*\r?$', security_content, re.MULTILINE | re.DOTALL)
auto_loaded_rule_bytes = len(security_content[security_header.end():].encode('utf-8')) if security_header else len(security_content.encode('utf-8'))