{"id":19401315,"url":"https://github.com/lazy-cat-io/tools.project","last_synced_at":"2025-08-11T15:13:45.217Z","repository":{"id":42172471,"uuid":"477440145","full_name":"lazy-cat-io/tools.project","owner":"lazy-cat-io","description":"A project management tool","archived":false,"fork":false,"pushed_at":"2022-04-11T22:28:34.000Z","size":116,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-01T03:33:18.832Z","etag":null,"topics":["clojure","project-management","project-management-tool"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/lazy-cat-io.png","metadata":{"files":{"readme":"readme.adoc","changelog":"changelog.adoc","contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-04-03T19:10:10.000Z","updated_at":"2022-05-23T02:17:47.000Z","dependencies_parsed_at":"2022-08-12T08:40:22.981Z","dependency_job_id":null,"html_url":"https://github.com/lazy-cat-io/tools.project","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/lazy-cat-io/tools.project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazy-cat-io%2Ftools.project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazy-cat-io%2Ftools.project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazy-cat-io%2Ftools.project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazy-cat-io%2Ftools.project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lazy-cat-io","download_url":"https://codeload.github.com/lazy-cat-io/tools.project/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazy-cat-io%2Ftools.project/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269909690,"owners_count":24494809,"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","status":"online","status_checked_at":"2025-08-11T02:00:10.019Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["clojure","project-management","project-management-tool"],"created_at":"2024-11-10T11:17:57.206Z","updated_at":"2025-08-11T15:13:45.190Z","avatar_url":"https://github.com/lazy-cat-io.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"image:https://img.shields.io/github/license/lazy-cat-io/tools.project[license,link=license]\nimage:https://img.shields.io/github/v/release/lazy-cat-io/tools.project.svg[https://github.com/lazy-cat-io/tools.project/releases]\nimage:https://github.com/lazy-cat-io/tools.project/actions/workflows/build.yml/badge.svg[https://github.com/lazy-cat-io/tools.project/actions/workflows/build.yml]\nimage:https://github.com/lazy-cat-io/tools.project/actions/workflows/deploy.yml/badge.svg[https://github.com/lazy-cat-io/tools.project/actions/workflows/deploy.yml]\n\nimage:https://img.shields.io/clojars/v/io.lazy-cat/tools.project.svg[clojars,link=https://clojars.org/io.lazy-cat/tools.project]\n\n== tools.project\n\nA project management tool.\n\n**Status**: alpha\n\n=== Features\n\n- Unify a project manifest\n- Collect dynamic metadata of builds at compile time (e.g. uberjar step) and use the metadata at runtime\n- Transform a project manifest to https://github.com/seancorfield/build-clj[io.github.seancorfield/build-clj] format\n- Manage project version\n\n=== Getting started\n\n==== Installation\n\nAdd the following dependency in your project:\n\n.project.clj or build.boot\n[source,clojure]\n----\n[io.lazy-cat/tools.project \"0.1.82\"]\n----\n\n.deps.edn or bb.edn\n[source,clojure]\n----\nio.lazy-cat/tools.project {:mvn/version \"0.1.82\"}\n----\n\n==== Configuration\n\nAdd the project manifest to the project root directory.\n\n.example-project\n[source,bash]\n----\n.\n├── .tools.project\n│   └── config.edn \u003c- project level configuration (variables, etc)\n├── src\n├── deps.edn\n└── project.edn \u003c- project manifest (any data)\n----\n\n.project.edn\n[source,clojure]\n----\n;; juxt/aero and selmer libraries are supported\n\n{:name         io.lazy-cat/tools.project\n :version      \"0.0.{{ git/commits-count }}{{ version/pre-release }}\"\n :description  \"A project management tool.\"\n :license      \"MIT\"\n :author       \"Ilshat Sultanov \u003cilshat@sultanov.team\u003e\"\n :contributors [{:name  \"Ilshat Sultanov\"\n                 :email \"ilshat@sultanov.team\"\n                 :url   \"https://github.com/just-sultanov\"}]\n :homepage     \"https://github.com/lazy-cat-io/tools.project#readme\"\n :repository   {:url \"https://github.com/lazy-cat-io/tools.project\"}\n :bugs         {:url \"https://github.com/lazy-cat-io/tools.project/issues\"}\n :keywords     [:clojure :project-management :project-management-tool]\n\n :build        {:src-dirs      [\"src/main/clojure\"]\n                :resource-dirs [\"src/main/resources\"]\n                :target        \"target\"\n                :jar-file      \"target/tools.project.jar\"\n                :scm           {:url #ref [:repository :url]}}\n\n :metadata     {:build/created-at        \"{{ build/created-at }}\"\n                :git/branch              \"{{ git/branch }}\"\n                :git/sha                 \"{{ git/sha }}\"\n\n                :git/commit-message      \"{{ git/commit-message }}\"\n\n                :git/author-email        \"{{ git/author-email }}\"\n                :git/author-name         \"{{ git/author-name }}\"\n                :git/author-timestamp    \"{{ git/author-timestamp }}\"\n\n                :git/committer-email     \"{{ git/committer-email }}\"\n                :git/committer-name      \"{{ git/committer-name }}\"\n                :git/committer-timestamp \"{{ git/committer-timestamp }}\"}}\n\n----\n\n==== API\n\n[source,clojure]\n----\n(ns example\n  (:require\n    [tools.project :as tp]))\n\n;;;;\n;; Configuration\n;;;;\n\n;; Stages of configuration building:\n;; - reading the local configuration of the project (./.tools.project/config.edn)\n;; - reading the global configuration from the user's home directory (~/.tools.project/config.edn)\n;; - reading the default configuration (src/main/resources/io/lazy-cat/tools/project/config.edn)\n\n;; example output\n(tp/read-config)\n=\u003e\n{\n ;; variables that can be used in project.edn in templates (uses Selmer under the hood)\n :variables {:build/created-at        \"2022-04-09T22:44:47.299245Z\"\n             :build/number            \"42\"\n             :datetime/day            \"09\"\n             :datetime/hour           \"22\"\n             :datetime/minute         \"47\"\n             :datetime/month          \"04\"\n             :datetime/second         \"77\"\n             :datetime/year           \"2022\"\n             :git/author-email        \"ilshat@sultanov.team\"\n             :git/author-name         \"Ilshat Sultanov\"\n             :git/author-timestamp    \"2022-04-10T01:37:02+03:00\"\n             :git/branch              \"master\"\n             :git/commit-body         nil\n             :git/commit-message      \"Add deploy step\"\n             :git/commit-subject      \"Add deploy step\"\n             :git/commits-count       \"64\"\n             :git/committer-email     \"ilshat@sultanov.team\"\n             :git/committer-name      \"Ilshat Sultanov\"\n             :git/committer-timestamp \"2022-04-10T01:37:02+03:00\"\n             :git/sha                 \"61770ee\"\n             :git/tags                nil\n             :git/url                 \"git@github.com:lazy-cat-io/tools.project.git\"\n             :version/pre-release     \"\"}\n\n ;; build-clj configuration (:lib and :version parameters will be added automatically)\n :build     {:src-dirs      [\"src\"]\n             :resource-dirs [\"resources\"]\n             :target        \"target\"}}\n\n;;;;\n;; Project manifest\n;;;;\n\n(tp/read-project)\n=\u003e\n{:name         io.lazy-cat/tools.project\n :version      \"0.0.64\"\n :description  \"A project management tool.\"\n :license      \"MIT\"\n :author       \"Ilshat Sultanov \u003cilshat@sultanov.team\u003e\"\n :contributors [{:name  \"Ilshat Sultanov\"\n                 :email \"ilshat@sultanov.team\"\n                 :url   \"https://github.com/just-sultanov\"}]\n :homepage     \"https://github.com/lazy-cat-io/tools.project#readme\"\n :repository   {:url \"https://github.com/lazy-cat-io/tools.project\"}\n :bugs         {:url \"https://github.com/lazy-cat-io/tools.project/issues\"}\n :keywords     [:clojure :project-management :project-management-tool]\n\n :build        {:src-dirs      [\"src/main/clojure\"]\n                :resource-dirs [\"src/main/resources\"]\n                :target        \"target\"\n                :jar-file      \"target/tools.project.jar\"\n                :scm           {:url \"https://github.com/lazy-cat-io/tools.project.git\"}}\n\n :metadata     {:build/created-at        \"2022-04-09T22:44:47.299245Z\"\n                :git/author-email        \"ilshat@sultanov.team\"\n                :git/author-name         \"Ilshat Sultanov\"\n                :git/author-timestamp    \"2022-04-10T01:37:02+03:00\"\n                :git/branch              \"master\"\n                :git/commit-message      \"Add deploy step\"\n                :git/committer-email     \"ilshat@sultanov.team\"\n                :git/committer-name      \"Ilshat Sultanov\"\n                :git/committer-timestamp \"2022-04-10T01:37:02+03:00\"\n                :git/sha                 \"61770ee\"}}\n\n\n;;;;\n;; Project metadata\n;;;;\n\n;; Export a build metadata to resources directory using a project name (without build-clj configuration - :build key)\n(tp/write-build-info (tp/read-project))\n;; =\u003e\n;; Output: src/main/resources/io/lazy-cat/tools/project/build.edn\n----\n\n==== Customization\n\nlink:src/main/resources/io/lazy-cat/tools/project/config.edn[See default variables]\n\n[source,clojure]\n----\n;; .tools.project/config.edn\n{:variables\n  {:git/long-sha #git \"rev-parse HEAD\"}}\n\n;; project.edn\n{:version \"v0.0.{{ git/long-sha }}\"}\n\n(tp/read-project)\n=\u003e\n{...\n :version \"v0.0.61770ee7e611ce57840fdf45cb71e085d32134d5\"\n ...}\n----\n\n===== CI/CD\n\nIf you need to use the variable `build/number` you should expose the environment variable `BUILD_NUMBER` or you can override `build/number` calculation.\n[source,clojure]\n\n----\n;; default configuration\n{:variables\n  {:build/number #or [#env BUILD_NUMBER \"N/A\"]}}\n----\n\n====== GitHub Actions\n\nHow to add `BUILD_NUMBER` on GitHub Actions:\n\n[source,yaml]\n----\n- name: Setup environment variables\n  run: \u003e-\n    echo 'BUILD_NUMBER=${{ github.run_number }}' \u003e\u003e $GITHUB_ENV;\n----\n\n=== Roadmap\n\n- [ ] Stabilize the API\n- [ ] Add validation using `malli` schemas\n- [ ] Use `rewrite-edn` to preserve the manifest formatting style\n- [ ] Add versioning support for `semver`, `git flow`\n- [ ] Add usage examples with the babashka and Clojure CLI as tool `(-T)`\n- [ ] Add support for `mono repositories`\n\n=== License\n\nlink:license[Copyright © 2022 lazy-cat.io]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flazy-cat-io%2Ftools.project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flazy-cat-io%2Ftools.project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flazy-cat-io%2Ftools.project/lists"}