smithery/ZempTime

vanilla-rails-naming

Use when naming classes, methods, routes in vanilla Rails codebases - enforces concern adjectives (-able/-ible only), no bangs for state, resource naming cascade, and commit message format

Installation

$ npx skills add smithery/ZempTime --skill vanilla-rails-naming

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from smithery/ZempTime.

npx skills add smithery/ZempTime

Browse all from smithery/ZempTime

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 2,548 B
  • docs SUMMARY.md 180 B

History

  1. First recorded snapshot · 0 installs

SKILL.md

Vanilla Rails Naming

37signals naming conventions from production Basecamp codebases.

The Naming Cascade

Every state change flows through this cascade:

Layer Pattern Example
Concern Adjective (-able/-ible) Card::Closeable
State model Noun Closure
Controller Plural noun ClosuresController
Route Singular resource resource :closure
Method Plain verb (no !) card.close
Async enqueue *_later notifywatcherslater
Sync execute *_now or plain notifywatchersnow

If the cascade doesn't flow, the naming is wrong.

Concern Names: -able/-ible ONLY

# Wrong
Card::Closing        # verb
Card::PinManager     # Manager/Handler/Service
Card::Closed         # past participle

# Right
Card::Closeable
Card::Pinnable
Card::Assignable

If concern name doesn't end in -able/-ible, STOP and rename immediately. No -ing, -er, -ish, Logic, Management, Handler, Service.

State Methods: No Bangs

Plain verbs for state changes. ! only when non-bang counterpart exists.

# Wrong                    # Right
card.close!                card.close
card.pin!                  card.pin_by(user)
card.archive!              card.archive

Async: later/now

_later always at the end of compound verbs:

notify_watchers_later      # enqueues job
notify_watchers_now        # actual logic (called by job)
pin_and_notify_later       # compound verb

File Locations

app/models/card/closeable.rb           # Model-specific concern
app/models/concerns/eventable.rb       # Shared concern
app/models/closure.rb                  # State record
app/controllers/cards/closures_controller.rb

Commit Messages

Present tense, lowercase, no type prefixes:

add pin feature to cards
extract closeable concern
fix closure validation

Not: feat:, fix:, [FEATURE], past tense, title case.

Red Flags

Red flag Fix
Concern not -able/-ible Rename immediately
State method with ! Remove bang
post :close in routes resource :closure
Async without _later Add suffix
ClosureController (singular) ClosuresController (plural)
Commit with feat: prefix Present tense, no prefix