Commit 728e37939f7956f64e47e37fed1c5d0e908c9c8a

Authored by vibe_erp
1 parent af178bb8

chore: bootstrap Gradle multi-project skeleton

.editorconfig 0 → 100644
  1 +root = true
  2 +
  3 +[*]
  4 +charset = utf-8
  5 +end_of_line = lf
  6 +insert_final_newline = true
  7 +trim_trailing_whitespace = true
  8 +indent_style = space
  9 +indent_size = 4
  10 +
  11 +[*.{kt,kts}]
  12 +indent_size = 4
  13 +max_line_length = 120
  14 +
  15 +[*.{yml,yaml,json}]
  16 +indent_size = 2
  17 +
  18 +[*.md]
  19 +trim_trailing_whitespace = false
  20 +
  21 +[Makefile]
  22 +indent_style = tab
.gitignore 0 → 100644
  1 +# Gradle
  2 +.gradle/
  3 +build/
  4 +!gradle/wrapper/gradle-wrapper.jar
  5 +!**/src/**/build/
  6 +!**/src/**/*build*
  7 +**/out/
  8 +
  9 +# IntelliJ
  10 +.idea/
  11 +*.iml
  12 +*.iws
  13 +*.ipr
  14 +
  15 +# VS Code
  16 +.vscode/
  17 +*.code-workspace
  18 +
  19 +# OS
  20 +.DS_Store
  21 +Thumbs.db
  22 +
  23 +# Logs
  24 +*.log
  25 +logs/
  26 +
  27 +# Environment
  28 +.env
  29 +.env.local
  30 +*.env
  31 +
  32 +# Local mounted volumes (ignored if developer maps them inside repo)
  33 +/var/
  34 +/srv/
  35 +/opt/vibe-erp/
  36 +
  37 +# Node (for the future web SPA)
  38 +node_modules/
  39 +dist/
  40 +.next/
  41 +
  42 +# Python (none in this repo, but reference docs include PDFs we don't want to lose)
  43 +# raw/ is intentionally tracked
build.gradle.kts 0 → 100644
  1 +plugins {
  2 + alias(libs.plugins.kotlin.jvm) apply false
  3 + alias(libs.plugins.kotlin.spring) apply false
  4 + alias(libs.plugins.kotlin.jpa) apply false
  5 + alias(libs.plugins.spring.boot) apply false
  6 + alias(libs.plugins.spring.dependency.management) apply false
  7 +}
  8 +
  9 +allprojects {
  10 + group = providers.gradleProperty("vibeerp.group").get()
  11 + version = providers.gradleProperty("vibeerp.version").get()
  12 +}
  13 +
  14 +// Enforce the architecture-level dependency rule (CLAUDE.md guardrail #9):
  15 +//
  16 +// • PBCs may NEVER depend on other PBCs.
  17 +// Cross-PBC interaction goes through api.v1 service interfaces or the
  18 +// event bus.
  19 +//
  20 +// • Plug-ins (and the reference plug-in) may ONLY depend on :api:api-v1.
  21 +// They never see :platform:* or :pbc:* internals.
  22 +//
  23 +// The build fails at configuration time if either rule is violated.
  24 +gradle.projectsEvaluated {
  25 + rootProject.allprojects.forEach { p ->
  26 + val ownPath: String = p.path
  27 +
  28 + val checkedConfigs = listOf("api", "implementation", "compileOnly", "compileClasspath")
  29 + val projectDeps = p.configurations
  30 + .matching { it.name in checkedConfigs }
  31 + .flatMap { cfg ->
  32 + cfg.dependencies.filterIsInstance<org.gradle.api.artifacts.ProjectDependency>()
  33 + }
  34 +
  35 + if (ownPath.startsWith(":pbc:")) {
  36 + projectDeps.forEach { dep ->
  37 + @Suppress("DEPRECATION")
  38 + val depPath = dep.dependencyProject.path
  39 + if (depPath.startsWith(":pbc:") && depPath != ownPath) {
  40 + throw GradleException(
  41 + "Architectural violation in $ownPath: depends on $depPath. " +
  42 + "PBCs MUST NOT depend on other PBCs. Use api.v1 service " +
  43 + "interfaces (org.vibeerp.api.v1.ext.<pbc>) or the event bus."
  44 + )
  45 + }
  46 + }
  47 + }
  48 +
  49 + val isPlugin = ownPath.startsWith(":reference-customer:") ||
  50 + ownPath.contains("plugin-")
  51 + if (isPlugin) {
  52 + projectDeps.forEach { dep ->
  53 + @Suppress("DEPRECATION")
  54 + val depPath = dep.dependencyProject.path
  55 + if (depPath.startsWith(":platform:") || depPath.startsWith(":pbc:")) {
  56 + throw GradleException(
  57 + "Architectural violation in $ownPath: depends on internal module $depPath. " +
  58 + "Plug-ins may only depend on :api:api-v1."
  59 + )
  60 + }
  61 + }
  62 + }
  63 + }
  64 +}
