{"id":28916372,"url":"https://github.com/intuit/hooks","last_synced_at":"2025-10-15T20:54:40.932Z","repository":{"id":37051683,"uuid":"342405057","full_name":"intuit/hooks","owner":"intuit","description":"Hooks is a little module for plugins, in Kotlin","archived":false,"fork":false,"pushed_at":"2025-06-09T19:19:38.000Z","size":840,"stargazers_count":40,"open_issues_count":10,"forks_count":5,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-06-09T20:26:02.460Z","etag":null,"topics":["gradle-plugin","hooks","kotlin-compiler-plugin","maven-plugin","plugin-framework","plugins"],"latest_commit_sha":null,"homepage":"https://intuit.github.io/hooks/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/intuit.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-02-25T23:16:09.000Z","updated_at":"2024-12-17T16:44:39.000Z","dependencies_parsed_at":"2024-05-21T23:40:10.618Z","dependency_job_id":"3c462ec2-d248-4eff-9512-494bc617fd88","html_url":"https://github.com/intuit/hooks","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/intuit/hooks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fhooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fhooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fhooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fhooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/intuit","download_url":"https://codeload.github.com/intuit/hooks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fhooks/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261211973,"owners_count":23125548,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gradle-plugin","hooks","kotlin-compiler-plugin","maven-plugin","plugin-framework","plugins"],"created_at":"2025-06-21T23:39:09.727Z","updated_at":"2025-10-15T20:54:40.911Z","avatar_url":"https://github.com/intuit.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg\n    src=\"docs/src/orchid/resources/assets/media/hooks_multi-3d-white-bg.svg\"\n    alt=\"Hooks Logo\"\n    width=\"300px\"\n    padding=\"40px\"\n  /\u003e\n  \u003cbr /\u003e\n  \u003cbr /\u003e\n  \u003cp\u003eHooks is a little module for plugins, in Kotlin\u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"https://github.com/intuit/auto\"\u003e\u003cimg src=\"https://img.shields.io/badge/release-auto.svg?colorA=888888\u0026colorB=9B065A\u0026label=auto\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACzElEQVR4AYXBW2iVBQAA4O+/nLlLO9NM7JSXasko2ASZMaKyhRKEDH2ohxHVWy6EiIiiLOgiZG9CtdgG0VNQoJEXRogVgZYylI1skiKVITPTTtnv3M7+v8UvnG3M+r7APLIRxStn69qzqeBBrMYyBDiL4SD0VeFmRwtrkrI5IjP0F7rjzrSjvbTqwubiLZffySrhRrSghBJa8EBYY0NyLJt8bDBOtzbEY72TldQ1kRm6otana8JK3/kzN/3V/NBPU6HsNnNlZAz/ukOalb0RBJKeQnykd7LiX5Fp/YXuQlfUuhXbg8Di5GL9jbXFq/tLa86PpxPhAPrwCYaiorS8L/uuPJh1hZFbcR8mewrx0d7JShr3F7pNW4vX0GRakKWVk7taDq7uPvFWw8YkMcPVb+vfvfRZ1i7zqFwjtmFouL72y6C/0L0Ie3GvaQXRyYVB3YZNE32/+A/D9bVLcRB3yw3hkRCdaDUtFl6Ykr20aaLvKoqIXUdbMj6GFzAmdxfWx9iIRrkDr1f27cFONGMUo/gRI/jNbIMYxJOoR1cY0OGaVPb5z9mlKbyJP/EsdmIXvsFmM7Ql42nEblX3xI1BbYbTkXCqRnxUbgzPo4T7sQBNeBG7zbAiDI8nWfZDhQWYCG4PFr+HMBQ6l5VPJybeRyJXwsdYJ/cRnlJV0yB4ZlUYtFQIkMZnst8fRrPcKezHCblz2IInMIkPzbbyb9mW42nWInc2xmE0y61AJ06oGsXL5rcOK1UdCbEXiVwNXsEy/6+EbaiVG8eeEAfxvaoSBnCH61uOD7BS1Ul8ESHBKWxCrdyd6EYNKihgEVrwOAbQruoytuBYIFfAc3gVN6iawhjKyNCEpYhVJXgbOzARyaU4hCtYizq5EI1YgiUoIlT1B7ZjByqmRWYbwtdYjoWoN7+LOIQefIqKawLzK6ID69GGpQgwhhEcwGGUzfEPAiPqsCXadFsAAAAASUVORK5CYII=\" alt=\"Auto Release\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://circleci.com/gh/intuit/hooks\"\u003e\u003cimg src=\"https://img.shields.io/circleci/project/github/intuit/hooks/main.svg?logo=circleci\" alt=\"CircleCI\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://maven-badges.herokuapp.com/maven-central/com.intuit.hooks/hooks\"\u003e\u003cimg src=\"https://maven-badges.herokuapp.com/maven-central/com.intuit.hooks/hooks/badge.svg\" alt=\"Maven Central\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://plugins.gradle.org/plugin/com.intuit.hooks\"\u003e\u003cimg src=\"https://img.shields.io/maven-metadata/v/https/plugins.gradle.org/m2/com/intuit/hooks/com.intuit.hooks.gradle.plugin/maven-metadata.xml.svg?colorB=007ec6\u0026label=gradlePluginPortal\" alt=\"Gradle Plugin Portal\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://app.fossa.com/projects/custom%2B23410%2Fgit%40github.com%3Aintuit%2Fhooks?ref=badge_shield\" alt=\"FOSSA Status\"\u003e\u003cimg src=\"https://app.fossa.com/api/projects/custom%2B23410%2Fgit%40github.com%3Aintuit%2Fhooks.svg?type=shield\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/intuit/hooks/search?l=kotlin\"\u003e\u003cimg src=\"https://img.shields.io/github/languages/top/intuit/hooks.svg?logo=Kotlin\u0026logoColor=orange\" alt=\"GitHub top language\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://ktlint.gihub.io\"\u003e\u003cimg src=\"https://img.shields.io/badge/code%20style-%E2%9D%A4-FF4081.svg\" alt=\"KtLint\" /\u003e\u003c/a\u003e\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n\u003ca href=\"#contributors-\"\u003e\u003cimg src=\"https://img.shields.io/badge/all_contributors-5-orange.svg\" alt=\"All Contributors\" /\u003e\u003c/a\u003e\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\nHooks represent \"pluggable\" points in a software model. They provide a mechanism for tapping into such points to get updates, or apply additional functionality to some typed object. Included in the hooks library are:\n- A variety of hooks to support different plugin behavior: `Basic, Waterfall, Bail, Loop`\n- Asynchronous support built on Kotlin [coroutines](https://kotlinlang.org/docs/coroutines-guide.html)\n- Support for additional [hook context](https://intuit.github.io/hooks/wiki/key-concepts/#hook-context) and [interceptors](https://intuit.github.io/hooks/wiki/key-concepts/#interceptors)\n\nAlong with the base library, we created a Kotlin symbol processor to enable hooks to be created with a simple typed-based DSL, limiting the redundancy and overhead required to subclass a hook.\n\nVisit our [site](https://intuit.github.io/hooks/) for information about how to use hooks.\n\n## Inspiration\n\nAt Intuit, we're big fans of [tapable](https://github.com/webpack/tapable). We use it in some of our core systems to\nenable teams to augment and extend our frameworks to solve their customer problems. Since our backend systems are\nprimarily JVM-based, we really missed tapable when working in service code. Hooks is our implementation of tapable as a\nlibrary for the JVM plus an [Arrow Meta](https://meta.arrow-kt.io/) Compiler Plugin to make it easier to use.\n\n## Structure\n\n- [hooks](https://github.com/intuit/hooks/tree/main/hooks) - The actual implementation of the hooks\n- [processor](https://github.com/intuit/hooks/tree/main/processor) - A Kotlin Symbol Processor that generates hook subclasses for you\n- [gradle-plugin](https://github.com/intuit/hooks/tree/main/gradle-plugin) - A Gradle plugin to make using the processor easier\n- [maven-plugin](https://github.com/intuit/hooks/tree/main/maven-plugin) - A Maven Kotlin plugin extension to make using the processor easier\n- [example-library](https://github.com/intuit/hooks/tree/main/example-library) - A library that exposes extension points for consumers using the hooks' `call` function\n- [example-application](https://github.com/intuit/hooks/tree/main/example-application) - The Application that demonstrates extending a library by calling the hooks' `tap` function\n\n## :beers: Contributing :beers:\n\nFeel free to make an [issue](https://github.com/intuit/hooks/issues) or open a [pull request](https://github.com/intuit/hooks/pulls) if you have an improvement and new plugin to propose!\n\nMake sure to read our [code of conduct](./.github/CODE_OF_CONDUCT.md).\n\n## :hammer: Start Developing :hammer:\n\nTo get set up, fork and clone the project.\n\n### Build\n\nBuild and verify all checks:\n\n```bash\n./gradlew build\n```\n\nPublish locally to use in other projects:\n\n```bash\n./gradlew publishToMavenLocal\n```\n\n### Test\n\nRecompile changes and run all tests:\n\n```bash\n./gradlew test\n```\n\n### Run example app\n\n```bash\n./gradlew run\n```\n\n### Cleaning\n\n```bash\n./gradlew clean\n```\n\n### Linting\n\nLinting is done with [ktlint](https://github.com/pinterest/ktlint) and configured using [JLLeitschuh's ktlint Gradle plugin](https://github.com/JLLeitschuh/ktlint-gradle).\n\nFormat code according to linting standards:\n\n```bash\n./gradlew ktlintFormat\n```\n\nVerify code meets linting standards:\n\n```bash\n./gradlew ktlintCheck\n```\n\n### API Validation\n\nTo ensure that binary compatibility is maintained across non-breaking releases, the public API is validated using the Kotlin [binary compatibility validator](https://github.com/Kotlin/binary-compatibility-validator) tool.\n\nUpdate the API dumps:\n\n```bash\n./gradlew apiDump\n```\n\nVerify the public API matches the API dumps:\n\n```bash\n./gradlew apiCheck\n```\n\n### Documentation\n\nThe docs site is built using the [Orchid](https://orchid.run/) tool and takes inspiration from the [stikt.io docs site](https://strikt.io/).\n\nRun the docs locally:\n\n```bash\n./gradlew orchidServe\n```\n\nThe [knit](https://github.com/Kotlin/kotlinx-knit) tool is also used to generate tests driven from markdown snippets to ensure documentation is maintained and up-to-date.\n\nUpdate all generated markdown tests:\n\n```bash\n./gradlew knit\n```\n\nVerify the generated tests match the latest markdown changes:\n\n```bash\n./gradlew knitCheck\n```\n\n### Versioning\n\nThis project follows the [semantic versioning](https://semver.org/) strategy and uses [Auto](https://intuit.github.io/auto/) to automate releases on CI. PRs must be labeled with an appropriate Auto label to denote what type of release should occur when merged. With the binary compatibility validator tool, we can follow this set of rules to determine release types:\n\n- Red on an API diff is breaking and requires a major bump\n- Green on an API diff is a new feature and requires a minor bump\n- No API diff, but has a code change requires a patch bump\n- Else, apply the corresponding label for documentation or build, etc.\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.jeremiahzucker.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/9255651?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJeremiah Zucker\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/intuit/hooks/commits?author=sugarmanz\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/intuit/hooks/commits?author=sugarmanz\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/intuit/hooks/commits?author=sugarmanz\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#infra-sugarmanz\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/stabbylambda\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/124668?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDavid Stone\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/intuit/hooks/commits?author=stabbylambda\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/intuit/hooks/commits?author=stabbylambda\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/intuit/hooks/commits?author=stabbylambda\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://hipstersmoothie.com/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1192452?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAndrew Lisowski\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/intuit/hooks/commits?author=hipstersmoothie\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#infra-hipstersmoothie\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/intuit/hooks/commits?author=hipstersmoothie\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/intuit/hooks/commits?author=hipstersmoothie\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/kharrop\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/24794756?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKelly Harrop\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#design-kharrop\" title=\"Design\"\u003e🎨\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/brocollie08\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/13474011?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ebrocollie08\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/intuit/hooks/commits?author=brocollie08\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/intuit/hooks/commits?author=brocollie08\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n## License\n\n[![FOSSA Status](https://app.fossa.com/api/projects/custom%2B23410%2Fgit%40github.com%3Aintuit%2Fhooks.svg?type=large)](https://app.fossa.com/projects/custom%2B23410%2Fgit%40github.com%3Aintuit%2Fhooks?ref=badge_large)\n\nThis product includes software developed by the Apache Software Foundation (http://www.apache.org/).\n\n\u003c!-- TRIGGER --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintuit%2Fhooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fintuit%2Fhooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintuit%2Fhooks/lists"}