== Why is this an issue?

Custom tasks and plugins should be moved from the build script to the `buildSrc` directory
to encapsulate custom build logic and separate it against its application in the build script.

This helps to keep the build script clean and easy to understand.

=== What is the potential impact?

==== Readability and Understanding

This change makes the build script easier to read and understand due to encapsulation and separation of concerns.

== How to fix it

Move custom tasks, plugins, and configuration extensions from your `./build.gradle.kts` file
to source files in `./buildSrc/src/main/kotlin`.
You should apply package names and folders like for any other source code.
Please see the attached links for details about how to write custom plugins and the proper use of the `./buildSrc` directory.

=== Code examples

==== Noncompliant code example

**./build.gradle.kts**
[source,kotlin,diff-id=1,diff-type=noncompliant]
----
open class MyCustomTask : DefaultTask() {
    // ...
}

tasks.register<MyCustomTask>("myCustom")

open class MyCustomExtension {
    var flag: Boolean = false
}

extensions.create<MyCustomExtension>("myCustomExtension")

val myCustomExtension: MyCustomExtension by project

myCustomExtension.flag = true
----

==== Compliant solution


**./buildSrc/src/main/kotlin/mypackage/MyCustomTask.kt**
[source,kotlin,diff-id=1,diff-type=compliant]
----
package mypackage

import org.gradle.api.DefaultTask

open class MyCustomTask : DefaultTask() {
    // ...
}
----

**./buildSrc/src/main/kotlin/mypackage/MyCustomExtension.kt**
[source,kotlin,diff-id=1,diff-type=compliant]
----
package mypackage

open class MyCustomExtension {
    var flag: Boolean = false
}
----

**./build.gradle.kts**
[source,kotlin,diff-id=1,diff-type=compliant]
----
import mypackage.MyCustomExtension
import mypackage.MyCustomTask

tasks.register<MyCustomTask>("myCustom")
extensions.create<MyCustomExtension>("myCustomExtension")

val myCustomExtension: MyCustomExtension by project
myCustomExtension.flag = true
----

== Resources

=== Documentation

* https://docs.gradle.org/current/userguide/organizing_gradle_projects.html#sec:build_sources[Gradle Documentation - Use "buildSrc" to abstract imperative logic]
* https://docs.gradle.org/current/userguide/custom_tasks.html#custom_tasks[Gradle Documentation - Developing Custom Gradle Task Types]
