No description
  • PHP 20.1%
  • Scheme 14.4%
  • JavaScript 10.5%
  • Python 10.4%
  • Java 6.8%
  • Other 37.8%
Find a file
euterpe c23d30bfc8
rename-field/shared-field-name: the limitation narrows to the unplaceable access
Type-directed resolution arrived (daisy: the named-element FIELD arm on
carried types): a construction-known or typed receiver now resolves, so the
old blanket shared-name refusal is gone. The case teaches what remains — an
untyped receiver in span() that neither carried type nor uniqueness can
place still refuses, and honestly.
2026-07-27 20:25:57 +00:00
history doc(history): third reading-lineage lesson — The Timeless Way of Building 2026-07-15 20:42:41 +03:00
pattern draft(catalog): pattern/fowler-pattern/dsl 2026-07-16 07:52:01 +00:00
refactor rename-field/shared-field-name: the limitation narrows to the unplaceable access 2026-07-27 20:25:57 +00:00
smell draft(catalog): smell/daisy-smell/code/overparsed-language 2026-07-16 07:51:59 +00:00
.gitattributes chore: force LF line endings (.gitattributes eol=lf) 2026-07-11 23:40:40 +02:00
AXES.md docs: standalone repo — reworked AXES.md (present-tense, no tooling/history), proper README, READING.md moved in 2026-07-10 20:26:17 +02:00
READING.md doc(history): third reading-lineage lesson — The Timeless Way of Building 2026-07-15 20:42:41 +03:00
README.md rename: smells/ → smell/ — group dirs all singular (smell, refactor, pattern) 2026-07-11 08:42:11 +02:00

catalog

A library of code smells, refactorings, and design patterns — the recognitions and corrective moves of the software-craft literature, drawn from published authors and rendered in one uniform, machine-readable entry format, alongside original entries this project has coined. It is consumed as a version-pinned dependency: tools depend on a specific commit, so the same catalog always yields the same answers.

What an entry is

Each entry is its own directory — composition over embedding. Source examples live as real, runnable files rather than being held hostage as escaped strings inside markdown fences (the hostage-situation smell, applied to our own format). A typical entry carries:

  • description.md — what the smell/refactor/pattern is, in prose.
  • examples/<case>/ — a case with a meta.json (outcome, the smell it relates to, the languages it covers) and per-language before/after fixtures. A refused case is as first-class as a transformed one — a refusal is a recognition.
  • arcs/<case>/ (refactors) — a bigger change as an ordered sequence of behaviour-preserving steps, each a named smaller move, with a fixture at every state. An arc is the runnable form of a composed refactor: tidy by tidy, or strangler-fig step by step.
  • prompt.md (where a model recognises or applies the entry) — the natural-language detector/actuator.

Entries link to each other by relation: a refused case names the smell that blocks it; a transformed case names the smell it cures. Composed, those links form a smell↔refactor dependency graph.

How it is organised

Three top-level groups — smell/, refactor/, pattern/ — with each author lineage a directory inside its group. smell/ also holds Opdyke preconditions — a distinct kind that is not a smell, but is recognised present-or-absent the same way (the blocked-by node between a smell and its refactor). A few operational lineages that are not smell/refactors/patterns stay at the root. The author prefix names whose recognition an entry follows; daisy- marks entries this project originated. Smells are classified onto four quality axes plus two grounds — see AXES.md. The sources are catalogued in READING.md.

Lineage Source
beck-tidy/ Beck, Tidy First? (2023)
fowler-refactor/ Fowler, Refactoring (2nd ed., 2018)
feathers-refactor/ Feathers, Working Effectively with Legacy Code (2004)
kerievsky-refactor/ Kerievsky, Refactoring to Patterns (2005)
fowler-smell/ Fowler, Refactoring — code smells
constantine-smell/ Myers, Composite Design (1975) / Constantine & Yourdon, Structured Design (1979) — the coupling ladder
opdyke-precondition/ Opdyke, Refactoring Object-Oriented Frameworks (1992) — the enabling conditions a refactor must find true; the blocked-by node between smell and refactor (not a smell, recognized like one)
meszaros-test-smell/ Mészáros, xUnit Test Patterns (2007) — test smells
meszaros-test-refactor/ Mészáros — test-smell → test-pattern moves
meszaros-test-pattern/ Mészáros — test pattern destinations
wake-test-pattern/ Bill Wake — Arrange-Act-Assert (2001)
north-test-pattern/ Dan North — Given-When-Then / BDD (2006)
goos-pattern/ Freeman & Pryce, Growing Object-Oriented Software, Guided by Tests (2009)
gof-pattern/ Gamma/Helm/Johnson/Vlissides, Design Patterns (1994)
meyer-pattern/ Meyer, Object-Oriented Software Construction (1997) — Command-Query Separation
young-pattern/ Greg Young — CQRS (~2010)
beck-pattern/ Beck, Smalltalk Best Practice Patterns (1997) — Intention-Revealing Name
poeaa-pattern/ Fowler, Patterns of Enterprise Application Architecture (2002)
karwin-sql-smell/ Karwin, SQL Antipatterns (2010 / 2022)
ambler-sql-refactor/ Ambler & Sadalage, Refactoring Databases (2006)
nygard-ops-smell/ · nygard-ops-action/ Nygard, Release It! (2018) — stability antipatterns & damping moves
daisy-tidy/ · daisy-refactor/ original — extensions to Beck / Fowler
daisy-smell/ · daisy-test-smell/ original — code/doc/data/policy/process smells; test smells in Mészáros's tradition
daisy-regex-smell/ · daisy-regex-refactor/ original — regex smells & moves, on Friedl; Goyvaerts & Levithan
daisy-pattern/ · daisy-ops-smell/ · daisy-ops-action/ · daisy-verb/ · daisy-workflow/ · myers-test-axis/ original — pattern destinations, operational smells & moves, verbs, workflows

Using the catalog

Pin it by commit — as a git submodule, or by cloning at a tag/hash. Consumers read entries through their own index; nothing here depends on a particular consumer. Growing the catalog is a normal contribution: add an entry as files on a branch, with its example (and, for a refactor, an arc), and open it for review.