llamacpp-ai-index-maven-plugin
Used in:
components
- OverviewOverview
- VersionsVersions
- DependentsDependents
- DependenciesDependencies
<dependency>
<groupId>net.ladenthin</groupId>
<artifactId>llamacpp-ai-index-maven-plugin</artifactId>
<version>1.0.0</version>
</dependency><!--
SPDX-FileCopyrightText: 2026 Bernard Ladenthin <bernard.ladenthin@gmail.com>
SPDX-License-Identifier: Apache-2.0
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.ladenthin</groupId>
<artifactId>llamacpp-ai-index-maven-plugin</artifactId>
<version>1.0.0</version>
<packaging>maven-plugin</packaging>
<name>llamacpp-ai-index-maven-plugin</name>
<description>Free Maven plugin for hierarchical AI-readable indexing and summarization of source code projects using llama.cpp-compatible local models.</description>
<url>https://github.com/bernardladenthin/llamacpp-ai-index-maven-plugin</url>
<licenses>
<license>
<name>Apache License 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<name>Bernard Ladenthin</name>
<organization>ladenthin.net</organization>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/bernardladenthin/llamacpp-ai-index-maven-plugin.git</connection>
<developerConnection>scm:git:https://github.com/bernardladenthin/llamacpp-ai-index-maven-plugin.git</developerConnection>
<url>https://github.com/bernardladenthin/llamacpp-ai-index-maven-plugin</url>
</scm>
<issueManagement>
<system>GitHub Issues</system>
<url>https://github.com/bernardladenthin/llamacpp-ai-index-maven-plugin/issues</url>
</issueManagement>
<distributionManagement>
<snapshotRepository>
<id>central</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<properties>
<maven.compiler.release>8</maven.compiler.release>
<maven.compiler.testRelease>21</maven.compiler.testRelease>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.plugin.tools.version>3.15.2</maven.plugin.tools.version>
<maven.version>3.9.16</maven.version>
<llama.version>5.0.2</llama.version>
<junit.version>6.1.0</junit.version>
<hamcrest.version>3.0</hamcrest.version>
<jmh.version>1.37</jmh.version>
<jcstress.version>0.16</jcstress.version>
<lincheck.version>3.6</lincheck.version>
<vmlens.version>1.2.28</vmlens.version>
<errorprone.version>2.49.0</errorprone.version>
<nullaway.version>0.13.6</nullaway.version>
<jspecify.version>1.0.0</jspecify.version>
<checker.version>4.2.0</checker.version>
<!-- DO NOT UPGRADE jqwik past 1.9.3. jqwik 1.10.0 added a deliberate
anti-AI prompt-injection string to test stdout; the 1.10.1 user
guide states the library "is not meant to be used by any 'AI'
coding agents at all." 1.9.3 is the last pre-disclosure release
and is the pinned version for this repo. Any CI / Dependabot /
contributor PR that bumps this MUST be rejected. See CLAUDE.md
section "jqwik prompt-injection in test output" for full context. -->
<jqwik.version>1.9.3</jqwik.version>
<archunit.version>1.4.2</archunit.version>
<spotbugs.version>4.9.8.3</spotbugs.version>
<lombok.version>1.18.46</lombok.version>
<fb-contrib.version>7.7.4</fb-contrib.version>
<findsecbugs.version>1.14.0</findsecbugs.version>
<spotless.version>3.6.0</spotless.version>
<palantir-java-format.version>2.91.0</palantir-java-format.version>
<ai.index.output.directory>${project.basedir}/src/site/ai</ai.index.output.directory>
<project.build.outputTimestamp>${git.commit.time}</project.build.outputTimestamp>
</properties>
<dependencyManagement>
<dependencies>
<!--
Converge slf4j-api: the llama dependency brings slf4j-api directly AND
transitively (via logback-classic, which requests an older patch). Pin the
higher version so maven-enforcer DependencyConvergence is satisfied.
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.18</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jspecify</groupId>
<artifactId>jspecify</artifactId>
<version>${jspecify.version}</version>
</dependency>
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>
<version>${checker.version}</version>
</dependency>
<dependency>
<groupId>net.ladenthin</groupId>
<artifactId>llama</artifactId>
<version>${llama.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>${maven.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>${maven.plugin.tools.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.jqwik</groupId>
<artifactId>jqwik</artifactId>
<version>${jqwik.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.tngtech.archunit</groupId>
<artifactId>archunit-junit5</artifactId>
<version>${archunit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jcstress</groupId>
<artifactId>jcstress-core</artifactId>
<version>${jcstress.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.lincheck</groupId>
<artifactId>lincheck</artifactId>
<version>${lincheck.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>${spotless.version}</version>
</plugin>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>${spotbugs.version}</version>
</plugin>
<plugin>
<groupId>com.vmlens</groupId>
<artifactId>vmlens-maven-plugin</artifactId>
<version>${vmlens.version}</version>
</plugin>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<version>10.0.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.15.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.6.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.8</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.5.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.12.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>${maven.plugin.tools.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.4.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.6</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.3</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.15</version>
</plugin>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.25.3</version>
</plugin>
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.10.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<executions>
<execution>
<id>get-git-properties</id>
<goals>
<goal>revision</goal>
</goals>
<phase>initialize</phase>
</execution>
</executions>
<configuration>
<dateFormat>yyyy-MM-dd'T'HH:mm:ss'Z'</dateFormat>
<dateFormatTimeZone>UTC</dateFormatTimeZone>
<generateGitPropertiesFile>false</generateGitPropertiesFile>
<failOnNoGitDirectory>false</failOnNoGitDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-maven</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.6.3,)</version>
</requireMavenVersion>
<requireJavaVersion>
<version>[1.8,)</version>
</requireJavaVersion>
<dependencyConvergence/>
<bannedDependencies>
<excludes>
<!-- Use SLF4J directly; never commons-logging. -->
<exclude>commons-logging:commons-logging</exclude>
<!-- Legacy / EoL logging frameworks. -->
<exclude>log4j:log4j</exclude>
<!-- Old hamcrest split artifacts; use hamcrest:hamcrest 2.x+. -->
<exclude>org.hamcrest:hamcrest-core</exclude>
<exclude>org.hamcrest:hamcrest-library</exclude>
<exclude>org.hamcrest:hamcrest-all</exclude>
<!-- Legacy JUnit 3 / 4; we use Jupiter (junit:junit-jupiter). -->
<exclude>junit:junit</exclude>
<exclude>junit:junit-dep</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>${maven.compiler.release}</release>
<testRelease>${maven.compiler.testRelease}</testRelease>
<showWarnings>true</showWarnings>
<parameters>true</parameters>
<compilerArgs>
<!--
-Xlint:all surfaces every category of javac warning. Excluded categories:
-serial : serialVersionUID warnings on non-Serializable classes
-options : bootclasspath / target-mismatch chatter under release=8
-classfile : noise when javac reads our own .class output mid-build
-processing: "No processor claimed any of these annotations" (Error
Prone's @GuardedBy is consumed by the EP javac plugin,
not by a JSR-269 annotation processor)
-Werror is on: the ElementType.MODULE blocker is gone now that
@NullMarked lives only in module-info.java (compiled at release 9 in a
separate execution); see module-info.java's javadoc.
-->
<arg>-Xlint:all,-serial,-options,-classfile,-processing</arg>
<arg>-Werror</arg>
<!-- Explicit processor list: Lombok (two SPI classes) + Checker Framework's
Nullness Checker as a 2nd nullness pass alongside NullAway. The explicit
-processor argument overrides SPI discovery, so every processor we want
to run must be listed here. -->
<arg>-processor</arg>
<arg>lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor,org.checkerframework.checker.nullness.NullnessChecker</arg>
<!-- Skip CF analysis of the auto-generated HelpMojo (target/generated-sources/plugin/...).
The plugin-tools-generated code is not under our control and has its own
initialization patterns Maven handles via reflection. -->
<arg>-AskipDefs=^net\.ladenthin\.llamacpp_ai_index_maven_plugin\..*$</arg>
<arg>-XDaddTypeAnnotationsToSymbol=true</arg>
<arg>-XDcompilePolicy=simple</arg>
<arg>--should-stop=ifError=FLOW</arg>
<!-- XepExcludedPaths skips the auto-generated HelpMojo for Error Prone
(parallels the -AskipDefs above for Checker Framework). The two
remaining warnings on that file (StringSplitter) would otherwise
break -Werror. -->
<arg>-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</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${errorprone.version}</version>
</path>
<path>
<groupId>com.uber.nullaway</groupId>
<artifactId>nullaway</artifactId>
<version>${nullaway.version}</version>
</path>
<path>
<groupId>org.checkerframework</groupId>
<artifactId>checker</artifactId>
<version>${checker.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<!-- The default compile pass targets Java 8 bytecode for the plugin
sources. module-info.java cannot be compiled at release 8 (it is a
Java 9+ construct) and is handled by the separate execution below. -->
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</configuration>
</execution>
<execution>
<id>module-info-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<!-- module-info.java is the only Java 9+ source in this project; compile
it at release 9 (the minimum version that understands modules) without
the Error Prone / NullAway / Checker Framework processors that target
ordinary source files only. Java 8 runtimes silently ignore the
resulting module-info.class at the JAR root, so Maven (which loads
plugins classpath-only) continues to work unchanged. -->
<release>9</release>
<includes>
<include>module-info.java</include>
</includes>
<compilerArgs combine.self="override"/>
<annotationProcessorPaths combine.self="override"/>
</configuration>
</execution>
<execution>
<id>default-testCompile</id>
<configuration>
<!-- Drop -parameters for test compile so jcstress / Lincheck reflection
doesn't pick up parameter names from MethodParameters. -->
<parameters>false</parameters>
<compilerArgs combine.self="override">
<arg>-XDaddTypeAnnotationsToSymbol=true</arg>
<arg>-XDcompilePolicy=simple</arg>
<arg>--should-stop=ifError=FLOW</arg>
<arg>-Xplugin:ErrorProne -Xep:NullAway:OFF -Xep:GuardedBy:OFF -Xep:IdentityBinaryExpression:OFF</arg>
</compilerArgs>
<annotationProcessorPaths combine.children="append">
<path>
<groupId>org.openjdk.jcstress</groupId>
<artifactId>jcstress-core</artifactId>
<version>${jcstress.version}</version>
</path>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<source>${maven.compiler.release}</source>
<failOnError>true</failOnError>
<failOnWarnings>true</failOnWarnings>
<doclint>all</doclint>
<sourceFileExcludes>
<sourceFileExclude>**/HelpMojo.java</sourceFileExclude>
</sourceFileExcludes>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<configuration>
<goalPrefix>ai-index</goalPrefix>
</configuration>
<executions>
<execution>
<id>default-descriptor</id>
<goals>
<goal>descriptor</goal>
</goals>
</execution>
<execution>
<id>help-goal</id>
<goals>
<goal>helpmojo</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<configuration>
<java>
<includes>
<include>src/main/java/**/*.java</include>
<include>src/test/java/**/*.java</include>
</includes>
<palantirJavaFormat>
<version>${palantir-java-format.version}</version>
</palantirJavaFormat>
<removeUnusedImports/>
<trimTrailingWhitespace/>
<endWithNewline/>
</java>
</configuration>
<executions>
<execution>
<id>spotless-check</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<configuration>
<effort>Max</effort>
<threshold>Low</threshold>
<failOnError>true</failOnError>
<includeTests>false</includeTests>
<excludeFilterFile>spotbugs-exclude.xml</excludeFilterFile>
<plugins>
<plugin>
<groupId>com.mebigfatguy.fb-contrib</groupId>
<artifactId>fb-contrib</artifactId>
<version>${fb-contrib.version}</version>
</plugin>
<plugin>
<groupId>com.h3xstream.findsecbugs</groupId>
<artifactId>findsecbugs-plugin</artifactId>
<version>${findsecbugs.version}</version>
</plugin>
</plugins>
</configuration>
<executions>
<execution>
<id>spotbugs-check</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<mainClass>org.openjdk.jmh.Main</mainClass>
<classpathScope>test</classpathScope>
</configuration>
</plugin>
<plugin>
<!--
PIT mutation testing is gated at a 100% threshold on every CI
build over the explicit list of classes that have reached 100%
mutation parity (verified with pitest-maven 1.25.3). Expand the
targetClasses list as more classes reach parity (see README TODO).
targetTests is the whole aiindex tree so any unit test may kill a
mutant; all listed classes are covered by pure-Java tests
(MockAiGenerationProvider — no GGUF model needed).
-->
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<dependencies>
<dependency>
<groupId>org.pitest</groupId>
<artifactId>pitest-junit5-plugin</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<configuration>
<targetClasses>
<!-- Classes verified at 100% PIT mutation parity. Expand as more reach it. -->
<param>net.ladenthin.maven.llamacpp.aiindex.config.AiFieldGenerationConfig</param>
<param>net.ladenthin.maven.llamacpp.aiindex.config.AiGenerationConfig</param>
<param>net.ladenthin.maven.llamacpp.aiindex.config.AiModelDefinition</param>
<param>net.ladenthin.maven.llamacpp.aiindex.config.AiModelDefinitionSupport</param>
<param>net.ladenthin.maven.llamacpp.aiindex.document.AiGenerationRequest</param>
<param>net.ladenthin.maven.llamacpp.aiindex.document.AiGenerationResult</param>
<param>net.ladenthin.maven.llamacpp.aiindex.document.AiMdChildEntryLineFormatter</param>
<param>net.ladenthin.maven.llamacpp.aiindex.document.AiMdDocument</param>
<param>net.ladenthin.maven.llamacpp.aiindex.document.AiMdHeader</param>
<param>net.ladenthin.maven.llamacpp.aiindex.document.AiMdHeaderSupport</param>
<param>net.ladenthin.maven.llamacpp.aiindex.prompt.AiPreparedPrompt</param>
<param>net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptDefinition</param>
<param>net.ladenthin.maven.llamacpp.aiindex.prompt.AiPromptSupport</param>
<param>net.ladenthin.maven.llamacpp.aiindex.provider.AiCompletionParser</param>
<param>net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProvider</param>
<param>net.ladenthin.maven.llamacpp.aiindex.provider.AiGenerationProviderFactory</param>
<param>net.ladenthin.maven.llamacpp.aiindex.provider.MockAiGenerationProvider</param>
<param>net.ladenthin.maven.llamacpp.aiindex.support.AiChecksumSupport</param>
<param>net.ladenthin.maven.llamacpp.aiindex.support.AiPathSupport</param>
<param>net.ladenthin.maven.llamacpp.aiindex.support.AiTimeSupport</param>
<param>net.ladenthin.maven.llamacpp.aiindex.support.Java8CompatibilityHelper</param>
</targetClasses>
<targetTests>
<param>net.ladenthin.maven.llamacpp.aiindex.*</param>
</targetTests>
<mutationThreshold>100</mutationThreshold>
<timeoutConstant>30000</timeoutConstant>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals><goal>sign</goal></goals>
<configuration>
<keyname>${gpg.keyname}</keyname>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<autoPublish>true</autoPublish>
<waitUntil>published</waitUntil>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>ai-index-selftest</id>
<build>
<plugins>
<plugin>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<configuration>
<outputDirectory>${ai.index.output.directory}</outputDirectory>
<subtrees>
<subtree>src/main/java/net/ladenthin/maven/llamacpp/aiindex</subtree>
</subtrees>
<generationProvider>llamacpp-jni</generationProvider>
<!--
AI model definitions: define each model once and reference it by key.
No Maven profiles or properties are needed for model configuration.
maxInputChars is calculated automatically from contextSize,
maxOutputTokens, charsPerToken, and the prompt template length.
-->
<aiDefinitions>
<!-- Mistral-7B-Instruct-v0.3-Q4_K_M (16 K context)
https://huggingface.co/lmstudio-community/Mistral-7B-Instruct-v0.3-GGUF/blob/main/Mistral-7B-Instruct-v0.3-Q4_K_M.gguf -->
<aiDefinition>
<key>Mistral-7B-Instruct-v0.3-Q4_K_M-C16k</key>
<modelPath>X:/Modelle/Mistral-7B-Instruct-v0.3-Q4_K_M.gguf</modelPath>
<contextSize>16384</contextSize>
<maxOutputTokens>2048</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- bartowski/Meta-Llama-3.1-8B-Instruct-GGUF
https://huggingface.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF/blob/main/Meta-Llama-3.1-8B-Instruct-Q5_K_M.gguf -->
<aiDefinition>
<key>Meta-Llama-3.1-8B-Instruct-Q5_K_M-C32k</key>
<modelPath>X:/Modelle/Meta-Llama-3.1-8B-Instruct-Q5_K_M.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>1536</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- Codestral-22B-v0.1-Q4_K (32 K context)
https://huggingface.co/bartowski/Codestral-22B-v0.1-GGUF/blob/main/Codestral-22B-v0.1-Q4_K.gguf -->
<aiDefinition>
<key>Codestral-22B-v0.1-Q4_K-C32k</key>
<modelPath>X:/Modelle/Codestral-22B-v0.1-Q4_K.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>1536</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- Codestral-22B-v0.1-Q6_K (32 K context)
https://huggingface.co/bartowski/Codestral-22B-v0.1-GGUF/blob/main/Codestral-22B-v0.1-Q6_K.gguf -->
<aiDefinition>
<key>Codestral-22B-v0.1-Q6_K-C32k</key>
<modelPath>X:/Modelle/Codestral-22B-v0.1-Q6_K.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>1536</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- Qwen2.5-Coder-7B-Instruct-Q5_K_M (16 K context)
https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF/blob/main/qwen2.5-coder-7b-instruct-q5_k_m.gguf -->
<aiDefinition>
<key>Qwen2.5-Coder-7B-Instruct-Q5_K_M-C16k</key>
<modelPath>X:/Modelle/qwen2.5-coder-7b-instruct-q5_k_m.gguf</modelPath>
<contextSize>16384</contextSize>
<maxOutputTokens>2048</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- Ministral-3-8B-Instruct-2512-Q4_K_M (32 K context)
8.4B language model + 0.4B vision encoder; supports 256k context window.
Temperature < 0.1 recommended for production (mistral.ai/news/mistral-3).
32k context is a practical sweet spot for code summarization on local hardware.
https://huggingface.co/mistralai/Ministral-3-8B-Instruct-2512-GGUF -->
<aiDefinition>
<key>Ministral-3-8B-Instruct-2512-Q4_K_M-C32k</key>
<modelPath>X:/Modelle/Ministral-3-8B-Instruct-2512-Q4_K_M.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>2048</maxOutputTokens>
<temperature>0.1</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- Ministral-3-14B-Instruct-2512-Q4_K_M (32 K context)
13.5B language model + 0.4B vision encoder; supports 256k context window.
Comparable performance to Mistral Small 3.2 24B at lower resource cost.
Temperature < 0.1 recommended for production (mistral.ai/news/mistral-3).
32k context is a practical sweet spot for code summarization on local hardware.
https://huggingface.co/mistralai/Ministral-3-14B-Instruct-2512-GGUF -->
<aiDefinition>
<key>Ministral-3-14B-Instruct-2512-Q4_K_M-C32k</key>
<modelPath>X:/Modelle/Ministral-3-14B-Instruct-2512-Q4_K_M.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>2048</maxOutputTokens>
<temperature>0.1</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- Ministral-3-8B-Instruct-2512-Q5_K_M (32 K context)
8.4B language model + 0.4B vision encoder; supports 256k context window.
Temperature < 0.1 recommended for production (mistral.ai/news/mistral-3).
32k context is a practical sweet spot for code summarization on local hardware.
https://huggingface.co/mistralai/Ministral-3-8B-Instruct-2512-GGUF -->
<aiDefinition>
<key>Ministral-3-8B-Instruct-2512-Q5_K_M-C32k</key>
<modelPath>X:/Modelle/Ministral-3-8B-Instruct-2512-Q5_K_M.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>2048</maxOutputTokens>
<temperature>0.1</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- Ministral-3-14B-Instruct-2512-Q5_K_M (32 K context)
13.5B language model + 0.4B vision encoder; supports 256k context window.
Comparable performance to Mistral Small 3.2 24B at lower resource cost.
Temperature < 0.1 recommended for production (mistral.ai/news/mistral-3).
32k context is a practical sweet spot for code summarization on local hardware.
https://huggingface.co/mistralai/Ministral-3-14B-Instruct-2512-GGUF -->
<aiDefinition>
<key>Ministral-3-14B-Instruct-2512-Q5_K_M-C32k</key>
<modelPath>X:/Modelle/Ministral-3-14B-Instruct-2512-Q5_K_M.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>2048</maxOutputTokens>
<temperature>0.1</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<repeatPenalty>1.1</repeatPenalty>
</aiDefinition>
<!-- gemma-4-26B-A4B-it-UD-Q4_K_M (32 K context)
26B total / ~4B active parameters (MoE: 128 experts, 8+1 active per token).
Runs at the computational cost of a ~4B dense model; quality near 27B dense.
Temperature 1.0 is critical for Gemma 4 — lowering degrades quality.
32k context is a practical sweet spot for code summarization on local hardware.
https://huggingface.co/unsloth/gemma-4-26B-A4B-it-GGUF -->
<aiDefinition>
<key>Gemma-4-26B-A4B-it-UD-Q4_K_M-C32k</key>
<modelPath>X:/Modelle/gemma-4-26B-A4B-it-UD-Q4_K_M.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>8192</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<topP>0.95</topP>
<topK>64</topK>
<repeatPenalty>1.1</repeatPenalty>
<chatTemplateEnableThinking>false</chatTemplateEnableThinking>
<stopStrings>
<stopString><end_of_turn></stopString>
</stopStrings>
</aiDefinition>
<!-- Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q4_K_M (32 K context)
~4B effective parameters (MoE); uncensored derivative of gemma-4-E4B-it.
Temperature 1.0 is critical for Gemma 4 — lowering degrades quality.
32k context is a practical sweet spot for code summarization on local hardware.
https://huggingface.co/HauhauCS/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive -->
<aiDefinition>
<key>Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q4_K_M-C32k</key>
<modelPath>X:/Modelle/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>8192</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<topP>0.95</topP>
<topK>64</topK>
<repeatPenalty>1.1</repeatPenalty>
<chatTemplateEnableThinking>false</chatTemplateEnableThinking>
<stopStrings>
<stopString><end_of_turn></stopString>
</stopStrings>
</aiDefinition>
<!-- Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q6_K_P (32 K context)
Same model as Q4_K_M above; Q6_K_P is a custom lossless quantization by HauhauCS
that preserves quality where it matters most (effectively 1-2 quant levels higher
at only 5-15 % larger file size).
Temperature 1.0 is critical for Gemma 4 — lowering degrades quality.
32k context is a practical sweet spot for code summarization on local hardware.
https://huggingface.co/HauhauCS/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive -->
<aiDefinition>
<key>Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q6_K_P-C32k</key>
<modelPath>X:/Modelle/Gemma-4-E4B-Uncensored-HauhauCS-Aggressive-Q6_K_P.gguf</modelPath>
<contextSize>32768</contextSize>
<maxOutputTokens>8192</maxOutputTokens>
<temperature>1.0</temperature>
<threads>8</threads>
<charsPerToken>4</charsPerToken>
<warnOnTrim>true</warnOnTrim>
<retryTemperatureIncrement>0.0</retryTemperatureIncrement>
<topP>0.95</topP>
<topK>64</topK>
<repeatPenalty>1.1</repeatPenalty>
<chatTemplateEnableThinking>false</chatTemplateEnableThinking>
<stopStrings>
<stopString><end_of_turn></stopString>
</stopStrings>
</aiDefinition>
</aiDefinitions>
<!--
Prompt template definitions shared across all executions.
Each promptKey is referenced from fieldGenerations in the executions below.
-->
<promptDefinitions>
<promptDefinition>
<key>file-body</key>
<template><![CDATA[
You generate a detailed markdown body section for a Java source file. Output the description directly as markdown prose. Do not wrap the output in XML tags, code fences, or any other delimiters.
Rules for the entire output:
- Output markdown only.
- Do not output explanations outside the body content.
- Never return an empty response.
- Start immediately with prose (no leading whitespace or empty lines).
- The summary is already rendered inside a '###' heading (the filename). Do NOT start the summary with another heading. Use '####' or deeper headings only for subsections within the summary when the content is long enough to warrant internal structure.
- The summary may be multiple lines.
- The length should adapt to the file size and complexity.
- Small files -> short summary.
- Large or complex files -> longer, more detailed summary is allowed.
- Do not use '###' or higher-level headings anywhere in the summary.
- Do not wrap the summary in code fences.
- Do not output ```markdown, ```java, or ```.
- Do not output formatter comments like // @formatter:on or // @formatter:off.
- For each public or protected method, include a brief one-line description of its purpose.
- Integrate all relevant class names, interface names, annotation names, and domain-specific terms naturally into the prose — do NOT list them separately.
- Focus the summary on purpose, behavior, important abstractions, and search-relevant terms woven into sentences.
- Mention every directly extended class.
- Mention every directly implemented interface.
- Mention generic declarations and important generic types when present.
- Do not mention standard Java methods unless they are meaningfully overridden or central to the class behavior.
- Summarize recurring exception behavior across methods when relevant.
- **IMPORTANT: If the source contains "[EOF - source was truncated]", the file is incomplete. Do NOT guess, invent, or hallucinate any methods, classes, fields, or code that is not explicitly present in the provided source. Only summarize what is actually shown.**
File: %s
Source:
%s
]]></template>
</promptDefinition>
<promptDefinition>
<key>package-body</key>
<template><![CDATA[
You generate a detailed markdown body section for a Java package or package-like index. Output the description directly as markdown prose. Do not wrap the output in XML tags, code fences, or any other delimiters.
Rules for the entire output:
- Output markdown only.
- Do not output explanations outside the body content.
- Never return an empty response.
- Start immediately with prose (no leading whitespace or empty lines).
- The summary is already rendered inside a '###' heading (the package name). Do NOT start the summary with another heading. Use '####' or deeper headings only for subsections within the summary when the content is long enough to warrant internal structure.
- The summary may be multiple lines.
- The length should adapt to the size and complexity of the package.
- Small packages -> short summary.
- Large packages -> more detailed summary is allowed.
- Do not use '###' or higher-level headings anywhere in the summary.
- Do not wrap the summary in code fences.
- Do not output ```markdown, ```java, or ```.
- Do not output formatter comments like // @formatter:on or // @formatter:off.
- For each contained file, include a brief one-line description of its purpose.
- Integrate all relevant class names, interface names, annotation names, and domain-specific terms naturally into the prose — do NOT list them separately.
- Focus the summary on the overall purpose, structure, responsibilities, and collaboration of the contained files.
- Mention important directly extended classes and directly implemented interfaces if they are central and repeatedly represented in the package content.
- Mention important generic declarations or important generic type patterns if they are central to the package design.
- Summarize recurring exception behavior across the package when relevant.
- For larger packages, group contained files by responsibility instead of listing every file.
- **IMPORTANT: If the source contains "[EOF - source was truncated]", the index is incomplete. Do NOT guess, invent, or hallucinate any files, classes, or content that is not explicitly present in the provided source. Only summarize what is actually shown.**
File: %s
Source:
%s
]]></template>
</promptDefinition>
</promptDefinitions>
</configuration>
<executions>
<execution>
<id>ai-generate</id>
<phase>generate-resources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<fieldGenerations>
<fieldGeneration>
<promptKey>file-body</promptKey>
<aiDefinitionKey>Gemma-4-26B-A4B-it-UD-Q4_K_M-C32k</aiDefinitionKey>
</fieldGeneration>
</fieldGenerations>
</configuration>
</execution>
<execution>
<id>ai-aggregate-packages</id>
<phase>process-resources</phase>
<goals>
<goal>aggregate-packages</goal>
</goals>
<configuration>
<fieldGenerations>
<fieldGeneration>
<promptKey>package-body</promptKey>
<aiDefinitionKey>Gemma-4-26B-A4B-it-UD-Q4_K_M-C32k</aiDefinitionKey>
</fieldGeneration>
</fieldGenerations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>vmlens</id>
<dependencies>
<dependency>
<groupId>com.vmlens</groupId>
<artifactId>api</artifactId>
<version>${vmlens.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.vmlens</groupId>
<artifactId>vmlens-maven-plugin</artifactId>
<configuration>
<!--
Lincheck generates its own TestThreadExecution class on the fly.
That bytecode clashes with vmlens's load-time instrumentation
(java.lang.VerifyError). Skip the Lincheck test under vmlens;
the default test job still runs it.
**/*$* is the plugin default - kept to preserve inner-class skip.
-->
<excludes>
<exclude>**/*$*</exclude>
<exclude>**/AiGenerationKindLincheckTest.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>vmlens-test</id>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jcstress</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>jcstress</id>
<phase>test</phase>
<goals><goal>exec</goal></goals>
<configuration>
<executable>${java.home}/bin/java</executable>
<classpathScope>test</classpathScope>
<arguments>
<argument>-classpath</argument>
<classpath/>
<argument>org.openjdk.jcstress.Main</argument>
<argument>-v</argument>
<argument>-m</argument>
<argument>default</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>