diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d5522e0..2341636 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -224,7 +224,7 @@ jobs: run: | mvn -B --no-transfer-progress -DskipTests -Denforcer.skip=true compile echo "=== internal package dependency graph (jdeps, bytecode) ===" - jdeps -verbose:package target/classes | grep 'net.ladenthin.maven.llamacpp.aiindex' || true + jdeps -verbose:package llamacpp-ai-index-maven-plugin/target/classes | grep 'net.ladenthin.maven.llamacpp.aiindex' || true build: name: Build @@ -240,7 +240,7 @@ jobs: - name: Build run: mvn --batch-mode --no-transfer-progress -DskipTests package - uses: actions/upload-artifact@v7 - with: { name: plugin-jars, path: target/*.jar } + with: { name: plugin-jars, path: llamacpp-ai-index-maven-plugin/target/*.jar } test: name: Test @@ -260,7 +260,7 @@ jobs: - uses: actions/upload-artifact@v7 with: name: jacoco-report - path: target/site/jacoco/jacoco.xml + path: llamacpp-ai-index-maven-plugin/target/site/jacoco/jacoco.xml if-no-files-found: ignore - name: Memory after tests if: always() @@ -271,12 +271,12 @@ jobs: with: name: crash-dumps-test path: | - ${{ github.workspace }}/hs_err_pid*.log - ${{ github.workspace }}/*.hprof - ${{ github.workspace }}/target/surefire-reports/*.dump - ${{ github.workspace }}/target/surefire-reports/*.dumpstream - ${{ github.workspace }}/target/surefire-reports/*.txt - ${{ github.workspace }}/target/surefire-reports/TEST-*.xml + ${{ github.workspace }}/llamacpp-ai-index-maven-plugin/hs_err_pid*.log + ${{ github.workspace }}/llamacpp-ai-index-maven-plugin/*.hprof + ${{ github.workspace }}/llamacpp-ai-index-maven-plugin/target/surefire-reports/*.dump + ${{ github.workspace }}/llamacpp-ai-index-maven-plugin/target/surefire-reports/*.dumpstream + ${{ github.workspace }}/llamacpp-ai-index-maven-plugin/target/surefire-reports/*.txt + ${{ github.workspace }}/llamacpp-ai-index-maven-plugin/target/surefire-reports/TEST-*.xml if-no-files-found: ignore - name: Run PIT mutation tests run: mvn --batch-mode --no-transfer-progress test-compile org.pitest:pitest-maven:mutationCoverage @@ -284,7 +284,7 @@ jobs: if: always() run: | echo "=== PIT Survived Mutations ===" - for html_file in $(find target/pit-reports -name "*.html" -type f 2>/dev/null | sort); do + for html_file in $(find llamacpp-ai-index-maven-plugin/target/pit-reports -name "*.html" -type f 2>/dev/null | sort); do if grep -q "SURVIVED" "$html_file"; then echo "Found survivors in $html_file:" grep -B 2 -A 3 "SURVIVED" "$html_file" @@ -293,7 +293,7 @@ jobs: done - uses: actions/upload-artifact@v7 if: always() - with: { name: pit-reports, path: target/pit-reports/ } + with: { name: pit-reports, path: llamacpp-ai-index-maven-plugin/target/pit-reports/ } vmlens: name: Test (vmlens interleavings) @@ -311,7 +311,7 @@ jobs: if: always() with: name: vmlens-report - path: target/vmlens-report/ + path: llamacpp-ai-index-maven-plugin/target/vmlens-report/ if-no-files-found: ignore report: @@ -325,21 +325,21 @@ jobs: - uses: actions/setup-java@v5 with: { java-version: '21', distribution: temurin } - uses: actions/download-artifact@v8 - with: { name: jacoco-report, path: target/site/jacoco/ } + with: { name: jacoco-report, path: llamacpp-ai-index-maven-plugin/target/site/jacoco/ } continue-on-error: true - uses: advanced-security/maven-dependency-submission-action@v5 - name: Coveralls uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} - file: target/site/jacoco/jacoco.xml + file: llamacpp-ai-index-maven-plugin/target/site/jacoco/jacoco.xml format: jacoco continue-on-error: true - name: Codecov uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} - files: target/site/jacoco/jacoco.xml + files: llamacpp-ai-index-maven-plugin/target/site/jacoco/jacoco.xml continue-on-error: true check-snapshot: @@ -402,14 +402,14 @@ jobs: MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} # Runs even when the deploy step failed: a Central publish-poll timeout reds the # job *after* the bundle was uploaded (and typically published server-side), while - # the signed jars + .asc files already exist in target/ (signing happens at + # the signed jars + .asc files already exist in llamacpp-ai-index-maven-plugin/target/ (signing happens at # verify). Collecting on failure lets the github-snapshot job still attach them. - name: Collect signed artifacts if: ${{ !cancelled() }} run: | mkdir -p signed-snapshot-assets - cp target/*.jar signed-snapshot-assets/ 2>/dev/null || true - cp target/*.jar.asc signed-snapshot-assets/ 2>/dev/null || true + cp llamacpp-ai-index-maven-plugin/target/*.jar signed-snapshot-assets/ 2>/dev/null || true + cp llamacpp-ai-index-maven-plugin/target/*.jar.asc signed-snapshot-assets/ 2>/dev/null || true - uses: actions/upload-artifact@v7 if: ${{ !cancelled() }} with: @@ -478,14 +478,14 @@ jobs: MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} # Runs even when the deploy step failed: a Central publish-poll timeout reds the # job *after* the bundle was uploaded (and typically published server-side), while - # the signed jars + .asc files already exist in target/ (signing happens at + # the signed jars + .asc files already exist in llamacpp-ai-index-maven-plugin/target/ (signing happens at # verify). Collecting on failure lets the github-release job still attach them. - name: Collect signed artifacts if: ${{ !cancelled() }} run: | mkdir -p signed-release-assets - cp target/*.jar signed-release-assets/ 2>/dev/null || true - cp target/*.jar.asc signed-release-assets/ 2>/dev/null || true + cp llamacpp-ai-index-maven-plugin/target/*.jar signed-release-assets/ 2>/dev/null || true + cp llamacpp-ai-index-maven-plugin/target/*.jar.asc signed-release-assets/ 2>/dev/null || true - uses: actions/upload-artifact@v7 if: ${{ !cancelled() }} with: diff --git a/.gitignore b/.gitignore index 2c7a209..4556a94 100644 --- a/.gitignore +++ b/.gitignore @@ -32,17 +32,18 @@ replay_pid* # heap dumps from OOM (e.g. -XX:+HeapDumpOnOutOfMemoryError on test/PIT forks) *.hprof -# jcstress / jqwik test outputs (generated in repo root) -/.jqwik-database +# jcstress / jqwik test outputs (generated at the repo root pre-reactor; each module's own +# basedir post-reactor, e.g. llamacpp-ai-index-maven-plugin/.jqwik-database) +**/.jqwik-database # Benchmark/experiment scratch output dirs (not part of the build) -src/siteGusto/ -src/siteMistral3/ -src/siteQwenBRUTAL/ +llamacpp-ai-index-maven-plugin/src/siteGusto/ +llamacpp-ai-index-maven-plugin/src/siteMistral3/ +llamacpp-ai-index-maven-plugin/src/siteQwenBRUTAL/ # IDE config .idea/ # Generated AI-index output from the self-index run (keep the tracked placeholder) -/src/site/ai/* -!/src/site/ai/empty.md +/llamacpp-ai-index-maven-plugin/src/site/ai/* +!/llamacpp-ai-index-maven-plugin/src/site/ai/empty.md diff --git a/REUSE.toml b/REUSE.toml index ebcb370..55888a5 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -7,7 +7,7 @@ SPDX-PackageDownloadLocation = "https://github.com/bernardladenthin/llamacpp-ai- path = [ "**.md", "CITATION.cff", - "src/site/ai/empty.md", + "llamacpp-ai-index-maven-plugin/src/site/ai/empty.md", "docs/RELEASE.md", ".github/ISSUE_TEMPLATE/bug_report.md", ".github/ISSUE_TEMPLATE/feature_request.md", @@ -18,7 +18,7 @@ SPDX-FileCopyrightText = "2026 Bernard Ladenthin " SPDX-License-Identifier = "Apache-2.0" [[annotations]] -path = "src/test/resources/SmolLM2-135M-Instruct-Q3_K_M.gguf" +path = "llamacpp-ai-index-maven-plugin/src/test/resources/SmolLM2-135M-Instruct-Q3_K_M.gguf" precedence = "aggregate" SPDX-FileCopyrightText = "HuggingFaceTB" SPDX-License-Identifier = "Apache-2.0" diff --git a/TODO.md b/TODO.md index 645add7..edef143 100644 --- a/TODO.md +++ b/TODO.md @@ -17,4 +17,4 @@ recorded in git history and `crossrepostatus.md`, not here. - **Cross-repo code-quality TODOs** — see [`../workspace/policies/code-quality-todos.md`](../workspace/policies/code-quality-todos.md) for the canonical `@VisibleForTesting` design-fit review, package hierarchy review, and class/method naming review. This repo has no `@VisibleForTesting` usages today; the package and naming reviews are still open here. -- **No LogCaptor smoke test needed (note, not an action).** This module has no logging code (`org.slf4j.*` not used in `src/main/java/`); production uses Maven's `Log` interface. If SLF4J logging is ever introduced, add a LogCaptor smoke test at the same time so the binding/configuration is exercised in tests. +- **SLF4J gap CLOSED.** The four `indexer.*` classes (`SourceFileIndexer`, `PackageIndexer`, `ProjectIndexer`, `AiFieldGenerationSupport`) now log via `org.slf4j.Logger` instead of the constructor-injected Maven `Log`; only the 5 mojos (and the `PluginArchitectureTest` `mavenMojoAnnotationsConfinedToMojo`/`nonMojoIsMavenFree` rules) still touch the Maven Plugin API. Maven's `maven-slf4j-provider` binds `slf4j-api` inside plugin executions, so every `LOGGER.info(...)`/`.warn(...)`/`.debug(...)` call surfaces as a normal `[INFO]`/`[WARN]`/`[DEBUG]` line in `mvn` output with zero glue (verified end-to-end with the `generate` goal against a scratch project). `AiFieldGenerationSupportTest` exercises the binding/configuration directly via a logback `ListAppender` attached to the class logger (the LogCaptor-smoke-test role this note used to flag as future work). diff --git a/llamacpp-ai-index-maven-plugin/pom.xml b/llamacpp-ai-index-maven-plugin/pom.xml new file mode 100644 index 0000000..09bb6b6 --- /dev/null +++ b/llamacpp-ai-index-maven-plugin/pom.xml @@ -0,0 +1,2341 @@ + + + + 4.0.0 + + + net.ladenthin + srcmorph-parent + 1.1.0-SNAPSHOT + ../pom.xml + + + llamacpp-ai-index-maven-plugin + maven-plugin + + llamacpp-ai-index-maven-plugin + Free Maven plugin for hierarchical AI-readable indexing and summarization of source code projects using llama.cpp-compatible local models. + + + bernardladenthin + 8 + 21 + UTF-8 + 3.15.2 + 3.9.16 + + 5.0.6 + + + + gpt-oss-20B-mxfp4 + + -1 + + -1 + + + 6.1.2 + 3.0 + 1.37 + 0.16 + 3.6 + 1.2.28 + 2.50.0 + 0.13.7 + 1.0.0 + 4.2.1 + + 1.9.3 + 1.4.2 + 4.10.2.0 + 1.18.46 + 7.7.4 + 1.14.0 + 3.8.0 + 2.94.0 + + ${project.basedir}/src/site/ai + + + true + + + + ${git.commit.time} + + + + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + org.jspecify + jspecify + ${jspecify.version} + + + org.checkerframework + checker-qual + ${checker.version} + + + net.ladenthin + llama + ${llama.version} + ${llama.classifier} + + + + + org.slf4j + slf4j-api + + + + org.apache.maven + maven-plugin-api + ${maven.version} + provided + + + + org.apache.maven.plugin-tools + maven-plugin-annotations + ${maven.plugin.tools.version} + provided + + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + + org.hamcrest + hamcrest + ${hamcrest.version} + test + + + net.jqwik + jqwik + ${jqwik.version} + test + + + com.tngtech.archunit + archunit-junit5 + ${archunit.version} + test + + + org.openjdk.jmh + jmh-core + ${jmh.version} + test + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + test + + + org.openjdk.jcstress + jcstress-core + ${jcstress.version} + test + + + org.jetbrains.lincheck + lincheck + ${lincheck.version} + test + + + + com.vmlens + api + ${vmlens.version} + test + + + + ch.qos.logback + logback-classic + test + + + + + + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + com.github.spotbugs + spotbugs-maven-plugin + ${spotbugs.version} + + + com.vmlens + vmlens-maven-plugin + ${vmlens.version} + + + io.github.git-commit-id + git-commit-id-maven-plugin + 10.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.15.0 + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.6.3 + + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.8 + + + org.apache.maven.plugins + maven-jar-plugin + 3.5.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.12.0 + + + org.apache.maven.plugins + maven-plugin-plugin + ${maven.plugin.tools.version} + + + org.apache.maven.plugins + maven-source-plugin + 3.4.0 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.6 + + + @{argLine} -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=. -XX:ErrorFile=hs_err_pid%p.log + + + **/VmlensInterleavingSmokeTest.java + + + + + org.codehaus.mojo + exec-maven-plugin + 3.6.3 + + + org.jacoco + jacoco-maven-plugin + 0.8.15 + + + org.pitest + pitest-maven + 1.25.7 + + + org.sonatype.central + central-publishing-maven-plugin + 0.11.0 + + + + + + io.github.git-commit-id + git-commit-id-maven-plugin + + + get-git-properties + + revision + + initialize + + + + yyyy-MM-dd'T'HH:mm:ss'Z' + UTC + false + false + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-maven + + enforce + + + + + [3.6.3,) + + + [1.8,) + + + + + + commons-logging:commons-logging + + log4j:log4j + + org.hamcrest:hamcrest-core + org.hamcrest:hamcrest-library + org.hamcrest:hamcrest-all + + junit:junit + junit:junit-dep + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.release} + ${maven.compiler.testRelease} + true + true + + + -Xlint:all,-serial,-options,-classfile,-processing + -Werror + + -processor + lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor,org.checkerframework.checker.nullness.NullnessChecker + + -AskipDefs=^net\.ladenthin\.llamacpp_ai_index_maven_plugin\..*$ + -XDaddTypeAnnotationsToSymbol=true + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + + -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* -Xep:NullAway:ERROR -XepOpt:NullAway:OnlyNullMarked=true -XepOpt:NullAway:ExcludedFieldAnnotations=org.apache.maven.plugins.annotations.Parameter,org.apache.maven.plugins.annotations.Component -XepOpt:NullAway:JSpecifyMode=true -XepOpt:NullAway:CheckOptionalEmptiness=true -XepOpt:NullAway:AcknowledgeRestrictiveAnnotations=true -XepOpt:NullAway:AcknowledgeAndroidRecent=true -XepOpt:NullAway:AssertsEnabled=true -Xep:BoxedPrimitiveEquality:ERROR -Xep:EqualsHashCode:ERROR -Xep:EqualsIncompatibleType:ERROR -Xep:IdentityBinaryExpression:ERROR -Xep:SelfAssignment:ERROR -Xep:SelfComparison:ERROR -Xep:SelfEquals:ERROR -Xep:DeadException:ERROR -Xep:FormatString:ERROR -Xep:InvalidPatternSyntax:ERROR -Xep:OptionalEquality:ERROR -Xep:ImpossibleNullComparison:ERROR + + + + org.projectlombok + lombok + ${lombok.version} + + + com.google.errorprone + error_prone_core + ${errorprone.version} + + + com.uber.nullaway + nullaway + ${nullaway.version} + + + org.checkerframework + checker + ${checker.version} + + + + + + default-compile + + + + module-info.java + + + + + module-info-compile + compile + + compile + + + + 9 + + module-info.java + + + + + + + default-testCompile + + + false + + -XDaddTypeAnnotationsToSymbol=true + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + -Xplugin:ErrorProne -Xep:NullAway:OFF -Xep:GuardedBy:OFF -Xep:IdentityBinaryExpression:OFF + + + + org.openjdk.jcstress + jcstress-core + ${jcstress.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + verify + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + ${maven.compiler.release} + true + true + all + + **/HelpMojo.java + + + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-plugin-plugin + + ai-index + + + + default-descriptor + + descriptor + + + + help-goal + + helpmojo + + + + + + + org.jacoco + jacoco-maven-plugin + + + prepare-agent + + prepare-agent + + + + report + test + + report + + + + + + com.diffplug.spotless + spotless-maven-plugin + + + + src/main/java/**/*.java + src/test/java/**/*.java + + + ${palantir-java-format.version} + + + + + + + + + spotless-check + verify + + check + + + + + + com.github.spotbugs + spotbugs-maven-plugin + + Max + Low + true + false + spotbugs-exclude.xml + + + com.mebigfatguy.fb-contrib + fb-contrib + ${fb-contrib.version} + + + com.h3xstream.findsecbugs + findsecbugs-plugin + ${findsecbugs.version} + + + + + + spotbugs-check + verify + + check + + + + + + org.codehaus.mojo + exec-maven-plugin + + org.openjdk.jmh.Main + test + + + + + org.pitest + pitest-maven + + + org.pitest + pitest-junit5-plugin + 1.2.3 + + + + + + net.ladenthin.maven.llamacpp.aiindex.config.AiCalibration + net.ladenthin.maven.llamacpp.aiindex.config.AiCondition + net.ladenthin.maven.llamacpp.aiindex.config.AiConditionEvaluator + net.ladenthin.maven.llamacpp.aiindex.config.AiFieldGenerationConfig + net.ladenthin.maven.llamacpp.aiindex.config.AiFieldGenerationSelector + net.ladenthin.maven.llamacpp.aiindex.config.AiFileContext + net.ladenthin.maven.llamacpp.aiindex.config.AiGenerationConfig + net.ladenthin.maven.llamacpp.aiindex.config.AiRangeCondition + net.ladenthin.maven.llamacpp.aiindex.config.AiModelDefinition + net.ladenthin.maven.llamacpp.aiindex.config.AiModelDefinitionSupport + net.ladenthin.maven.llamacpp.aiindex.indexer.AiCalibrationMeasurement + net.ladenthin.maven.llamacpp.aiindex.indexer.AiInputWindowCalculator + net.ladenthin.maven.llamacpp.aiindex.document.AiGenerationRequest + net.ladenthin.maven.llamacpp.aiindex.document.AiGenerationResult + net.ladenthin.maven.llamacpp.aiindex.document.AiMdChildEntryLineFormatter + net.ladenthin.maven.llamacpp.aiindex.document.AiMdDocument + net.ladenthin.maven.llamacpp.aiindex.document.AiMdHeader + net.ladenthin.maven.llamacpp.aiindex.document.AiMdHeaderSupport + net.ladenthin.maven.llamacpp.aiindex.document.AiMdLeadExtractor + net.ladenthin.maven.llamacpp.aiindex.prompt.AiPreparedPrompt + net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptDefinition + net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptPreparationSupport + net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport + net.ladenthin.maven.llamacpp.aiindex.provider.AiCompletionParser + net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationTimings + net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProvider + net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProviderFactory + net.ladenthin.maven.llamacpp.aiindex.provider.MockAiGenerationProvider + net.ladenthin.maven.llamacpp.aiindex.config.AiOversizeStrategy + net.ladenthin.maven.llamacpp.aiindex.config.AiFactCounter + net.ladenthin.maven.llamacpp.aiindex.config.AiFactDefinition + net.ladenthin.maven.llamacpp.aiindex.config.AiFactDefinitionSupport + net.ladenthin.maven.llamacpp.aiindex.config.AiFactExtractor + net.ladenthin.maven.llamacpp.aiindex.support.AiChecksumSupport + net.ladenthin.maven.llamacpp.aiindex.support.AiDeterministicSummary + net.ladenthin.maven.llamacpp.aiindex.support.AiGenerationTimeEstimator + net.ladenthin.maven.llamacpp.aiindex.support.AiPathSupport + net.ladenthin.maven.llamacpp.aiindex.support.AiProgressBar + net.ladenthin.maven.llamacpp.aiindex.support.AiSourceExcludeFilter + net.ladenthin.maven.llamacpp.aiindex.support.AiTimeSupport + net.ladenthin.maven.llamacpp.aiindex.support.Java8CompatibilityHelper + + + net.ladenthin.maven.llamacpp.aiindex.* + + 100 + 30000 + + + + + + + + + gpu-cuda + + cuda13-windows-x86-64 + + + + gpu-vulkan + + vulkan-windows-x86-64 + + + + + + + ai-index-selftest + + + + ${project.groupId} + ${project.artifactId} + ${project.version} + + + ${ai.index.output.directory} + + + src/main/java/net/ladenthin/maven/llamacpp/aiindex/config + src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider + + + + + **/package-info.java + **/module-info.java + + + llamacpp-jni + + + + + + + Mistral-7B-Instruct-v0.3-Q4_K_M-C16k + X:/Modelle/Mistral-7B-Instruct-v0.3-Q4_K_M.gguf + 16384 + 2048 + 1.0 + 8 + 4 + true + 1.1 + + + + Meta-Llama-3.1-8B-Instruct-Q5_K_M-C32k + X:/Modelle/Meta-Llama-3.1-8B-Instruct-Q5_K_M.gguf + 32768 + 1536 + 1.0 + 8 + 4 + true + 1.1 + + + + Codestral-22B-v0.1-Q4_K_M-C32k + X:/Modelle/Codestral-22B-v0.1-Q4_K_M.gguf + 32768 + 1536 + 1.0 + 8 + 4 + true + 1.1 + + + + Codestral-22B-v0.1-Q6_K-C32k + X:/Modelle/Codestral-22B-v0.1-Q6_K.gguf + 32768 + 1536 + 1.0 + 8 + 4 + true + 1.1 + + + + Qwen2.5-Coder-7B-Instruct-Q5_K_M-C16k + X:/Modelle/qwen2.5-coder-7b-instruct-q5_k_m.gguf + 16384 + 2048 + 1.0 + 8 + 4 + true + 1.1 + + + + Ministral-3-8B-Instruct-2512-Q4_K_M-C32k + X:/Modelle/Ministral-3-8B-Instruct-2512-Q4_K_M.gguf + 32768 + 2048 + 0.1 + 8 + 4 + true + 1.1 + + + + Ministral-3-14B-Instruct-2512-Q4_K_M-C32k + X:/Modelle/Ministral-3-14B-Instruct-2512-Q4_K_M.gguf + 32768 + 2048 + 0.1 + 8 + 4 + true + 1.1 + + + + Ministral-3-8B-Instruct-2512-Q5_K_M-C32k + X:/Modelle/Ministral-3-8B-Instruct-2512-Q5_K_M.gguf + 32768 + 2048 + 0.1 + 8 + 4 + true + 1.1 + + + + Ministral-3-14B-Instruct-2512-Q5_K_M-C32k + X:/Modelle/Ministral-3-14B-Instruct-2512-Q5_K_M.gguf + 32768 + 2048 + 0.1 + 8 + 4 + true + 1.1 + + + + Gemma-4-26B-A4B-it-UD-Q4_K_M-C32k + X:/Modelle/gemma-4-26B-A4B-it-UD-Q4_K_M.gguf + 32768 + 8192 + 1.0 + 8 + 4 + true + 0.95 + 64 + 1.1 + false + + <end_of_turn> + + + + + Gemma-4-12B-it-Q4_K_M-C32k + X:/Modelle/gemma-4-12B-it-Q4_K_M.gguf + 32768 + 8192 + 1.0 + 8 + 4 + true + 0.95 + 64 + 1.1 + false + + <end_of_turn> + + + + + Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q4_K_M-C32k + X:/Modelle/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf + 32768 + 8192 + 1.0 + 8 + 4 + true + 0.95 + 64 + 1.1 + false + + <end_of_turn> + + + + + Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q6_K_P-C32k + X:/Modelle/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q6_K_P.gguf + 32768 + 8192 + 1.0 + 8 + 4 + true + 0.95 + 64 + 1.1 + false + + <end_of_turn> + + + + + Qwen3-Coder-30B-A3B-Instruct-UD-Q4_K_XL-C64k + X:/Modelle/Qwen3-Coder-30B-A3B-Instruct-UD-Q4_K_XL.gguf + + 16384 + 1536 + 0.7 + 8 + 4 + true + 0.8 + 20 + 1.05 + ${ai.cachePrompt} + + + + Qwen2.5-Coder-14B-Instruct-Q4_K_M-C32k + X:/Modelle/Qwen2.5-Coder-14B-Instruct-Q4_K_M.gguf + 32768 + 2048 + 0.7 + 8 + 4 + true + 0.8 + 20 + 1.05 + + + + Qwen3-4B-Instruct-2507-Q5_K_M-C32k + X:/Modelle/Qwen3-4B-Instruct-2507-Q5_K_M.gguf + 32768 + 2048 + 0.7 + 8 + 4 + true + 0.8 + 20 + 1.05 + + + + Granite-4.0-H-Tiny-Q4_K_M-C128k + X:/Modelle/ibm-granite_granite-4.0-h-tiny-Q4_K_M.gguf + 131072 + 2048 + 0.2 + 8 + 4 + true + 1.1 + + + + Granite-4.0-H-Small-Q4_K_M-C128k + X:/Modelle/ibm-granite_granite-4.0-h-small-Q4_K_M.gguf + 131072 + 2048 + 0.2 + 8 + 4 + true + 1.1 + + + + EXP-Qwen3.5-4B + X:/Modelle/Qwen3.5-4B-Q4_K_M.gguf + 16384 + 1536 + 0.7 + 8 + 4 + true + 0.8 + 20 + 1.05 + false + + + EXP-Qwen2.5-Coder-7B + X:/Modelle/qwen2.5-coder-7b-instruct-q5_k_m.gguf + 16384 + 1536 + 0.7 + 8 + 4 + true + 0.8 + 20 + 1.05 + + + + gpt-oss-20B-c16k + X:/Modelle/gpt-oss-20b-UD-Q4_K_XL.gguf + 16384 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 2048 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + gpt-oss-20B-c48k + X:/Modelle/gpt-oss-20b-UD-Q4_K_XL.gguf + 49152 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 4096 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + gpt-oss-20B-c96k + X:/Modelle/gpt-oss-20b-UD-Q4_K_XL.gguf + 98304 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 6144 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + + + gpt-oss-20B-mxfp4 + X:/Modelle/gpt-oss-20b-mxfp4.gguf + 98304 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 6144 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + gpt-oss-20B-Q4_K_M + X:/Modelle/gpt-oss-20b-Q4_K_M.gguf + 98304 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 6144 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + gpt-oss-20B-Q5_K_M + X:/Modelle/gpt-oss-20b-Q5_K_M.gguf + 98304 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 6144 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + gpt-oss-20B-Q8_0 + X:/Modelle/gpt-oss-20b-Q8_0.gguf + 98304 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 6144 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + gpt-oss-20B-F16 + X:/Modelle/gpt-oss-20b-F16.gguf + 98304 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 6144 + 0.7 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + low + + + + + granite-4.0-h-tiny-bigwindow + X:/Modelle/granite-4.0-h-tiny-Q4_K_M.gguf + 393216 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 4096 + 0.2 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + + + + + + granite-4.0-h-1b-fastchunk + X:/Modelle/granite-4.0-h-1b-Q4_K_M.gguf + 16384 + ${ai.gpuLayers} + ${ai.mainGpu} + ${ai.devices} + 1536 + 0.2 + 8 + 3 + true + 1.0 + 0 + 0.05 + 1.0 + + + + + EXP-Qwen3-Coder-30B + X:/Modelle/Qwen3-Coder-30B-A3B-Instruct-UD-Q4_K_XL.gguf + 16384 + 1536 + 0.7 + 8 + 4 + true + 0.8 + 20 + 1.05 + + + + EXP-DeepSeek-Coder-V2-Lite + X:/Modelle/DeepSeek-Coder-V2-Lite-Instruct-Q4_K_M.gguf + 16384 + 1536 + 0.3 + 8 + 4 + true + 0.9 + 40 + 1.05 + + + EXP-Seed-Coder-8B + X:/Modelle/Seed-Coder-8B-Instruct-Q4_K_M.gguf + 16384 + 1536 + 0.3 + 8 + 4 + true + 0.9 + 40 + 1.05 + + + EXP-Granite-4.0-H-Tiny + X:/Modelle/granite-4.0-h-tiny-Q4_K_M.gguf + 16384 + 1536 + 0.0 + 8 + 4 + true + 1.0 + 0 + 1.0 + + + + EXP-Granite-4.0-H-Small + X:/Modelle/granite-4.0-h-small-UD-Q4_K_XL.gguf + 16384 + 1536 + 0.0 + 8 + 4 + true + 1.0 + 0 + 1.0 + + + EXP-Qwen3-4B-Instruct-2507 + X:/Modelle/Qwen3-4B-Instruct-2507-Q4_K_M.gguf + 16384 + 1536 + 0.7 + 8 + 4 + true + 0.8 + 20 + 1.05 + + + + + + + file-body-java + + + + file-body-sql + + + + file-body-fallback + + + + package-body + + + + project-body + + + + + file-body-java-v2 + + + + package-body-v2 + + + + + + + + + + ai-generate + generate-resources + + generate + + + + + .java + .sql + + + + + java-facts + + (?m)^\s*(?:public\s+|final\s+|abstract\s+|sealed\s+|non-sealed\s+|static\s+)*(?:class|interface|enum|record)\s+\w + \bpublic\b + \b(?:TODO|FIXME)\b + @Override\b + + (?m)^[ \t]*(?:(?:public|private|protected|static|final|abstract|default|synchronized|native|strictfp)[ \t]+)*(?:<[^>]+>[ \t]*)?(?!(?:if|for|while|switch|catch|return|new|else|do|try|synchronized|assert|throw)\b)[A-Za-z_$][\w$.]*(?:<[^;{}=]*>)?(?:\[\])*[ \t]+([A-Za-z_$]\w*)[ \t]*\([^;{]*\)(?:[ \t]*throws[ \t][\w$., \t]+)?[ \t]*[{;] + (?m)^[ \t]*(?:(?:public|private|protected)[ \t]+)?([A-Z][A-Za-z0-9_$]*)[ \t]*\([^;{]*\)(?:[ \t]*throws[ \t][\w$., \t]+)?[ \t]*\{ + (?m)^[ \t]*(?:(?:public|private|protected|static|transient|volatile|final)[ \t]+)*(?:public|private|protected|static|transient|volatile)[ \t]+(?:(?:public|private|protected|static|transient|volatile|final)[ \t]+)*(?!class\b|interface\b|enum\b|record\b|void\b|new\b)[A-Za-z_$][\w$.]*(?:<[^;{}=]*>)?(?:\[\])*[ \t]+([A-Za-z_$]\w*(?:[ \t]*,[ \t]*[A-Za-z_$]\w*)*)[ \t]*(?:=[^;]*)?; + + + + sql-facts + + (?im)^\s*INSERT\s+INTO\b + (?im)^\s*CREATE\s+TABLE\b + (?im)^\s*CREATE\s+(?:OR\s+REPLACE\s+)?VIEW\b + (?im)^\s*CREATE\s+(?:UNIQUE\s+)?INDEX\b + (?im)^\s*CREATE\s+(?:OR\s+REPLACE\s+)?(?:FUNCTION|PROCEDURE)\b + + + + + + + huge-java + file-body-java + granite-4.0-h-1b-fastchunk + 200 + + mapReduce + 6 + java-facts + + + + + .java + + + 1000000 + + + + + + + huge-sql + file-body-sql + granite-4.0-h-1b-fastchunk + 200 + mapReduce + 6 + + sql-facts + + + + + .sql + + + 1000000 + + + + + + + big-window-java + file-body-java + granite-4.0-h-tiny-bigwindow + 100 + + + + + + .java + + + 275000 + + + + + + + big-window-sql + file-body-sql + granite-4.0-h-tiny-bigwindow + 100 + + + + + .sql + + + 275000 + + + + + + + java + file-body-java + ${ai.model} + + java-facts + + .java + + + + sql + file-body-sql + ${ai.model} + sql-facts + + .sql + + + + + fallback + file-body-fallback + ${ai.model} + true + + + + + + + ai-aggregate-packages + process-resources + + aggregate-packages + + + + + package-body + ${ai.model} + + + + + + + + ai-aggregate-project + prepare-package + + aggregate-project + + + + + project-body + ${ai.model} + + + + + + + + + + + + vmlens + + + + com.vmlens + vmlens-maven-plugin + + + + **/VmlensInterleavingSmokeTest.java + + + + + vmlens-test + + test + + + + + + + + + jcstress + + + + org.codehaus.mojo + exec-maven-plugin + + + jcstress + test + exec + + ${java.home}/bin/java + test + + -classpath + + org.openjdk.jcstress.Main + -v + -m + default + + + + + + + + + + diff --git a/spotbugs-exclude.xml b/llamacpp-ai-index-maven-plugin/spotbugs-exclude.xml similarity index 93% rename from spotbugs-exclude.xml rename to llamacpp-ai-index-maven-plugin/spotbugs-exclude.xml index 986f75c..8d41c61 100644 --- a/spotbugs-exclude.xml +++ b/llamacpp-ai-index-maven-plugin/spotbugs-exclude.xml @@ -525,4 +525,32 @@ SPDX-License-Identifier: Apache-2.0 + + + + + + + + + + + diff --git a/src/main/java/module-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/module-info.java similarity index 100% rename from src/main/java/module-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/module-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibration.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibration.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibration.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibration.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCondition.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCondition.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCondition.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCondition.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluator.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluator.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluator.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluator.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroup.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroup.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroup.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroup.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounter.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounter.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounter.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounter.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinition.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinition.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinition.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinition.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupport.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupport.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractor.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractor.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractor.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractor.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfig.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfig.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfig.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfig.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelector.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelector.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelector.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelector.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContext.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContext.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContext.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContext.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfig.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfig.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfig.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfig.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKind.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKind.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKind.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKind.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinition.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinition.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinition.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinition.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupport.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupport.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategy.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategy.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategy.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategy.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeCondition.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeCondition.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeCondition.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeCondition.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/config/package-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationRequest.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationRequest.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationRequest.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationRequest.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationResult.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationResult.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationResult.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationResult.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatter.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatter.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatter.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatter.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocument.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocument.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocument.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocument.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodec.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodec.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodec.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodec.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeader.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeader.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeader.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeader.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodec.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodec.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodec.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodec.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupport.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupport.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractor.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractor.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractor.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractor.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/document/package-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurement.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurement.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurement.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurement.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunner.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunner.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunner.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunner.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java similarity index 88% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java index 73c3be6..5fa364e 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java @@ -26,7 +26,8 @@ import net.ladenthin.maven.llamacpp.aiindex.support.AiGenerationTimeEstimator; import net.ladenthin.maven.llamacpp.aiindex.support.AiSourceChunker; import net.ladenthin.maven.llamacpp.aiindex.support.Java8CompatibilityHelper; -import org.apache.maven.plugin.logging.Log; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Shared field-generation logic used by both {@link SourceFileIndexer} and @@ -35,17 +36,17 @@ *

Iterates over a list of {@link net.ladenthin.maven.llamacpp.aiindex.config.AiFieldGenerationConfig} entries, prepares the * prompt for each, delegates generation to the configured {@link net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProvider}, * and accumulates the generated text as the document body. - * A trim warning is emitted via the supplied {@link Log} whenever the source text had - * to be truncated to fit within the configured maximum input character budget.

+ * A trim warning is logged whenever the source text had to be truncated to fit within the + * configured maximum input character budget.

* *

{@code toString} is generated by Lombok over the collaborator fields and the - * maxInputChars cache. The Maven {@link Log} is excluded because its default - * {@code toString} prints implementation details (logger configuration, output stream - * state) that are noisy and not useful for build-log diagnostics. + * maxInputChars cache. */ @ToString public class AiFieldGenerationSupport { + private static final Logger LOGGER = LoggerFactory.getLogger(AiFieldGenerationSupport.class); + /** * Log message fragment inserted between the context type and the remainder of the * trim-warning message, ensuring a consistent sentence structure regardless of whether @@ -175,11 +176,6 @@ public class AiFieldGenerationSupport { */ private static final String CONTEXT_OVERFLOW_MARKER = "exceeds the available context size"; - // Maven plugin Log — its default toString prints implementation details - // (logger configuration, output stream state); excluded from the rendered output. - @ToString.Exclude - private final Log log; - private final AiGenerationProvider generationProvider; private final AiPromptPreparationSupport promptPreparationSupport; private final AiModelDefinitionSupport modelDefinitionSupport; @@ -196,17 +192,14 @@ public class AiFieldGenerationSupport { /** * Creates a new {@code AiFieldGenerationSupport}. * - * @param log Maven logger for trim warnings and diagnostics * @param generationProvider AI backend used to generate text for each field * @param promptPreparationSupport helper that resolves and prepares prompt templates * @param modelDefinitionSupport lookup for {@link net.ladenthin.maven.llamacpp.aiindex.config.AiGenerationConfig} by key */ public AiFieldGenerationSupport( - final Log log, final AiGenerationProvider generationProvider, final AiPromptPreparationSupport promptPreparationSupport, final AiModelDefinitionSupport modelDefinitionSupport) { - this.log = log; this.generationProvider = generationProvider; this.promptPreparationSupport = promptPreparationSupport; this.modelDefinitionSupport = modelDefinitionSupport; @@ -283,8 +276,11 @@ public AiGenerationResult processFieldGenerations( body = factsPrefix + AiDeterministicSummary.body( sourceText, contextName(contextFile), DETERMINISTIC_SAMPLE_LINES); - log.info("Oversize " + contextType + " '" + contextFile + "' -> deterministic body (no model), " - + sourceText.length() + " chars"); + LOGGER.info( + "Oversize {} '{}' -> deterministic body (no model), {} chars", + contextType, + contextFile, + sourceText.length()); continue; } if (oversize == AiOversizeStrategy.MAP_REDUCE) { @@ -296,11 +292,15 @@ public AiGenerationResult processFieldGenerations( } if (preparedPrompt.trimmed() && generationConfig.isWarnOnTrim()) { - log.warn("Trimmed AI input for " + contextType + TRIM_WARN_FIELD_LABEL + "body': " + contextFile - + " (source chars " + preparedPrompt.originalSourceLength() - + " -> " + preparedPrompt.trimmedSourceLength() - + ", available source chars " + preparedPrompt.availableSourceChars() - + ", max input chars " + effectiveMaxInputChars + ")"); + LOGGER.warn( + "Trimmed AI input for {}" + TRIM_WARN_FIELD_LABEL + + "body': {} (source chars {} -> {}, available source chars {}, max input chars {})", + contextType, + contextFile, + preparedPrompt.originalSourceLength(), + preparedPrompt.trimmedSourceLength(), + preparedPrompt.availableSourceChars(), + effectiveMaxInputChars); } final int processedSourceChars = preparedPrompt.sourceText().length(); @@ -310,16 +310,20 @@ public AiGenerationResult processFieldGenerations( // Use the model's measured when present, so the live per-file ETA matches the // (already calibrated) plan ETA instead of the built-in reference-CPU model. final long estimatedSeconds = estimateSeconds(processedSourceChars, generationConfig); - log.info(PROCESSING_LOG_PREFIX + contextType + " '" + contextFile + "'" - + PROCESSING_LOG_SIZE_INFIX + sourceSizeKb - + PROCESSING_LOG_TOKENS_INFIX + timeEstimator.estimatePromptTokens(processedSourceChars) - + PROCESSING_LOG_ETA_INFIX - + timeEstimator.formatDuration(estimatedSeconds) - + PROCESSING_LOG_DISCLAIMER); - - log.info("Generating field '" + fieldGeneration.getPromptKey() + "' with temperature=" - + generationConfig.getTemperature() + ", maxInputChars=" - + effectiveMaxInputChars); + LOGGER.info( + PROCESSING_LOG_PREFIX + "{} '{}'" + PROCESSING_LOG_SIZE_INFIX + "{}" + PROCESSING_LOG_TOKENS_INFIX + + "{}" + PROCESSING_LOG_ETA_INFIX + "{}" + PROCESSING_LOG_DISCLAIMER, + contextType, + contextFile, + sourceSizeKb, + timeEstimator.estimatePromptTokens(processedSourceChars), + timeEstimator.formatDuration(estimatedSeconds)); + + LOGGER.info( + "Generating field '{}' with temperature={}, maxInputChars={}", + fieldGeneration.getPromptKey(), + generationConfig.getTemperature(), + effectiveMaxInputChars); final long generationStartNanos = System.nanoTime(); final String generated = generateWithOverflowRetry( fieldGeneration.getPromptKey(), contextFile, sourceText, baseHeader, effectiveMaxInputChars); @@ -328,13 +332,20 @@ public AiGenerationResult processFieldGenerations( // Log the MEASURED wall-clock duration next to the estimate so real runs are directly // comparable across models/quants without a separate benchmark harness. - log.info(GENERATED_LOG_PREFIX + contextType + " '" + contextFile + GENERATED_LOG_IN_INFIX - + timeEstimator.formatDuration(actualSeconds) + GENERATED_LOG_ACTUAL_INFIX - + timeEstimator.formatDuration(estimatedSeconds) + GENERATED_LOG_SUFFIX); + LOGGER.info( + GENERATED_LOG_PREFIX + "{} '{}" + GENERATED_LOG_IN_INFIX + "{}" + GENERATED_LOG_ACTUAL_INFIX + "{}" + + GENERATED_LOG_SUFFIX, + contextType, + contextFile, + timeEstimator.formatDuration(actualSeconds), + timeEstimator.formatDuration(estimatedSeconds)); if (compatibilityHelper.isBlank(generated)) { - log.warn(EMPTY_OUTPUT_WARN_PREFIX + contextType + TRIM_WARN_FIELD_LABEL + fieldGeneration.getPromptKey() - + "': " + contextFile); + LOGGER.warn( + EMPTY_OUTPUT_WARN_PREFIX + "{}" + TRIM_WARN_FIELD_LABEL + "{}': {}", + contextType, + fieldGeneration.getPromptKey(), + contextFile); } } @@ -376,15 +387,18 @@ private String mapReduceSummarize( final int overlap = Math.min(MAP_REDUCE_OVERLAP_CHARS, sourceBudget / MAP_REDUCE_OVERLAP_DIVISOR); final List chunks = AiSourceChunker.chunk(sourceText, sourceBudget, overlap, fieldGeneration.getMaxChunks()); - log.info("Oversize file '" + contextFile + "' -> mapReduce: " + sourceText.length() + " chars in " - + chunks.size() + " chunk(s)"); + LOGGER.info( + "Oversize file '{}' -> mapReduce: {} chars in {} chunk(s)", + contextFile, + sourceText.length(), + chunks.size()); final List partials = new ArrayList<>(chunks.size()); int index = 0; for (final String chunk : chunks) { index++; partials.add(summarizeChunk(fieldGeneration.getPromptKey(), contextFile, chunk, baseHeader, safeWindow) .trim()); - log.info(" mapReduce chunk " + index + "/" + chunks.size() + " summarized (" + chunk.length() + " chars)"); + LOGGER.info(" mapReduce chunk {}/{} summarized ({} chars)", index, chunks.size(), chunk.length()); } return reducePartials( fieldGeneration.getPromptKey(), contextFile, baseHeader, partials, sourceBudget, safeWindow); @@ -443,7 +457,7 @@ private String reducePartials( next.add(summarizeChunk(promptKey, contextFile, batch.toString(), baseHeader, safeWindow) .trim()); } - log.info(" mapReduce reduce round " + round + ": " + level.size() + " -> " + next.size() + " partial(s)"); + LOGGER.info(" mapReduce reduce round {}: {} -> {} partial(s)", round, level.size(), next.size()); if (next.size() >= level.size()) { // Pathological: partials too large to combine two-at-a-time. Collapse to one trimmed reduce // so the method always terminates rather than looping without shrinking. @@ -522,8 +536,12 @@ private String generateWithOverflowRetry( if (attempt >= MAX_OVERFLOW_RETRIES || reduced >= budget || !isContextOverflow(e)) { throw e; } - log.warn("AI provider rejected the prompt (context overflow) for " + contextFile - + "; retrying with a smaller window (" + budget + " -> " + reduced + " chars)"); + LOGGER.warn( + "AI provider rejected the prompt (context overflow) for {}; retrying with a smaller window" + + " ({} -> {} chars)", + contextFile, + budget, + reduced); budget = reduced; } } @@ -649,20 +667,22 @@ private int calculateAndLogMaxInputChars(final AiGenerationConfig config, final // Single source of truth for the threshold shared with the planning path (SourceFileIndexer.classify). final int finalChars = AiInputWindowCalculator.maxInputChars(config, basePromptLength); - log.info("Maximum input characters for source code before trimming. Calculated as: (context_size x " - + charsPerToken + ") - overhead"); - log.info(" Context: " + contextSize + " tokens"); - log.info(" Chars per token: ~" + charsPerToken); - log.info(" [Total available]: " + contextSize + " x " + charsPerToken + " = " + totalChars + " chars"); - log.info(" Overhead (conservative estimate):"); - log.info(" - Prompt template: ~" + promptChars + " chars"); - log.info(" - EOF marker: ~" + eofChars + " chars"); - log.info(" - Max output (" + maxOutputTokens + " tokens x " + charsPerToken + "): ~" + outputChars + " chars"); - log.info(" - Safety margin: ~" + safetyChars + " chars"); - log.info(" - [Subtotal overhead]: ~" + overheadTotal + " chars"); - log.info(" Available for source: [Total available] - [Subtotal overhead]"); - log.info(" Available for source: " + totalChars + " - " + overheadTotal + " = " + availableChars + " chars"); - log.info(" Set to: " + finalChars + " (rounded, conservative)"); + LOGGER.info( + "Maximum input characters for source code before trimming. Calculated as: (context_size x {}) -" + + " overhead", + charsPerToken); + LOGGER.info(" Context: {} tokens", contextSize); + LOGGER.info(" Chars per token: ~{}", charsPerToken); + LOGGER.info(" [Total available]: {} x {} = {} chars", contextSize, charsPerToken, totalChars); + LOGGER.info(" Overhead (conservative estimate):"); + LOGGER.info(" - Prompt template: ~{} chars", promptChars); + LOGGER.info(" - EOF marker: ~{} chars", eofChars); + LOGGER.info(" - Max output ({} tokens x {}): ~{} chars", maxOutputTokens, charsPerToken, outputChars); + LOGGER.info(" - Safety margin: ~{} chars", safetyChars); + LOGGER.info(" - [Subtotal overhead]: ~{} chars", overheadTotal); + LOGGER.info(" Available for source: [Total available] - [Subtotal overhead]"); + LOGGER.info(" Available for source: {} - {} = {} chars", totalChars, overheadTotal, availableChars); + LOGGER.info(" Set to: {} (rounded, conservative)", finalChars); return finalChars; } diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlan.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlan.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlan.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlan.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculator.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculator.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculator.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculator.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java similarity index 96% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java index ad870d7..14b43cc 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java @@ -28,21 +28,21 @@ import net.ladenthin.maven.llamacpp.aiindex.support.AiPathSupport; import net.ladenthin.maven.llamacpp.aiindex.support.AiTimeSupport; import net.ladenthin.maven.llamacpp.aiindex.support.Java8CompatibilityHelper; -import org.apache.maven.plugin.logging.Log; import org.jspecify.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Aggregates {@code package.ai.md} index files: walks the output tree, lists each * package's contents, and fills in AI-generated summary and keyword fields. * - *

{@code toString} is generated by Lombok over the configuration and collaborator - * fields. The Maven {@link Log} is excluded because its default {@code toString} prints - * implementation details (logger configuration, output stream state) that are noisy - * and not useful for build-log diagnostics. + *

{@code toString} is generated by Lombok over the configuration and collaborator fields. */ @ToString public class PackageIndexer { + private static final Logger LOGGER = LoggerFactory.getLogger(PackageIndexer.class); + /** * Section heading inserted above the contents listing in both the package source text * and the default package body. @@ -71,12 +71,6 @@ public class PackageIndexer { */ private static final String CHILD_SUMMARY_MISSING_NOTE = "(no summary available)"; - /** - * Earliest possible date value used as the starting point when scanning child nodes - * to find the latest index creation date. - */ - private static final String EPOCH_DATE = "1970-01-01T00:00:00Z"; - /** * Context-type label passed to {@link AiFieldGenerationSupport} so that trim-warning * log messages read "Trimmed AI input for package field '…'". @@ -96,11 +90,6 @@ public class PackageIndexer { return fileName.toString(); }); - // Maven plugin Log — its default toString prints implementation details - // (logger configuration, output stream state); excluded from the rendered output. - @ToString.Exclude - private final Log log; - private final Path outputRoot; private final String pluginVersion; private final String aiVersion; @@ -124,7 +113,6 @@ public class PackageIndexer { /** * Creates a new {@link PackageIndexer}. * - * @param log Maven plugin logger * @param baseDirectory project base directory * @param outputRoot root directory in which {@code .ai.md} files reside * @param pluginVersion plugin version recorded in headers @@ -137,7 +125,6 @@ public class PackageIndexer { * @param modelDefinitionSupport AI model definition lookup */ public PackageIndexer( - final Log log, final Path baseDirectory, final Path outputRoot, final String pluginVersion, @@ -148,7 +135,6 @@ public PackageIndexer( final @Nullable Collection fieldGenerations, final AiPromptSupport promptSupport, final AiModelDefinitionSupport modelDefinitionSupport) { - this.log = log; this.outputRoot = outputRoot; this.pluginVersion = pluginVersion; this.aiVersion = aiVersion; @@ -164,7 +150,7 @@ public PackageIndexer( this.force = force; this.fieldGenerations = fieldGenerations != null ? new ArrayList<>(fieldGenerations) : null; this.fieldGenerationSupport = new AiFieldGenerationSupport( - log, generationProvider, new AiPromptPreparationSupport(promptSupport), modelDefinitionSupport); + generationProvider, new AiPromptPreparationSupport(promptSupport), modelDefinitionSupport); } /** @@ -275,7 +261,7 @@ private void writePackageFile(final Path directory) throws IOException { childLinks); if (!headerSupport.shouldWrite(force, packageFile, baseHeader)) { - log.info("Unchanged package AI index file: " + packageFile); + LOGGER.info("Unchanged package AI index file: {}", packageFile); return; } @@ -292,7 +278,7 @@ private void writePackageFile(final Path directory) throws IOException { final AiMdDocument document = new AiMdDocument(baseHeader, body); documentCodec.write(packageFile, document); - log.info("Wrote package AI index file: " + packageFile); + LOGGER.info("Wrote package AI index file: {}", packageFile); } private List collectContents(final Path directory) throws IOException { @@ -582,7 +568,7 @@ private String calculatePackageChecksum(final Path directory) throws IOException } private String calculatePackageDate(final Path directory) throws IOException { - String latest = EPOCH_DATE; + String latest = AiTimeSupport.EPOCH_DATE; try (Stream stream = Files.list(directory)) { for (Path path : compatibilityHelper.toList(stream.sorted(BY_FILE_NAME))) { diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java similarity index 93% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java index 2dce903..6c29756 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java @@ -27,8 +27,9 @@ import net.ladenthin.maven.llamacpp.aiindex.support.AiChecksumSupport; import net.ladenthin.maven.llamacpp.aiindex.support.AiTimeSupport; import net.ladenthin.maven.llamacpp.aiindex.support.Java8CompatibilityHelper; -import org.apache.maven.plugin.logging.Log; import org.jspecify.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Builds the single project-level AI index — the top of the three-level index. @@ -59,14 +60,13 @@ * model, triggers a rebuild) — or when {@code force} is set. This mirrors the incremental contract of * {@link SourceFileIndexer} and {@link PackageIndexer}.

* - *

{@code toString} is generated by Lombok over the configuration and collaborator fields. The - * Maven {@link Log} is excluded because its default {@code toString} prints implementation details - * (logger configuration, output stream state) that are noisy and not useful for build-log - * diagnostics.

+ *

{@code toString} is generated by Lombok over the configuration and collaborator fields.

*/ @ToString public class ProjectIndexer { + private static final Logger LOGGER = LoggerFactory.getLogger(ProjectIndexer.class); + /** Markdown heading introducing the per-package listing in the project index body. */ private static final String PACKAGES_HEADING = "#### Packages"; @@ -100,17 +100,6 @@ public class ProjectIndexer { /** Separator between a package path and its lead in the overview source listing. */ private static final String OVERVIEW_SOURCE_LEAD_SEPARATOR = ": "; - /** - * Earliest possible date value used as the starting point when scanning packages to find the - * latest index creation date recorded in the project header's {@code d} field. - */ - private static final String EPOCH_DATE = "1970-01-01T00:00:00Z"; - - // Maven plugin Log — its default toString prints implementation details - // (logger configuration, output stream state); excluded from the rendered output. - @ToString.Exclude - private final Log log; - private final String projectTitle; private final String pluginVersion; private final String aiVersion; @@ -132,19 +121,14 @@ public class ProjectIndexer { /** * Creates a deterministic {@link ProjectIndexer} with no AI overview. * - * @param log Maven plugin logger * @param projectTitle title recorded in the project index header (typically the Maven project name) * @param pluginVersion plugin version recorded in the header * @param aiVersion AI summarisation logic version recorded in the header * @param force when {@code true}, rewrite the project index even when it is unchanged */ public ProjectIndexer( - final Log log, - final String projectTitle, - final String pluginVersion, - final String aiVersion, - final boolean force) { - this(log, projectTitle, pluginVersion, aiVersion, force, null, null, null, null); + final String projectTitle, final String pluginVersion, final String aiVersion, final boolean force) { + this(projectTitle, pluginVersion, aiVersion, force, null, null, null, null); } /** @@ -154,7 +138,6 @@ public ProjectIndexer( * {@code promptSupport}, and {@code modelDefinitionSupport} are all non-{@code null}; otherwise the * indexer behaves exactly like the deterministic constructor above.

* - * @param log Maven plugin logger * @param projectTitle title recorded in the project index header * @param pluginVersion plugin version recorded in the header * @param aiVersion AI summarisation logic version recorded in the header @@ -165,7 +148,6 @@ public ProjectIndexer( * @param modelDefinitionSupport AI model definition lookup; {@code null} disables the overview */ public ProjectIndexer( - final Log log, final String projectTitle, final String pluginVersion, final String aiVersion, @@ -174,7 +156,6 @@ public ProjectIndexer( final @Nullable AiFieldGenerationConfig overviewFieldGeneration, final @Nullable AiPromptSupport promptSupport, final @Nullable AiModelDefinitionSupport modelDefinitionSupport) { - this.log = log; this.projectTitle = projectTitle; this.pluginVersion = pluginVersion; this.aiVersion = aiVersion; @@ -186,7 +167,7 @@ public ProjectIndexer( && promptSupport != null && modelDefinitionSupport != null) { this.fieldGenerationSupport = new AiFieldGenerationSupport( - log, generationProvider, new AiPromptPreparationSupport(promptSupport), modelDefinitionSupport); + generationProvider, new AiPromptPreparationSupport(promptSupport), modelDefinitionSupport); } else { this.fieldGenerationSupport = null; } @@ -229,12 +210,12 @@ public int aggregate(final Path rootDirectory) throws IOException { } if (packageFiles.isEmpty()) { - log.info("No package index files found under " + rootDirectory + "; skipping project index."); + LOGGER.info("No package index files found under {}; skipping project index.", rootDirectory); return 0; } final List entries = new ArrayList<>(packageFiles.size()); - String latestDate = EPOCH_DATE; + String latestDate = AiTimeSupport.EPOCH_DATE; for (final Path packageFile : packageFiles) { final AiMdDocument document = documentCodec.read(packageFile); final String displayPath = displayPath(rootDirectory, packageFile); @@ -283,7 +264,7 @@ public int aggregate(final Path rootDirectory) throws IOException { final Path projectFile = rootDirectory.resolve(AiMdHeaderCodec.PROJECT_AI_MD_FILENAME); if (!headerSupport.shouldWrite(force, projectFile, baseHeader)) { - log.info("Unchanged project index file: " + projectFile); + LOGGER.info("Unchanged project index file: {}", projectFile); return 0; } @@ -298,7 +279,7 @@ public int aggregate(final Path rootDirectory) throws IOException { } documentCodec.write(projectFile, new AiMdDocument(baseHeader, body)); - log.info("Wrote project index file: " + projectFile + " (" + entries.size() + " packages)"); + LOGGER.info("Wrote project index file: {} ({} packages)", projectFile, entries.size()); return 1; } diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexer.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexer.java similarity index 96% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexer.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexer.java index cf9ee03..82dafef 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexer.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexer.java @@ -34,8 +34,9 @@ import net.ladenthin.maven.llamacpp.aiindex.support.AiSourceExcludeFilter; import net.ladenthin.maven.llamacpp.aiindex.support.AiTimeSupport; import net.ladenthin.maven.llamacpp.aiindex.support.Java8CompatibilityHelper; -import org.apache.maven.plugin.logging.Log; import org.jspecify.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Walks the configured source subtrees and writes per-file {@code .ai.md} index files. @@ -51,24 +52,19 @@ * {@code .ai.md} with a given rule, using a provider-bearing support (one per model group). * * - *

{@code toString} is generated by Lombok over the configuration fields. The Maven {@link Log} is - * excluded because its default {@code toString} prints implementation details that are noisy in - * build-log diagnostics.

+ *

{@code toString} is generated by Lombok over the configuration fields.

*/ @ToString public class SourceFileIndexer { + private static final Logger LOGGER = LoggerFactory.getLogger(SourceFileIndexer.class); + /** * Context-type label passed to {@link AiFieldGenerationSupport} so that trim-warning * log messages read "Trimmed AI input for file field '…'". */ private static final String CONTEXT_TYPE_FILE = "file"; - // Maven plugin Log — its default toString prints implementation details - // (logger configuration, output stream state); excluded from the rendered output. - @ToString.Exclude - private final Log log; - private final Path baseDirectory; private final Path outputRoot; private final List fileExtensions; @@ -95,7 +91,6 @@ public class SourceFileIndexer { * ({@link #classify(Collection, List)} / {@link #indexFile}) so a run can load a separate model per * routing group. * - * @param log Maven plugin logger * @param baseDirectory project base directory * @param outputRoot root directory in which {@code .ai.md} files are written * @param fileExtensions file extensions to index; may be empty (matches no files) @@ -109,7 +104,6 @@ public class SourceFileIndexer { * @param force when {@code true}, regenerate even when fields are populated */ public SourceFileIndexer( - final Log log, final Path baseDirectory, final Path outputRoot, final Collection fileExtensions, @@ -120,7 +114,6 @@ public SourceFileIndexer( final long minFileSizeBytes, final long maxFileSizeBytes, final boolean force) { - this.log = log; this.baseDirectory = baseDirectory; this.outputRoot = outputRoot; this.fileExtensions = new ArrayList<>(fileExtensions); @@ -152,11 +145,11 @@ public List collectCandidates(final Path sourceRoot) throws IOException { continue; } if (isExcluded(path)) { - log.debug("Excluded from indexing: " + path); + LOGGER.debug("Excluded from indexing: {}", path); continue; } if (!matchesSize(path)) { - log.debug("Outside configured size band, skipped: " + path); + LOGGER.debug("Outside configured size band, skipped: {}", path); continue; } candidates.add(path); @@ -342,7 +335,7 @@ public boolean indexFile( AiMdHeaderCodec.NODE_TYPE_FILE); if (!headerSupport.shouldWrite(force, targetFile, baseHeader)) { - log.info("Unchanged AI index file: " + targetFile); + LOGGER.info("Unchanged AI index file: {}", targetFile); return false; } @@ -354,7 +347,7 @@ public boolean indexFile( final AiMdDocument document = new AiMdDocument(baseHeader, result.body()); documentCodec.write(targetFile, document); - log.info("Wrote AI index file: " + targetFile); + LOGGER.info("Wrote AI index file: {}", targetFile); return true; } diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/package-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AbstractAiIndexMojo.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AbstractAiIndexMojo.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AbstractAiIndexMojo.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AbstractAiIndexMojo.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregatePackagesMojo.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregatePackagesMojo.java similarity index 99% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregatePackagesMojo.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregatePackagesMojo.java index fcee5d8..15cec8d 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregatePackagesMojo.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregatePackagesMojo.java @@ -97,7 +97,6 @@ public void execute() throws MojoExecutionException { try (AiGenerationProvider provider = providerFactory.create(generationProvider, buildLlamaCppJniConfig(), promptSupport)) { final PackageIndexer packageIndexer = new PackageIndexer( - getLog(), basePath, outputPath, pluginVersion, diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregateProjectMojo.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregateProjectMojo.java similarity index 95% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregateProjectMojo.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregateProjectMojo.java index c7df68a..fda4c25 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregateProjectMojo.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregateProjectMojo.java @@ -130,7 +130,7 @@ public void execute() throws MojoExecutionException { written = aggregateWithOverview(outputPath, title, fieldGenerations.get(0)); } else { getLog().info("Project overview generation: disabled (no fieldGenerations configured)"); - final ProjectIndexer indexer = new ProjectIndexer(getLog(), title, pluginVersion, aiVersion, force); + final ProjectIndexer indexer = new ProjectIndexer(title, pluginVersion, aiVersion, force); written = indexer.aggregate(outputPath); } getLog().info("Project index files written: " + written); @@ -162,15 +162,7 @@ private int aggregateWithOverview(final Path outputPath, final String title, fin try (AiGenerationProvider provider = providerFactory.create(generationProvider, buildLlamaCppJniConfig(), promptSupport)) { final ProjectIndexer indexer = new ProjectIndexer( - getLog(), - title, - pluginVersion, - aiVersion, - force, - provider, - overview, - promptSupport, - modelDefinitionSupport); + title, pluginVersion, aiVersion, force, provider, overview, promptSupport, modelDefinitionSupport); return indexer.aggregate(outputPath); } } diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/CalibrateMojo.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/CalibrateMojo.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/CalibrateMojo.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/CalibrateMojo.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/GenerateMojo.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/GenerateMojo.java similarity index 98% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/GenerateMojo.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/GenerateMojo.java index 8a38555..d2395bc 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/GenerateMojo.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/GenerateMojo.java @@ -173,7 +173,6 @@ public void execute() throws MojoExecutionException { selector.validate(fieldGenerations); final SourceFileIndexer fileIndexer = new SourceFileIndexer( - getLog(), basePath, outputPath, resolvedExtensions, @@ -251,8 +250,8 @@ public void execute() throws MojoExecutionException { + group.getValue().size() + " file(s)"); try (AiGenerationProvider provider = providerFactory.create( generationProvider, buildLlamaCppJniConfig(aiDefinitionKey), promptSupport)) { - final AiFieldGenerationSupport support = new AiFieldGenerationSupport( - getLog(), provider, promptPreparationSupport, modelDefinitionSupport); + final AiFieldGenerationSupport support = + new AiFieldGenerationSupport(provider, promptPreparationSupport, modelDefinitionSupport); for (final AiIndexPlan.Entry entry : group.getValue()) { if (fileIndexer.indexFile(entry.file(), entry.rule(), support)) { wrote++; diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/package-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/package-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPrompt.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPrompt.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPrompt.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPrompt.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptDefinition.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptDefinition.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptDefinition.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptDefinition.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupport.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupport.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupport.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupport.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/package-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParser.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParser.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParser.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParser.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProvider.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProvider.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProvider.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProvider.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactory.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactory.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactory.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactory.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimings.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimings.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimings.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimings.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProvider.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProvider.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProvider.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProvider.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniConfig.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniConfig.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniConfig.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniConfig.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProvider.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProvider.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProvider.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProvider.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/package-info.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupport.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupport.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummary.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummary.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummary.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummary.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimator.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimator.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimator.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimator.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupport.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupport.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBar.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBar.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBar.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBar.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunker.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunker.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunker.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunker.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilter.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilter.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilter.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilter.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java similarity index 65% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java index 6e34998..60254f2 100644 --- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java +++ b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java @@ -19,6 +19,14 @@ public AiTimeSupport() { private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_INSTANT; + /** + * The earliest possible ISO-8601 date, formatted the same way as every other timestamp in this + * class. Used as the starting value when folding over a set of child dates to find the latest + * one (e.g. {@code latest = EPOCH_DATE; for (child) latest = laterDate(latest, child.date());}) — + * never itself persisted, since callers only run that fold when at least one child exists. + */ + public static final String EPOCH_DATE = ISO_FORMATTER.format(Instant.EPOCH); + /** * Formats the given instant as an ISO-8601 string truncated to seconds. * diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/ConvertToRecord.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/ConvertToRecord.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/ConvertToRecord.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/ConvertToRecord.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelper.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelper.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelper.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelper.java diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/package-info.java b/llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/package-info.java similarity index 100% rename from src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/package-info.java rename to llamacpp-ai-index-maven-plugin/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/package-info.java diff --git a/src/site/ai/empty.md b/llamacpp-ai-index-maven-plugin/src/site/ai/empty.md similarity index 100% rename from src/site/ai/empty.md rename to llamacpp-ai-index-maven-plugin/src/site/ai/empty.md diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/CommonTestFixtures.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/CommonTestFixtures.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/CommonTestFixtures.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/CommonTestFixtures.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java similarity index 85% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java index 0fab08b..2c1b2dd 100644 --- a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java +++ b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java @@ -15,6 +15,7 @@ import java.util.Random; import net.ladenthin.maven.llamacpp.aiindex.config.AiModelDefinition; import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptDefinition; +import org.slf4j.Logger; @AnalyzeClasses(packages = "net.ladenthin.maven.llamacpp.aiindex", importOptions = ImportOption.DoNotIncludeTests.class) public class PluginArchitectureTest { @@ -43,8 +44,9 @@ public class PluginArchitectureTest { /** * Production code must not write to {@code System.out} / {@code System.err}; all output - * goes through Maven's {@link org.apache.maven.plugin.logging.Log}. Currently vacuous - * (no usage); acts as a regression guard. + * goes through an SLF4J {@link Logger} (mojo-lifecycle messages still use Maven's + * {@code Log} via {@code getLog()}). Currently vacuous (no usage); acts as a regression + * guard. */ @ArchTest static final ArchRule noSystemOutOrErrInProduction = noClasses() @@ -215,17 +217,40 @@ public class PluginArchitectureTest { .allowEmptyShould(true); /** - * The foundation layers ({@code config}, {@code support}) must be framework-free: no Maven - * API at all (not even {@code Log}). They are pure data + stateless utilities, so they can - * be unit-tested without a Maven runtime. + * Every layer except {@code mojo} must be framework-free: no Maven API at all (not even + * {@code Log} — logging in {@code indexer} goes through an SLF4J {@link Logger} instead). + * They are plain Java, so they can be unit-tested and eventually extracted into a + * standalone library without a Maven runtime. Only {@code mojo} is the Maven Plugin API + * boundary ({@code AbstractMojo}, {@code @Parameter}, {@code MojoExecutionException}, and + * the injected {@code getLog()} for mojo-lifecycle messages). */ @ArchTest - static final ArchRule foundationIsMavenFree = noClasses() + static final ArchRule nonMojoIsMavenFree = noClasses() .that() .resideInAnyPackage( - "net.ladenthin.maven.llamacpp.aiindex.config..", "net.ladenthin.maven.llamacpp.aiindex.support..") + "net.ladenthin.maven.llamacpp.aiindex.config..", + "net.ladenthin.maven.llamacpp.aiindex.support..", + "net.ladenthin.maven.llamacpp.aiindex.document..", + "net.ladenthin.maven.llamacpp.aiindex.prompt..", + "net.ladenthin.maven.llamacpp.aiindex.provider..", + "net.ladenthin.maven.llamacpp.aiindex.indexer..") .should() .dependOnClassesThat() .resideInAPackage("org.apache.maven..") .allowEmptyShould(true); + + /** + * Every SLF4J {@link Logger} field must be {@code private static final} — a single shared + * logger per class, never an instance field or a mutable/visible one. + */ + @ArchTest + static final ArchRule loggersArePrivateStaticFinal = fields().that() + .haveRawType(Logger.class) + .should() + .bePrivate() + .andShould() + .beStatic() + .andShould() + .beFinal() + .allowEmptyShould(true); } diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibrationTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibrationTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibrationTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibrationTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluatorTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluatorTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluatorTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluatorTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroupTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroupTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroupTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroupTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounterTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounterTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounterTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounterTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupportTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupportTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractorTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractorTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractorTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractorTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfigTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfigTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfigTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfigTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelectorTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelectorTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelectorTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelectorTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContextTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContextTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContextTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContextTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfigTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfigTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfigTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfigTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKindLincheckTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKindLincheckTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKindLincheckTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKindLincheckTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupportTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupportTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategyTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategyTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategyTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategyTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeConditionTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeConditionTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeConditionTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeConditionTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/JavaStructureFactPatternsTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/JavaStructureFactPatternsTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/JavaStructureFactPatternsTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/config/JavaStructureFactPatternsTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatterTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatterTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatterTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatterTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodecTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodecTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodecTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodecTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecProperties.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecProperties.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecProperties.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecProperties.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupportTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupportTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractorTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractorTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractorTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractorTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurementTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurementTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurementTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurementTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunnerTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunnerTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunnerTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunnerTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportRealModelTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportRealModelTest.java similarity index 97% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportRealModelTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportRealModelTest.java index 16faeba..77e31a5 100644 --- a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportRealModelTest.java +++ b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportRealModelTest.java @@ -25,7 +25,6 @@ import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport; import net.ladenthin.maven.llamacpp.aiindex.provider.LlamaCppJniAiGenerationProvider; import net.ladenthin.maven.llamacpp.aiindex.provider.LlamaCppJniConfig; -import org.apache.maven.plugin.logging.SystemStreamLog; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; @@ -120,8 +119,7 @@ public void mapReduceWithFacts_realModel_producesFactsPlusSummary() throws Excep final Path contextFile = Files.createTempFile("Data", ".java"); try (LlamaCppJniAiGenerationProvider provider = new LlamaCppJniAiGenerationProvider(jniConfig, promptSupport)) { - final AiFieldGenerationSupport support = - new AiFieldGenerationSupport(new SystemStreamLog(), provider, prep, models); + final AiFieldGenerationSupport support = new AiFieldGenerationSupport(provider, prep, models); final AiGenerationResult result = support.processFieldGenerations( Collections.singletonList(rule), contextFile, "file", source, header()); diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportTest.java similarity index 91% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportTest.java index a989c07..b0e62d2 100644 --- a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportTest.java +++ b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportTest.java @@ -10,6 +10,10 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -30,53 +34,61 @@ import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptPreparationSupport; import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport; import net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProvider; -import org.apache.maven.plugin.logging.SystemStreamLog; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; public class AiFieldGenerationSupportTest { /** - * Simple {@link Log} implementation that captures all messages passed to - * {@link #warn(CharSequence)} and {@link #info(CharSequence)} for later assertion. + * Lower bound on chunks needed to force a second reduce round: strictly above the production + * {@code MAX_REDUCE_FANIN} (16) so the reduce cannot combine every partial in a single call. */ - private static class WarnCapturingLog extends SystemStreamLog { + private static final long MIN_CHUNKS_FOR_TWO_REDUCE_ROUNDS = 16L; - private final List capturedWarnings = new ArrayList<>(); - private final List capturedInfos = new ArrayList<>(); + /** + * Captures the SLF4J log output of {@link AiFieldGenerationSupport} via a logback + * {@link ListAppender} attached directly to its logger, replacing the constructor-injected + * Maven {@code Log} the production class used previously. + */ + private ListAppender logAppender; - @Override - public void warn(final CharSequence content) { - capturedWarnings.add(content.toString()); - super.warn(content); - } + private static Logger loggerUnderTest() { + return (Logger) LoggerFactory.getLogger(AiFieldGenerationSupport.class); + } - @Override - public void info(final CharSequence content) { - capturedInfos.add(content.toString()); - super.info(content); - } + @BeforeEach + public void setUp() { + logAppender = new ListAppender<>(); + logAppender.start(); + final Logger logger = loggerUnderTest(); + logger.setLevel(Level.DEBUG); + logger.setAdditive(false); + logger.addAppender(logAppender); + } - public List getCapturedWarnings() { - return capturedWarnings; - } + @AfterEach + public void tearDown() { + loggerUnderTest().detachAppender(logAppender); + } - public List getCapturedInfos() { - return capturedInfos; + private List capturedMessages(final Level level) { + final List messages = new ArrayList<>(); + for (final ILoggingEvent event : logAppender.list) { + if (event.getLevel() == level) { + messages.add(event.getFormattedMessage()); + } } + return messages; } - /** - * Lower bound on chunks needed to force a second reduce round: strictly above the production - * {@code MAX_REDUCE_FANIN} (16) so the reduce cannot combine every partial in a single call. - */ - private static final long MIN_CHUNKS_FOR_TWO_REDUCE_ROUNDS = 16L; - - private WarnCapturingLog capturingLog; + private List getCapturedWarnings() { + return capturedMessages(Level.WARN); + } - @BeforeEach - public void setUp() { - capturingLog = new WarnCapturingLog(); + private List getCapturedInfos() { + return capturedMessages(Level.INFO); } // @@ -96,7 +108,6 @@ public void processFieldGenerations_providerReturnsNonEmpty_noWarningLogged() th final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createFilePromptDefinitions()); final AiGenerationProvider nonEmptyProvider = request -> "A real summary."; final AiFieldGenerationSupport support = new AiFieldGenerationSupport( - capturingLog, nonEmptyProvider, new AiPromptPreparationSupport(promptSupport), CommonTestFixtures.createDefaultAiModelDefinitionSupport()); @@ -106,7 +117,7 @@ public void processFieldGenerations_providerReturnsNonEmpty_noWarningLogged() th CommonTestFixtures.createFileFieldGenerations(), contextFile, "file", "public class Test {}", header); // assert - assertThat(capturingLog.getCapturedWarnings().isEmpty(), is(true)); + assertThat(getCapturedWarnings().isEmpty(), is(true)); } @Test @@ -125,7 +136,6 @@ public void processFieldGenerations_providerReturnsEmpty_warningContainsContextF final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createFilePromptDefinitions()); final AiGenerationProvider emptyProvider = request -> ""; final AiFieldGenerationSupport support = new AiFieldGenerationSupport( - capturingLog, emptyProvider, new AiPromptPreparationSupport(promptSupport), CommonTestFixtures.createDefaultAiModelDefinitionSupport()); @@ -139,8 +149,8 @@ public void processFieldGenerations_providerReturnsEmpty_warningContainsContextF header); // assert - assertThat(capturingLog.getCapturedWarnings().size(), is(equalTo(1))); - assertThat(capturingLog.getCapturedWarnings().get(0), containsString(contextFile.toString())); + assertThat(getCapturedWarnings().size(), is(equalTo(1))); + assertThat(getCapturedWarnings().get(0), containsString(contextFile.toString())); } @Test @@ -159,7 +169,6 @@ public void processFieldGenerations_providerReturnsEmpty_warningContainsPromptKe final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createFilePromptDefinitions()); final AiGenerationProvider emptyProvider = request -> ""; final AiFieldGenerationSupport support = new AiFieldGenerationSupport( - capturingLog, emptyProvider, new AiPromptPreparationSupport(promptSupport), CommonTestFixtures.createDefaultAiModelDefinitionSupport()); @@ -169,8 +178,8 @@ public void processFieldGenerations_providerReturnsEmpty_warningContainsPromptKe CommonTestFixtures.createFileFieldGenerations(), contextFile, "file", "public class Test {}", header); // assert - assertThat(capturingLog.getCapturedWarnings().size(), is(equalTo(1))); - assertThat(capturingLog.getCapturedWarnings().get(0), containsString(CommonTestFixtures.PROMPT_KEY_FILE_BODY)); + assertThat(getCapturedWarnings().size(), is(equalTo(1))); + assertThat(getCapturedWarnings().get(0), containsString(CommonTestFixtures.PROMPT_KEY_FILE_BODY)); } @Test @@ -189,7 +198,6 @@ public void processFieldGenerations_providerReturnsEmpty_resultBodyIsEmpty() thr final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createFilePromptDefinitions()); final AiGenerationProvider emptyProvider = request -> ""; final AiFieldGenerationSupport support = new AiFieldGenerationSupport( - capturingLog, emptyProvider, new AiPromptPreparationSupport(promptSupport), CommonTestFixtures.createDefaultAiModelDefinitionSupport()); @@ -227,7 +235,6 @@ public String generate(final AiGenerationRequest request) { } }; final AiFieldGenerationSupport support = new AiFieldGenerationSupport( - capturingLog, alwaysEmptyProvider, new AiPromptPreparationSupport(promptSupport), CommonTestFixtures.createDefaultAiModelDefinitionSupport()); @@ -238,7 +245,7 @@ public String generate(final AiGenerationRequest request) { // assert — provider invoked exactly once (no retries), one warning, empty body assertThat(callCount.get(), is(equalTo(1))); - assertThat(capturingLog.getCapturedWarnings().size(), is(equalTo(1))); + assertThat(getCapturedWarnings().size(), is(equalTo(1))); assertThat(result.body(), is(equalTo(""))); } @@ -263,7 +270,6 @@ public String generate(final AiGenerationRequest request) { } }; final AiFieldGenerationSupport support = new AiFieldGenerationSupport( - capturingLog, alwaysEmptyProvider, new AiPromptPreparationSupport(promptSupport), CommonTestFixtures.createDefaultAiModelDefinitionSupport()); @@ -274,7 +280,7 @@ public String generate(final AiGenerationRequest request) { // assert — exactly three INFO lines: the per-file processing/ETA line, the generation line, // and the measured actual-duration line. No retry lines (the retry mechanism was removed). - final List infos = capturingLog.getCapturedInfos(); + final List infos = getCapturedInfos(); assertThat(infos.size(), is(equalTo(3))); // First message: the per-file processing line with size + token + duration estimate @@ -325,8 +331,7 @@ private AiFieldGenerationSupport supportWith(final AiGenerationProvider provider private AiFieldGenerationSupport supportWithModels( final AiGenerationProvider provider, final AiModelDefinitionSupport models) { final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createFilePromptDefinitions()); - return new AiFieldGenerationSupport( - capturingLog, provider, new AiPromptPreparationSupport(promptSupport), models); + return new AiFieldGenerationSupport(provider, new AiPromptPreparationSupport(promptSupport), models); } /** A model with a normal window, so a small source fits and is NOT treated as over-window. */ @@ -529,7 +534,7 @@ public void onOversize_mapReduce_unbounded_reducesHierarchicallyInMultipleRounds largeSource(3000), anyHeader()); - final List infos = capturingLog.getCapturedInfos(); + final List infos = getCapturedInfos(); final long mapChunks = infos.stream().filter(m -> m.contains("summarized (")).count(); final boolean hasRound1 = infos.stream().anyMatch(m -> m.contains("reduce round 1:")); diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlanTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlanTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlanTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlanTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculatorTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculatorTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculatorTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculatorTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexerTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexerTest.java similarity index 98% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexerTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexerTest.java index d80e8e7..a23c133 100644 --- a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexerTest.java +++ b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexerTest.java @@ -26,7 +26,6 @@ import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport; import net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProvider; import net.ladenthin.maven.llamacpp.aiindex.provider.MockAiGenerationProvider; -import org.apache.maven.plugin.logging.SystemStreamLog; import org.junit.jupiter.api.Test; public class PackageIndexerTest { @@ -59,7 +58,6 @@ public void aggregate_singleChildFile_createsPackageAiMdFile() throws Exception final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createPackagePromptDefinitions()); final PackageIndexer indexer = new PackageIndexer( - new SystemStreamLog(), baseDirectory, outputRoot, "1.0.0", @@ -113,7 +111,6 @@ public void aggregate_childFileBodies_areEmbeddedInPackageSourceText() throws Ex final CapturingProvider provider = new CapturingProvider(); final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createPackagePromptDefinitions()); final PackageIndexer indexer = new PackageIndexer( - new SystemStreamLog(), temp, outputRoot, "1.0.0", @@ -153,7 +150,6 @@ public void aggregate_subPackageBody_isEmbeddedInParentSourceText() throws Excep final CapturingProvider provider = new CapturingProvider(); final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createPackagePromptDefinitions()); final PackageIndexer indexer = new PackageIndexer( - new SystemStreamLog(), temp, outputRoot, "1.0.0", @@ -205,7 +201,6 @@ public void aggregate_projectAiMdInOutputRoot_isNotEmbeddedAsChild() throws Exce final CapturingProvider provider = new CapturingProvider(); final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createPackagePromptDefinitions()); final PackageIndexer indexer = new PackageIndexer( - new SystemStreamLog(), temp, outputRoot, "1.0.0", @@ -243,7 +238,6 @@ public void aggregate_packageHeader_listsChildLinksInHeader() throws Exception { final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createPackagePromptDefinitions()); final PackageIndexer indexer = new PackageIndexer( - new SystemStreamLog(), temp, outputRoot, "1.0.0", diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexerTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexerTest.java similarity index 90% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexerTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexerTest.java index f62b71f..770d0dd 100644 --- a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexerTest.java +++ b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexerTest.java @@ -24,7 +24,6 @@ import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptDefinition; import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport; import net.ladenthin.maven.llamacpp.aiindex.provider.MockAiGenerationProvider; -import org.apache.maven.plugin.logging.SystemStreamLog; import org.junit.jupiter.api.Test; public class ProjectIndexerTest { @@ -47,8 +46,7 @@ public void aggregate_multiplePackages_writesProjectIndexHeaderAndListing() thro "main/java/com/example/billing", "> Creates and sends invoices.\n\n#### Purpose\n- billing\n"); - final ProjectIndexer indexer = - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false); + final ProjectIndexer indexer = new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false); // act final int written = indexer.aggregate(outputRoot); @@ -91,8 +89,7 @@ public void aggregate_noPackages_writesNothing() throws Exception { final Path outputRoot = Files.createTempDirectory("ai-index-test").resolve("ai"); Files.createDirectories(outputRoot); - final ProjectIndexer indexer = - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false); + final ProjectIndexer indexer = new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false); // act final int written = indexer.aggregate(outputRoot); @@ -114,13 +111,10 @@ public void aggregate_unchanged_isNotRewritten() throws Exception { "> Example package.\n"); // first run writes the file - assertThat( - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot), - is(equalTo(1))); + assertThat(new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot), is(equalTo(1))); // act: a second run over the same packages must detect no change - final int second = - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot); + final int second = new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot); // assert assertThat(second, is(equalTo(0))); @@ -134,11 +128,10 @@ public void aggregate_force_rewritesEvenWhenUnchanged() throws Exception { outputRoot.resolve("main/java/com/example/package.ai.md"), "main/java/com/example", "> Example package.\n"); - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot); + new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot); // act: force=true rewrites despite no content change - final int forced = - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", true).aggregate(outputRoot); + final int forced = new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", true).aggregate(outputRoot); // assert assertThat(forced, is(equalTo(1))); @@ -152,8 +145,7 @@ public void aggregate_packageWithoutLead_listsPathWithoutLeadSeparator() throws final Path outputRoot = Files.createTempDirectory("ai-index-test").resolve("ai"); writePackageFile(outputRoot.resolve("main/java/com/example/package.ai.md"), "main/java/com/example", ""); - final ProjectIndexer indexer = - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false); + final ProjectIndexer indexer = new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false); // act indexer.aggregate(outputRoot); @@ -173,8 +165,7 @@ public void aggregate_rootPackage_isListedAsDot() throws Exception { final Path outputRoot = Files.createTempDirectory("ai-index-test").resolve("ai"); writePackageFile(outputRoot.resolve("package.ai.md"), "ai", "> The whole project.\n"); - final ProjectIndexer indexer = - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false); + final ProjectIndexer indexer = new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false); // act indexer.aggregate(outputRoot); @@ -220,7 +211,7 @@ public void aggregate_overviewDisabled_hasNoOverviewSection() throws Exception { "> Example package.\n"); // act: the deterministic constructor performs no AI call - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot); + new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot); // assert final AiMdDocument document = documentCodec.read(outputRoot.resolve(AiMdHeaderCodec.PROJECT_AI_MD_FILENAME)); @@ -255,9 +246,7 @@ public void aggregate_enablingOverview_rewritesPreviouslyDeterministicIndex() th outputRoot.resolve("main/java/com/example/package.ai.md"), "main/java/com/example", "> Example package.\n"); - assertThat( - new ProjectIndexer(new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot), - is(equalTo(1))); + assertThat(new ProjectIndexer(PROJECT_TITLE, "1.0.0", "0.0.0", false).aggregate(outputRoot), is(equalTo(1))); // act: enabling the overview changes the generation signature in the checksum -> regenerate final int rewritten = overviewIndexer(false).aggregate(outputRoot); @@ -293,7 +282,6 @@ private ProjectIndexer overviewIndexer(final boolean force) { final AiPromptSupport promptSupport = new AiPromptSupport(Collections.singletonList(prompt)); return new ProjectIndexer( - new SystemStreamLog(), PROJECT_TITLE, "1.0.0", "0.0.0", diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexerTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexerTest.java similarity index 98% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexerTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexerTest.java index 26871ed..709a98f 100644 --- a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexerTest.java +++ b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexerTest.java @@ -23,7 +23,6 @@ import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptPreparationSupport; import net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport; import net.ladenthin.maven.llamacpp.aiindex.provider.MockAiGenerationProvider; -import org.apache.maven.plugin.logging.SystemStreamLog; import org.junit.jupiter.api.Test; public class SourceFileIndexerTest { @@ -37,7 +36,6 @@ private SourceFileIndexer indexer( final long minSizeBytes, final long maxSizeBytes) { return new SourceFileIndexer( - new SystemStreamLog(), baseDirectory, outputRoot, Arrays.asList(".java"), @@ -53,7 +51,6 @@ private SourceFileIndexer indexer( private AiFieldGenerationSupport mockSupport() { final AiPromptSupport promptSupport = new AiPromptSupport(CommonTestFixtures.createFilePromptDefinitions()); return new AiFieldGenerationSupport( - new SystemStreamLog(), new MockAiGenerationProvider(), new AiPromptPreparationSupport(promptSupport), CommonTestFixtures.createDefaultAiModelDefinitionSupport()); diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/jcstress/AiGenerationKindRace.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/jcstress/AiGenerationKindRace.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/jcstress/AiGenerationKindRace.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/jcstress/AiGenerationKindRace.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/mojo/MojoPhaseSkipTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/mojo/MojoPhaseSkipTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/mojo/MojoPhaseSkipTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/mojo/MojoPhaseSkipTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPromptTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPromptTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPromptTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPromptTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupportTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupportTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupportTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupportTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParserTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParserTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParserTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParserTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderDefaultTimingsTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderDefaultTimingsTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderDefaultTimingsTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderDefaultTimingsTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactoryTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactoryTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactoryTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactoryTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimingsTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimingsTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimingsTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimingsTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProviderTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProviderTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProviderTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProviderTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProviderTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProviderTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProviderTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProviderTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupportTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupportTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummaryTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummaryTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummaryTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummaryTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimatorTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimatorTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimatorTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimatorTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupportTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupportTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupportTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBarTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBarTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBarTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBarTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunkerTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunkerTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunkerTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunkerTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilterTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilterTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilterTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilterTest.java diff --git a/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java new file mode 100644 index 0000000..0d5220e --- /dev/null +++ b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2026 Bernard Ladenthin +// +// SPDX-License-Identifier: Apache-2.0 +package net.ladenthin.maven.llamacpp.aiindex.support; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.time.Instant; +import org.junit.jupiter.api.Test; + +public class AiTimeSupportTest { + + private final AiTimeSupport timeSupport = new AiTimeSupport(); + + @Test + public void formatInstant_formatsAsIso8601WithSecondPrecision() { + Instant instant = Instant.parse("2026-01-02T03:04:05.678Z"); + assertThat(timeSupport.formatInstant(instant), is("2026-01-02T03:04:05Z")); + } + + @Test + public void formatInstant_epoch_matchesEpochDateConstant() { + // Ties the two derivations of the Unix epoch string together: EPOCH_DATE is a static-context + // constant (used as a fold seed by PackageIndexer/ProjectIndexer, where no instance-bound + // formatInstant call is convenient), formatInstant is the instance-bound formatter every other + // timestamp in a .ai.md header goes through. Both must agree. + assertThat(timeSupport.formatInstant(Instant.EPOCH), is(AiTimeSupport.EPOCH_DATE)); + } + + @Test + public void epochDate_isTheUnixEpochInIso8601() { + assertThat(AiTimeSupport.EPOCH_DATE, is("1970-01-01T00:00:00Z")); + } +} diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelperTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelperTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelperTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelperTest.java diff --git a/src/test/java/net/ladenthin/maven/llamacpp/aiindex/vmlens/VmlensInterleavingSmokeTest.java b/llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/vmlens/VmlensInterleavingSmokeTest.java similarity index 100% rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/vmlens/VmlensInterleavingSmokeTest.java rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/vmlens/VmlensInterleavingSmokeTest.java diff --git a/src/test/resources/SmolLM2-135M-Instruct-Q3_K_M.gguf b/llamacpp-ai-index-maven-plugin/src/test/resources/SmolLM2-135M-Instruct-Q3_K_M.gguf similarity index 100% rename from src/test/resources/SmolLM2-135M-Instruct-Q3_K_M.gguf rename to llamacpp-ai-index-maven-plugin/src/test/resources/SmolLM2-135M-Instruct-Q3_K_M.gguf diff --git a/pom.xml b/pom.xml index bcf86b0..31c443f 100644 --- a/pom.xml +++ b/pom.xml @@ -11,12 +11,12 @@ SPDX-License-Identifier: Apache-2.0 4.0.0 net.ladenthin - llamacpp-ai-index-maven-plugin - 1.0.3-SNAPSHOT - maven-plugin + srcmorph-parent + 1.1.0-SNAPSHOT + pom - llamacpp-ai-index-maven-plugin - Free Maven plugin for hierarchical AI-readable indexing and summarization of source code projects using llama.cpp-compatible local models. + ${project.groupId}:${project.artifactId} + Reactor parent for srcmorph: a prompt-driven source-tree transformer using local llama.cpp models, and its Maven plugin. https://github.com/bernardladenthin/llamacpp-ai-index-maven-plugin @@ -52,87 +52,15 @@ SPDX-License-Identifier: Apache-2.0 - - bernardladenthin - 8 - 21 - UTF-8 - 3.15.2 - 3.9.16 - - 5.0.6 - - - - gpt-oss-20B-mxfp4 - - -1 - - -1 - - - 6.1.2 - 3.0 - 1.37 - 0.16 - 3.6 - 1.2.28 - 2.50.0 - 0.13.7 - 1.0.0 - 4.2.1 - - 1.9.3 - 1.4.2 - 4.10.2.0 - 1.18.46 - 7.7.4 - 1.14.0 - 3.8.0 - 2.94.0 - - ${project.basedir}/src/site/ai - - - true - - - - ${git.commit.time} - - + + + llamacpp-ai-index-maven-plugin + @@ -146,650 +74,25 @@ SPDX-License-Identifier: Apache-2.0 slf4j-api 2.0.18 + + + ch.qos.logback + logback-classic + 1.5.37 + - - - org.projectlombok - lombok - ${lombok.version} - provided - - - org.jspecify - jspecify - ${jspecify.version} - - - org.checkerframework - checker-qual - ${checker.version} - - - net.ladenthin - llama - ${llama.version} - ${llama.classifier} - - - - org.apache.maven - maven-plugin-api - ${maven.version} - provided - - - - org.apache.maven.plugin-tools - maven-plugin-annotations - ${maven.plugin.tools.version} - provided - - - - org.junit.jupiter - junit-jupiter - ${junit.version} - test - - - - org.hamcrest - hamcrest - ${hamcrest.version} - test - - - net.jqwik - jqwik - ${jqwik.version} - test - - - com.tngtech.archunit - archunit-junit5 - ${archunit.version} - test - - - org.openjdk.jmh - jmh-core - ${jmh.version} - test - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - test - - - org.openjdk.jcstress - jcstress-core - ${jcstress.version} - test - - - org.jetbrains.lincheck - lincheck - ${lincheck.version} - test - + - - com.vmlens - api - ${vmlens.version} - test - - - - - - - - com.diffplug.spotless - spotless-maven-plugin - ${spotless.version} - - - com.github.spotbugs - spotbugs-maven-plugin - ${spotbugs.version} - - - com.vmlens - vmlens-maven-plugin - ${vmlens.version} - - - io.github.git-commit-id - git-commit-id-maven-plugin - 10.0.0 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.15.0 - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.6.3 - - - org.apache.maven.plugins - maven-gpg-plugin - 3.2.8 - - - org.apache.maven.plugins - maven-jar-plugin - 3.5.0 - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.12.0 - - - org.apache.maven.plugins - maven-plugin-plugin - ${maven.plugin.tools.version} - - - org.apache.maven.plugins - maven-source-plugin - 3.4.0 - - - org.apache.maven.plugins - maven-surefire-plugin - 3.5.6 - - - @{argLine} -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=. -XX:ErrorFile=hs_err_pid%p.log - - - **/VmlensInterleavingSmokeTest.java - - - - - org.codehaus.mojo - exec-maven-plugin - 3.6.3 - - - org.jacoco - jacoco-maven-plugin - 0.8.15 - - - org.pitest - pitest-maven - 1.25.7 - - - org.sonatype.central - central-publishing-maven-plugin - 0.11.0 - - - - - - io.github.git-commit-id - git-commit-id-maven-plugin - - - get-git-properties - - revision - - initialize - - - - yyyy-MM-dd'T'HH:mm:ss'Z' - UTC - false - false - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-maven - - enforce - - - - - [3.6.3,) - - - [1.8,) - - - - - - commons-logging:commons-logging - - log4j:log4j - - org.hamcrest:hamcrest-core - org.hamcrest:hamcrest-library - org.hamcrest:hamcrest-all - - junit:junit - junit:junit-dep - - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${maven.compiler.release} - ${maven.compiler.testRelease} - true - true - - - -Xlint:all,-serial,-options,-classfile,-processing - -Werror - - -processor - lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor,org.checkerframework.checker.nullness.NullnessChecker - - -AskipDefs=^net\.ladenthin\.llamacpp_ai_index_maven_plugin\..*$ - -XDaddTypeAnnotationsToSymbol=true - -XDcompilePolicy=simple - --should-stop=ifError=FLOW - - -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* -Xep:NullAway:ERROR -XepOpt:NullAway:OnlyNullMarked=true -XepOpt:NullAway:ExcludedFieldAnnotations=org.apache.maven.plugins.annotations.Parameter,org.apache.maven.plugins.annotations.Component -XepOpt:NullAway:JSpecifyMode=true -XepOpt:NullAway:CheckOptionalEmptiness=true -XepOpt:NullAway:AcknowledgeRestrictiveAnnotations=true -XepOpt:NullAway:AcknowledgeAndroidRecent=true -XepOpt:NullAway:AssertsEnabled=true -Xep:BoxedPrimitiveEquality:ERROR -Xep:EqualsHashCode:ERROR -Xep:EqualsIncompatibleType:ERROR -Xep:IdentityBinaryExpression:ERROR -Xep:SelfAssignment:ERROR -Xep:SelfComparison:ERROR -Xep:SelfEquals:ERROR -Xep:DeadException:ERROR -Xep:FormatString:ERROR -Xep:InvalidPatternSyntax:ERROR -Xep:OptionalEquality:ERROR -Xep:ImpossibleNullComparison:ERROR - - - - org.projectlombok - lombok - ${lombok.version} - - - com.google.errorprone - error_prone_core - ${errorprone.version} - - - com.uber.nullaway - nullaway - ${nullaway.version} - - - org.checkerframework - checker - ${checker.version} - - - - - - default-compile - - - - module-info.java - - - - - module-info-compile - compile - - compile - - - - 9 - - module-info.java - - - - - - - default-testCompile - - - false - - -XDaddTypeAnnotationsToSymbol=true - -XDcompilePolicy=simple - --should-stop=ifError=FLOW - -Xplugin:ErrorProne -Xep:NullAway:OFF -Xep:GuardedBy:OFF -Xep:IdentityBinaryExpression:OFF - - - - org.openjdk.jcstress - jcstress-core - ${jcstress.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - verify - - jar-no-fork - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - ${maven.compiler.release} - true - true - all - - **/HelpMojo.java - - - - - attach-javadocs - - jar - - - - - - - org.apache.maven.plugins - maven-plugin-plugin - - ai-index - - - - default-descriptor - - descriptor - - - - help-goal - - helpmojo - - - - - - - org.jacoco - jacoco-maven-plugin - - - prepare-agent - - prepare-agent - - - - report - test - - report - - - - - - com.diffplug.spotless - spotless-maven-plugin - - - - src/main/java/**/*.java - src/test/java/**/*.java - - - ${palantir-java-format.version} - - - - - - - - - spotless-check - verify - - check - - - - - - com.github.spotbugs - spotbugs-maven-plugin - - Max - Low - true - false - spotbugs-exclude.xml - - - com.mebigfatguy.fb-contrib - fb-contrib - ${fb-contrib.version} - - - com.h3xstream.findsecbugs - findsecbugs-plugin - ${findsecbugs.version} - - - - - - spotbugs-check - verify - - check - - - - - - org.codehaus.mojo - exec-maven-plugin - - org.openjdk.jmh.Main - test - - - - - org.pitest - pitest-maven - - - org.pitest - pitest-junit5-plugin - 1.2.3 - - - - - - net.ladenthin.maven.llamacpp.aiindex.config.AiCalibration - net.ladenthin.maven.llamacpp.aiindex.config.AiCondition - net.ladenthin.maven.llamacpp.aiindex.config.AiConditionEvaluator - net.ladenthin.maven.llamacpp.aiindex.config.AiFieldGenerationConfig - net.ladenthin.maven.llamacpp.aiindex.config.AiFieldGenerationSelector - net.ladenthin.maven.llamacpp.aiindex.config.AiFileContext - net.ladenthin.maven.llamacpp.aiindex.config.AiGenerationConfig - net.ladenthin.maven.llamacpp.aiindex.config.AiRangeCondition - net.ladenthin.maven.llamacpp.aiindex.config.AiModelDefinition - net.ladenthin.maven.llamacpp.aiindex.config.AiModelDefinitionSupport - net.ladenthin.maven.llamacpp.aiindex.indexer.AiCalibrationMeasurement - net.ladenthin.maven.llamacpp.aiindex.indexer.AiInputWindowCalculator - net.ladenthin.maven.llamacpp.aiindex.document.AiGenerationRequest - net.ladenthin.maven.llamacpp.aiindex.document.AiGenerationResult - net.ladenthin.maven.llamacpp.aiindex.document.AiMdChildEntryLineFormatter - net.ladenthin.maven.llamacpp.aiindex.document.AiMdDocument - net.ladenthin.maven.llamacpp.aiindex.document.AiMdHeader - net.ladenthin.maven.llamacpp.aiindex.document.AiMdHeaderSupport - net.ladenthin.maven.llamacpp.aiindex.document.AiMdLeadExtractor - net.ladenthin.maven.llamacpp.aiindex.prompt.AiPreparedPrompt - net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptDefinition - net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptPreparationSupport - net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport - net.ladenthin.maven.llamacpp.aiindex.provider.AiCompletionParser - net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationTimings - net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProvider - net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProviderFactory - net.ladenthin.maven.llamacpp.aiindex.provider.MockAiGenerationProvider - net.ladenthin.maven.llamacpp.aiindex.config.AiOversizeStrategy - net.ladenthin.maven.llamacpp.aiindex.config.AiFactCounter - net.ladenthin.maven.llamacpp.aiindex.config.AiFactDefinition - net.ladenthin.maven.llamacpp.aiindex.config.AiFactDefinitionSupport - net.ladenthin.maven.llamacpp.aiindex.config.AiFactExtractor - net.ladenthin.maven.llamacpp.aiindex.support.AiChecksumSupport - net.ladenthin.maven.llamacpp.aiindex.support.AiDeterministicSummary - net.ladenthin.maven.llamacpp.aiindex.support.AiGenerationTimeEstimator - net.ladenthin.maven.llamacpp.aiindex.support.AiPathSupport - net.ladenthin.maven.llamacpp.aiindex.support.AiProgressBar - net.ladenthin.maven.llamacpp.aiindex.support.AiSourceExcludeFilter - net.ladenthin.maven.llamacpp.aiindex.support.AiTimeSupport - net.ladenthin.maven.llamacpp.aiindex.support.Java8CompatibilityHelper - - - net.ladenthin.maven.llamacpp.aiindex.* - - 100 - 30000 - - - - - - - - - gpu-cuda - - cuda13-windows-x86-64 - - - - gpu-vulkan - - vulkan-windows-x86-64 - - - release @@ -797,6 +100,9 @@ SPDX-License-Identifier: Apache-2.0 org.apache.maven.plugins maven-gpg-plugin + + 3.2.8 sign-artifacts @@ -816,6 +122,9 @@ SPDX-License-Identifier: Apache-2.0 org.sonatype.central central-publishing-maven-plugin + + 0.11.0 true central @@ -829,1564 +138,5 @@ SPDX-License-Identifier: Apache-2.0 - - - ai-index-selftest - - - - ${project.groupId} - ${project.artifactId} - ${project.version} - - - ${ai.index.output.directory} - - - src/main/java/net/ladenthin/maven/llamacpp/aiindex/config - src/main/java/net/ladenthin/maven/llamacpp/aiindex/provider - - - - - **/package-info.java - **/module-info.java - - - llamacpp-jni - - - - - - - Mistral-7B-Instruct-v0.3-Q4_K_M-C16k - X:/Modelle/Mistral-7B-Instruct-v0.3-Q4_K_M.gguf - 16384 - 2048 - 1.0 - 8 - 4 - true - 1.1 - - - - Meta-Llama-3.1-8B-Instruct-Q5_K_M-C32k - X:/Modelle/Meta-Llama-3.1-8B-Instruct-Q5_K_M.gguf - 32768 - 1536 - 1.0 - 8 - 4 - true - 1.1 - - - - Codestral-22B-v0.1-Q4_K_M-C32k - X:/Modelle/Codestral-22B-v0.1-Q4_K_M.gguf - 32768 - 1536 - 1.0 - 8 - 4 - true - 1.1 - - - - Codestral-22B-v0.1-Q6_K-C32k - X:/Modelle/Codestral-22B-v0.1-Q6_K.gguf - 32768 - 1536 - 1.0 - 8 - 4 - true - 1.1 - - - - Qwen2.5-Coder-7B-Instruct-Q5_K_M-C16k - X:/Modelle/qwen2.5-coder-7b-instruct-q5_k_m.gguf - 16384 - 2048 - 1.0 - 8 - 4 - true - 1.1 - - - - Ministral-3-8B-Instruct-2512-Q4_K_M-C32k - X:/Modelle/Ministral-3-8B-Instruct-2512-Q4_K_M.gguf - 32768 - 2048 - 0.1 - 8 - 4 - true - 1.1 - - - - Ministral-3-14B-Instruct-2512-Q4_K_M-C32k - X:/Modelle/Ministral-3-14B-Instruct-2512-Q4_K_M.gguf - 32768 - 2048 - 0.1 - 8 - 4 - true - 1.1 - - - - Ministral-3-8B-Instruct-2512-Q5_K_M-C32k - X:/Modelle/Ministral-3-8B-Instruct-2512-Q5_K_M.gguf - 32768 - 2048 - 0.1 - 8 - 4 - true - 1.1 - - - - Ministral-3-14B-Instruct-2512-Q5_K_M-C32k - X:/Modelle/Ministral-3-14B-Instruct-2512-Q5_K_M.gguf - 32768 - 2048 - 0.1 - 8 - 4 - true - 1.1 - - - - Gemma-4-26B-A4B-it-UD-Q4_K_M-C32k - X:/Modelle/gemma-4-26B-A4B-it-UD-Q4_K_M.gguf - 32768 - 8192 - 1.0 - 8 - 4 - true - 0.95 - 64 - 1.1 - false - - <end_of_turn> - - - - - Gemma-4-12B-it-Q4_K_M-C32k - X:/Modelle/gemma-4-12B-it-Q4_K_M.gguf - 32768 - 8192 - 1.0 - 8 - 4 - true - 0.95 - 64 - 1.1 - false - - <end_of_turn> - - - - - Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q4_K_M-C32k - X:/Modelle/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf - 32768 - 8192 - 1.0 - 8 - 4 - true - 0.95 - 64 - 1.1 - false - - <end_of_turn> - - - - - Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q6_K_P-C32k - X:/Modelle/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q6_K_P.gguf - 32768 - 8192 - 1.0 - 8 - 4 - true - 0.95 - 64 - 1.1 - false - - <end_of_turn> - - - - - Qwen3-Coder-30B-A3B-Instruct-UD-Q4_K_XL-C64k - X:/Modelle/Qwen3-Coder-30B-A3B-Instruct-UD-Q4_K_XL.gguf - - 16384 - 1536 - 0.7 - 8 - 4 - true - 0.8 - 20 - 1.05 - ${ai.cachePrompt} - - - - Qwen2.5-Coder-14B-Instruct-Q4_K_M-C32k - X:/Modelle/Qwen2.5-Coder-14B-Instruct-Q4_K_M.gguf - 32768 - 2048 - 0.7 - 8 - 4 - true - 0.8 - 20 - 1.05 - - - - Qwen3-4B-Instruct-2507-Q5_K_M-C32k - X:/Modelle/Qwen3-4B-Instruct-2507-Q5_K_M.gguf - 32768 - 2048 - 0.7 - 8 - 4 - true - 0.8 - 20 - 1.05 - - - - Granite-4.0-H-Tiny-Q4_K_M-C128k - X:/Modelle/ibm-granite_granite-4.0-h-tiny-Q4_K_M.gguf - 131072 - 2048 - 0.2 - 8 - 4 - true - 1.1 - - - - Granite-4.0-H-Small-Q4_K_M-C128k - X:/Modelle/ibm-granite_granite-4.0-h-small-Q4_K_M.gguf - 131072 - 2048 - 0.2 - 8 - 4 - true - 1.1 - - - - EXP-Qwen3.5-4B - X:/Modelle/Qwen3.5-4B-Q4_K_M.gguf - 16384 - 1536 - 0.7 - 8 - 4 - true - 0.8 - 20 - 1.05 - false - - - EXP-Qwen2.5-Coder-7B - X:/Modelle/qwen2.5-coder-7b-instruct-q5_k_m.gguf - 16384 - 1536 - 0.7 - 8 - 4 - true - 0.8 - 20 - 1.05 - - - - gpt-oss-20B-c16k - X:/Modelle/gpt-oss-20b-UD-Q4_K_XL.gguf - 16384 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 2048 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - gpt-oss-20B-c48k - X:/Modelle/gpt-oss-20b-UD-Q4_K_XL.gguf - 49152 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 4096 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - gpt-oss-20B-c96k - X:/Modelle/gpt-oss-20b-UD-Q4_K_XL.gguf - 98304 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 6144 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - - - gpt-oss-20B-mxfp4 - X:/Modelle/gpt-oss-20b-mxfp4.gguf - 98304 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 6144 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - gpt-oss-20B-Q4_K_M - X:/Modelle/gpt-oss-20b-Q4_K_M.gguf - 98304 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 6144 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - gpt-oss-20B-Q5_K_M - X:/Modelle/gpt-oss-20b-Q5_K_M.gguf - 98304 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 6144 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - gpt-oss-20B-Q8_0 - X:/Modelle/gpt-oss-20b-Q8_0.gguf - 98304 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 6144 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - gpt-oss-20B-F16 - X:/Modelle/gpt-oss-20b-F16.gguf - 98304 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 6144 - 0.7 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - low - - - - - granite-4.0-h-tiny-bigwindow - X:/Modelle/granite-4.0-h-tiny-Q4_K_M.gguf - 393216 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 4096 - 0.2 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - - - - - - granite-4.0-h-1b-fastchunk - X:/Modelle/granite-4.0-h-1b-Q4_K_M.gguf - 16384 - ${ai.gpuLayers} - ${ai.mainGpu} - ${ai.devices} - 1536 - 0.2 - 8 - 3 - true - 1.0 - 0 - 0.05 - 1.0 - - - - - EXP-Qwen3-Coder-30B - X:/Modelle/Qwen3-Coder-30B-A3B-Instruct-UD-Q4_K_XL.gguf - 16384 - 1536 - 0.7 - 8 - 4 - true - 0.8 - 20 - 1.05 - - - - EXP-DeepSeek-Coder-V2-Lite - X:/Modelle/DeepSeek-Coder-V2-Lite-Instruct-Q4_K_M.gguf - 16384 - 1536 - 0.3 - 8 - 4 - true - 0.9 - 40 - 1.05 - - - EXP-Seed-Coder-8B - X:/Modelle/Seed-Coder-8B-Instruct-Q4_K_M.gguf - 16384 - 1536 - 0.3 - 8 - 4 - true - 0.9 - 40 - 1.05 - - - EXP-Granite-4.0-H-Tiny - X:/Modelle/granite-4.0-h-tiny-Q4_K_M.gguf - 16384 - 1536 - 0.0 - 8 - 4 - true - 1.0 - 0 - 1.0 - - - - EXP-Granite-4.0-H-Small - X:/Modelle/granite-4.0-h-small-UD-Q4_K_XL.gguf - 16384 - 1536 - 0.0 - 8 - 4 - true - 1.0 - 0 - 1.0 - - - EXP-Qwen3-4B-Instruct-2507 - X:/Modelle/Qwen3-4B-Instruct-2507-Q4_K_M.gguf - 16384 - 1536 - 0.7 - 8 - 4 - true - 0.8 - 20 - 1.05 - - - - - - - file-body-java - - - - file-body-sql - - - - file-body-fallback - - - - package-body - - - - project-body - - - - - file-body-java-v2 - - - - package-body-v2 - - - - - - - - - - ai-generate - generate-resources - - generate - - - - - .java - .sql - - - - - java-facts - - (?m)^\s*(?:public\s+|final\s+|abstract\s+|sealed\s+|non-sealed\s+|static\s+)*(?:class|interface|enum|record)\s+\w - \bpublic\b - \b(?:TODO|FIXME)\b - @Override\b - - (?m)^[ \t]*(?:(?:public|private|protected|static|final|abstract|default|synchronized|native|strictfp)[ \t]+)*(?:<[^>]+>[ \t]*)?(?!(?:if|for|while|switch|catch|return|new|else|do|try|synchronized|assert|throw)\b)[A-Za-z_$][\w$.]*(?:<[^;{}=]*>)?(?:\[\])*[ \t]+([A-Za-z_$]\w*)[ \t]*\([^;{]*\)(?:[ \t]*throws[ \t][\w$., \t]+)?[ \t]*[{;] - (?m)^[ \t]*(?:(?:public|private|protected)[ \t]+)?([A-Z][A-Za-z0-9_$]*)[ \t]*\([^;{]*\)(?:[ \t]*throws[ \t][\w$., \t]+)?[ \t]*\{ - (?m)^[ \t]*(?:(?:public|private|protected|static|transient|volatile|final)[ \t]+)*(?:public|private|protected|static|transient|volatile)[ \t]+(?:(?:public|private|protected|static|transient|volatile|final)[ \t]+)*(?!class\b|interface\b|enum\b|record\b|void\b|new\b)[A-Za-z_$][\w$.]*(?:<[^;{}=]*>)?(?:\[\])*[ \t]+([A-Za-z_$]\w*(?:[ \t]*,[ \t]*[A-Za-z_$]\w*)*)[ \t]*(?:=[^;]*)?; - - - - sql-facts - - (?im)^\s*INSERT\s+INTO\b - (?im)^\s*CREATE\s+TABLE\b - (?im)^\s*CREATE\s+(?:OR\s+REPLACE\s+)?VIEW\b - (?im)^\s*CREATE\s+(?:UNIQUE\s+)?INDEX\b - (?im)^\s*CREATE\s+(?:OR\s+REPLACE\s+)?(?:FUNCTION|PROCEDURE)\b - - - - - - - huge-java - file-body-java - granite-4.0-h-1b-fastchunk - 200 - - mapReduce - 6 - java-facts - - - - - .java - - - 1000000 - - - - - - - huge-sql - file-body-sql - granite-4.0-h-1b-fastchunk - 200 - mapReduce - 6 - - sql-facts - - - - - .sql - - - 1000000 - - - - - - - big-window-java - file-body-java - granite-4.0-h-tiny-bigwindow - 100 - - - - - - .java - - - 275000 - - - - - - - big-window-sql - file-body-sql - granite-4.0-h-tiny-bigwindow - 100 - - - - - .sql - - - 275000 - - - - - - - java - file-body-java - ${ai.model} - - java-facts - - .java - - - - sql - file-body-sql - ${ai.model} - sql-facts - - .sql - - - - - fallback - file-body-fallback - ${ai.model} - true - - - - - - - ai-aggregate-packages - process-resources - - aggregate-packages - - - - - package-body - ${ai.model} - - - - - - - - ai-aggregate-project - prepare-package - - aggregate-project - - - - - project-body - ${ai.model} - - - - - - - - - - - - vmlens - - - - com.vmlens - vmlens-maven-plugin - - - - **/VmlensInterleavingSmokeTest.java - - - - - vmlens-test - - test - - - - - - - - - jcstress - - - - org.codehaus.mojo - exec-maven-plugin - - - jcstress - test - exec - - ${java.home}/bin/java - test - - -classpath - - org.openjdk.jcstress.Main - -v - -m - default - - - - - - - -