gradle.properties 0 → 100644
  1 +# JVM
  2 +org.gradle.jvmargs=-Xmx2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
  3 +org.gradle.parallel=true
  4 +org.gradle.caching=true
  5 +org.gradle.configuration-cache=false
  6 +
  7 +# Kotlin
  8 +kotlin.code.style=official
  9 +kotlin.incremental=true
  10 +
  11 +# vibe_erp
  12 +vibeerp.version=0.1.0-SNAPSHOT
  13 +vibeerp.api.version=1.0.0-SNAPSHOT
  14 +vibeerp.group=org.vibeerp
gradle/libs.versions.toml 0 → 100644
  1 +[versions]
  2 +kotlin = "1.9.24"
  3 +springBoot = "3.3.4"
  4 +springDependencyManagement = "1.1.6"
  5 +jakartaValidation = "3.1.0"
  6 +postgres = "42.7.4"
  7 +hibernate = "6.5.3.Final"
  8 +liquibase = "4.29.2"
  9 +pf4j = "3.12.0"
  10 +icu4j = "75.1"
  11 +jackson = "2.18.0"
  12 +junitJupiter = "5.11.2"
  13 +mockk = "1.13.13"
  14 +testcontainers = "1.20.2"
  15 +assertk = "0.28.1"
  16 +
  17 +[libraries]
  18 +# Spring Boot starters
  19 +spring-boot-starter = { module = "org.springframework.boot:spring-boot-starter", version.ref = "springBoot" }
  20 +spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web", version.ref = "springBoot" }
  21 +spring-boot-starter-data-jpa = { module = "org.springframework.boot:spring-boot-starter-data-jpa", version.ref = "springBoot" }
  22 +spring-boot-starter-validation = { module = "org.springframework.boot:spring-boot-starter-validation", version.ref = "springBoot" }
  23 +spring-boot-starter-actuator = { module = "org.springframework.boot:spring-boot-starter-actuator", version.ref = "springBoot" }
  24 +spring-boot-starter-test = { module = "org.springframework.boot:spring-boot-starter-test", version.ref = "springBoot" }
  25 +
  26 +# Kotlin
  27 +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
  28 +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
  29 +jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" }
  30 +
  31 +# Validation
  32 +jakarta-validation-api = { module = "jakarta.validation:jakarta.validation-api", version.ref = "jakartaValidation" }
  33 +
  34 +# Persistence
  35 +postgres = { module = "org.postgresql:postgresql", version.ref = "postgres" }
  36 +liquibase-core = { module = "org.liquibase:liquibase-core", version.ref = "liquibase" }
  37 +
  38 +# Plug-in framework
  39 +pf4j = { module = "org.pf4j:pf4j", version.ref = "pf4j" }
  40 +pf4j-spring = { module = "org.pf4j:pf4j-spring", version = "0.9.0" }
  41 +
  42 +# i18n
  43 +icu4j = { module = "com.ibm.icu:icu4j", version.ref = "icu4j" }
  44 +
  45 +# Testing
  46 +junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junitJupiter" }
  47 +mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
  48 +assertk = { module = "com.willowtreeapps.assertk:assertk-jvm", version.ref = "assertk" }
  49 +testcontainers-postgres = { module = "org.testcontainers:postgresql", version.ref = "testcontainers" }
  50 +testcontainers-junit-jupiter = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainers" }
  51 +
  52 +[plugins]
  53 +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
  54 +kotlin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" }
  55 +kotlin-jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" }
  56 +spring-boot = { id = "org.springframework.boot", version.ref = "springBoot" }
  57 +spring-dependency-management = { id = "io.spring.dependency-management", version.ref = "springDependencyManagement" }
gradle/wrapper/gradle-wrapper.jar 0 → 100644
No preview for this file type
gradle/wrapper/gradle-wrapper.properties 0 → 100644
  1 +distributionBase=GRADLE_USER_HOME
  2 +distributionPath=wrapper/dists
  3 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
  4 +networkTimeout=10000
  5 +validateDistributionUrl=true
  6 +zipStoreBase=GRADLE_USER_HOME
  7 +zipStorePath=wrapper/dists
