firebase-android-sdk / plugins
AGENTS.md2.6k starsChanged 14 months agoApache-2.0View on GitHub
Agents that support directory-scoped context files load this file only when they read or edit files under plugins/. It complements the repository-wide guidance in the root AGENTS.md. All custom build, release, CI, and documentation logic lives in plugins/, which is included as a composite build (includeBuild("./plugins") in the root settings.gradle.kts). - Source layout: plugins/src/main/java/com/google/firebase/gradle/plugins/ (core plugins, tasks, and extensions) and plugins/src/main/java/com/google/firebase/gradle/bomgenerator/ (BOM tasks). - Testing and formatting: Run plugin unit and Gradle TestKit tests with ./gradlew plugins:check and format plugin…
We split this AGENTS.md into the rules it gives an agent
5 rules. About 0 are common, 0 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 7
All custom build, release, CI, and documentation logic lives in plugins/, which is included as a composite build (includeBuild("./plugins") …
- Very specific: line 13
Testing and formatting: Run plugin unit and Gradle TestKit tests with ./gradlew plugins:check and format plugin code with ./gradlew -p …
- Very specific: line 56
Every firebase-library and firebase-java-library module exposes the firebaseLibrary DSL block:
- Very specific: line 160
Use ./gradlew :<project>:cleanDackkaDocumentation to delete intermediate and root doc output directories when testing changes locally.
- Very specific: line 177
If the JAR is absent locally, kotlindoc will fail.
≈ “Common” is an estimate: at least 1 in 5 of the 36,368 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Gradle Plugins (plugins/ Directory)
Agents that support directory-scoped context files load this file only when they read or edit
files under plugins/. It complements the repository-wide guidance in the root
AGENTS.md.
All custom build, release, CI, and documentation logic lives in plugins/, which is included as a
composite build (includeBuild("./plugins") in the root settings.gradle.kts).
- Source layout:
plugins/src/main/java/com/google/firebase/gradle/plugins/(core plugins, tasks, and extensions) andplugins/src/main/java/com/google/firebase/gradle/bomgenerator/(BOM tasks). - Testing and formatting: Run plugin unit and Gradle TestKit tests with
./gradlew plugins:checkand format plugin code with./gradlew -p plugins spotlessApply.
Registered Plugins and Extensions
Plugins are registered in plugins/build.gradle.kts:
- Library Plugins (subclass
BaseFirebaseLibraryPlugin):firebase-library(FirebaseAndroidLibraryPlugin): Applied to Android SDK modules. Appliescom.android.library,LicenseResolverPlugin,DackkaPlugin, andGitSubmodulePlugin(bindsupdateGitSubmodulestopreBuild). Configures Java 8/Kotlin targets,FirebaseTestServer, Metalava API tasks (apiInformation,generateApiTxtFile,docStubs),gmavenVersionCheck,metalavaSemver,makeReleaseNotes, and Maven publishing.firebase-java-library(FirebaseJavaLibraryPlugin): Applied to pure Java/Kotlin JVM library modules. Appliesjava-libraryandDackkaPlugin, and configures Metalava API tasks, version checks,makeReleaseNotes, and Maven publishing.
- Root Orchestration Plugins (applied in root
build.gradle.kts):PublishingPlugin(PublishingPlugin): Orchestrates release validation, artifact and doc packaging, release notes, BOM generation, and dynamically appliesPostReleasePluginto releasing modules.firebase-ci(ContinuousIntegrationPlugin): Computes Git-affected subprojects and registers*Dependentsand*Changedverification tasks (checkChanged,checkCoverageChanged,deviceCheckChanged,writeChangedProjects). Configured via thefirebaseContinuousIntegrationextension (ignorePaths).smoke-tests(SmokeTestsPlugin): RegistersassembleAllForSmokeTests, which runspublishAllToBuildDirand writesbuild/m2repository/changed-artifacts.json.test-report(TestReportPlugin): RegistersgenerateTestReport.
- Utility Plugins:
firebase-vendor(VendorPlugin): Shades and relocates dependencies declared on thevendorconfiguration into the module's namespace duringreleasebuilds using JarJar (<variant>VendorTransform). Fails ifjava.*orjavax.*classes are present in vendored dependencies, so those transitive dependencies must be excluded.LicenseResolverPlugin(LicenseResolverPlugin): Creates thethirdPartyLicensesextension (add(name, ...licenseUris)) and registersgenerateLicensesto bundle third-party license files into the AAR.copy-google-services(CopyGoogleServicesPlugin): RegisterscopyRootGoogleServicesto copy the rootgoogle-services.json(orplugins/resources/dummy-google-services.jsonfallback, orFIREBASE_GOOGLE_SERVICES_PATH) into the module directory, rewriting allpackage_namefields to match the module's Androidnamespace. Automatically appliescom.google.gms.google-serviceswhen instrumentation test tasks (AndroidTest,connectedCheck,deviceCheck) are invoked.
firebaseLibrary Extension (FirebaseLibraryExtension)
Every firebase-library and firebase-java-library module exposes the firebaseLibrary DSL block:
groupId/artifactId: Maven coordinates (default to projectgroupandname).libraryGroup: Links sibling modules that must always release together and share identical versions (aligned automatically viafixLibraryGroupVersionsinLibraryGroups.kt). Modules in the samelibraryGroupare permitted to retain project-level dependencies (project(":...")) on one another across releases.publishJavadoc(defaulttrue) /onlyPublishKotlindoc(defaultfalse): Controls reference documentation generation viaDackkaPlugin.previewMode: When set (for example,"alpha"or"beta"), release validation enforces that the module'sversioningradle.propertiescontains that suffix.androidLintCheckProjects: Projects added tolintChecks(configurable via-Pfirebase.checks.lintProjects).customizePom { ... }: Customizes the generated Maven POM.testLab(FirebaseTestLabExtension): Configures Firebase Test Lab execution (enabled,timeout,devices).releaseNotes(ReleaseNotesConfigurationExtension): ConfiguresmakeReleaseNotes(enabled,name,versionName,nestedHeader,artifactName) for Devsite/Firesite variable substitution.
Publishing Architecture and Task Execution
Publishing is split between per-module configuration in BaseFirebaseLibraryPlugin and root-level
orchestration in PublishingPlugin:
- Per-Module Publication (
BaseFirebaseLibraryPlugin):- Applies
MavenPublishPlugin, disablesGenerateModuleMetadataon Android libraries, and registers a local repository namedBuildDirat<rootProject>/build/m2repository. - Creates a
MavenPublicationnamedmavenAarfromfirebaseLibrary.componentName(releasefor Android orjavafor JVM libraries; switches todebugwhen-PpublishDebugVariant=trueis set). - Transforms the generated POM XML (
applyPomTransformations): inspectsreleaseRuntimeClasspath(orruntimeClasspath) to identify project and external Android dependencies and injects<type>aar</type>or<type>jar</type>into each<dependency>element. Notice that project-level dependencies on modules withoutfirebaseLibrarywill throw aRuntimeExceptionduring POM generation.
- Applies
- Release Metadata Resolution (
PublishingPlugin.computeReleaseMetadata):- Runs in
gradle.projectsEvaluatedand resolves the releasing module set from one of two sources (project properties take precedence):- Project properties:
-PprojectsToPublish="<artifactId1>,<artifactId2>"(with optional-PreleaseName="<name>"). Automatically computes the transitive closure (getDeepTransitiveReleases) across both project-level dependencies andlibraryGroupsiblings. release.json(ReleaseConfig): Generated by./gradlew generateReleaseConfig -PcurrentRelease=... -PpastRelease=...(ReleaseGenerator.kt), which inspects Git commits touchingCHANGELOG.mdand outputsrelease.jsonandrelease_report.md. Unlike-PprojectsToPublish,release.jsonlists Gradle project paths and does not auto-expand; missinglibraryGroupsiblings cause an immediateGradleException.
- Project properties:
- Runs in
firebasePublishExecution Graph:- Validation tasks:
validateProjectsToPublish: Ensures the releasing set is non-empty and every module'sversionsatisfies itspreviewMode.validateLibraryGroupsToPublish: Verifies all members of any releasinglibraryGroupare included.checkHeadDependencies(CheckHeadDependencies.kt): Verifies all project-level dependencies of releasing modules are also in the release (exceptprotolite-well-known-types).validatePomForRelease/isPomDependencyValid(PomValidator.kt): Diffs generated POM dependency versions against the latest released POM on GMaven to catch accidental version downgrades.
- Artifact tasks:
publishReleasingLibrariesToBuildDir->buildMavenZip: RunspublishMavenAarPublicationToBuildDirRepositoryfor each releasing module and archives<root>/build/m2repositoryintobuild/m2repository.zip.generateKotlindocForRelease->buildKotlindocZip: Runskotlindocon each releasing module and archives the output intobuild/kotlindoc.zip.prepareReleaseNotesForDrop->buildReleaseNotesZip: RunsmakeReleaseNotes(MakeReleaseNotesTask.kt, which parses the# Unreleasedsection ofCHANGELOG.md) for each releasing module, stages files underbuild/release-notes/android/client/<module>/_releases/<releaseName>.md, and archives them intobuild/release-notes.zip.
- Post-release and BOM tasks:
postReleaseCleanup(PostReleasePlugin, applied to releasing modules): RunsversionBump(VersionBumpTask.kt),moveUnreleasedChanges(MoveUnreleasedChangesTask.kt), andupdatePinnedDependencies(UpdatePinnedDependenciesTask.kt, which rewritesproject(":...")dependencies outside the module'slibraryGroupback to pinned GMaven coordinates in the module's build file).generateBom,generateBomReleaseNotes,generateTutorialBundle, andbuildBomBundleZip: Generate the Firebase BOM and release collateral usingGMavenService.
- Validation tasks:
Reference Documentation Generation (DackkaPlugin)
Reference documentation for Firesite (firebase.google.com/docs/reference) is generated by
DackkaPlugin (DackkaPlugin.kt, DackkaGenerationTask.kt, FiresiteTransformTask.kt). When
firebaseLibrary.publishJavadoc is true, invoking ./gradlew :<project>:kotlindoc executes a
three-step pipeline:
generateDackkaDocumentation(GenerateDocumentationTask):- Collects Java and Kotlin source directories from the Android
releasevariant, combinesreleaseCompileConfigurationjars,javadocClasspathjars, andbootClasspath, and writes a JSON configuration file (dackkaArgs*.json) forcom.google.devsite.DevsitePlugin(settingjavaDocsPathto"android"unlessonlyPublishKotlindocistrue, andkotlinDocsPathto"kotlin"). - Launches Dokka (
org.jetbrains.dokka.MainKt) via a GradleWorkerExecutoragainst the fat JAR at<rootProject>/dackka-fat-1.2.0.jar, outputting to a task temporary directory (dackkaRawOutput). Depends oncreateFullJarRelease.
- Collects Java and Kotlin source directories from the Android
firesiteTransform(FiresiteTransformTask):- Transforms Devsite-formatted output in
dackkaRawOutput/docs/referenceinto Firesite format (dackkaTransformedFiles):- Deletes
index.html,classes.html,packages.html, andpackage-list. - Strips
Class IndexandPackage Indexsections, removes thecom.google.prefix from package titles, and addsstatus: deprecatedto-ktxpackages in_toc.yamlfiles. - Strips module-specific prefixes from
book_path, repairs malformed HTML hyperlinks inside@seeblocks, and rewrites.Companion.htmllinks to.htmlin generated HTML files.
- Deletes
- Transforms Devsite-formatted output in
copyDocsToCommonDirectory:- Copies transformed documentation into
<rootProject>/build/firebase-kotlindoc. - Use
./gradlew :<project>:cleanDackkaDocumentationto delete intermediate and root doc output directories when testing changes locally.
- Copies transformed documentation into
Common Pitfalls and Failure Modes in Reference Documentation
The documentation tasks are brittle and prone to break in the following ways:
firebase-java-libraryincompatibility withDackkaPlugin:FirebaseJavaLibraryPluginappliesDackkaPluginand inheritspublishJavadoc = truefromBaseFirebaseLibraryPlugin. However,registerGenerateDackkaDocumentationTaskunconditionally queries the AndroidLibraryExtension(project.extensions.getByType<LibraryExtension>()), depends on the Android taskcreateFullJarRelease, and resolvesandroid-classesartifacts. Any pure Java/Kotlin module usingfirebase-java-librarymust setfirebaseLibrary { publishJavadoc = false }, or configuringgenerateDackkaDocumentation/ runningkotlindocwill fail.- Missing
<rootProject>/dackka-fat-1.2.0.jar:generateDackkaDocumentationrequiresdackka-fat-1.2.0.jarin the repository root. In CI (.github/workflows/build-release-artifacts.yml), this file is fetched fromgs://android-ci/mvn/com/google/devsite/dackka-fat/1.2.0/dackka-fat-1.2.0.jar. If the JAR is absent locally,kotlindocwill fail. - Hardcoded
kotlindoc/package-listsdirectory names:GenerateDocumentationTaskdiscovers allkotlindoc/package-lists/**/package-listfiles and looks up each file's parent directory name in a hardcoded map inDackkaGenerationTask.kt(android,androidx,google,coroutines,firebase,kotlin,serialization). Adding a new subdirectory underkotlindoc/package-lists/without registering its base URL increateExternalLinksthrowsRuntimeException("Unexpected package-list found: ..."). - Unresolved symbols from
compileOnlyor annotation processors: Dackka resolves symbols from the Androidreleasecompile configuration andjavadocClasspath(whichcompileOnlyextends from). If a library uses compile-only annotations (such aslibs.autovalue.annotations) needed during doc generation, declare them onjavadocClasspath. Note thatjavadocConfig.jarsresolves dependencies using theartifactType = "android-classes"attribute view. - Fragile regex transformations in
FiresiteTransformTask: HTML and_toc.yamlfixes inFiresiteTransformTaskrely on exact regular expressions matching Dackka's output structure (for example,@see <a href="...">tags,setvar book_path, and_toc.yamlindentation). Malformed@seetags in KDoc/Javadoc or changes in Dackka's output format can silently leave broken links or corrupt_toc.yaml. - Metalava
docStubsruns duringcheck: Bothfirebase-libraryandfirebase-java-libraryregister a MetalavadocStubs(GenerateStubsTask) task and attach it tocheck. Invalid Javadoc/KDoc syntax or missing classpath references in doc comments can cause./gradlew :<project>:checkto fail indocStubs.
Trending
Quiet since August.about the whole repository
Who's talking about firebase/firebase-android-sdk
- Stack Overflow“API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with …”Stack Overflow · Mar 16, 2019 · 293 votes
- firebase/flutterfire“🐛 [firebase_core] java.lang.IllegalArgumentException: Service not registered: …”GitHub · Nov 11, 2020 · 49 reactions
- Stack Overflow“Android Error when communicating with the Firebase Installations server API”Stack Overflow · Apr 27, 2020 · 40 votes
- Stack Overflow“Android Error when communicating with the Firebase Installations server API”Stack Overflow · Apr 30, 2020 · 37 votes
- Stack Overflow“Play Store Warning : play-services-safetynet (com.google.android.gms:play-services-safetynet) has reported …”Stack Overflow · Jul 20, 2022 · 22 votes
The biggest 5 of 61 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 61
Talked about on Stack Overflow, GitHub and Hacker News (61 times).
On Stack Overflow · 30
- Mar 16, 2019API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildProviders()293 votes
- Apr 27, 2020Android Error when communicating with the Firebase Installations server API40 votes · 19 answers
- Apr 30, 2020Android Error when communicating with the Firebase Installations server API37 votes
- Jul 20, 2022Play Store Warning : play-services-safetynet (com.google.android.gms:play-services-safetynet) has reported critical issues with version 17.0.022 votes
- May 2, 2020Firebase cannot communicate with Firebase Server19 votes
25 more on Stack Overflow
- Aug 29, 2017How to send to "Miscellaneous" notification channel?16 votes
- Jan 28, 2021Why does I'm getting "Service not registered" exception, even though I not used any service in Android - Java/Kotlin?13 votes
- Jan 23, 2019API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildProviders()12 votes
- Jul 28, 2022Will preventing AD_ID permission to be merged affect Firebase functionality?11 votes
- Jan 23, 2019API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildProviders()9 votes
- Feb 18, 2020Specified path for unstripped native libs is not a directory - generateCrashlyticsSymbolFileRelease8 votes
- May 3, 2019Perform the Pending Writes When the App is Closed7 votes
- Sep 16, 2020FirebaseNetworkException: A network error (such as timeout, interrupted connection or unreachable host)6 votes · 2 answers
- Dec 6, 2018AGP 3.3 and Gradle 5.0 warning for variants that are obsolete and will be removed at the end of 20196 votes · 1 answer
- Jan 29, 2024FirebaseRemoteConfigClientException on production (Android)5 votes
- Dec 1, 2023Firebase Crashlytics - java.lang.IllegalStateException: The Crashlytics build ID is missing5 votes
- Dec 5, 2020auth().signInWithPhoneNumber() not working for react-native5 votes
- Aug 27, 2020java.io.IOException: AUTHENTICATION_FAILED in Android Firebase (and SERVICE_NOT_AVAILABLE)5 votes
- May 27, 2020Firebase Crashlytics - uploadCrashlyticsSymbolFile, OutOfMemoryError: Java heap space5 votes · 2 answers
- Apr 8, 2020How to check if Firebase Crashlytics is initialized?5 votes · 1 answer
- Jan 25, 2019API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildProviders()5 votes
- Oct 31, 2022Duplicate class com.google.android.gms.internal.firebase_messaging.zza found in modules4 votes
- Apr 6, 2022FirebaseAuth - Requests from this Android client application <empty> are blocked4 votes
- Apr 4, 2022Android Firebase-Analytics : Not able to set null to userid and userproperty4 votes
- Mar 1, 2022How to display a message in the app when Firebase Analytics log event is successful?4 votes
- Nov 9, 2020Exception thrown while unbinding at com.google.android.gms.measurement.internal4 votes
- May 2, 2020FirebaseInstallationsException on latest version4 votes
- Apr 6, 2020Firebase Config: ClassNotFoundException4 votes
- Mar 6, 2020Firebase InApp messaging crash on Android 6 and 54 votes · 1 answer
- Jul 12, 2019Firebase Functions gives Timeout on Client side after 10s4 votes
On GitHub · 29
- Nov 11, 2020🐛 [firebase_core] java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.measurement.internal.zzji@dbed45a — firebase/flutterfire49 reactions · 38 comments
- Jul 19, 2023Fixing: `Type XYZ is defined multiple times` || `packages generated by more than one managed type` — dotnet/android-libraries20 reactions · 16 comments
- Jan 13, 2021🐛 [firebase_auth] App crashing when calling verifyPhoneNumber on android emulator after updating firebase_auth to 0.20.0 from 0.18.4 — firebase/flutterfire10 reactions · 40 comments
- Mar 30, 2026[cloud_firestore] Snapshot listeners stall on Android after upgrading to 6.1.3+ (Firestore native 26.0.2) — firebase/flutterfire9 reactions · 10 comments
- Mar 18, 2025[FR]: Make nowinandroid Gradle Isolated Projects compatible — android/nowinandroid8 reactions · 7 comments
24 more on GitHub
- Dec 6, 2022🐛 [firebase_dynamic_links] problem with targetSdkVersion 33 — firebase/flutterfire8 reactions · 23 comments
- Jun 22, 2020Quiet logging for emulators:exec — firebase/firebase-tools7 reactions · 3 comments
- Mar 6, 2026[cloud_firestore]: Upgrade to Android SDK 34.9 causes ANR on large/deeply nested documents — firebase/flutterfire6 reactions · 5 comments
- Aug 24, 2026fix(firebase_auth): compile Android Kotlin without checker-qual on inferred types — firebase/flutterfire4 reactions · 1 comment
- Jun 3, 2024앱 설정 Repository 구현 — MeetUpEat/Zipbab3 reactions
- Sep 14, 2025AGP 9 — android/nowinandroid2 reactions · 5 comments
- Aug 3, 2026deps: bump com.google.firebase:firebase-firestore from 26.0.1 to 26.5.0 — ZentithLLM/zentithllm1 reaction · 1 comment
- Jul 10, 2026deps: bump com.google.firebase:firebase-crashlytics from 20.0.2 to 20.1.0 — ZentithLLM/zentithllm1 reaction
- May 8, 2026deps: bump com.google.firebase:firebase-crashlytics from 20.0.2 to 20.0.6 — ZentithLLM/zentithllm1 reaction · 1 comment
- May 8, 2026deps: bump com.google.firebase:firebase-config from 23.0.1 to 23.1.0 — ZentithLLM/zentithllm1 reaction
- Apr 10, 2026deps: bump com.google.firebase:firebase-crashlytics from 20.0.2 to 20.0.5 — ZentithLLM/zentithllm1 reaction · 1 comment
- Apr 10, 2026deps: bump com.google.firebase:firebase-perf from 22.0.2 to 22.0.5 — ZentithLLM/zentithllm1 reaction · 1 comment
- Apr 10, 2026deps: bump com.google.firebase:firebase-firestore from 26.0.1 to 26.2.0 — ZentithLLM/zentithllm1 reaction · 1 comment
- Mar 13, 2026feat(firestore): Add support for pipeline subqueries — firebase/firebase-js-sdk1 reaction · 2 comments
- Feb 27, 2026deps: bump com.google.firebase:firebase-firestore from 26.0.1 to 26.1.1 — ZentithLLM/zentithllm1 reaction · 1 comment
- Jan 29, 2026build(deps): bump com.google.firebase:firebase-messaging from 24.1.0 to 25.0.1 — lusky3/underseerr1 reaction · 1 comment
- Jan 19, 2026deps: bump com.google.firebase:firebase-firestore from 26.0.1 to 26.1.0 — ZentithLLM/zentithllm1 reaction · 1 comment
- Jan 19, 2026deps: bump com.google.firebase:firebase-crashlytics from 20.0.2 to 20.0.4 — ZentithLLM/zentithllm1 reaction · 1 comment
- Jan 16, 2026deps: Bump com.google.firebase:firebase-firestore from 26.0.1 to 26.1.0 — ZentithLLM/zentithllm1 reaction
- Jan 16, 2026deps: Bump com.google.firebase:firebase-crashlytics from 20.0.2 to 20.0.4 — ZentithLLM/zentithllm1 reaction
- Nov 14, 2025deps: bump com.google.firebase:firebase-perf from 22.0.2 to 22.0.4 — ZentithLLM/zentithllm1 reaction · 1 comment
- Oct 19, 2024feat(messaging, android): add priority + originalPriority to RemoteMessage — invertase/react-native-firebase1 reaction · 1 comment
- Jun 24, 2021Re order plugins — firebase/quickstart-android1 reaction
- Jun 13, 2019fix build error with latest android studio — naman14/TimberX1 reaction
On Hacker News · 2
- Sep 6, 2018Google's Firebase Android SDKs are now open source5 points
- May 4, 2022Android Firebase Crashlytics Crashes on App Launch1 point
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 28,693 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repositoryOne other file it gives its agents.
- AGENTS.mdAGENTS.md
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

