Clean code reads like well-written prose. Every name reveals intent. Every function tells a story. Every class has a single purpose. The goal isn't just working code—it's code that others can understand quickly, modify safely, and extend confidently.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionclean-codeExecute the skills CLI command in your project's root directory to begin installation:
Fetches clean-code from ratacat/claude-skills and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate clean-code. Access via /clean-code in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Create detailed user stories, acceptance criteria, and feature specs
Example
Generate user stories for 'password reset feature' with acceptance criteria, edge cases, and test scenarios
Reduce spec writing time by 50%, ensure comprehensive coverage
Research competitors, compare features, identify gaps
Example
Analyze 5 competitor products, create feature comparison matrix, suggest differentiation opportunities
Complete competitive research in 2 hours instead of 2 days
Evaluate features using frameworks (RICE, ICE, Kano) and create prioritized backlogs
Example
Score 20 feature ideas using RICE framework, generate prioritized roadmap with rationale
0
total installs
0
this week
28
GitHub stars
0
upvotes
Run in your terminal
0
installs
0
this week
28
stars
Clean code reads like well-written prose. Every name reveals intent. Every function tells a story. Every class has a single purpose. The goal isn't just working code—it's code that others can understand quickly, modify safely, and extend confidently.
"Clean code always looks like it was written by someone who cares." — Michael Feathers
"You know you are working on clean code when each routine turns out to be pretty much what you expected." — Ward Cunningham
The Boy Scout Rule: Leave the code cleaner than you found it. Every commit should improve quality, even if just slightly. Small improvements compound.
This skill provides an overview with quick references. For detailed guidance with examples, see the chapter files:
chapters/names.md - Meaningful Names (intention-revealing, searchable, pronounceable)chapters/functions.md - Functions (small, do one thing, few arguments)chapters/comments.md - Comments (why to avoid, what's acceptable)chapters/objects-and-data.md - Objects and Data Structures (Law of Demeter, DTOs)chapters/error-handling.md - Error Handling (exceptions, null handling, Special Case Pattern)chapters/tests.md - Unit Tests (TDD, F.I.R.S.T., clean tests)chapters/classes.md - Classes (SRP, cohesion, OCP, DIP)smells-and-heuristics.md - Complete code smells reference (66 smells with explanations)Names should reveal intent and be searchable.
| Rule | Bad | Good |
|---|---|---|
| Reveal intent | d |
elapsedTimeInDays |
| Avoid disinformation | accountList (not a List) |
accounts |
| Make distinctions | a1, a2 |
source, destination |
| Pronounceable | genymdhms |
generationTimestamp |
| Searchable | 7 |
MAX_CLASSES_PER_STUDENT |
| Classes = nouns | Process |
Customer, Account |
| Methods = verbs | data |
postPayment(), save() |
Avoid: Manager, Processor, Data, Info in class names—they hint at unclear responsibilities.
Key insight: If you need a comment to explain what a variable is, rename it instead.
| Count | Guidance |
|---|---|
| 0 | Best |
| 1 | Good |
| 2 | Acceptable |
| 3+ | Avoid—wrap in object |
Flag arguments (booleans) are ugly. They proclaim the function does two things. Split it:
# Bad
def render(is_suite: bool): ...
# Good
def render_for_suite(): ...
def render_for_single_test(): ...
checkPassword() also initializes a session, it liesComments are, at best, a necessary evil. The proper use of comments is to compensate for our failure to express ourselves in code.
// default constructor, // increment i} // end if means too much nesting// takes 30 minutes)The Rule: When you feel the urge to comment, first try to refactor the code so the comment would be unnecessary.
Error handling is important, but if it obscures logic, it's wrong.
| Rule | Details |
|---|---|
| Use exceptions over return codes | Separates algorithm from error handling |
| Provide context | Include operation that failed and type of failure |
| Wrap third-party APIs | Minimizes dependencies, enables mocking |
| Use Special Case Pattern | Return object that handles special case (empty list, default values) |
| Don't return null | Creates work, invites NullPointerException |
| Don't pass null | Worse than returning null—forbid it by default |
# Bad - null checks everywhere
if employees is not None:
for e in employees:
total += e.pay
# Good - return empty collection instead of null
for e in get_employees(): # Returns [] if none
total += e.pay
A class should have one, and only one, reason to change.
Tests:
Manager, Processor, Super)Methods should use the class's instance variables. When methods cluster around certain variables but not others, the class should be split.
Classes should be open for extension but closed for modification. Add new behavior via subclassing, not modifying existing code.
Depend on abstractions, not concrete details. Inject dependencies for testability.
# Bad - can't test without network
class Portfolio:
def __init__(self):
self.exchange = TokyoStockExchange()
# Good - injectable, testable
class Portfolio:
def __init__(self, exchange: StockExchange):
self.exchange = exchange
Warning: Test code is just as important as production code. If you let tests rot, your code will rot too.
| Concept | Hides | Exposes | Easy to add... |
|---|---|---|---|
| Objects | Data | Functions | New types |
| Data Structures | Nothing | Data | New functions |
The idea that everything is an object is a myth. Sometimes you want simple data structures with procedures operating on them.
A method should only call methods of:
Don't call methods on objects returned by allowed functions (train wrecks):
# Bad
output_dir = ctxt.get_options().get_scratch_dir().get_absolute_path()
# Good - tell the object to do the work
bos = ctxt.create_scratch_file_stream(class_file_name)
From Chapter 17's comprehensive list, these are the most important:
The root of all evil in software. Every duplication is a missed abstraction opportunity:
If you can extract another function from it, the original was doing more than one thing.
Names are 90% of what makes code readable. Take time to choose wisely.
Zero is best, then one, two, three. More requires justification.
Boolean parameters mean the function does two things. Split it.
Code that isn't executed. Delete it—version control remembers.
If you do something one way, do all similar things the same way.
An abomination. Delete it immediately.
"Writing clean code requires the disciplined use of a myriad little techniques applied through a painstakingly acquired sense of 'cleanliness.' The code-sense is the key."
Clean code isn't written by following rules mechanically. It comes from values that drive disciplines—caring about craft, respecting readers of your code, and taking pride in professional work.
How do you write clean code? First drafts are clumsy—long functions, nested loops, arbitrary names, duplication. You refine: break out functions, change names, eliminate duplication, shrink methods. Nobody writes clean code from the start.
Getting software to work and making it clean are different activities. Most of us have limited room in our heads, so we focus on getting code to work first. The problem is that too many of us think we are done once the program works. We fail to switch to organization and cleanliness. We move on to the next problem rather than going back and breaking overstuffed classes into decoupled units.
Don't. Go back. Clean it up. Leave it better than you found it.
Make data-driven prioritization decisions faster
Draft PRDs, status updates, and stakeholder presentations
Example
Create executive summary of Q3 roadmap, monthly progress report, feature launch announcement
Save 3-5 hours/week on communication overhead
Prerequisites
Time Estimate
30-60 minutes to see productivity improvements
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use for user story writing, competitive research, roadmap prioritization, stakeholder communication, and PRD drafting. Best for reducing repetitive documentation and research work.
✗ Avoid when
Avoid for strategic product vision (requires deep customer empathy), pricing decisions (needs market and financial expertise), or when face-to-face customer discovery is more valuable than speed.
asyrafhussin/agent-skills
shadcn/improve
mattpocock/skills
parcadei/continuous-claude-v3
cursor/plugins
ailabs-393/ai-labs-claude-skills
I recommend clean-code for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
clean-code fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
Registry listing for clean-code matched our evaluation — installs cleanly and behaves as described in the markdown.
clean-code fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
clean-code has been reliable in day-to-day use. Documentation quality is above average for community skills.
clean-code reduced setup friction for our internal harness; good balance of opinion and flexibility.
clean-code is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
Useful defaults in clean-code — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
clean-code is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
Keeps context tight: clean-code is the kind of skill you can hand to a new teammate without a long onboarding doc.
showing 1-10 of 34