{"slug": "i-built-a-repo-where-a-first-pr-is-one-folder-and-a-144-line-validator-reviews", "title": "I built a repo where a first PR is one folder, and a 144-line validator reviews the format", "summary": "A developer built skills-es, an open catalog of Spanish-language skills for Claude Code in which each contribution is a single folder containing a SKILL.md file. A 144-line Python validator using only the standard library runs in CI on every pull request, checking kebab-case naming that matches the folder, description length and character rules, a 'when to use' section, an example file, and the absence of secrets, binaries or executables, returning all errors for a skill at once. The project also ships a CONTRIBUTING guide, a PR checklist template and ten 'good first issue' tickets aimed at first-time contributors, with the developer noting uncertainty over the hand-rolled frontmatter parser and regex-based secret detection.", "body_md": "I'm a beginner in open source. A few weeks ago a fairly big pull request of mine was merged into someone else's project, and the review taught me how much of a maintainer's time goes into checking things a machine could check.\n\nSo I tried to design a small repo where that part is automatic: skills-es, an open catalog of Spanish-language skills for Claude Code.\n\nDisclosure: I built it with Claude's help and reviewed the result myself.\n\nThe idea\n\nA \"skill\" is a folder with a SKILL.md file: reusable instructions an AI coding assistant can follow. Almost every catalog is in English, so this one is in Spanish.\n\nThe contribution unit is one folder:\n\nskills/\n\n  my-skill/\n\n    SKILL.md\n\n    ejemplos/ejemplo.md\n\nAdding a skill never touches code. That matters for people sending their first PR.\n\nThe validator\n\nInstead of the maintainer checking the format by hand, a Python script (standard library only, 144 lines) runs in CI on every PR. For each skill it checks:\n\nname is kebab-case and matches the folder name\n\ndescription is 20-1024 characters and has no < or >\n\nthere is a \"when to use\" section\n\nan example file exists\n\nno secrets (ghp_..., AKIA..., private keys), binaries, or executables\n\nIt returns all errors of a skill at once, not just the first, so a newcomer fixes everything in one round.\n\nSome choices I made:\n\nNo YAML dependency. I parse the frontmatter by hand and only allow key: value on one line. It's less flexible, but there is nothing to install and the error messages are clearer. The trade-off: it will break the day someone wants a multi-line value.\n\nTests that build skills in a temp folder. Each rule has its own unit test (13 in total) that creates a tiny skill, breaks exactly one thing, and asserts the error. Adding a rule means adding one test.\n\nRegex for secrets. Cheap and good enough for obvious leaks, but I'm not sure it's the right call versus a dedicated scanner in CI.\n\nMaking the first PR easy\n\nCONTRIBUTING.md walks through fork, branch, folder, validate, PR.\n\nA PR template with a checklist.\n\nTen issues labelled good first issue, each with acceptance criteria and a hint about where to look.\n\nWhat I don't know yet\n\nWhether a hand-rolled frontmatter parser is a mistake I'll regret.\n\nWhether secret detection by regex is enough.\n\nWhether anyone besides me needs these skills. That's the real test, and no amount of CI answers it.\n\nIf you want to try it or send a skill, the repo is here: [https://github.com/DeadY2J/skills-es](https://github.com/DeadY2J/skills-es)\n\nAnd if you've built contribution tooling for a small project, I'd love to hear what you'd do differently.", "url": "https://wpnews.pro/news/i-built-a-repo-where-a-first-pr-is-one-folder-and-a-144-line-validator-reviews", "canonical_source": "https://dev.to/deady2j/i-built-a-repo-where-a-first-pr-is-one-folder-and-a-144-line-validator-reviews-the-format-2a82", "published_at": "2026-11-03 14:26:43+00:00", "updated_at": "2026-11-03 14:30:43.713627+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "developer-tools", "mlops"], "entities": ["skills-es", "Claude Code", "GitHub", "DeadY2J"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/i-built-a-repo-where-a-first-pr-is-one-folder-and-a-144-line-validator-reviews", "markdown": "https://wpnews.pro/news/i-built-a-repo-where-a-first-pr-is-one-folder-and-a-144-line-validator-reviews.md", "text": "https://wpnews.pro/news/i-built-a-repo-where-a-first-pr-is-one-folder-and-a-144-line-validator-reviews.txt", "jsonld": "https://wpnews.pro/news/i-built-a-repo-where-a-first-pr-is-one-folder-and-a-144-line-validator-reviews.jsonld"}}