Skip to content

AGENTS.md

Tool-neutral entry point for AI coding assistants working in this repository. The canonical code conventions live in docs/Code Conventions - Guide.md; they apply to every contributor — human or automated — and supersede generic language/style heuristics that an assistant might apply by default.

Output grading

Generated code must pass the two rulesets that ship in this repo under scanner/:

  • PMD (Apex): scanner/kerndx-pmd-ruleset.xml — KernDX Apex conventions (no inline SOQL/DML, no System.debug, no fflib_ patterns, ApexDoc required, explicit sharing, coverage-theatre detection, etc.).
  • ESLint (LWC + JS): scanner/eslint-plugin-kerndx/ — KernDX LWC conventions (no direct LightningElement, ComponentBuilder extension, etc.).

Run them locally before opening a PR:

bash
# PMD via Salesforce Code Analyzer (uses scanner/code-analyzer.yml config)
sf code-analyzer run --config-file code-analyzer.yml --target force-app/

# ESLint via the bundled plugin (extend it from your repo's flat config)
npx eslint --config eslint.config.mjs <files>

If either fails, fix the violation in source — do not suppress the rule without justification documented in code review.

Read first

DocumentPurpose
docs/Code Conventions - Guide.mdCritical Apex/LWC/JS rules, naming, formatting, ApexDoc requirements.
docs/Installation.mdHow adopters install or repackage KernDX. Path 1 (managed package) vs Path 2 (namespace repackage).
docs/README.mdLearning paths into Fast Starts + Strategic Guides + the auto-generated Apex reference.
scanner/README.mdHow to wire the PMD ruleset + ESLint plugin into a subscriber's CI.

Operating rules for AI assistants

  • Match repository style. Allman braces in Apex + JavaScript, tabs for indentation, 180-char Apex line cap, single-quoted JS strings, K&R-style if(condition) (no space before paren).
  • No inline SOQL / DML. Use SEL_* selectors and DML_Builder — see docs/Selectors - Guide.md and docs/DML - Guide.md.
  • No System.debug. Use LOG_Builder — see docs/Logging - Guide.md.
  • No LightningElement directly. Use ComponentBuilder — see docs/LWC - Guide.md.
  • Declare sharing. Every Apex class declares one of with sharing / inherited sharing / without sharing. Default to with sharing; use inherited sharing for selectors + stateless utilities.
  • 100% test coverage on Apex + LWC. Tests must assert behaviour — empty try { ... } catch { } blocks and unconditional Assert.isNotNull(record) after TST_Builder.build() are coverage theatre and rejected by the scanner.
  • No hardcoded namespaces. Use SObjectClass.class.getName() in Apex, @salesforce/schema/* and standard__objectPage in LWC. Never embed kern. as a literal in production code.
  • Use Assert.* in tests, not System.Assert.*. Prefer Foobar__c over standard objects unless the test specifically validates a standard-object integration.

Subscriber context

KernDX ships as a managed package under the kern namespace. Subscribers may have their own namespace and prefix conventions (e.g., ACME_SEL_*). When generating code for a subscriber repo, apply that repo's stated prefix conventions and refer to KernDX classes as kern.ClassName from subscriber Apex.

> Building subscriber code that consumes KernDX? This file (AGENTS.md) governs work > inside this repo. For AI-generation context to drop into your own subscriber > repository's AI assistant, use docs/AI Agent Instructions.md — > it's the comprehensive KernDX framework reference (namespace rules, class patterns, > common idioms) designed for that purpose.

Configuration

The release-testing runners read two environment variables:

  • SF_SUBSCRIBER_ORG_ALIAS — your subscriber test scratch-org alias.
  • KERN_DEV_ORG — your dev scratch-org alias.

Both are required (no defaults). Export them before invoking npm run release:phase2, npm run release:all, or any script under scripts/ that resolves an org alias.

When this document doesn't apply

  • Pure documentation edits.
  • Build-script changes that touch only scripts/ and do not alter Apex or LWC contracts.
  • Configuration / metadata edits in force-app/main/default/customMetadata/.

For everything else: docs/Code Conventions - Guide.md is the rule set.