Two CLAUDE.md conventions had no mechanical gate, so both drifted: entity models shipped without sibling tests, and feature test files imported src modules via `../` instead of the `@/` alias. - `entity-must-have-test` — every entities/models/<x>.ts needs a sibling <x>.test.ts (errors and barrels excluded). - `no-relative-parent-import-in-tests` — feature test files must import src via `@/`, not `../`. Scoped to feature packages; core packages are governed by their own generator templates. Both register at warn level, bringing the conformance rule count to 15.
52 lines
2.6 KiB
JavaScript
52 lines
2.6 KiB
JavaScript
import featureMustHaveManifest from "./rules/feature-must-have-manifest.js";
|
|
import usecaseMustHaveTestFile from "./rules/usecase-must-have-test-file.js";
|
|
import requiredCoresInstalled from "./rules/required-cores-installed.js";
|
|
import noUndeclaredEventPublish from "./rules/no-undeclared-event-publish.js";
|
|
import noUndeclaredAudit from "./rules/no-undeclared-audit.js";
|
|
import noUndeclaredAnalyticsEvent from "./rules/no-undeclared-analytics-event.js";
|
|
import usecaseMustBeWired from "./rules/usecase-must-be-wired.js";
|
|
import componentMustHaveStory from "./rules/component-must-have-story.js";
|
|
import componentMustHaveTest from "./rules/component-must-have-test.js";
|
|
import atomicTierImportDirection from "./rules/atomic-tier-import-direction.js";
|
|
import piiDeclarationMustBeComplete from "./rules/pii-declaration-must-be-complete.js";
|
|
import noUndeclaredConsentCheck from "./rules/no-undeclared-consent-check.js";
|
|
import noUndeclaredRateLimit from "./rules/no-undeclared-rate-limit.js";
|
|
import entityMustHaveTest from "./rules/entity-must-have-test.js";
|
|
import noRelativeParentImportInTests from "./rules/no-relative-parent-import-in-tests.js";
|
|
|
|
/**
|
|
* The `@repo/core-eslint` conformance plugin. Aggregates custom rules that
|
|
* enforce feature-conformance contracts (manifest presence, sibling tests,
|
|
* required-cores ↔ workspace consistency).
|
|
*
|
|
* Registered as the `conformance` plugin in flat config:
|
|
*
|
|
* import conformancePlugin from "@repo/core-eslint/plugin";
|
|
* export default [
|
|
* { plugins: { conformance: conformancePlugin } },
|
|
* { rules: { "conformance/feature-must-have-manifest": ["warn", { repoRoot: import.meta.dirname }] } },
|
|
* ];
|
|
*/
|
|
const plugin = {
|
|
meta: { name: "conformance", version: "0.4.0" },
|
|
rules: {
|
|
"feature-must-have-manifest": featureMustHaveManifest,
|
|
"usecase-must-have-test-file": usecaseMustHaveTestFile,
|
|
"required-cores-installed": requiredCoresInstalled,
|
|
"no-undeclared-event-publish": noUndeclaredEventPublish,
|
|
"no-undeclared-audit": noUndeclaredAudit,
|
|
"no-undeclared-analytics-event": noUndeclaredAnalyticsEvent,
|
|
"usecase-must-be-wired": usecaseMustBeWired,
|
|
"component-must-have-story": componentMustHaveStory,
|
|
"component-must-have-test": componentMustHaveTest,
|
|
"atomic-tier-import-direction": atomicTierImportDirection,
|
|
"pii-declaration-must-be-complete": piiDeclarationMustBeComplete,
|
|
"no-undeclared-consent-check": noUndeclaredConsentCheck,
|
|
"no-undeclared-rate-limit": noUndeclaredRateLimit,
|
|
"entity-must-have-test": entityMustHaveTest,
|
|
"no-relative-parent-import-in-tests": noRelativeParentImportInTests,
|
|
},
|
|
};
|
|
|
|
export default plugin;
|