Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ collections:
meetups:
output: true
permalink: /meetups/:year-:month-:day/:title
skills:
output: true
permalink: /skills/:name/

defaults:
- scope:
Expand Down Expand Up @@ -69,3 +72,10 @@ defaults:
values:
description: "Detalle de meetup de Ruby UY con charlas, speakers y recursos de la comunidad Ruby en Uruguay."
keywords: "meetup ruby uruguay, charlas ruby, comunidad ruby uruguay"
- scope:
path: ""
type: "skills"
values:
layout: skill
page_scripts: [skill]
keywords: "skills ruby on rails, claude code skills, agentes ia ruby, comunidad ruby uruguay"
14 changes: 14 additions & 0 deletions _data/skills.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Community-made skills for coding agents (Claude Code, etc.) focused on Ruby on Rails.
# Skills belong to the community — they are not attributed to a single author.
#
# To add one: drop a SKILL.md in _skills/<name>.md and add its entry here.

last_updated: 2026-08-14

skills:
Comment thread
AFornio marked this conversation as resolved.
- name: rspec-tests-for-rails
category: Tests
type: rule
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.
url: /skills/rspec-tests-for-rails/
topics: [rspec, testing, factorybot]
1 change: 1 addition & 0 deletions _includes/default_header.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ <h2>Sé parte_</h2>
<a href="/community">Community<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
<a href="/primera-vez/">Primera vez<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
<a href="/stats">Stats<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
<a href="/skills/">Skills<img src='/assets/images/arrow.svg' aria-hidden="true" focuseable="false"/></a>
</div>
</div>
</header>
18 changes: 18 additions & 0 deletions _includes/skill_card.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div class="skill" data-search="{{ search_text | downcase | strip_html | strip_newlines }}">
<h4>
<a href="{{ skill.url }}">{{ skill.name }}</a>
<span class="skill-type skill-type-{{ skill.type | default: "skill" }}">{{ skill.type | default: "skill" }}s</span>
</h4>

{% if skill.description != "" %}
<p class="skill-description">{{ skill.description }}</p>
{% endif %}

{% if skill.topics.size > 0 %}
<div class="skill-topics">
{% for topic in skill.topics limit: 4 %}
<span class="skill-topic">{{ topic }}</span>
{% endfor %}
</div>
{% endif %}
</div>
39 changes: 39 additions & 0 deletions _layouts/skill.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
{% include head.html %}

<body>
{% include nav.html %}

<main>
<article id="view-skill" class="view">
{% comment %} Catalog metadata lives only in _data/skills.yml {% endcomment %}
{% assign skill = site.data.skills.skills | where: "url", page.url | first %}

<section>
<a href="/skills/" class="skill-back">&larr; Skills</a>
<h2>{{ skill.name }}</h2>
<p class="skill-detail-description">{{ skill.description }}</p>
</section>

<section>
<div class="skill-toolbar">
<div class="skill-tabs">
<button class="skill-tab active" data-view="markdown" type="button">Markdown</button>
<button class="skill-tab" data-view="raw" type="button">Raw</button>
</div>
<button id="skill-copy" class="skill-copy-btn" type="button">Copy</button>
</div>

{% comment %} Rendered by Jekyll; the raw file is re-read below for the copy button {% endcomment %}
<div id="skill-markdown" class="skill-markdown">{{ content }}</div>

{% capture skill_source %}{% include_relative {{ page.slug }}.md %}{% endcapture %}
<pre id="skill-source" class="skill-raw" hidden>{{ skill_source | escape }}</pre>
</section>
</article>
</main>

{% include footer.html %}
</body>
</html>
44 changes: 44 additions & 0 deletions _layouts/skills.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">
{% include head.html %}

<body>
{% include nav.html %}

<main>
<article id="view-skills" class="view">
<section>
<h2>Skills &amp; Rules</h2>
<p class="skills-subtitle">The best Ruby on Rails skills and rules built by our community, for coding agents</p>

<input type="search" id="skills-search" class="skills-search" placeholder="Search skills..." autocomplete="off">

<p class="skills-updated">Last updated: {{ site.data.skills.last_updated | date: "%B %-d, %Y" }}</p>

<p class="skills-contribute">Missing one? <a href="https://github.com/rubyuy/ruby.uy/tree/main/_skills">Contribute a skill or rule</a> — anyone can add one.</p>
</section>

<section id="skills-list">
{% assign skills = site.data.skills.skills %}

{% if skills.size == 0 %}
<p class="skills-empty">No skills published yet — be the first to add one.</p>
{% endif %}

{% assign categories = skills | group_by: "category" %}
{% for category in categories %}
<h3 class="skills-category">{{ category.name | default: "Other" }}</h3>

{% for skill in category.items %}
{% capture search_text %}{{ skill.name }} {{ skill.description }} {{ skill.topics | join: ' ' }}{% endcapture %}

{% include skill_card.html %}
{% endfor %}
{% endfor %}
</section>
</article>
</main>

{% include footer.html %}
</body>
</html>
Loading
Loading