create-rule
Scaffold a new rule processor, implement the evaluation logic, and write tests.
SKILL.md.claude/skills/create-rule/SKILL.md
GitHubScaffold the rule using the built-in script:
pnpm create-rule <name> <scope> <description><name>: kebab-case rule name (e.g.,vehicle-validation)<scope>: processor group (mass-idis the only one that exists today)<description>: short description of what the rule validates
This creates the standard file structure:
{rule-name}/ ├── {rule-name}.processor.ts ├── {rule-name}.lambda.ts ├── {rule-name}.processor.spec.ts ├── {rule-name}.lambda.e2e.spec.ts ├── {rule-name}.test-cases.ts ├── {rule-name}.rule-subject.ts ├── index.ts ├── project.json └── vitest.config.tsDefine the rule subject schema: In
{rule-name}.rule-subject.ts, define a*RuleSubjectSchemausingz.object()with the exact fields the rule needs. Export both the schema and the inferred type. UsevalidateRuleSubjectOrThrowas the standard validation entry point in the processor.Implement the processor: In
{rule-name}.processor.ts, implement theevaluateResult()method. The processor extendsParentDocumentRuleProcessor<RuleSubject>.Write test cases: In
{rule-name}.test-cases.ts, define shared test data using@faker-js/fakerandzocker. Never use real data (no real company names, tax IDs, addresses, etc.).Write unit tests: In
{rule-name}.processor.spec.ts, test the core evaluation logic using the shared test cases.Write e2e tests: In
{rule-name}.lambda.e2e.spec.ts, test the Lambda handler end-to-end.Apply to a methodology (if needed):
pnpm apply-methodology-rule <methodology> <rule> <scope>Example:
pnpm apply-methodology-rule carbon-organic vehicle-validation mass-idVerify: Run
pnpm lint:affected && pnpm ts:affected && pnpm test:affectedto confirm everything passes.