Repository: diggerhq/digger
Pull request #523 (2023-08-24 14:04:09)

switch to lib-digger-config


Patch:
diff --git a/cmd/digger/main.go b/cmd/digger/main.go
index baf802d4..91fd92ff 100644
--- a/cmd/digger/main.go
+++ b/cmd/digger/main.go
@@ -4,7 +4,6 @@ import (
 	"context"
 	"digger/pkg/azure"
 	"digger/pkg/backend"
-	"digger/pkg/configuration"
 	core_backend "digger/pkg/core/backend"
 	core_locking "digger/pkg/core/locking"
 	"digger/pkg/core/models"
@@ -22,6 +21,7 @@ import (
 	"digger/pkg/usage"
 	"digger/pkg/utils"
 	"fmt"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"gopkg.in/yaml.v3"
 	"log"
 	"net/http"
diff --git a/go.mod b/go.mod
index f1771810..a5ad8773 100644
--- a/go.mod
+++ b/go.mod
@@ -1,15 +1,14 @@
 module digger
 
-go 1.18
+go 1.20
 
 require (
 	cloud.google.com/go/storage v1.32.0
 	github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1
 	github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.2
 	github.com/aws/aws-sdk-go v1.44.325
-	github.com/bmatcuk/doublestar/v4 v4.6.0
+	github.com/bmatcuk/doublestar/v4 v4.6.0 // indirect
 	github.com/caarlos0/env/v8 v8.0.0
-	github.com/google/go-github/v54 v54.0.0
 	github.com/google/uuid v1.3.0
 	github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5
 	github.com/open-policy-agent/opa v0.54.0
@@ -19,11 +18,11 @@ require (
 )
 
 require (
+	github.com/diggerhq/lib-digger-config v0.0.0-20230824131856-20c017537bb3
 	github.com/dominikbraun/graph v0.23.0
 	github.com/google/go-github/v53 v53.2.0
 	github.com/gruntwork-io/terragrunt v0.36.6
 	github.com/hashicorp/go-getter v1.7.2
-	github.com/hashicorp/go-getter/v2 v2.2.1
 	github.com/hashicorp/hcl/v2 v2.11.1
 	github.com/hashicorp/terraform-config-inspect v0.0.0-20230808231734-f15f31bf62b3
 	github.com/zclconf/go-cty v1.13.2
@@ -74,7 +73,6 @@ require (
 	github.com/hashicorp/vault/sdk v0.1.14-0.20210322210658-b52b8b8c1264 // indirect
 	github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c // indirect
 	github.com/imdario/mergo v0.3.12 // indirect
-	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/klauspost/compress v1.15.11 // indirect
 	github.com/lib/pq v1.8.0 // indirect
 	github.com/mattn/go-colorable v0.1.7 // indirect
@@ -89,9 +87,6 @@ require (
 	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 	github.com/ryanuber/go-glob v1.0.0 // indirect
 	github.com/sergi/go-diff v1.1.0 // indirect
-	github.com/spf13/cobra v1.7.0 // indirect
-	github.com/spf13/pflag v1.0.5 // indirect
-	github.com/transcend-io/terragrunt-atlantis-config v1.16.0 // indirect
 	github.com/ulikunitz/xz v0.5.10 // indirect
 	github.com/urfave/cli v1.22.4 // indirect
 	github.com/zclconf/go-cty-yaml v1.0.2 // indirect
@@ -125,7 +120,6 @@ require (
 	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/gobwas/glob v0.2.3 // indirect
-	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
diff --git a/go.sum b/go.sum
index 6e224967..991795b8 100644
--- a/go.sum
+++ b/go.sum
@@ -33,10 +33,6 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9
 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
 cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
 cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
-cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys=
-cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
-cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA=
-cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw=
 cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk=
 cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI=
 cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
@@ -75,10 +71,6 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz
 cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
 cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
 cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
-cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY=
-cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE=
-cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds=
-cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI=
 cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg=
 cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
 cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
@@ -120,15 +112,12 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97
 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
 cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
 cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
-cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k=
-cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
 cloud.google.com/go/iam v1.1.0 h1:67gSqaPukx7O8WLLHMa0PNs3EBGd2eE4d+psbO/CO94=
 cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk=
 cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
 cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
 cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
 cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
-cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM=
 cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
 cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
 cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
@@ -186,10 +175,6 @@ cloud.google.com/go/storage v1.16.0/go.mod h1:ieKBmUyzcftN5tbxwnXClMKH00CfcQ+xL6
 cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
 cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
 cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
-cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM=
-cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E=
-cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI=
-cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0=
 cloud.google.com/go/storage v1.32.0 h1:5w6DxEGOnktmJHarxAOUywxVW9lbNWIzlzzUltG/3+o=
 cloud.google.com/go/storage v1.32.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8=
 cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
@@ -217,22 +202,15 @@ github.com/Azure/azure-sdk-for-go v47.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9mo
 github.com/Azure/azure-sdk-for-go v51.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 github.com/Azure/azure-sdk-for-go v52.5.0+incompatible h1:/NLBWHCnIHtZyLPc1P7WIqi4Te4CC23kIQyK3Ep/7lA=
 github.com/Azure/azure-sdk-for-go v52.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 h1:8kDqDngH+DmVBiCtIjCFTGa7MBnsIOkF9IccInFEbjk=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY=
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 h1:LNHhpdK7hzUcx/k1LIcuh5k7k1LGIWLQfCjaneSj7Fc=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M=
-github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.1 h1:bFa9IcjvrCber6gGgDAUZ+I2bO8J7s8JxXmu9fhi2ss=
-github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.1/go.mod h1:l3wvZkG9oW07GLBW5Cd0WwG5asOfJ8aqE8raUvNzLpk=
 github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.2 h1:iXFUCl7NK2DPVKfixcYDPGj3uLV7yf5eolBsoWD8Sc4=
 github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.2/go.mod h1:E1WPwLx0wZyus7NBHjhrHE1QgWwKJPE81fnUbT+FxqI=
 github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
 github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
+github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
 github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
 github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
@@ -274,6 +252,7 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB
 github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
 github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
 github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
+github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
 github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc=
 github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
@@ -294,8 +273,6 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM
 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
 github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
 github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
 github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk=
 github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -309,9 +286,11 @@ github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0
 github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
 github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
 github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
+github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331 h1:3YnB7Hpmh1lPecPE8doMOtYCrMdrpedZOvxfuNES/Vk=
 github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
 github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
 github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8=
@@ -346,9 +325,9 @@ github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb
 github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU=
 github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
 github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
+github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
 github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
 github.com/apparentlymart/go-shquot v0.0.1/go.mod h1:lw58XsE5IgUXZ9h0cxnypdx31p9mPFIVEQ9P3c7MlrU=
-github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
 github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
 github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
 github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
@@ -374,10 +353,6 @@ github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zK
 github.com/aws/aws-sdk-go v1.37.18/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
 github.com/aws/aws-sdk-go v1.41.7/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
 github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
-github.com/aws/aws-sdk-go v1.44.300 h1:Zn+3lqgYahIf9yfrwZ+g+hq/c3KzUBaQ8wqY/ZXiAbY=
-github.com/aws/aws-sdk-go v1.44.300/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
-github.com/aws/aws-sdk-go v1.44.321 h1:iXwFLxWjZPjYqjPq0EcCs46xX7oDLEELte1+BzgpKk8=
-github.com/aws/aws-sdk-go v1.44.321/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
 github.com/aws/aws-sdk-go v1.44.325 h1:jF/L99fJSq/BfiLmUOflO/aM+LwcqBm0Fe/qTK5xxuI=
 github.com/aws/aws-sdk-go v1.44.325/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
@@ -402,6 +377,7 @@ github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7N
 github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA=
 github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0=
 github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo=
+github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
 github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -438,6 +414,7 @@ github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX
 github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 github.com/containerd/continuity v0.0.0-20200709052629-daa8e1ccc0bc/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo=
+github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe h1:PEmIrUvwG9Yyv+0WKZqjXfSFDeZjs/q15g0m08BYS9k=
 github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo=
 github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
 github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
@@ -455,7 +432,6 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
@@ -474,6 +450,8 @@ github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWa
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g=
 github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
+github.com/diggerhq/lib-digger-config v0.0.0-20230824131856-20c017537bb3 h1:3EG6wvFBYxCrV5XWqf6bAca8cY4Md8Oz2w6U3Z95lxU=
+github.com/diggerhq/lib-digger-config v0.0.0-20230824131856-20c017537bb3/go.mod h1:AdWua640lLPJJwWe7kZmKP6rk1+ycxxPjd1M4cQJDbs=
 github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
 github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
 github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
@@ -486,7 +464,9 @@ github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r
 github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v1.4.2-0.20200319182547-c7ad2b866182/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
+github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
+github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
 github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
@@ -523,17 +503,18 @@ github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
+github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI=
+github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE=
 github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew=
 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
@@ -579,6 +560,7 @@ github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3a
 github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
 github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
 github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
+github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M=
 github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
 github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
@@ -592,8 +574,6 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV
 github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
-github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
-github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE=
 github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -661,7 +641,6 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/go-containerregistry v0.0.0-20200110202235-f4fb41bf00a3/go.mod h1:2wIuQute9+hhWqvL3vEI7YB0EKluF4WcPzI1eAliazk=
 github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI=
 github.com/google/go-github/v53 v53.2.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao=
-github.com/google/go-github/v54 v54.0.0/go.mod h1:Sw1LXWHhXRZtzJ9LI5fyJg9wbQzYvFhW8W5P2yaAQ7s=
 github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
@@ -669,6 +648,7 @@ github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSN
 github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -702,8 +682,6 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
-github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k=
-github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
 github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM=
 github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
@@ -715,10 +693,6 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99
 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
 github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=
 github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
-github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A=
-github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
-github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4=
-github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI=
 github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=
 github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
@@ -729,6 +703,7 @@ github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEo
 github.com/gophercloud/gophercloud v0.6.1-0.20191122030953-d8ac278c1c9d/go.mod h1:ozGNgr9KYOVATV5jsgHl/ceCDXGuguqOZAzoQ/2vcNM=
 github.com/gophercloud/gophercloud v0.10.1-0.20200424014253-c3bfe50899e5/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss=
 github.com/gophercloud/utils v0.0.0-20200423144003-7c72efc7435d/go.mod h1:ehWUbLQJPqS0Ep+CxeD559hsm9pthPXadJNKwZkp43w=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
@@ -747,11 +722,13 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
 github.com/gruntwork-io/gruntwork-cli v0.7.0/go.mod h1:jp6Z7NcLF2avpY8v71fBx6hds9eOFPELSuD/VPv7w00=
 github.com/gruntwork-io/terragrunt v0.36.6 h1:cl2qAGoJNHdbo/Rl4fUoGPs46C/u6q3cbFgLijBOtQI=
 github.com/gruntwork-io/terragrunt v0.36.6/go.mod h1:RrG5599JjmyVx/6AIS1coH6XTj5UOI9BPXZv9ImAfxA=
+github.com/gruntwork-io/terratest v0.32.6 h1:OEA11ZqEwKRowEdxusDnAPnMUN0w/jzeNcziuQsqkYk=
 github.com/gruntwork-io/terratest v0.32.6/go.mod h1:0iy7d56CziX3R4ZUn570HMElr4WgBKoKNa8Hzex7bvo=
 github.com/hashicorp/aws-sdk-go-base v0.6.0/go.mod h1:2fRjWDv3jJBeN6mVWFHV6hFTNeFBx2gpDLQaZNxUVAY=
 github.com/hashicorp/consul v0.0.0-20171026175957-610f3c86a089/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI=
@@ -767,14 +744,10 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n
 github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
 github.com/hashicorp/go-getter v1.5.1/go.mod h1:a7z7NPPfNQpJWcn4rSWFtdrSldqLdLPEF3d8nFMsSLM=
 github.com/hashicorp/go-getter v1.5.7/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI=
-github.com/hashicorp/go-getter v1.5.11 h1:wioTuNmaBU3IE9vdFtFMcmZWj0QzLc6DYaP6sNe5onY=
-github.com/hashicorp/go-getter v1.5.11/go.mod h1:9i48BP6wpWweI/0/+FBjqLrp9S8XtwUGjiu0QkWHEaY=
 github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg=
 github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744=
-github.com/hashicorp/go-getter/v2 v2.2.1/go.mod h1:EcJx6oZE8hmGuRR1l38QrfnyiujQbwsEAn11eHv6l2M=
 github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
 github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
-github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
 github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
@@ -818,7 +791,6 @@ github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09
 github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw=
 github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
 github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
@@ -840,8 +812,6 @@ github.com/hashicorp/terraform v0.15.3 h1:2QWbTj2xJ/8W1gCyIrd0WAqVF4weKPMYjx8nKj
 github.com/hashicorp/terraform v0.15.3/go.mod h1:w4eBEsluZfYumXUTLe834eqHh969AabcLqbj2WAYlM8=
 github.com/hashicorp/terraform-config-inspect v0.0.0-20210209133302-4fd17a0faac2/go.mod h1:Z0Nnk4+3Cy89smEbrq+sl1bxc9198gIP4I7wcQF6Kqs=
 github.com/hashicorp/terraform-config-inspect v0.0.0-20210318070130-9a80970d6b34/go.mod h1:Z0Nnk4+3Cy89smEbrq+sl1bxc9198gIP4I7wcQF6Kqs=
-github.com/hashicorp/terraform-config-inspect v0.0.0-20210625153042-09f34846faab h1:P08dNG+lM+gjaaMk8SsMi/mIPs8z7jrkEmnpcCwy/U0=
-github.com/hashicorp/terraform-config-inspect v0.0.0-20210625153042-09f34846faab/go.mod h1:Z0Nnk4+3Cy89smEbrq+sl1bxc9198gIP4I7wcQF6Kqs=
 github.com/hashicorp/terraform-config-inspect v0.0.0-20230808231734-f15f31bf62b3 h1:1uP3RA50ayEcTrHJtHaqubpW66KkXKIYXHP1+79dbMc=
 github.com/hashicorp/terraform-config-inspect v0.0.0-20230808231734-f15f31bf62b3/go.mod h1:l8HcFPm9cQh6Q0KSWoYPiePqMvRFenybP1CH2MjKdlg=
 github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 h1:HKLsbzeOsfXmKNpr3GiT18XAblV0BjCbzL8KQAMZGa0=
@@ -870,8 +840,6 @@ github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH
 github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
 github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
-github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s=
 github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
@@ -894,6 +862,7 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
@@ -902,8 +871,6 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
-github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
-github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c=
 github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -1024,15 +991,19 @@ github.com/open-policy-agent/opa v0.54.0 h1:mGEsK+R5ZTMV8fzzbNzmYDGbTmY30wmRCIHm
 github.com/open-policy-agent/opa v0.54.0/go.mod h1:d8I8jWygKGi4+T4H07qrbeCdH1ITLsEfT0M+bsvxWw0=
 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
+github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034=
 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
+github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc=
 github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 github.com/oracle/oci-go-sdk v7.1.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
 github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
+github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA=
 github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
 github.com/packer-community/winrmcp v0.0.0-20180921211025-c76d91c1e7db/go.mod h1:f6Izs6JvFTdnRbziASagjZ2vmf55NSIkC/weStxCHqk=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@@ -1096,7 +1067,6 @@ github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYe
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=
-github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@@ -1118,9 +1088,11 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
 github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
 github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -1130,21 +1102,19 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU
 github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
-github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
-github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
 github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -1165,8 +1135,6 @@ github.com/tencentyun/cos-go-sdk-v5 v0.0.0-20190808065407-f07404cefc8c/go.mod h1
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tombuildsstuff/giovanni v0.15.1/go.mod h1:0TZugJPEtqzPlMpuJHYfXY6Dq2uLPrXf98D2XQSxNbA=
-github.com/transcend-io/terragrunt-atlantis-config v1.16.0 h1:d3gd9aKCNR4btOufRbp377ptcczBSfpG1bw/t8XgwW4=
-github.com/transcend-io/terragrunt-atlantis-config v1.16.0/go.mod h1:RvDhQOC1bBDfH712ux4DS3s5NemhTo24j0Fw3eO/RkQ=
 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
 github.com/ugorji/go v0.0.0-20180813092308-00b869d2f4a5/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
@@ -1208,7 +1176,6 @@ github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLE
 github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
 github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
 github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
-github.com/zclconf/go-cty v1.8.3 h1:48gwZXrdSADU2UW9eZKHprxAI7APZGW9XmExpJpSjT0=
 github.com/zclconf/go-cty v1.8.3/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
 github.com/zclconf/go-cty v1.13.2 h1:4GvrUxe/QUDYuJKAav4EYqdM47/kZa672LwmXFmEKT0=
 github.com/zclconf/go-cty v1.13.2/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0=
@@ -1276,10 +1243,6 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
-golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
-golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
-golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
 golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
 golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1388,10 +1351,6 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
 golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
-golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
-golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
-golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
-golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
 golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
 golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1420,8 +1379,6 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri
 golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A=
-golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8=
-golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
 golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU=
 golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1438,8 +1395,6 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
-golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
 golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
 golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1538,10 +1493,6 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
-golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
-golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
@@ -1549,10 +1500,6 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
 golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28=
-golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
-golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
-golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
 golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
 golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1568,10 +1515,6 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
-golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
-golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
 golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1713,10 +1656,6 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ
 google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
 google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
 google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
-google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE=
-google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
-google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o=
-google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
 google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc=
 google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
@@ -1833,18 +1772,10 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw
 google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
 google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
 google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
-google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
-google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
-google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao=
-google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64=
 google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 h1:Au6te5hbKUV8pIYWHqOUZ1pva5qK/rwbIhoXEUB9Lu8=
 google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y=
-google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM=
-google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
 google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 h1:XVeBY8d/FaK4848myy41HBqnDwvxeV3zMZhwN1TvAMU=
 google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM=
 google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
@@ -1889,8 +1820,6 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu
 google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ=
-google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
 google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI=
 google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
@@ -1909,8 +1838,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
-google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
diff --git a/pkg/azure/azure.go b/pkg/azure/azure.go
index 8d334351..5aab9a8e 100644
--- a/pkg/azure/azure.go
+++ b/pkg/azure/azure.go
@@ -3,12 +3,12 @@ package azure
 import (
 	"context"
 	"digger/pkg/ci"
-	"digger/pkg/configuration"
 	"digger/pkg/core/models"
 	"digger/pkg/utils"
 	"encoding/json"
 	"errors"
 	"fmt"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"github.com/microsoft/azure-devops-go-api/azuredevops"
 	"github.com/microsoft/azure-devops-go-api/azuredevops/git"
 	"strings"
diff --git a/pkg/configuration/config.go b/pkg/configuration/config.go
deleted file mode 100644
index 9977ce5e..00000000
--- a/pkg/configuration/config.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package configuration
-
-import "digger/pkg/core/models"
-
-type DiggerConfig struct {
-	Projects         []Project
-	AutoMerge        bool
-	CollectUsageData bool
-	Workflows        map[string]Workflow
-}
-
-type Project struct {
-	Name               string
-	Dir                string
-	Workspace          string
-	Terragrunt         bool
-	Workflow           string
-	IncludePatterns    []string
-	ExcludePatterns    []string
-	DependencyProjects []string
-	DriftDetection     bool
-}
-
-type Workflow struct {
-	EnvVars       *TerraformEnvConfig
-	Plan          *models.Stage
-	Apply         *models.Stage
-	Configuration *WorkflowConfiguration
-}
-
-type WorkflowConfiguration struct {
-	OnPullRequestPushed []string
-	OnPullRequestClosed []string
-	OnCommitToDefault   []string
-}
-
-type TerraformEnvConfig struct {
-	State    []EnvVar
-	Commands []EnvVar
-}
-
-type EnvVar struct {
-	Name      string
-	ValueFrom string
-	Value     string
-}
-
-func defaultWorkflow() *Workflow {
-	return &Workflow{
-		Configuration: &WorkflowConfiguration{
-			OnCommitToDefault:   []string{"digger unlock"},
-			OnPullRequestPushed: []string{"digger plan"},
-			OnPullRequestClosed: []string{"digger unlock"},
-		},
-		Plan: &models.Stage{
-			Steps: []models.Step{
-				{
-					Action: "init", ExtraArgs: []string{},
-				},
-				{
-					Action: "plan", ExtraArgs: []string{},
-				},
-			},
-		},
-		Apply: &models.Stage{
-			Steps: []models.Step{
-				{
-					Action: "init", ExtraArgs: []string{},
-				},
-				{
-					Action: "apply", ExtraArgs: []string{},
-				},
-			},
-		},
-		EnvVars: &TerraformEnvConfig{},
-	}
-}
diff --git a/pkg/configuration/converters.go b/pkg/configuration/converters.go
deleted file mode 100644
index 92fe06bc..00000000
--- a/pkg/configuration/converters.go
+++ /dev/null
@@ -1,235 +0,0 @@
-package configuration
-
-import (
-	"digger/pkg/core/models"
-	"digger/pkg/utils"
-	"fmt"
-	"github.com/dominikbraun/graph"
-	"path/filepath"
-)
-
-const defaultWorkflowName = "default"
-
-func copyProjects(projects []*ProjectYaml) []Project {
-	result := make([]Project, len(projects))
-	for i, p := range projects {
-		driftDetection := true
-		if p.DriftDetection != nil {
-			driftDetection = *p.DriftDetection
-		}
-		item := Project{p.Name,
-			p.Dir,
-			p.Workspace,
-			p.Terragrunt,
-			p.Workflow,
-			p.IncludePatterns,
-			p.ExcludePatterns,
-			p.DependencyProjects,
-			driftDetection,
-		}
-		result[i] = item
-	}
-	return result
-}
-
-func copyTerraformEnvConfig(terraformEnvConfig *TerraformEnvConfigYaml) *TerraformEnvConfig {
-	if terraformEnvConfig == nil {
-		return &TerraformEnvConfig{}
-	}
-	result := TerraformEnvConfig{}
-	result.State = make([]EnvVar, len(terraformEnvConfig.State))
-	result.Commands = make([]EnvVar, len(terraformEnvConfig.Commands))
-
-	for i, s := range terraformEnvConfig.State {
-		item := EnvVar{
-			s.Name,
-			s.ValueFrom,
-			s.Value,
-		}
-		result.State[i] = item
-	}
-	for i, s := range terraformEnvConfig.Commands {
-		item := EnvVar{
-			s.Name,
-			s.ValueFrom,
-			s.Value,
-		}
-		result.Commands[i] = item
-	}
-
-	return &result
-}
-
-func copyStage(stage *StageYaml) *models.Stage {
-	result := models.Stage{}
-	result.Steps = make([]models.Step, len(stage.Steps))
-
-	for i, s := range stage.Steps {
-		item := models.Step{
-			Action:    s.Action,
-			Value:     s.Value,
-			ExtraArgs: s.ExtraArgs,
-			Shell:     s.Shell,
-		}
-		result.Steps[i] = item
-	}
-	return &result
-}
-
-func copyWorkflowConfiguration(config *WorkflowConfigurationYaml) *WorkflowConfiguration {
-	result := WorkflowConfiguration{}
-	result.OnPullRequestClosed = config.OnPullRequestClosed
-	result.OnPullRequestPushed = config.OnPullRequestPushed
-	result.OnCommitToDefault = config.OnCommitToDefault
-	return &result
-}
-
-// converts dict of WorkflowYaml's to dict of Workflow's
-func copyWorkflows(workflows map[string]*WorkflowYaml) map[string]Workflow {
-	result := make(map[string]Workflow, len(workflows))
-	for i, w := range workflows {
-		if w == nil {
-			item := *defaultWorkflow()
-			result[i] = item
-		} else {
-			envVars := copyTerraformEnvConfig(w.EnvVars)
-			plan := copyStage(w.Plan)
-			apply := copyStage(w.Apply)
-			configuration := copyWorkflowConfiguration(w.Configuration)
-			item := Workflow{
-				envVars,
-				plan,
-				apply,
-				configuration,
-			}
-			result[i] = item
-		}
-	}
-	return result
-}
-
-func ConvertDiggerYamlToConfig(diggerYaml *DiggerConfigYaml, workingDir string) (*DiggerConfig, graph.Graph[string, string], error) {
-	var diggerConfig DiggerConfig
-
-	if diggerYaml.AutoMerge != nil {
-		diggerConfig.AutoMerge = *diggerYaml.AutoMerge
-	} else {
-		diggerConfig.AutoMerge = false
-	}
-
-	if diggerYaml.CollectUsageData != nil {
-		diggerConfig.CollectUsageData = *diggerYaml.CollectUsageData
-	} else {
-		diggerConfig.CollectUsageData = true
-	}
-
-	// if workflow block is not specified in yaml we create a default one, and add it to every project
-	if diggerYaml.Workflows != nil {
-		workflows := copyWorkflows(diggerYaml.Workflows)
-		diggerConfig.Workflows = workflows
-
-		// provide default workflow if not specified
-		if _, ok := diggerConfig.Workflows[defaultWorkflowName]; !ok {
-			workflow := *defaultWorkflow()
-			diggerConfig.Workflows[defaultWorkflowName] = workflow
-		}
-	} else {
-		workflow := *defaultWorkflow()
-		diggerConfig.Workflows = make(map[string]Workflow)
-		diggerConfig.Workflows[defaultWorkflowName] = workflow
-	}
-
-	projects := copyProjects(diggerYaml.Projects)
-	diggerConfig.Projects = projects
-
-	// update project's workflow if needed
-	for _, project := range diggerConfig.Projects {
-		if project.Workflow == "" {
-			project.Workflow = defaultWorkflowName
-		}
-	}
-
-	// check for project name duplicates
-	projectNames := make(map[string]bool)
-	for _, project := range diggerConfig.Projects {
-		if projectNames[project.Name] {
-			return nil, nil, fmt.Errorf("project name '%s' is duplicated", project.Name)
-		}
-		projectNames[project.Name] = true
-	}
-
-	// check project dependencies exist
-	for _, project := range diggerConfig.Projects {
-		for _, dependency := range project.DependencyProjects {
-			if !projectNames[dependency] {
-				return nil, nil, fmt.Errorf("project '%s' depends on '%s' which does not exist", project.Name, dependency)
-			}
-		}
-	}
-
-	if diggerYaml.GenerateProjectsConfig != nil && diggerYaml.GenerateProjectsConfig.TerragruntParsingConfig == nil {
-		var dirWalker = &FileSystemTopLevelTerraformDirWalker{}
-		dirs, err := dirWalker.GetDirs(workingDir)
-		if err != nil {
-			return nil, nil, err
-		}
-
-		for _, dir := range dirs {
-			includePattern := diggerYaml.GenerateProjectsConfig.Include
-			excludePattern := diggerYaml.GenerateProjectsConfig.Exclude
-			if utils.MatchIncludeExcludePatternsToFile(dir, []string{includePattern}, []string{excludePattern}) {
-				project := Project{Name: filepath.Base(dir), Dir: dir, Workflow: defaultWorkflowName, Workspace: "default"}
-				diggerConfig.Projects = append(diggerConfig.Projects, project)
-			}
-		}
-	}
-
-	dependencyGraph, err := CreateProjectDependencyGraph(diggerConfig.Projects)
-	if err != nil {
-		return nil, nil, fmt.Errorf("failed to create project dependency graph: %s", err.Error())
-	}
-
-	// if one of the workflows is missing Plan or Apply we copy default values
-	for _, w := range diggerConfig.Workflows {
-		defaultWorkflow := *defaultWorkflow()
-		if w.Plan == nil {
-			w.Plan = defaultWorkflow.Plan
-		}
-		if w.Apply == nil {
-			w.Apply = defaultWorkflow.Apply
-		}
-	}
-
-	return &diggerConfig, dependencyGraph, nil
-}
-
-func CreateProjectDependencyGraph(projects []Project) (graph.Graph[string, string], error) {
-	g := graph.New(graph.StringHash, graph.Directed(), graph.PreventCycles())
-	for _, project := range projects {
-		v, _ := g.Vertex(project.Name)
-
-		if v == "" {
-			err := g.AddVertex(project.Name)
-			if err != nil {
-				return nil, err
-			}
-		}
-		for _, dependency := range project.DependencyProjects {
-			v, _ := g.Vertex(dependency)
-
-			if v == "" {
-				err := g.AddVertex(dependency)
-
-				if err != nil {
-					return nil, err
-				}
-			}
-
-			err := g.AddEdge(dependency, project.Name)
-			if err != nil {
-				return nil, err
-			}
-		}
-	}
-	return g, nil
-}
diff --git a/pkg/configuration/digger_config.go b/pkg/configuration/digger_config.go
deleted file mode 100644
index 48b387b1..00000000
--- a/pkg/configuration/digger_config.go
+++ /dev/null
@@ -1,451 +0,0 @@
-package configuration
-
-import (
-	"digger/pkg/terragrunt/atlantis"
-	"digger/pkg/utils"
-	"errors"
-	"fmt"
-	"github.com/dominikbraun/graph"
-	"gopkg.in/yaml.v3"
-	"log"
-	"os"
-	"path"
-	"path/filepath"
-	"regexp"
-	"strings"
-)
-
-type DirWalker interface {
-	GetDirs(workingDir string) ([]string, error)
-}
-
-type FileSystemTopLevelTerraformDirWalker struct {
-}
-
-type FileSystemTerragruntDirWalker struct {
-}
-
-type FileSystemModuleDirWalker struct {
-}
-
-func GetFilesWithExtension(workingDir string, ext string) ([]string, error) {
-	var files []string
-	listOfFiles, err := os.ReadDir(workingDir)
-	if err != nil {
-		return nil, errors.New(fmt.Sprintf("error reading directory %s: %v", workingDir, err))
-	}
-	for _, f := range listOfFiles {
-		if !f.IsDir() {
-			r, err := regexp.MatchString(ext, f.Name())
-			if err == nil && r {
-				files = append(files, f.Name())
-			}
-		}
-	}
-
-	return files, nil
-}
-
-func (walker *FileSystemTopLevelTerraformDirWalker) GetDirs(workingDir string) ([]string, error) {
-	var dirs []string
-	err := filepath.Walk(workingDir,
-		func(path string, info os.FileInfo, err error) error {
-
-			if err != nil {
-				return err
-			}
-			if info.IsDir() {
-				if info.Name() == "modules" {
-					return filepath.SkipDir
-				}
-				terraformFiles, _ := GetFilesWithExtension(path, ".tf")
-				if len(terraformFiles) > 0 {
-					dirs = append(dirs, strings.ReplaceAll(path, workingDir+string(os.PathSeparator), ""))
-					return filepath.SkipDir
-				}
-			}
-			return nil
-		})
-	if err != nil {
-		return nil, err
-	}
-	return dirs, nil
-}
-
-func (walker *FileSystemModuleDirWalker) GetDirs(workingDir string) ([]string, error) {
-	var dirs []string
-	err := filepath.Walk(workingDir,
-		func(path string, info os.FileInfo, err error) error {
-
-			if err != nil {
-				return err
-			}
-			if info.IsDir() && info.Name() == "modules" {
-				dirs = append(dirs, strings.ReplaceAll(path, workingDir+string(os.PathSeparator), ""))
-				return filepath.SkipDir
-			}
-			return nil
-		})
-	if err != nil {
-		return nil, err
-	}
-	return dirs, nil
-}
-
-func (walker *FileSystemTerragruntDirWalker) GetDirs(workingDir string) ([]string, error) {
-	var dirs []string
-	err := filepath.Walk(workingDir,
-		func(path string, info os.FileInfo, err error) error {
-
-			if err != nil {
-				return err
-			}
-			if info.IsDir() {
-				if info.Name() == "modules" {
-					return filepath.SkipDir
-				}
-				terragruntFiles, _ := GetFilesWithExtension(path, "terragrunt.hcl")
-				if len(terragruntFiles) > 0 {
-					for _, f := range terragruntFiles {
-						terragruntFile := path + string(os.PathSeparator) + f
-						fileContent, err := os.ReadFile(terragruntFile)
-						if err != nil {
-							return err
-						}
-						if strings.Contains(string(fileContent), "include \"root\"") {
-							dirs = append(dirs, strings.ReplaceAll(path, workingDir+string(os.PathSeparator), ""))
-							return filepath.SkipDir
-						}
-					}
-				}
-			}
-			return nil
-		})
-	if err != nil {
-		return nil, err
-	}
-	return dirs, nil
-}
-
-var ErrDiggerConfigConflict = errors.New("more than one digger config file detected, please keep either 'digger.yml' or 'digger.yaml'")
-
-func LoadDiggerConfig(workingDir string) (*DiggerConfig, *DiggerConfigYaml, graph.Graph[string, string], error) {
-	configYaml := &DiggerConfigYaml{}
-	config := &DiggerConfig{}
-	fileName, err := retrieveConfigFile(workingDir)
-	if err != nil {
-		if errors.Is(err, ErrDiggerConfigConflict) {
-			return nil, nil, nil, fmt.Errorf("error while retrieving config file: %v", err)
-		}
-	}
-
-	if fileName == "" {
-		configYaml, err = AutoDetectDiggerConfig(workingDir)
-		if err != nil {
-			return nil, nil, nil, fmt.Errorf("failed to auto detect digger config: %v", err)
-		}
-		marshalledConfig, err := yaml.Marshal(configYaml)
-		if err != nil {
-			log.Printf("failed to marshal auto detected digger config: %v", err)
-		} else {
-			log.Printf("Auto detected digger config: \n%v", string(marshalledConfig))
-		}
-	} else {
-		data, err := os.ReadFile(fileName)
-		if err != nil {
-			return nil, nil, nil, fmt.Errorf("failed to read config file %s: %v", fileName, err)
-		}
-
-		if err := yaml.Unmarshal(data, configYaml); err != nil {
-			return nil, nil, nil, fmt.Errorf("error parsing '%s': %v", fileName, err)
-		}
-	}
-
-	if configYaml.GenerateProjectsConfig != nil && configYaml.GenerateProjectsConfig.TerragruntParsingConfig != nil {
-		hydrateDiggerConfig(configYaml, *configYaml.GenerateProjectsConfig.TerragruntParsingConfig)
-	} else if configYaml.GenerateProjectsConfig != nil && configYaml.GenerateProjectsConfig.Terragrunt {
-		hydrateDiggerConfig(configYaml, TerragruntParsingConfig{})
-	}
-
-	if (configYaml.Projects == nil || len(configYaml.Projects) == 0) && configYaml.GenerateProjectsConfig == nil {
-		return nil, nil, nil, fmt.Errorf("no projects configuration found in '%s'", fileName)
-	}
-
-	config, projectDependencyGraph, err := ConvertDiggerYamlToConfig(configYaml, workingDir)
-	if err != nil {
-		return nil, nil, nil, err
-	}
-
-	for _, p := range config.Projects {
-		_, ok := config.Workflows[p.Workflow]
-		if !ok {
-			return nil, nil, nil, fmt.Errorf("failed to find workflow config '%s' for project '%s'", p.Workflow, p.Name)
-		}
-	}
-
-	for _, w := range config.Workflows {
-		for _, s := range w.Plan.Steps {
-			if s.Action == "" {
-				return nil, nil, nil, fmt.Errorf("plan step's action can't be empty")
-			}
-		}
-	}
-
-	for _, w := range config.Workflows {
-		for _, s := range w.Apply.Steps {
-			if s.Action == "" {
-				return nil, nil, nil, fmt.Errorf("apply step's action can't be empty")
-			}
-		}
-	}
-	return config, configYaml, projectDependencyGraph, nil
-}
-
-func hydrateDiggerConfig(configYaml *DiggerConfigYaml, parsingConfig TerragruntParsingConfig) {
-	root := ""
-	if parsingConfig.GitRoot == nil {
-		wd, err := os.Getwd()
-		if err != nil {
-			log.Printf("failed to get working directory: %v", err)
-		} else {
-			root = wd
-		}
-	}
-	projectExternalChilds := true
-
-	if parsingConfig.CreateHclProjectExternalChilds != nil {
-		projectExternalChilds = *parsingConfig.CreateHclProjectExternalChilds
-	}
-
-	parallel := true
-	if parsingConfig.Parallel != nil {
-		parallel = *parsingConfig.Parallel
-	}
-
-	ignoreParentTerragrunt := true
-	if parsingConfig.IgnoreParentTerragrunt != nil {
-		ignoreParentTerragrunt = *parsingConfig.IgnoreParentTerragrunt
-	}
-
-	cascadeDependencies := true
-	if parsingConfig.CascadeDependencies != nil {
-		cascadeDependencies = *parsingConfig.CascadeDependencies
-	}
-
-	atlantisConfig, _, err := atlantis.Parse(
-		root,
-		parsingConfig.ProjectHclFiles,
-		projectExternalChilds,
-		parsingConfig.AutoMerge,
-		parallel,
-		parsingConfig.FilterPath,
-		parsingConfig.CreateHclProjectChilds,
-		ignoreParentTerragrunt,
-		parsingConfig.IgnoreDependencyBlocks,
-		cascadeDependencies,
-		parsingConfig.DefaultWorkflow,
-		parsingConfig.DefaultApplyRequirements,
-		parsingConfig.AutoPlan,
-		parsingConfig.DefaultTerraformVersion,
-		parsingConfig.CreateProjectName,
-		parsingConfig.CreateWorkspace,
-		parsingConfig.PreserveProjects,
-		parsingConfig.UseProjectMarkers,
-	)
-	if err != nil {
-		log.Printf("failed to autogenerate config: %v", err)
-	}
-
-	configYaml.AutoMerge = &atlantisConfig.AutoMerge
-	for _, atlantisProject := range atlantisConfig.Projects {
-		configYaml.Projects = append(configYaml.Projects, &ProjectYaml{
-			Name:            atlantisProject.Name,
-			Dir:             atlantisProject.Dir,
-			Workspace:       atlantisProject.Workspace,
-			Terragrunt:      true,
-			Workflow:        atlantisProject.Workflow,
-			IncludePatterns: atlantisProject.Autoplan.WhenModified,
-		})
-	}
-}
-
-func AutoDetectDiggerConfig(workingDir string) (*DiggerConfigYaml, error) {
-	configYaml := &DiggerConfigYaml{}
-	collectUsageData := true
-	configYaml.CollectUsageData = &collectUsageData
-
-	terragruntDirWalker := &FileSystemTerragruntDirWalker{}
-	terraformDirWalker := &FileSystemTopLevelTerraformDirWalker{}
-	moduleDirWalker := &FileSystemModuleDirWalker{}
-
-	terragruntDirs, err := terragruntDirWalker.GetDirs(workingDir)
-
-	if err != nil {
-		return nil, err
-	}
-
-	terraformDirs, err := terraformDirWalker.GetDirs(workingDir)
-	if err != nil {
-		return nil, err
-	}
-
-	moduleDirs, err := moduleDirWalker.GetDirs(workingDir)
-
-	var modulePatterns []string
-	for _, dir := range moduleDirs {
-		modulePatterns = append(modulePatterns, dir+"/**")
-	}
-
-	if err != nil {
-		return nil, err
-	}
-	if len(terragruntDirs) > 0 {
-		// TODO: add support for dependency graph when parsing terragrunt config
-		for _, dir := range terragruntDirs {
-			projectName := dir
-			if dir == "./" {
-				projectName = "default"
-			}
-			project := ProjectYaml{Name: projectName, Dir: dir, Workflow: defaultWorkflowName, Workspace: "default", Terragrunt: true, IncludePatterns: modulePatterns}
-			configYaml.Projects = append(configYaml.Projects, &project)
-		}
-		return configYaml, nil
-	} else if len(terraformDirs) > 0 {
-		for _, dir := range terraformDirs {
-			projectName := dir
-			if dir == "./" {
-				projectName = "default"
-			}
-			project := ProjectYaml{Name: projectName, Dir: dir, Workflow: defaultWorkflowName, Workspace: "default", Terragrunt: false, IncludePatterns: modulePatterns}
-			configYaml.Projects = append(configYaml.Projects, &project)
-		}
-		return configYaml, nil
-	} else {
-		return nil, fmt.Errorf("no terragrunt or terraform project detected in the repository")
-	}
-}
-
-func (c *DiggerConfig) GetProject(projectName string) *Project {
-	for _, project := range c.Projects {
-		if projectName == project.Name {
-			return &project
-		}
-	}
-	return nil
-}
-
-func (c *DiggerConfig) GetProjects(projectName string) []Project {
-	if projectName == "" {
-		return c.Projects
-	}
-	project := c.GetProject(projectName)
-	if project == nil {
-		return nil
-	}
-	return []Project{*project}
-}
-
-func (c *DiggerConfig) GetModifiedProjects(changedFiles []string) []Project {
-	var result []Project
-	for _, project := range c.Projects {
-		for _, changedFile := range changedFiles {
-			includePatterns := project.IncludePatterns
-			excludePatterns := project.ExcludePatterns
-			if !project.Terragrunt {
-				includePatterns = append(includePatterns, filepath.Join(project.Dir, "**", "*.tf"))
-			} else {
-				includePatterns = append(includePatterns, filepath.Join(project.Dir, "*.hcl"))
-			}
-			// all our patterns are the globale dir pattern + the include patterns specified by user
-			if utils.MatchIncludeExcludePatternsToFile(changedFile, includePatterns, excludePatterns) {
-				result = append(result, project)
-				break
-			}
-		}
-	}
-	return result
-}
-
-func (c *DiggerConfig) GetDirectory(projectName string) string {
-	project := c.GetProject(projectName)
-	if project == nil {
-		return ""
-	}
-	return project.Dir
-}
-
-func (c *DiggerConfig) GetWorkflow(workflowName string) *Workflow {
-	workflows := c.Workflows
-
-	workflow, ok := workflows[workflowName]
-	if !ok {
-		return nil
-	}
-	return &workflow
-
-}
-
-type File struct {
-	Filename string
-}
-
-func isFileExists(path string) bool {
-	fi, err := os.Stat(path)
-	if os.IsNotExist(err) {
-		return false
-	}
-	// file exists make sure it's not a directory
-	return !fi.IsDir()
-}
-
-func retrieveConfigFile(workingDir string) (string, error) {
-	fileName := "digger"
-	if workingDir != "" {
-		fileName = path.Join(workingDir, fileName)
-	}
-
-	// Make sure we don't have more than one digger config file
-	ymlCfg := isFileExists(fileName + ".yml")
-	yamlCfg := isFileExists(fileName + ".yaml")
-	if ymlCfg && yamlCfg {
-		return "", ErrDiggerConfigConflict
-	}
-
-	// At this point we know there are no duplicates
-	// Return the first one that exists
-	if ymlCfg {
-		return path.Join(workingDir, "digger.yml"), nil
-	}
-	if yamlCfg {
-		return path.Join(workingDir, "digger.yaml"), nil
-	}
-
-	// Passing this point means digger config file is
-	// missing which is a non-error
-	return "", nil
-}
-
-func CollectTerraformEnvConfig(envs *TerraformEnvConfig) (map[string]string, map[string]string) {
-	stateEnvVars := map[string]string{}
-	commandEnvVars := map[string]string{}
-
-	if envs != nil {
-		for _, envvar := range envs.State {
-			if envvar.Value != "" {
-				stateEnvVars[envvar.Name] = envvar.Value
-			} else if envvar.ValueFrom != "" {
-				stateEnvVars[envvar.Name] = os.Getenv(envvar.ValueFrom)
-			}
-		}
-
-		for _, envvar := range envs.Commands {
-			if envvar.Value != "" {
-				commandEnvVars[envvar.Name] = envvar.Value
-			} else if envvar.ValueFrom != "" {
-				commandEnvVars[envvar.Name] = os.Getenv(envvar.ValueFrom)
-			}
-		}
-	}
-
-	return stateEnvVars, commandEnvVars
-}
diff --git a/pkg/configuration/yaml.go b/pkg/configuration/yaml.go
deleted file mode 100644
index ad549a24..00000000
--- a/pkg/configuration/yaml.go
+++ /dev/null
@@ -1,214 +0,0 @@
-package configuration
-
-import (
-	"digger/pkg/core/models"
-	"gopkg.in/yaml.v3"
-)
-
-type DiggerConfigYaml struct {
-	Projects               []*ProjectYaml              `yaml:"projects"`
-	AutoMerge              *bool                       `yaml:"auto_merge"`
-	Workflows              map[string]*WorkflowYaml    `yaml:"workflows"`
-	CollectUsageData       *bool                       `yaml:"collect_usage_data,omitempty"`
-	GenerateProjectsConfig *GenerateProjectsConfigYaml `yaml:"generate_projects"`
-}
-
-type ProjectYaml struct {
-	Name               string   `yaml:"name"`
-	Dir                string   `yaml:"dir"`
-	Workspace          string   `yaml:"workspace"`
-	Terragrunt         bool     `yaml:"terragrunt"`
-	Workflow           string   `yaml:"workflow"`
-	IncludePatterns    []string `yaml:"include_patterns,omitempty"`
-	ExcludePatterns    []string `yaml:"exclude_patterns,omitempty"`
-	DependencyProjects []string `yaml:"depends_on,omitempty"`
-	DriftDetection     *bool    `yaml:"drift_detection,omitempty"`
-}
-
-type WorkflowYaml struct {
-	EnvVars       *TerraformEnvConfigYaml    `yaml:"env_vars"`
-	Plan          *StageYaml                 `yaml:"plan,omitempty"`
-	Apply         *StageYaml                 `yaml:"apply,omitempty"`
-	Configuration *WorkflowConfigurationYaml `yaml:"workflow_configuration"`
-}
-
-type WorkflowConfigurationYaml struct {
-	OnPullRequestPushed []string `yaml:"on_pull_request_pushed"`
-	OnPullRequestClosed []string `yaml:"on_pull_request_closed"`
-	OnCommitToDefault   []string `yaml:"on_commit_to_default"`
-}
-
-func (s *StageYaml) ToCoreStage() models.Stage {
-	var steps []models.Step
-	for _, step := range s.Steps {
-		steps = append(steps, step.ToCoreStep())
-	}
-	return models.Stage{Steps: steps}
-}
-
-type StageYaml struct {
-	Steps []StepYaml `yaml:"steps"`
-}
-
-type StepYaml struct {
-	Action    string
-	Value     string
-	ExtraArgs []string `yaml:"extra_args,omitempty"`
-	Shell     string
-}
-
-type TerraformEnvConfigYaml struct {
-	State    []EnvVarYaml `yaml:"state"`
-	Commands []EnvVarYaml `yaml:"commands"`
-}
-
-type EnvVarYaml struct {
-	Name      string `yaml:"name"`
-	ValueFrom string `yaml:"value_from"`
-	Value     string `yaml:"value"`
-}
-
-type GenerateProjectsConfigYaml struct {
-	Include                 string                   `yaml:"include"`
-	Exclude                 string                   `yaml:"exclude"`
-	Terragrunt              bool                     `yaml:"terragrunt"`
-	TerragruntParsingConfig *TerragruntParsingConfig `yaml:"terragrunt_parsing,omitempty"`
-}
-
-type TerragruntParsingConfig struct {
-	GitRoot                  *string  `yaml:"gitRoot,omitempty"`
-	AutoPlan                 bool     `yaml:"autoPlan"`
-	AutoMerge                bool     `yaml:"autoMerge"`
-	IgnoreParentTerragrunt   *bool    `yaml:"ignoreParentTerragrunt,omitempty"`
-	CreateParentProject      bool     `yaml:"createParentProject"`
-	IgnoreDependencyBlocks   bool     `yaml:"ignoreDependencyBlocks"`
-	Parallel                 *bool    `yaml:"parallel,omitempty"`
-	CreateWorkspace          bool     `yaml:"createWorkspace"`
-	CreateProjectName        bool     `yaml:"createProjectName"`
-	DefaultTerraformVersion  string   `yaml:"defaultTerraformVersion"`
-	DefaultWorkflow          string   `yaml:"defaultWorkflow"`
-	FilterPath               string   `yaml:"filterPath"`
-	OutputPath               string   `yaml:"outputPath"`
-	PreserveWorkflows        *bool    `yaml:"preserveWorkflows,omitempty"`
-	PreserveProjects         bool     `yaml:"preserveProjects"`
-	CascadeDependencies      *bool    `yaml:"cascadeDependencies,omitempty"`
-	DefaultApplyRequirements []string `yaml:"defaultApplyRequirements"`
-	//NumExecutors                   int64	`yaml:"numExecutors"`
-	ProjectHclFiles                []string `yaml:"projectHclFiles"`
-	CreateHclProjectChilds         bool     `yaml:"createHclProjectChilds"`
-	CreateHclProjectExternalChilds *bool    `yaml:"createHclProjectExternalChilds,omitempty"`
-	UseProjectMarkers              bool     `yaml:"useProjectMarkers"`
-	//ExecutionOrderGroups           bool	`yaml:"executionOrderGroups"`
-}
-
-func (p *ProjectYaml) UnmarshalYAML(unmarshal func(interface{}) error) error {
-	type rawProject ProjectYaml
-	raw := rawProject{
-		Workspace:  "default",
-		Terragrunt: false,
-		Workflow:   "default",
-	}
-	if err := unmarshal(&raw); err != nil {
-		return err
-	}
-	*p = ProjectYaml(raw)
-	return nil
-}
-
-func (w *WorkflowYaml) UnmarshalYAML(unmarshal func(interface{}) error) error {
-	type rawWorkflow WorkflowYaml
-	raw := rawWorkflow{
-		Configuration: &WorkflowConfigurationYaml{
-			OnCommitToDefault:   []string{"digger unlock"},
-			OnPullRequestPushed: []string{"digger plan"},
-			OnPullRequestClosed: []string{"digger unlock"},
-		},
-		Plan: &StageYaml{
-			Steps: []StepYaml{
-				{
-					Action: "init", ExtraArgs: []string{},
-				},
-				{
-					Action: "plan", ExtraArgs: []string{},
-				},
-			},
-		},
-		Apply: &StageYaml{
-			Steps: []StepYaml{
-				{
-					Action: "init", ExtraArgs: []string{},
-				},
-				{
-					Action: "apply", ExtraArgs: []string{},
-				},
-			},
-		},
-		EnvVars: &TerraformEnvConfigYaml{
-			State:    []EnvVarYaml{},
-			Commands: []EnvVarYaml{},
-		},
-	}
-	if err := unmarshal(&raw); err != nil {
-		return err
-	}
-	*w = WorkflowYaml(raw)
-	return nil
-}
-
-func (s *StepYaml) UnmarshalYAML(value *yaml.Node) error {
-
-	if value.Kind == yaml.ScalarNode {
-		return value.Decode(&s.Action)
-	}
-
-	var stepMap map[string]interface{}
-	if err := value.Decode(&stepMap); err != nil {
-		return err
-	}
-
-	if _, ok := stepMap["run"]; ok {
-		s.Action = "run"
-		s.Value = stepMap["run"].(string)
-		if _, ok := stepMap["shell"]; ok {
-			s.Shell = stepMap["shell"].(string)
-		}
-		return nil
-	}
-
-	s.extract(stepMap, "init")
-	s.extract(stepMap, "plan")
-	s.extract(stepMap, "apply")
-
-	return nil
-}
-
-func (s *StepYaml) ToCoreStep() models.Step {
-	return models.Step{
-		Action:    s.Action,
-		Value:     s.Value,
-		ExtraArgs: s.ExtraArgs,
-		Shell:     s.Shell,
-	}
-}
-
-func (s *StepYaml) extract(stepMap map[string]interface{}, action string) {
-	if _, ok := stepMap[action]; ok {
-		s.Action = action
-		var extraArgs []string
-		if v, ok := stepMap["extra_args"]; ok {
-			for _, v := range v.([]interface{}) {
-				extraArgs = append(extraArgs, v.(string))
-			}
-			s.ExtraArgs = extraArgs
-		} else {
-			if stepMap[action] != nil {
-				if v, ok := stepMap[action].(map[string]interface{})["extra_args"]; ok {
-					for _, v := range v.([]interface{}) {
-						extraArgs = append(extraArgs, v.(string))
-					}
-					s.ExtraArgs = extraArgs
-				}
-			}
-		}
-	}
-}
diff --git a/pkg/core/execution/execution.go b/pkg/core/execution/execution.go
index 87a07c06..3fb01930 100644
--- a/pkg/core/execution/execution.go
+++ b/pkg/core/execution/execution.go
@@ -2,13 +2,13 @@ package execution
 
 import (
 	"digger/pkg/core/locking"
-	"digger/pkg/core/models"
 	"digger/pkg/core/reporting"
 	"digger/pkg/core/runners"
 	"digger/pkg/core/storage"
 	"digger/pkg/core/terraform"
 	"digger/pkg/core/utils"
 	"fmt"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"log"
 	"os"
 	"path"
@@ -90,8 +90,8 @@ type DiggerExecutor struct {
 	ProjectPath       string
 	StateEnvVars      map[string]string
 	CommandEnvVars    map[string]string
-	ApplyStage        *models.Stage
-	PlanStage         *models.Stage
+	ApplyStage        *configuration.Stage
+	PlanStage         *configuration.Stage
 	CommandRunner     runners.CommandRun
 	TerraformExecutor terraform.TerraformExecutor
 	Reporter          reporting.Reporter
@@ -127,12 +127,12 @@ func (d DiggerExecutor) Plan() (bool, bool, string, string, error) {
 	plan := ""
 	terraformPlanOutput := ""
 	isNonEmptyPlan := false
-	var planSteps []models.Step
+	var planSteps []configuration.Step
 
 	if d.PlanStage != nil {
 		planSteps = d.PlanStage.Steps
 	} else {
-		planSteps = []models.Step{
+		planSteps = []configuration.Step{
 			{
 				Action: "init",
 			},
@@ -220,12 +220,12 @@ func (d DiggerExecutor) Apply() (bool, string, error) {
 		}
 	}
 
-	var applySteps []models.Step
+	var applySteps []configuration.Step
 
 	if d.ApplyStage != nil {
 		applySteps = d.ApplyStage.Steps
 	} else {
-		applySteps = []models.Step{
+		applySteps = []configuration.Step{
 			{
 				Action: "init",
 			},
@@ -279,7 +279,7 @@ func (d DiggerExecutor) Apply() (bool, string, error) {
 
 func (d DiggerExecutor) Destroy() (bool, error) {
 
-	destroySteps := []models.Step{
+	destroySteps := []configuration.Step{
 		{
 			Action: "init",
 		},
diff --git a/pkg/core/models/models.go b/pkg/core/models/models.go
index 14d66a36..55828649 100644
--- a/pkg/core/models/models.go
+++ b/pkg/core/models/models.go
@@ -1,13 +1,15 @@
 package models
 
+import configuration "github.com/diggerhq/lib-digger-config"
+
 type Job struct {
 	ProjectName       string
 	ProjectDir        string
 	ProjectWorkspace  string
 	Terragrunt        bool
 	Commands          []string
-	ApplyStage        *Stage
-	PlanStage         *Stage
+	ApplyStage        *configuration.Stage
+	PlanStage         *configuration.Stage
 	PullRequestNumber *int
 	EventName         string
 	RequestedBy       string
@@ -15,14 +17,3 @@ type Job struct {
 	StateEnvVars      map[string]string
 	CommandEnvVars    map[string]string
 }
-
-type Step struct {
-	Action    string
-	Value     string
-	ExtraArgs []string
-	Shell     string
-}
-
-type Stage struct {
-	Steps []Step
-}
diff --git a/pkg/github/github.go b/pkg/github/github.go
index a1579d8e..168f58b9 100644
--- a/pkg/github/github.go
+++ b/pkg/github/github.go
@@ -3,12 +3,12 @@ package github
 import (
 	"context"
 	"digger/pkg/ci"
-	"digger/pkg/configuration"
 	dg_models "digger/pkg/core/models"
 	"digger/pkg/github/models"
 	"digger/pkg/utils"
 	"encoding/json"
 	"fmt"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"log"
 	"strings"
 
diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go
index 74fe7f0b..beb07ffe 100644
--- a/pkg/gitlab/gitlab.go
+++ b/pkg/gitlab/gitlab.go
@@ -2,10 +2,10 @@ package gitlab
 
 import (
 	"digger/pkg/ci"
-	"digger/pkg/configuration"
 	"digger/pkg/core/models"
 	"digger/pkg/utils"
 	"fmt"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"log"
 	"strings"
 
diff --git a/pkg/usage/usage.go b/pkg/usage/usage.go
index b4636a88..9e267e2a 100644
--- a/pkg/usage/usage.go
+++ b/pkg/usage/usage.go
@@ -3,10 +3,10 @@ package usage
 import (
 	"bytes"
 	"crypto/sha256"
-	"digger/pkg/configuration"
 	"encoding/hex"
 	"encoding/json"
 	"fmt"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"log"
 	"net/http"
 	"os"
diff --git a/pkg/utils/io.go b/pkg/utils/io.go
index 6cd120b5..d33fe212 100644
--- a/pkg/utils/io.go
+++ b/pkg/utils/io.go
@@ -3,12 +3,8 @@ package utils
 import (
 	"archive/zip"
 	"bytes"
-	"github.com/bmatcuk/doublestar/v4"
 	"io"
 	"io/ioutil"
-	"log"
-	"path"
-	"path/filepath"
 	"strings"
 )
 
@@ -70,46 +66,3 @@ func (z *Zipper) GetFileFromZip(zipFile string, filename string) (string, error)
 
 	return "", nil
 }
-
-func NormalizeFileName(fileName string) string {
-	res, err := filepath.Abs(path.Join("/", fileName))
-	if err != nil {
-		log.Fatalf("Failed to convert path to absolute: %v", err)
-	}
-	return res
-}
-
-func MatchIncludeExcludePatternsToFile(fileToMatch string, includePatterns []string, excludePatterns []string) bool {
-	fileToMatch = NormalizeFileName(fileToMatch)
-	for i, _ := range includePatterns {
-		includePatterns[i] = NormalizeFileName(includePatterns[i])
-	}
-	for i, _ := range excludePatterns {
-		excludePatterns[i] = NormalizeFileName(excludePatterns[i])
-	}
-
-	matching := false
-	for _, ipattern := range includePatterns {
-		isMatched, err := doublestar.PathMatch(ipattern, fileToMatch)
-		if err != nil {
-			log.Fatalf("Failed to match modified files (%v, %v): Error: %v", fileToMatch, ipattern, err)
-		}
-		if isMatched {
-			matching = true
-			break
-		}
-	}
-
-	for _, epattern := range excludePatterns {
-		excluded, err := doublestar.PathMatch(epattern, fileToMatch)
-		if err != nil {
-			log.Fatalf("Failed to match modified files (%v, %v): Error: %v", fileToMatch, epattern, err)
-		}
-		if excluded {
-			matching = false
-			break
-		}
-	}
-
-	return matching
-}


Test patch:
diff --git a/cmd/digger/main_test.go b/cmd/digger/main_test.go
index d0daa15e..535fd496 100644
--- a/cmd/digger/main_test.go
+++ b/cmd/digger/main_test.go
@@ -1,14 +1,13 @@
 package main
 
 import (
-	"digger/pkg/configuration"
-	"digger/pkg/core/models"
 	"digger/pkg/digger"
 	"digger/pkg/github"
 	gh_models "digger/pkg/github/models"
 	"digger/pkg/reporting"
 	"digger/pkg/utils"
 	"fmt"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"testing"
 
 	"github.com/davecgh/go-spew/spew"
@@ -940,11 +939,11 @@ func TestGitHubNewPullRequestInMultiEnvProjectContext(t *testing.T) {
 	prod := configuration.Project{Name: "prod", Dir: "prod", Workflow: "prod"}
 	workflows := map[string]configuration.Workflow{
 		"dev": {
-			Plan: &models.Stage{Steps: []models.Step{
+			Plan: &configuration.Stage{Steps: []configuration.Step{
 				{Action: "init", ExtraArgs: []string{}},
 				{Action: "plan", ExtraArgs: []string{"-var-file=dev.tfvars"}},
 			}},
-			Apply: &models.Stage{Steps: []models.Step{
+			Apply: &configuration.Stage{Steps: []configuration.Step{
 				{Action: "init", ExtraArgs: []string{}},
 				{Action: "apply", ExtraArgs: []string{"-var-file=dev.tfvars"}},
 			}},
@@ -955,11 +954,11 @@ func TestGitHubNewPullRequestInMultiEnvProjectContext(t *testing.T) {
 			},
 		},
 		"prod": {
-			Plan: &models.Stage{Steps: []models.Step{
+			Plan: &configuration.Stage{Steps: []configuration.Step{
 				{Action: "init", ExtraArgs: []string{}},
 				{Action: "plan", ExtraArgs: []string{"-var-file=dev.tfvars"}},
 			}},
-			Apply: &models.Stage{Steps: []models.Step{
+			Apply: &configuration.Stage{Steps: []configuration.Step{
 				{Action: "init", ExtraArgs: []string{}},
 				{Action: "apply", ExtraArgs: []string{"-var-file=dev.tfvars"}},
 			}},
diff --git a/pkg/configuration/digger_config_test.go b/pkg/configuration/digger_config_test.go
deleted file mode 100644
index a9d4086d..00000000
--- a/pkg/configuration/digger_config_test.go
+++ /dev/null
@@ -1,673 +0,0 @@
-package configuration
-
-import (
-	"digger/pkg/core/models"
-	"github.com/dominikbraun/graph"
-	"log"
-	"os"
-	"path"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-)
-
-func setUp() (string, func()) {
-	tempDir := createTempDir()
-	return tempDir, func() {
-		deleteTempDir(tempDir)
-	}
-}
-
-func TestDiggerConfigWhenMultipleConfigExist(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	_, err := os.Create(path.Join(tempDir, "digger.yaml"))
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	_, err = os.Create(path.Join(tempDir, "digger.yml"))
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.Error(t, err, "expected error to be returned")
-	assert.ErrorContains(t, err, ErrDiggerConfigConflict.Error(), "expected error to match target error")
-	assert.Nil(t, dg, "expected diggerConfig to be nil")
-}
-
-func TestDiggerConfigWhenOnlyYamlExists(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: prod
-  branch: /main/
-  dir: path/to/module/test
-  workspace: default
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "path/to/module/test", dg.GetDirectory("prod"))
-}
-
-func TestNoDiggerYaml(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	terraformFile := ""
-	deleteFile := createFile(path.Join(tempDir, "main.tf"), terraformFile)
-	defer deleteFile()
-
-	os.Chdir(tempDir)
-	dg, _, _, err := LoadDiggerConfig("./")
-
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, 1, len(dg.Projects))
-	assert.Equal(t, false, dg.AutoMerge)
-	assert.Equal(t, true, dg.CollectUsageData)
-	assert.Equal(t, 1, len(dg.Workflows))
-	assert.Equal(t, "default", dg.Projects[0].Name)
-	assert.Equal(t, "./", dg.Projects[0].Dir)
-
-	workflow := dg.Workflows["default"]
-	assert.NotNil(t, workflow, "expected workflow to be not nil")
-	assert.NotNil(t, workflow.Plan)
-	assert.NotNil(t, workflow.Plan.Steps)
-
-	assert.NotNil(t, workflow.Apply)
-	assert.NotNil(t, workflow.Apply.Steps)
-	assert.NotNil(t, workflow.EnvVars)
-	assert.NotNil(t, workflow.Configuration)
-}
-
-func TestDefaultDiggerConfig(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: prod
-  branch: /main/
-  dir: path/to/module/test
-  workspace: default
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, 1, len(dg.Projects))
-	assert.Equal(t, false, dg.AutoMerge)
-	assert.Equal(t, true, dg.CollectUsageData)
-	assert.Equal(t, 1, len(dg.Workflows))
-
-	workflow := dg.Workflows["default"]
-	assert.NotNil(t, workflow, "expected workflow to be not nil")
-	assert.NotNil(t, workflow.Plan)
-	assert.NotNil(t, workflow.Plan.Steps)
-
-	assert.NotNil(t, workflow.Apply)
-	assert.NotNil(t, workflow.Apply.Steps)
-	assert.NotNil(t, workflow.EnvVars)
-	assert.NotNil(t, workflow.Configuration)
-
-	assert.Equal(t, "path/to/module/test", dg.GetDirectory("prod"))
-}
-
-func TestDiggerConfigDefaultWorkflow(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: prod
-  branch: /main/
-  dir: path/to/module/test
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "default", dg.Projects[0].Workflow)
-	_, ok := dg.Workflows["default"]
-	assert.True(t, ok)
-}
-
-func TestDiggerConfigWhenOnlyYmlExists(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: dev
-  branch: /main/
-  dir: path/to/module
-  workspace: default
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "path/to/module", dg.GetDirectory("dev"))
-}
-
-func TestCustomCommandsConfiguration(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: dev
-  dir: infra/dev
-  workflow: myworkflow
-
-workflows:
-  myworkflow:
-    plan:
-      steps:
-      - run: echo "hello"
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.Equal(t, models.Step{Action: "run", Value: "echo \"hello\"", Shell: ""}, dg.Workflows["myworkflow"].Plan.Steps[0], "parsed struct does not match expected struct")
-}
-
-func TestEnvVarsConfiguration(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: dev
-  branch: /main/
-  dir: .
-  workspace: default
-  terragrunt: false
-  workflow: myworkflow
-workflows:
-  myworkflow:
-    plan:
-      steps:
-      - init:
-          extra_args: ["-lock=false"]
-      - plan: 
-          extra_args: ["-lock=false"]
-      - run: echo "hello"
-    apply:
-      steps:
-      - apply:
-        extra_args: ["-lock=false"]
-    workflow_configuration:
-      on_pull_request_pushed: [digger plan]
-      on_pull_request_closed: [digger unlock]
-      on_commit_to_default: [digger apply]
-    env_vars:
-      state:
-      - name: TF_VAR_state
-        value: s3://mybucket/terraform.tfstate
-      commands:
-      - name: TF_VAR_command
-        value: plan
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.Equal(t, []EnvVar{
-		{Name: "TF_VAR_state", Value: "s3://mybucket/terraform.tfstate"},
-	}, dg.Workflows["myworkflow"].EnvVars.State, "parsed struct does not match expected struct")
-	assert.Equal(t, []EnvVar{
-		{Name: "TF_VAR_command", Value: "plan"},
-	}, dg.Workflows["myworkflow"].EnvVars.Commands, "parsed struct does not match expected struct")
-}
-
-func TestDefaultValuesForWorkflowConfiguration(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: dev
-  dir: .
-  workflow: dev
-
-workflows:
-  dev:
-    plan:
-      steps:
-        - run: rm -rf .terraform
-        - init
-        - plan:
-          extra_args: ["-var-file=vars/dev.tfvars"]  
-  default:
-    plan:
-      steps:
-        - run: rm -rf .terraform
-        - init
-        - plan:
-            extra_args: ["-var-file=vars/dev.tfvars"]
-
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.Equal(t, models.Step{Action: "run", Value: "rm -rf .terraform", Shell: ""}, dg.Workflows["dev"].Plan.Steps[0], "parsed struct does not match expected struct")
-	assert.Equal(t, models.Step{Action: "init", ExtraArgs: nil, Shell: ""}, dg.Workflows["dev"].Plan.Steps[1], "parsed struct does not match expected struct")
-	assert.Equal(t, models.Step{Action: "plan", ExtraArgs: []string{"-var-file=vars/dev.tfvars"}, Shell: ""}, dg.Workflows["dev"].Plan.Steps[2], "parsed struct does not match expected struct")
-
-	assert.Equal(t, models.Step{Action: "run", Value: "rm -rf .terraform", Shell: ""}, dg.Workflows["default"].Plan.Steps[0], "parsed struct does not match expected struct")
-	assert.Equal(t, models.Step{Action: "init", ExtraArgs: nil, Shell: ""}, dg.Workflows["default"].Plan.Steps[1], "parsed struct does not match expected struct")
-	assert.Equal(t, models.Step{Action: "plan", ExtraArgs: []string{"-var-file=vars/dev.tfvars"}, Shell: ""}, dg.Workflows["default"].Plan.Steps[2], "parsed struct does not match expected struct")
-}
-
-func TestDiggerGenerateProjects(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-generate_projects:
-  include: dev/*
-  exclude: dev/project
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yml"), diggerCfg)
-	defer deleteFile()
-	dirsToCreate := []string{"dev/test1", "dev/test2", "dev/project", "testtt"}
-
-	for _, dir := range dirsToCreate {
-		err := os.MkdirAll(path.Join(tempDir, dir), os.ModePerm)
-		defer createFile(path.Join(tempDir, dir, "main.tf"), "")()
-		assert.NoError(t, err, "expected error to be nil")
-	}
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "test1", dg.Projects[0].Name)
-	assert.Equal(t, "test2", dg.Projects[1].Name)
-	assert.Equal(t, "dev/test1", dg.Projects[0].Dir)
-	assert.Equal(t, "dev/test2", dg.Projects[1].Dir)
-	assert.Equal(t, 2, len(dg.Projects))
-}
-
-func TestGenerateProjectsWithoutDiggerConfig(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	dirsWithTfToCreate := []string{"dev/test1", "dev/test1/db", "dev/test1/vpc", "dev/test2", "dev/test2/db", "dev/test2/vpc", "dev/project", "prod/test1", "prod/test2", "prod/project", "test", "modules/test1", "modules/test2"}
-
-	for _, dir := range dirsWithTfToCreate {
-		err := os.MkdirAll(path.Join(tempDir, dir), os.ModePerm)
-		defer createFile(path.Join(tempDir, dir, "main.tf"), "")()
-		assert.NoError(t, err, "expected error to be nil")
-	}
-
-	dirtsWithoutTfToCreate := []string{"docs", "random", "docs/random"}
-	for _, dir := range dirtsWithoutTfToCreate {
-		err := os.MkdirAll(path.Join(tempDir, dir), os.ModePerm)
-		assert.NoError(t, err, "expected error to be nil")
-	}
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "dev/project", dg.Projects[0].Name)
-	assert.Equal(t, "dev/test1", dg.Projects[1].Name)
-	assert.Equal(t, "dev/test2", dg.Projects[2].Name)
-	assert.Equal(t, "prod/project", dg.Projects[3].Name)
-	assert.Equal(t, "prod/test1", dg.Projects[4].Name)
-	assert.Equal(t, "prod/test2", dg.Projects[5].Name)
-	assert.Equal(t, "test", dg.Projects[6].Name)
-	assert.Equal(t, 7, len(dg.Projects))
-}
-
-func TestDiggerGenerateProjectsWithSubDirs(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-generate_projects:
-  include: dev/**
-  exclude: dev/project
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yml"), diggerCfg)
-	defer deleteFile()
-	dirsToCreate := []string{
-		"dev/test1/utils",
-		"dev/test2",
-		"dev/project",
-		"testtt",
-	}
-	for _, dir := range dirsToCreate {
-		err := os.MkdirAll(path.Join(tempDir, dir), os.ModePerm)
-		defer createFile(path.Join(tempDir, dir, "main.tf"), "")()
-		assert.NoError(t, err, "expected error to be nil")
-	}
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "utils", dg.Projects[0].Name)
-	assert.Equal(t, "test2", dg.Projects[1].Name)
-	assert.Equal(t, "dev/test1/utils", dg.Projects[0].Dir)
-	assert.Equal(t, "dev/test2", dg.Projects[1].Dir)
-	assert.Equal(t, 2, len(dg.Projects))
-}
-
-func TestDiggerGenerateProjectsIgnoreSubdirs(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-generate_projects:
-  include: dev
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yml"), diggerCfg)
-	defer deleteFile()
-	dirsToCreate := []string{
-		"dev",
-		"dev/test1",
-		"dev/test1/utils",
-		"dev/test2",
-		"dev/project",
-		"testtt",
-	}
-	for _, dir := range dirsToCreate {
-		err := os.MkdirAll(path.Join(tempDir, dir), os.ModePerm)
-		defer createFile(path.Join(tempDir, dir, "main.tf"), "")()
-		assert.NoError(t, err, "expected error to be nil")
-	}
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "dev", dg.Projects[0].Name)
-	assert.Equal(t, 1, len(dg.Projects))
-}
-
-func TestMissingProjectsReturnsError(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-	_, _, _, err := LoadDiggerConfig(tempDir)
-	assert.ErrorContains(t, err, "no projects configuration found")
-}
-
-func TestDiggerConfigCustomWorkflow(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: my-first-app
-  dir: app-one
-  workflow: my_custom_workflow
-workflows:
-  my_custom_workflow:
-    steps:
-      - run: echo "run"
-      - init: terraform init
-      - plan: terraform plan
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	dg, _, _, err := LoadDiggerConfig(tempDir)
-	assert.NoError(t, err, "expected error to be nil")
-	assert.NotNil(t, dg, "expected digger config to be not nil")
-	assert.Equal(t, "my_custom_workflow", dg.Projects[0].Workflow)
-	_, ok := dg.Workflows["my_custom_workflow"]
-	assert.True(t, ok)
-}
-
-func TestDiggerConfigCustomWorkflowMissingParams(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	// missing workflow config
-	diggerCfg := `
-projects:
-- name: my-first-app
-  dir: app-one
-  workflow: my_custom_workflow
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	_, _, _, err := LoadDiggerConfig(tempDir)
-	assert.Error(t, err, "failed to find workflow config 'my_custom_workflow' for project 'my-first-app'")
-
-	// steps block is missing for workflows
-	diggerCfg = `
-projects:
-- name: my-first-app
-  dir: app-one
-  workflow: my_custom_workflow
-workflows:
-  my_custom_workflow:
-`
-	deleteFile = createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	diggerConfig, _, _, err := LoadDiggerConfig(tempDir)
-	assert.Equal(t, "my_custom_workflow", diggerConfig.Projects[0].Workflow)
-	workflow, ok := diggerConfig.Workflows["my_custom_workflow"]
-	assert.True(t, ok)
-	assert.NotNil(t, workflow)
-	assert.NotNil(t, workflow.Plan)
-	assert.NotNil(t, workflow.Apply)
-
-}
-
-func TestDiggerConfigMissingProjectsWorkflow(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: my-first-app
-  dir: app-one
-  workflow: my_custom_workflow
-workflows:
-  my_custom_workflow_no_one_use:
-    steps:
-      - run: echo "run"
-      - init: terraform init
-      - plan: terraform plan
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	_, _, _, err := LoadDiggerConfig(tempDir)
-	assert.Equal(t, "failed to find workflow config 'my_custom_workflow' for project 'my-first-app'", err.Error())
-
-}
-
-func TestDiggerConfigWithEmptyInitBlock(t *testing.T) {
-	tempDir, teardown := setUp()
-	defer teardown()
-
-	diggerCfg := `
-projects:
-- name: my-first-app
-  dir: app-one
-  workflow: default
-workflows:
-  default:
-    plan:
-      steps:
-      - init: 
-      - plan:
-        extra_args: ["-var-file=$ENV_NAME"]
-`
-	deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
-	defer deleteFile()
-
-	_, _, _, err := LoadDiggerConfig(tempDir)
-	assert.Nil(t, err)
-}
-
-func TestDiggerConfigDependencyGraph(t *testing.T) {
-	p1 := Project{
-		Name:               "A",
-		DependencyProjects: []string{"B", "C"},
-	}
-
-	p2 := Project{
-		Name:               "B",
-		DependencyProjects: []string{"C"},
-	}
-
-	p3 := Project{
-		Name: "C",
-	}
-
-	p4 := Project{
-		Name: "D",
-	}
-
-	p5 := Project{
-		Name:               "E",
-		DependencyProjects: []string{"A"},
-	}
-
-	p6 := Project{
-		Name:               "F",
-		DependencyProjects: []string{"A", "B"},
-	}
-
-	projects := []Project{p1, p2, p3, p4, p5, p6}
-
-	g, err := CreateProjectDependencyGraph(projects)
-
-	assert.NoError(t, err, "expected error to be nil")
-
-	orderedProjects, _ := graph.StableTopologicalSort(g, func(s string, s2 string) bool {
-		return s < s2
-	})
-
-	assert.Equal(t, 6, len(orderedProjects))
-	assert.Equal(t, []string{"C", "D", "B", "A", "E", "F"}, orderedProjects)
-}
-
-func TestDiggerConfigDependencyGraph2(t *testing.T) {
-	p1 := Project{
-		Name:               "A",
-		DependencyProjects: []string{"B", "C", "D"},
-	}
-
-	p2 := Project{
-		Name:               "B",
-		DependencyProjects: []string{"E", "F"},
-	}
-
-	p3 := Project{
-		Name: "C",
-		DependencyProjects: []string{
-			"G",
-		},
-	}
-
-	p4 := Project{
-		Name: "D",
-		DependencyProjects: []string{
-			"H", "I",
-		},
-	}
-
-	projects := []Project{p1, p2, p3, p4}
-
-	g, err := CreateProjectDependencyGraph(projects)
-
-	assert.NoError(t, err, "expected error to be nil")
-
-	orderedProjects, _ := graph.StableTopologicalSort(g, func(s string, s2 string) bool {
-		return s > s2
-	})
-
-	assert.Equal(t, 9, len(orderedProjects))
-	assert.Equal(t, []string{"I", "H", "G", "F", "E", "D", "C", "B", "A"}, orderedProjects)
-}
-
-func TestDiggerConfigDependencyGraphWithCyclesFails(t *testing.T) {
-	p1 := Project{
-		Name:               "A",
-		DependencyProjects: []string{"B"},
-	}
-
-	p2 := Project{
-		Name:               "B",
-		DependencyProjects: []string{"C"},
-	}
-
-	p3 := Project{
-		Name: "C",
-		DependencyProjects: []string{
-			"A",
-		},
-	}
-
-	projects := []Project{p1, p2, p3}
-
-	_, err := CreateProjectDependencyGraph(projects)
-
-	assert.Error(t, err, "expected error on cycle")
-	assert.Equal(t, "edge would create a cycle", err.Error())
-}
-
-func createTempDir() string {
-	dir, err := os.MkdirTemp("", "tmp")
-	if err != nil {
-		log.Fatal(err)
-	}
-	return dir
-}
-
-func deleteTempDir(name string) {
-	err := os.RemoveAll(name)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-func createFile(filepath string, content string) func() {
-	f, err := os.Create(filepath)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	_, err = f.WriteString(content)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	return func() {
-		err := f.Close()
-		if err != nil {
-			log.Fatal(err)
-		}
-	}
-}
diff --git a/pkg/digger/digger_test.go b/pkg/digger/digger_test.go
index ac54b255..0545ab7b 100644
--- a/pkg/digger/digger_test.go
+++ b/pkg/digger/digger_test.go
@@ -6,14 +6,14 @@ import (
 	"digger/pkg/core/models"
 	"digger/pkg/reporting"
 	"digger/pkg/utils"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"github.com/dominikbraun/graph"
+	"github.com/stretchr/testify/assert"
 	"sort"
 	"strconv"
 	"strings"
 	"testing"
 	"time"
-
-	"github.com/stretchr/testify/assert"
 )
 
 type RunInfo struct {
@@ -216,8 +216,8 @@ func TestCorrectCommandExecutionWhenApplying(t *testing.T) {
 	}
 	planPathProvider := &MockPlanPathProvider{}
 	executor := execution.DiggerExecutor{
-		ApplyStage: &models.Stage{
-			Steps: []models.Step{
+		ApplyStage: &configuration.Stage{
+			Steps: []configuration.Step{
 				{
 					Action:    "init",
 					ExtraArgs: nil,
@@ -235,7 +235,7 @@ func TestCorrectCommandExecutionWhenApplying(t *testing.T) {
 				},
 			},
 		},
-		PlanStage:         &models.Stage{},
+		PlanStage:         &configuration.Stage{},
 		CommandRunner:     commandRunner,
 		TerraformExecutor: terraformExecutor,
 		Reporter:          reporter,
@@ -264,8 +264,8 @@ func TestCorrectCommandExecutionWhenDestroying(t *testing.T) {
 	}
 	planPathProvider := &MockPlanPathProvider{}
 	executor := execution.DiggerExecutor{
-		ApplyStage: &models.Stage{
-			Steps: []models.Step{
+		ApplyStage: &configuration.Stage{
+			Steps: []configuration.Step{
 				{
 					Action:    "init",
 					ExtraArgs: nil,
@@ -278,7 +278,7 @@ func TestCorrectCommandExecutionWhenDestroying(t *testing.T) {
 				},
 			},
 		},
-		PlanStage:         &models.Stage{},
+		PlanStage:         &configuration.Stage{},
 		CommandRunner:     commandRunner,
 		TerraformExecutor: terraformExecutor,
 		Reporter:          reporter,
@@ -305,9 +305,9 @@ func TestCorrectCommandExecutionWhenPlanning(t *testing.T) {
 	planPathProvider := &MockPlanPathProvider{}
 
 	executor := execution.DiggerExecutor{
-		ApplyStage: &models.Stage{},
-		PlanStage: &models.Stage{
-			Steps: []models.Step{
+		ApplyStage: &configuration.Stage{},
+		PlanStage: &configuration.Stage{
+			Steps: []configuration.Step{
 				{
 					Action:    "init",
 					ExtraArgs: nil,
diff --git a/pkg/integration/integration_test.go b/pkg/integration/integration_test.go
index 564963aa..94e6ce07 100644
--- a/pkg/integration/integration_test.go
+++ b/pkg/integration/integration_test.go
@@ -3,7 +3,6 @@ package integration
 import (
 	"context"
 	"digger/pkg/aws"
-	"digger/pkg/configuration"
 	"digger/pkg/core/terraform"
 	"digger/pkg/digger"
 	dg_github "digger/pkg/github"
@@ -11,6 +10,7 @@ import (
 	"digger/pkg/reporting"
 	"digger/pkg/storage"
 	"digger/pkg/utils"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"log"
 	"math/rand"
 	"os"
diff --git a/pkg/utils/io_test.go b/pkg/utils/io_test.go
index 294fdfa5..7249a1b3 100644
--- a/pkg/utils/io_test.go
+++ b/pkg/utils/io_test.go
@@ -3,6 +3,7 @@ package utils
 import (
 	"archive/zip"
 	"bytes"
+	configuration "github.com/diggerhq/lib-digger-config"
 	"github.com/stretchr/testify/assert"
 	"io/ioutil"
 	"os"
@@ -87,7 +88,7 @@ func TestNormalizeFileName(t *testing.T) {
 		{"./my/directory", "/my/directory"},
 	}
 	for _, tt := range normTests {
-		res := NormalizeFileName(tt.input)
+		res := configuration.NormalizeFileName(tt.input)
 		assert.Equal(t, tt.expectedOutput, res)
 	}
 }
@@ -111,7 +112,7 @@ func TestMatchIncludeExcludePatternsToFile(t *testing.T) {
 		{"modules/moduleA/main.tf", []string{""}, []string{""}, false},
 	}
 	for _, tt := range normTests {
-		res := MatchIncludeExcludePatternsToFile(tt.fileToMatch, tt.includePatterns, tt.excludePatterns)
+		res := configuration.MatchIncludeExcludePatternsToFile(tt.fileToMatch, tt.includePatterns, tt.excludePatterns)
 		assert.Equal(t, tt.expectedResult, res)
 	}
 }