ed3dai/ed3d-plugins/coding-effectively
Claude Code and agent skill by ed3dai/ed3d-plugins
- community
Checking that the SKILL.md file is still in the repository.
ALWAYS use this skill when writing or refactoring code. Includes context-dependent sub-skills to empower different coding styles across languages and runtimes.
Install
npx vskill@latest install ed3dai/ed3d-plugins/coding-effectivelySKILL.md
Coding Effectively
Required Sub-Skills
ALWAYS REQUIRED:
howto-functional-vs-imperative- Separate pure logic from side effectsdefense-in-depth- Validate at every layer data passes through
CONDITIONAL: Use these sub-skills when applicable:
howto-code-in-typescript- TypeScript codehowto-code-in-rust- Rust codehowto-develop-with-postgres- PostgreSQL database codeprogramming-in-react- React frontend codewriting-good-tests- Writing or reviewing testsproperty-based-testing- Tests for serialization, validation, normalization, pure functions
Property-Driven Design
When designing features, think about properties upfront. This surfaces design gaps early.
Discovery questions:
| Question | Property Type | Example | |
|---|---|---|---|
| Does it have an inverse operation? | Roundtrip | decode(encode(x)) == x | |
| Is applying it twice the same as once? | Idempotence | f(f(x)) == f(x) | |
| What quantities are preserved? | Invariants | Length, sum, count unchanged | |
| Is order of arguments irrelevant? | Commutativity | f(a, b) == f(b, a) | |
| Can operations be regrouped? | Associativity | f(f(a,b), c) == f(a, f(b,c)) | |
| Is there a neutral element? | Identity | f(x, 0) == x | |
| Is there a reference implementation? | Oracle | new(x) == old(x) | |
| Can output be easily verified? | Easy to verify | is_sorted(sort(x)) |
Common design questions these reveal:
- "What about deleted/deactivated entities?"
- "Case-sensitive or not?"
- "Stable sort or not? Tie-breaking rules?"
- "Which algorithm? Configurable?"
Surface these during design, not during debugging.
Core Engineering Principles
Correctness Over Convenience
Model the full error space. No shortcuts.
- Handle all edge cases: race conditions, timing issues, partial failures
- Use the type system to encode correctness constraints
- Prefer compile-time guarantees over runtime checks where possible
- When uncertain, explore and iterate rather than assume
Don't:
- Simplify error handling to save time
- Ignore edge cases because "they probably won't happen"
- Use
anyor equivalent to bypass type checking
Error Handling Philosophy
Two-tier model:
- User-facing errors: Semantic exit codes, rich diagnostics, actionable messages
- Internal errors: Programming errors that may panic or use internal types
Error message format: Lowercase sentence fragments for "failed to {message}".
Lowercase fragments compose naturally: "operation failed: " + error.message reads correctly.
Pragmatic Incrementalism
- Prefer specific, composable logic over abstract frameworks
- Evolve design incrementally rather than perfect upfront architecture
- Don't build for hypothetical future requirements
- Document design decisions and trade-offs when making non-obvious choices
The rule of three applies to abstraction: Don't abstract until you've seen the pattern three times. Three similar lines of code is better than a premature abstraction.
File Organization
Descriptive File Names Over Catch-All Files
Name files by what they contain, not by generic categories.
Don't create:
utils.ts- Becomes a dumping ground for unrelated functionshelpers.ts- Same problemcommon.ts- What isn't common?misc.ts- Actively unhelpful
Do create:
string-formatting.ts- String manipulation utilitiesdate-arithmetic.ts- Date calculationsapi-error-handling.ts- API error utilitiesuser-validation.ts- User input validation
Why this matters:
- Discoverability: Developers find code by scanning file names
- Cohesion: Related code stays together
- Prevents bloat: Hard to add unrelated code to
string-formatting.ts - Import clarity:
import { formatDate } from './date-arithmetic'is self-documenting
When you're tempted to create utils.ts: Stop. Ask what the functions have in common. Name the file after that commonality.
Module Organization
- Keep module boundaries strict with restricted visibility
- Platform-specific code in separate files:
unix.ts,windows.ts,posix.ts - Use conditional compilation or runtime checks for platform branching
- Test helpers in dedicated modules/files, not mixed with production code
Cross-Platform Principles
Use OS-Native Logic
Don't emulate Unix on Windows or vice versa. Use each platform's native patterns.
Bad: Trying to make Windows paths behave like Unix paths everywhere.
Good: Accept platform differences, handle them explicitly.
Platform-Specific Files
When platform differences are significant, use separate files:
Document Platform Differences
When behavior differs by platform, document it in comments:
Test on All Target Platforms
Don't assume Unix behavior works on Windows. Test explicitly:
- CI should run on all supported platforms
- Platform-specific code paths need platform-specific tests
- Document which platforms are supported
Common Mistakes
| Mistake | Reality | Fix | |
|---|---|---|---|
| "Just put it in utils for now" | utils.ts becomes 2000 lines of unrelated code | Name files by purpose from the start | |
| "Edge cases are rare" | Edge cases cause production incidents | Handle them. Model the full error space. | |
| "We might need this abstraction later" | Premature abstraction is harder to remove than add | Wait for the third use case | |
| "It works on my Mac" | It may not work on Windows or Linux | Test on target platforms | |
| "The type system is too strict" | Strictness catches bugs at compile time | Fix the type error, don't bypass it |
Red Flags
Stop and refactor when you see:
- A
utils.tsorhelpers.tsfile growing beyond 200 lines - Error handling that swallows errors or uses generic messages
- Platform-specific code mixed with cross-platform code
- Abstractions created for single use cases
- Type assertions (
as any) to bypass the type system - Code that "works on my machine" but isn't tested cross-platform
Commit Hygiene
Applies to all languages. Commits are the unit of review and bisect; treat them with the same care as the code they contain.
- Each commit is a logical, atomic unit of change.
- Every commit must build and pass all checks (bisect-able history).
- Separate concerns: formatting fixes and refactoring go in separate commits from feature changes.
- Use simple past and present tense in bodies: "Previously X happened. With this commit, Y now happens."
- Commit message bodies use markdown. Do not use backticks in commit titles, but do use them in bodies.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugins/ed3d-house-style/skills/coding-effectively/SKILL.md
Popularity
- Repository stars
- 158
- Repository forks
- 18
- 7-day trend score
- 25
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 31 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/ed3dai/ed3d-plugins/coding-effectively)