gradlew 0 → 100755
  1 +#!/bin/sh
  2 +
  3 +#
  4 +# Copyright © 2015 the original authors.
  5 +#
  6 +# Licensed under the Apache License, Version 2.0 (the "License");
  7 +# you may not use this file except in compliance with the License.
  8 +# You may obtain a copy of the License at
  9 +#
  10 +# https://www.apache.org/licenses/LICENSE-2.0
  11 +#
  12 +# Unless required by applicable law or agreed to in writing, software
  13 +# distributed under the License is distributed on an "AS IS" BASIS,
  14 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15 +# See the License for the specific language governing permissions and
  16 +# limitations under the License.
  17 +#
  18 +# SPDX-License-Identifier: Apache-2.0
  19 +#
  20 +
  21 +##############################################################################
  22 +#
  23 +# Gradle start up script for POSIX generated by Gradle.
  24 +#
  25 +# Important for running:
  26 +#
  27 +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
  28 +# noncompliant, but you have some other compliant shell such as ksh or
  29 +# bash, then to run this script, type that shell name before the whole
  30 +# command line, like:
  31 +#
  32 +# ksh Gradle
  33 +#
  34 +# Busybox and similar reduced shells will NOT work, because this script
  35 +# requires all of these POSIX shell features:
  36 +# * functions;
  37 +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
  38 +# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
  39 +# * compound commands having a testable exit status, especially «case»;
  40 +# * various built-in commands including «command», «set», and «ulimit».
  41 +#
  42 +# Important for patching:
  43 +#
  44 +# (2) This script targets any POSIX shell, so it avoids extensions provided
  45 +# by Bash, Ksh, etc; in particular arrays are avoided.
  46 +#
  47 +# The "traditional" practice of packing multiple parameters into a
  48 +# space-separated string is a well documented source of bugs and security
  49 +# problems, so this is (mostly) avoided, by progressively accumulating
  50 +# options in "$@", and eventually passing that to Java.
  51 +#
  52 +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
  53 +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
  54 +# see the in-line comments for details.
  55 +#
  56 +# There are tweaks for specific operating systems such as AIX, CygWin,
  57 +# Darwin, MinGW, and NonStop.
  58 +#
  59 +# (3) This script is generated from the Groovy template
  60 +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
  61 +# within the Gradle project.
  62 +#
  63 +# You can find Gradle at https://github.com/gradle/gradle/.
  64 +#
  65 +##############################################################################
  66 +
  67 +# Attempt to set APP_HOME
  68 +
  69 +# Resolve links: $0 may be a link
  70 +app_path=$0
  71 +
  72 +# Need this for daisy-chained symlinks.
  73 +while
  74 + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
  75 + [ -h "$app_path" ]
  76 +do
  77 + ls=$( ls -ld "$app_path" )
  78 + link=${ls#*' -> '}
  79 + case $link in #(
  80 + /*) app_path=$link ;; #(
  81 + *) app_path=$APP_HOME$link ;;
  82 + esac
  83 +done
  84 +
  85 +# This is normally unused
  86 +# shellcheck disable=SC2034
  87 +APP_BASE_NAME=${0##*/}
  88 +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
  89 +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
  90 +
  91 +# Use the maximum available, or set MAX_FD != -1 to use that value.
  92 +MAX_FD=maximum
  93 +
  94 +warn () {
  95 + echo "$*"
  96 +} >&2
  97 +
  98 +die () {
  99 + echo
  100 + echo "$*"
  101 + echo
  102 + exit 1
  103 +} >&2
  104 +
  105 +# OS specific support (must be 'true' or 'false').
  106 +cygwin=false
  107 +msys=false
  108 +darwin=false
  109 +nonstop=false
  110 +case "$( uname )" in #(
  111 + CYGWIN* ) cygwin=true ;; #(
  112 + Darwin* ) darwin=true ;; #(
  113 + MSYS* | MINGW* ) msys=true ;; #(
  114 + NONSTOP* ) nonstop=true ;;
  115 +esac
  116 +
  117 +
  118 +
  119 +# Determine the Java command to use to start the JVM.
  120 +if [ -n "$JAVA_HOME" ] ; then
  121 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  122 + # IBM's JDK on AIX uses strange locations for the executables
  123 + JAVACMD=$JAVA_HOME/jre/sh/java
  124 + else
  125 + JAVACMD=$JAVA_HOME/bin/java
  126 + fi
  127 + if [ ! -x "$JAVACMD" ] ; then
  128 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
  129 +
  130 +Please set the JAVA_HOME variable in your environment to match the
  131 +location of your Java installation."
  132 + fi
  133 +else
  134 + JAVACMD=java
  135 + if ! command -v java >/dev/null 2>&1
  136 + then
  137 + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  138 +
  139 +Please set the JAVA_HOME variable in your environment to match the
  140 +location of your Java installation."
  141 + fi
  142 +fi
  143 +
  144 +# Increase the maximum file descriptors if we can.
  145 +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
  146 + case $MAX_FD in #(
  147 + max*)
  148 + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
  149 + # shellcheck disable=SC2039,SC3045
  150 + MAX_FD=$( ulimit -H -n ) ||
  151 + warn "Could not query maximum file descriptor limit"
  152 + esac
  153 + case $MAX_FD in #(
  154 + '' | soft) :;; #(
  155 + *)
  156 + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
  157 + # shellcheck disable=SC2039,SC3045
  158 + ulimit -n "$MAX_FD" ||
  159 + warn "Could not set maximum file descriptor limit to $MAX_FD"
  160 + esac
  161 +fi
  162 +
  163 +# Collect all arguments for the java command, stacking in reverse order:
  164 +# * args from the command line
  165 +# * the main class name
  166 +# * -classpath
  167 +# * -D...appname settings
  168 +# * --module-path (only if needed)
  169 +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
  170 +
  171 +# For Cygwin or MSYS, switch paths to Windows format before running java
  172 +if "$cygwin" || "$msys" ; then
  173 + APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
  174 +
  175 + JAVACMD=$( cygpath --unix "$JAVACMD" )
  176 +
  177 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
  178 + for arg do
  179 + if
  180 + case $arg in #(
  181 + -*) false ;; # don't mess with options #(
  182 + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
  183 + [ -e "$t" ] ;; #(
  184 + *) false ;;
  185 + esac
  186 + then
  187 + arg=$( cygpath --path --ignore --mixed "$arg" )
  188 + fi
  189 + # Roll the args list around exactly as many times as the number of
  190 + # args, so each arg winds up back in the position where it started, but
  191 + # possibly modified.
  192 + #
  193 + # NB: a `for` loop captures its iteration list before it begins, so
  194 + # changing the positional parameters here affects neither the number of
  195 + # iterations, nor the values presented in `arg`.
  196 + shift # remove old arg
  197 + set -- "$@" "$arg" # push replacement arg
  198 + done
  199 +fi
  200 +
  201 +
  202 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  203 +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
  204 +
  205 +# Collect all arguments for the java command:
  206 +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
  207 +# and any embedded shellness will be escaped.
  208 +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
  209 +# treated as '${Hostname}' itself on the command line.
  210 +
  211 +set -- \
  212 + "-Dorg.gradle.appname=$APP_BASE_NAME" \
  213 + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
  214 + "$@"
  215 +
  216 +# Stop when "xargs" is not available.
  217 +if ! command -v xargs >/dev/null 2>&1
  218 +then
  219 + die "xargs is not available"
  220 +fi
  221 +
  222 +# Use "xargs" to parse quoted args.
  223 +#
  224 +# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
  225 +#
  226 +# In Bash we could simply go:
  227 +#
  228 +# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
  229 +# set -- "${ARGS[@]}" "$@"
  230 +#
  231 +# but POSIX shell has neither arrays nor command substitution, so instead we
  232 +# post-process each arg (as a line of input to sed) to backslash-escape any
  233 +# character that might be a shell metacharacter, then use eval to reverse
  234 +# that process (while maintaining the separation between arguments), and wrap
  235 +# the whole thing up as a single "set" statement.
  236 +#
  237 +# This will of course break if any of these variables contains a newline or
  238 +# an unmatched quote.
  239 +#
  240 +
  241 +eval "set -- $(
  242 + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
  243 + xargs -n1 |
  244 + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
  245 + tr '\n' ' '
  246 + )" '"$@"'
  247 +
  248 +exec "$JAVACMD" "$@"
