Skip to content

Commit 41738e3

Browse files
author
Agustin Fornio
committed
Add /skills/ section for community-owned agent skills
Skills are markdown documents that coding agents (Claude Code and friends) load as instructions. This adds a place to publish the ones the community agrees on, so nobody has to rewrite them per project. Each skill is a single file in _skills/, rendered at /skills/<name>/ with a markdown viewer, a raw view and a copy button. Skills are grouped by category and are not attributed to an author: they belong to the community. Seeded with one skill for writing RSpec specs.
1 parent ff18356 commit 41738e3

12 files changed

Lines changed: 772 additions & 1 deletion

File tree

_config.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ collections:
2828
meetups:
2929
output: true
3030
permalink: /meetups/:year-:month-:day/:title
31+
skills:
32+
output: true
33+
permalink: /skills/:name/
3134

3235
defaults:
3336
- scope:
@@ -69,3 +72,10 @@ defaults:
6972
values:
7073
description: "Detalle de meetup de Ruby UY con charlas, speakers y recursos de la comunidad Ruby en Uruguay."
7174
keywords: "meetup ruby uruguay, charlas ruby, comunidad ruby uruguay"
75+
- scope:
76+
path: ""
77+
type: "skills"
78+
values:
79+
layout: skill
80+
page_scripts: [skill]
81+
keywords: "skills ruby on rails, claude code skills, agentes ia ruby, comunidad ruby uruguay"

_data/skills.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Community-made skills for coding agents (Claude Code, etc.) focused on Ruby on Rails.
2+
# Skills belong to the community — they are not attributed to a single author.
3+
#
4+
# To add one: drop a SKILL.md in _skills/<name>.md and add its entry here.
5+
6+
last_updated: 2026-08-14
7+
8+
skills:
9+
- name: rspec-tests-for-rails
10+
category: Tests
11+
description: Rules for writing fast, maintainable RSpec specs in Rails — build_stubbed over build/create, let over before, avoiding N+1s in specs, memoizing the subject.
12+
url: /skills/rspec-tests-for-rails/
13+
topics: [rspec, testing, factorybot]

_includes/default_header.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ <h2>Sé parte_</h2>
1818
<a href="/community">Community<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
1919
<a href="/primera-vez/">Primera vez<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
2020
<a href="/stats">Stats<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
21+
<a href="/skills/">Skills<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
2122
</div>
2223
</div>
2324
</header>

_includes/skill_card.html

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<div class="skill" data-search="{{ search_text | downcase | strip_html | strip_newlines }}">
2+
<h4>
3+
<a href="{{ skill.url }}">{{ skill.name }}</a>
4+
</h4>
5+
6+
{% if skill.description != "" %}
7+
<p class="skill-description">{{ skill.description }}</p>
8+
{% endif %}
9+
10+
{% if skill.topics.size > 0 %}
11+
<div class="skill-topics">
12+
{% for topic in skill.topics limit: 4 %}
13+
<span class="skill-topic">{{ topic }}</span>
14+
{% endfor %}
15+
</div>
16+
{% endif %}
17+
</div>

_layouts/skill.html

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
{% include head.html %}
4+
5+
<body>
6+
{% include nav.html %}
7+
8+
<main>
9+
<article id="view-skill" class="view">
10+
{% comment %} Catalog metadata lives only in _data/skills.yml {% endcomment %}
11+
{% assign skill = site.data.skills.skills | where: "url", page.url | first %}
12+
13+
<section>
14+
<a href="/skills/" class="skill-back">&larr; Skills</a>
15+
<h2>{{ skill.name }}</h2>
16+
<p class="skill-detail-description">{{ skill.description }}</p>
17+
</section>
18+
19+
<section>
20+
<div class="skill-toolbar">
21+
<div class="skill-tabs">
22+
<button class="skill-tab active" data-view="markdown" type="button">Markdown</button>
23+
<button class="skill-tab" data-view="raw" type="button">Raw</button>
24+
</div>
25+
<button id="skill-copy" class="skill-copy-btn" type="button">Copy</button>
26+
</div>
27+
28+
{% comment %} Rendered by Jekyll; the raw file is re-read below for the copy button {% endcomment %}
29+
<div id="skill-markdown" class="skill-markdown">{{ content }}</div>
30+
31+
{% capture skill_source %}{% include_relative {{ page.slug }}.md %}{% endcapture %}
32+
<pre id="skill-source" class="skill-raw" hidden>{{ skill_source | escape }}</pre>
33+
</section>
34+
</article>
35+
</main>
36+
37+
{% include footer.html %}
38+
</body>
39+
</html>

_layouts/skills.html

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
{% include head.html %}
4+
5+
<body>
6+
{% include nav.html %}
7+
8+
<main>
9+
<article id="view-skills" class="view">
10+
<section>
11+
<h2>Skills</h2>
12+
<p class="skills-subtitle">The best Ruby on Rails skills built by our community, for coding agents</p>
13+
14+
<input type="search" id="skills-search" class="skills-search" placeholder="Search skills..." autocomplete="off">
15+
16+
<p class="skills-updated">Last updated: {{ site.data.skills.last_updated | date: "%B %-d, %Y" }}</p>
17+
</section>
18+
19+
<section id="skills-list">
20+
{% assign skills = site.data.skills.skills %}
21+
22+
{% if skills.size == 0 %}
23+
<p class="skills-empty">No skills published yet — be the first to add one.</p>
24+
{% endif %}
25+
26+
{% assign categories = skills | group_by: "category" %}
27+
{% for category in categories %}
28+
<h3 class="skills-category">{{ category.name | default: "Other" }}</h3>
29+
30+
{% for skill in category.items %}
31+
{% capture search_text %}{{ skill.name }} {{ skill.description }} {{ skill.topics | join: ' ' }}{% endcapture %}
32+
33+
{% include skill_card.html %}
34+
{% endfor %}
35+
{% endfor %}
36+
</section>
37+
</article>
38+
</main>
39+
40+
{% include footer.html %}
41+
</body>
42+
</html>

0 commit comments

Comments
 (0)