gradlew.bat 0 → 100644
  1 +@rem
  2 +@rem Copyright 2015 the original author or authors.
  3 +@rem
  4 +@rem Licensed under the Apache License, Version 2.0 (the "License");
  5 +@rem you may not use this file except in compliance with the License.
  6 +@rem You may obtain a copy of the License at
  7 +@rem
  8 +@rem https://www.apache.org/licenses/LICENSE-2.0
  9 +@rem
  10 +@rem Unless required by applicable law or agreed to in writing, software
  11 +@rem distributed under the License is distributed on an "AS IS" BASIS,
  12 +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 +@rem See the License for the specific language governing permissions and
  14 +@rem limitations under the License.
  15 +@rem
  16 +@rem SPDX-License-Identifier: Apache-2.0
  17 +@rem
  18 +
  19 +@if "%DEBUG%"=="" @echo off
  20 +@rem ##########################################################################
  21 +@rem
  22 +@rem Gradle startup script for Windows
  23 +@rem
  24 +@rem ##########################################################################
  25 +
  26 +@rem Set local scope for the variables with windows NT shell
  27 +if "%OS%"=="Windows_NT" setlocal
  28 +
  29 +set DIRNAME=%~dp0
  30 +if "%DIRNAME%"=="" set DIRNAME=.
  31 +@rem This is normally unused
  32 +set APP_BASE_NAME=%~n0
  33 +set APP_HOME=%DIRNAME%
  34 +
  35 +@rem Resolve any "." and ".." in APP_HOME to make it shorter.
  36 +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
  37 +
  38 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  39 +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
  40 +
  41 +@rem Find java.exe
  42 +if defined JAVA_HOME goto findJavaFromJavaHome
  43 +
  44 +set JAVA_EXE=java.exe
  45 +%JAVA_EXE% -version >NUL 2>&1
  46 +if %ERRORLEVEL% equ 0 goto execute
  47 +
  48 +echo. 1>&2
  49 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
  50 +echo. 1>&2
  51 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2
  52 +echo location of your Java installation. 1>&2
  53 +
  54 +goto fail
  55 +
  56 +:findJavaFromJavaHome
  57 +set JAVA_HOME=%JAVA_HOME:"=%
  58 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
  59 +
  60 +if exist "%JAVA_EXE%" goto execute
  61 +
  62 +echo. 1>&2
  63 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
  64 +echo. 1>&2
  65 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2
  66 +echo location of your Java installation. 1>&2
  67 +
  68 +goto fail
  69 +
  70 +:execute
  71 +@rem Setup the command line
  72 +
  73 +
  74 +
  75 +@rem Execute Gradle
  76 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
  77 +
  78 +:end
  79 +@rem End local scope for the variables with windows NT shell
  80 +if %ERRORLEVEL% equ 0 goto mainEnd
  81 +
  82 +:fail
  83 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
  84 +rem the _cmd.exe /c_ return code!
  85 +set EXIT_CODE=%ERRORLEVEL%
  86 +if %EXIT_CODE% equ 0 set EXIT_CODE=1
  87 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
  88 +exit /b %EXIT_CODE%
  89 +
  90 +:mainEnd
  91 +if "%OS%"=="Windows_NT" endlocal
  92 +
  93 +:omega
settings.gradle.kts 0 → 100644
  1 +rootProject.name = "vibe-erp"
  2 +
  3 +pluginManagement {
  4 + repositories {
  5 + gradlePluginPortal()
  6 + mavenCentral()
  7 + }
  8 +}
  9 +
  10 +dependencyResolutionManagement {
  11 + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  12 + repositories {
  13 + mavenCentral()
  14 + }
  15 + // Gradle auto-discovers `gradle/libs.versions.toml` and creates the
  16 + // `libs` catalog automatically — no explicit `from(files(...))` needed.
  17 +}
  18 +
  19 +// ─── Public contract ────────────────────────────────────────────────
  20 +include(":api:api-v1")
  21 +project(":api:api-v1").projectDir = file("api/api-v1")
  22 +
  23 +// ─── Platform (framework runtime, internal) ─────────────────────────
  24 +include(":platform:platform-bootstrap")
  25 +project(":platform:platform-bootstrap").projectDir = file("platform/platform-bootstrap")
  26 +
  27 +include(":platform:platform-persistence")
  28 +project(":platform:platform-persistence").projectDir = file("platform/platform-persistence")
  29 +
  30 +include(":platform:platform-plugins")
  31 +project(":platform:platform-plugins").projectDir = file("platform/platform-plugins")
  32 +
  33 +// ─── Packaged Business Capabilities (core PBCs) ─────────────────────
  34 +include(":pbc:pbc-identity")
  35 +project(":pbc:pbc-identity").projectDir = file("pbc/pbc-identity")
  36 +
  37 +// ─── Reference customer plug-in (NOT loaded by default) ─────────────
  38 +include(":reference-customer:plugin-printing-shop")
  39 +project(":reference-customer:plugin-printing-shop").projectDir = file("reference-customer/plugin-printing-shop")
  40 +
  41 +// ─── Distribution (assembles the runnable image) ────────────────────
  42 +include(":distribution")
  43 +project(":distribution").projectDir = file("distribution")