From 7292d9937804bed3fbf2b1690923e2ef62502e33 Mon Sep 17 00:00:00 2001
From: Claude
Date: Wed, 15 Jul 2026 02:02:31 +0000
Subject: [PATCH 1/3] Replace Maven Log with SLF4J in the indexer layer
SourceFileIndexer, PackageIndexer, ProjectIndexer, and
AiFieldGenerationSupport now log via org.slf4j.Logger instead of a
constructor-injected Maven Log, closing the long-standing "no SLF4J
usage" gap and decoupling these classes from the Maven Plugin API as
the first step toward extracting them into a standalone library. Only
the 5 mojos still touch org.apache.maven, enforced by a broadened
ArchUnit rule (nonMojoIsMavenFree) plus a new loggersArePrivateStaticFinal
rule.
All log calls use parameterized {} placeholders instead of string
concatenation, fixing a genuine SpotBugs LO_APPENDED_STRING_IN_FORMAT_STRING
finding; a narrowly-scoped CRLF_INJECTION_LOGS suppression was added for
the four converted classes (local filesystem paths only, no untrusted
input, matching the project's existing suppression style).
AiFieldGenerationSupportTest's log-capturing tests now attach a logback
ListAppender to the class logger instead of a hand-rolled Maven
SystemStreamLog subclass; logback-classic is added as a direct
test-scope dependency (already resolved transitively via llama) and
slf4j-api becomes a direct compile dependency.
Verified: full test suite green (414 tests, 3 expected native-model
skips), spotless/spotbugs clean, and an end-to-end run of the generate
goal against a scratch project confirms the SLF4J log lines surface
identically as [INFO] lines in Maven's console output via
maven-slf4j-provider.
Co-Authored-By: Claude Sonnet 5
Claude-Session: https://claude.ai/code/session_016DByQrKSWzzpBt4iSRcmRP
---
TODO.md | 2 +-
pom.xml | 32 +++++
spotbugs-exclude.xml | 28 ++++
.../indexer/AiFieldGenerationSupport.java | 132 ++++++++++--------
.../aiindex/indexer/PackageIndexer.java | 24 ++--
.../aiindex/indexer/ProjectIndexer.java | 35 ++---
.../aiindex/indexer/SourceFileIndexer.java | 25 ++--
.../aiindex/mojo/AggregatePackagesMojo.java | 1 -
.../aiindex/mojo/AggregateProjectMojo.java | 12 +-
.../llamacpp/aiindex/mojo/GenerateMojo.java | 5 +-
.../aiindex/PluginArchitectureTest.java | 39 +++++-
...AiFieldGenerationSupportRealModelTest.java | 4 +-
.../indexer/AiFieldGenerationSupportTest.java | 99 ++++++-------
.../aiindex/indexer/PackageIndexerTest.java | 6 -
.../aiindex/indexer/ProjectIndexerTest.java | 32 ++---
.../indexer/SourceFileIndexerTest.java | 3 -
16 files changed, 264 insertions(+), 215 deletions(-)
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/pom.xml b/pom.xml
index bcf86b0..c240661 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,6 +146,16 @@ SPDX-License-Identifier: Apache-2.0
slf4j-api2.0.18
+
+
+ ch.qos.logback
+ logback-classic
+ 1.5.37
+
@@ -173,6 +183,17 @@ SPDX-License-Identifier: Apache-2.0
${llama.classifier}
+
+
+ org.slf4j
+ slf4j-api
+
+
org.apache.mavenmaven-plugin-api
@@ -251,6 +272,17 @@ SPDX-License-Identifier: Apache-2.0
${vmlens.version}test
+
+
+ ch.qos.logback
+ logback-classic
+ test
+
diff --git a/spotbugs-exclude.xml b/spotbugs-exclude.xml
index 986f75c..8d41c61 100644
--- a/spotbugs-exclude.xml
+++ b/spotbugs-exclude.xml
@@ -525,4 +525,32 @@ SPDX-License-Identifier: Apache-2.0
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java b/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/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/PackageIndexer.java b/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java
index ad870d7..c0e2012 100644
--- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java
+++ b/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.
@@ -96,11 +96,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 +119,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 +131,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 +141,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 +156,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 +267,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 +284,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 {
diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java b/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java
index 2dce903..cc6e8dd 100644
--- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java
+++ b/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";
@@ -106,11 +106,6 @@ public class ProjectIndexer {
*/
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 +127,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 +144,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 +154,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 +162,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 +173,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,7 +216,7 @@ 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;
}
@@ -283,7 +270,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 +285,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/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/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/mojo/AggregatePackagesMojo.java b/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/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/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/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/GenerateMojo.java b/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/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/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java b/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/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/indexer/AiFieldGenerationSupportRealModelTest.java b/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/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/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/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/PackageIndexerTest.java b/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/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/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/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/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/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());
From 4f03055ce4b6765e056befa691aa153975c97551 Mon Sep 17 00:00:00 2001
From: Claude
Date: Wed, 15 Jul 2026 11:27:33 +0000
Subject: [PATCH 2/3] Deduplicate the EPOCH_DATE sentinel into AiTimeSupport
PackageIndexer and ProjectIndexer each hardcoded their own private
"1970-01-01T00:00:00Z" literal as the seed value for folding over
child dates to find the latest one. Both are exactly
Instant.EPOCH formatted through the same ISO_INSTANT formatter
AiTimeSupport.formatInstant already uses for every other timestamp
in a .ai.md header, so the duplicate literals are now a single
derived AiTimeSupport.EPOCH_DATE constant.
Added AiTimeSupportTest (previously untested despite being in the
PIT 100%-threshold targetClasses list) to cover formatInstant and
pin the new constant; verified 1/1 mutations killed on AiTimeSupport.
Co-Authored-By: Claude Sonnet 5
Claude-Session: https://claude.ai/code/session_016DByQrKSWzzpBt4iSRcmRP
---
.../aiindex/indexer/PackageIndexer.java | 8 +----
.../aiindex/indexer/ProjectIndexer.java | 8 +----
.../aiindex/support/AiTimeSupport.java | 8 +++++
.../aiindex/support/AiTimeSupportTest.java | 35 +++++++++++++++++++
4 files changed, 45 insertions(+), 14 deletions(-)
create mode 100644 src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java
diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java b/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java
index c0e2012..14b43cc 100644
--- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java
+++ b/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java
@@ -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 '…'".
@@ -574,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/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java
index cc6e8dd..6c29756 100644
--- a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java
+++ b/src/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java
@@ -100,12 +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";
-
private final String projectTitle;
private final String pluginVersion;
private final String aiVersion;
@@ -221,7 +215,7 @@ public int aggregate(final Path rootDirectory) throws IOException {
}
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);
diff --git a/src/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java b/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/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/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java b/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java
new file mode 100644
index 0000000..0d5220e
--- /dev/null
+++ b/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"));
+ }
+}
From 6af25cd099b09680d0483a18bc8dd4083b88af07 Mon Sep 17 00:00:00 2001
From: Claude
Date: Wed, 15 Jul 2026 11:57:41 +0000
Subject: [PATCH 3/3] Reactor-ify into a parent + plugin module (srcmorph step
3)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Introduces the root net.ladenthin:srcmorph-parent (packaging=pom) as
the first step of the srcmorph multi-module migration. The existing
plugin moves into llamacpp-ai-index-maven-plugin/ with its coordinates,
Java package, and goalPrefix completely unchanged — this step is a pure
structural move, not a rename. The coordinate/package/goalPrefix
rename to srcmorph is deferred to the final migration step, once the
core library and CLI modules exist and the whole reactor is proven
working end-to-end.
Hoisted to the parent (reactor-wide, so future core/CLI modules can
share it without duplication): project metadata (licenses, developers,
scm, issueManagement, url, distributionManagement), the slf4j-api/
logback-classic dependencyManagement convergence pins, and the
`release` profile (GPG signing + central-publishing-maven-plugin) so a
single `mvn -P release deploy` from the root signs and publishes every
reactor module. Everything else (dependencies, the full build-plugin
chain, all other profiles) stays in the plugin module unchanged.
Version bumped 1.0.3-SNAPSHOT -> 1.1.0-SNAPSHOT (parent + child, by
inheritance) since adding modules is a feature-level change.
Moved with git mv (history preserved): pom.xml, src/, and
spotbugs-exclude.xml into llamacpp-ai-index-maven-plugin/ (spotbugs
resolves its exclude file relative to the module basedir; lombok.config
stays at the repo root, since Lombok's config search bubbles up from
each source file until it finds one, and stopBubbling only stops the
search at the file where it's declared — one shared root config already
works correctly for every future module). Updated the path-relative
references that break under the move: .gitignore module-scoped
patterns, REUSE.toml file annotations, and every target/... path in
.github/workflows/publish.yml (build artifacts, jacoco/PIT/vmlens
reports, crash dumps, signed-artifact collection).
Verified: `mvn verify` from the reactor root — BUILD SUCCESS, both
modules green, 417 tests (3 expected native-model skips), spotless and
spotbugs clean via their verify-phase bindings. Byte-diffed the
generated plugin.xml descriptor against a pre-move build of the same
commit: identical except the version number, confirming the mojo/
parameter/goalPrefix descriptor is completely unaffected by the
restructuring. `mvn -P release help:effective-pom` confirms the
parent's release profile (gpg + central-publishing) correctly resolves
into the child module's effective build.
Co-Authored-By: Claude Sonnet 5
Claude-Session: https://claude.ai/code/session_016DByQrKSWzzpBt4iSRcmRP
---
.github/workflows/publish.yml | 42 +-
.gitignore | 15 +-
REUSE.toml | 4 +-
llamacpp-ai-index-maven-plugin/pom.xml | 2341 +++++++++++++++++
.../spotbugs-exclude.xml | 0
.../src}/main/java/module-info.java | 0
.../aiindex/config/AiCalibration.java | 0
.../llamacpp/aiindex/config/AiCondition.java | 0
.../aiindex/config/AiConditionEvaluator.java | 0
.../aiindex/config/AiConditionGroup.java | 0
.../aiindex/config/AiFactCounter.java | 0
.../aiindex/config/AiFactDefinition.java | 0
.../config/AiFactDefinitionSupport.java | 0
.../aiindex/config/AiFactExtractor.java | 0
.../config/AiFieldGenerationConfig.java | 0
.../config/AiFieldGenerationSelector.java | 0
.../aiindex/config/AiFileContext.java | 0
.../aiindex/config/AiGenerationConfig.java | 0
.../aiindex/config/AiGenerationKind.java | 0
.../aiindex/config/AiModelDefinition.java | 0
.../config/AiModelDefinitionSupport.java | 0
.../aiindex/config/AiOversizeStrategy.java | 0
.../aiindex/config/AiRangeCondition.java | 0
.../llamacpp/aiindex/config/package-info.java | 0
.../aiindex/document/AiGenerationRequest.java | 0
.../aiindex/document/AiGenerationResult.java | 0
.../document/AiMdChildEntryLineFormatter.java | 0
.../aiindex/document/AiMdDocument.java | 0
.../aiindex/document/AiMdDocumentCodec.java | 0
.../llamacpp/aiindex/document/AiMdHeader.java | 0
.../aiindex/document/AiMdHeaderCodec.java | 0
.../aiindex/document/AiMdHeaderSupport.java | 0
.../aiindex/document/AiMdLeadExtractor.java | 0
.../aiindex/document/package-info.java | 0
.../indexer/AiCalibrationMeasurement.java | 0
.../aiindex/indexer/AiCalibrationRunner.java | 0
.../indexer/AiFieldGenerationSupport.java | 0
.../llamacpp/aiindex/indexer/AiIndexPlan.java | 0
.../indexer/AiInputWindowCalculator.java | 0
.../aiindex/indexer/PackageIndexer.java | 0
.../aiindex/indexer/ProjectIndexer.java | 0
.../aiindex/indexer/SourceFileIndexer.java | 0
.../aiindex/indexer/package-info.java | 0
.../aiindex/mojo/AbstractAiIndexMojo.java | 0
.../aiindex/mojo/AggregatePackagesMojo.java | 0
.../aiindex/mojo/AggregateProjectMojo.java | 0
.../llamacpp/aiindex/mojo/CalibrateMojo.java | 0
.../llamacpp/aiindex/mojo/GenerateMojo.java | 0
.../llamacpp/aiindex/mojo/package-info.java | 0
.../maven/llamacpp/aiindex/package-info.java | 0
.../aiindex/prompt/AiPreparedPrompt.java | 0
.../aiindex/prompt/AiPromptDefinition.java | 0
.../prompt/AiPromptPreparationSupport.java | 0
.../aiindex/prompt/AiPromptSupport.java | 0
.../llamacpp/aiindex/prompt/package-info.java | 0
.../aiindex/provider/AiCompletionParser.java | 0
.../provider/AiGenerationProvider.java | 0
.../provider/AiGenerationProviderFactory.java | 0
.../aiindex/provider/AiGenerationTimings.java | 0
.../LlamaCppJniAiGenerationProvider.java | 0
.../aiindex/provider/LlamaCppJniConfig.java | 0
.../provider/MockAiGenerationProvider.java | 0
.../aiindex/provider/package-info.java | 0
.../aiindex/support/AiChecksumSupport.java | 0
.../support/AiDeterministicSummary.java | 0
.../support/AiGenerationTimeEstimator.java | 0
.../aiindex/support/AiPathSupport.java | 0
.../aiindex/support/AiProgressBar.java | 0
.../aiindex/support/AiSourceChunker.java | 0
.../support/AiSourceExcludeFilter.java | 0
.../aiindex/support/AiTimeSupport.java | 0
.../aiindex/support/ConvertToRecord.java | 0
.../support/Java8CompatibilityHelper.java | 0
.../aiindex/support/package-info.java | 0
.../src}/site/ai/empty.md | 0
.../llamacpp/aiindex/CommonTestFixtures.java | 0
.../aiindex/PluginArchitectureTest.java | 0
.../aiindex/config/AiCalibrationTest.java | 0
.../config/AiConditionEvaluatorTest.java | 0
.../aiindex/config/AiConditionGroupTest.java | 0
.../aiindex/config/AiConditionTest.java | 0
.../aiindex/config/AiFactCounterTest.java | 0
.../config/AiFactDefinitionSupportTest.java | 0
.../aiindex/config/AiFactDefinitionTest.java | 0
.../aiindex/config/AiFactExtractorTest.java | 0
.../config/AiFieldGenerationConfigTest.java | 0
.../config/AiFieldGenerationSelectorTest.java | 0
.../aiindex/config/AiFileContextTest.java | 0
.../config/AiGenerationConfigTest.java | 0
.../config/AiGenerationKindLincheckTest.java | 0
.../config/AiModelDefinitionSupportTest.java | 0
.../aiindex/config/AiModelDefinitionTest.java | 0
.../config/AiOversizeStrategyTest.java | 0
.../aiindex/config/AiRangeConditionTest.java | 0
.../config/JavaStructureFactPatternsTest.java | 0
.../AiMdChildEntryLineFormatterTest.java | 0
.../document/AiMdDocumentCodecTest.java | 0
.../document/AiMdHeaderCodecProperties.java | 0
.../aiindex/document/AiMdHeaderCodecTest.java | 0
.../document/AiMdHeaderSupportTest.java | 0
.../aiindex/document/AiMdHeaderTest.java | 0
.../document/AiMdLeadExtractorTest.java | 0
.../indexer/AiCalibrationMeasurementTest.java | 0
.../indexer/AiCalibrationRunnerTest.java | 0
...AiFieldGenerationSupportRealModelTest.java | 0
.../indexer/AiFieldGenerationSupportTest.java | 0
.../aiindex/indexer/AiIndexPlanTest.java | 0
.../indexer/AiInputWindowCalculatorTest.java | 0
.../aiindex/indexer/PackageIndexerTest.java | 0
.../aiindex/indexer/ProjectIndexerTest.java | 0
.../indexer/SourceFileIndexerTest.java | 0
.../jcstress/AiGenerationKindRace.java | 0
.../aiindex/mojo/MojoPhaseSkipTest.java | 0
.../aiindex/prompt/AiPreparedPromptTest.java | 0
.../AiPromptPreparationSupportTest.java | 0
.../aiindex/prompt/AiPromptSupportTest.java | 0
.../provider/AiCompletionParserTest.java | 0
...iGenerationProviderDefaultTimingsTest.java | 0
.../AiGenerationProviderFactoryTest.java | 0
.../provider/AiGenerationTimingsTest.java | 0
.../LlamaCppJniAiGenerationProviderTest.java | 0
.../MockAiGenerationProviderTest.java | 0
.../support/AiChecksumSupportTest.java | 0
.../support/AiDeterministicSummaryTest.java | 0
.../AiGenerationTimeEstimatorTest.java | 0
.../aiindex/support/AiPathSupportTest.java | 0
.../aiindex/support/AiProgressBarTest.java | 0
.../aiindex/support/AiSourceChunkerTest.java | 0
.../support/AiSourceExcludeFilterTest.java | 0
.../aiindex/support/AiTimeSupportTest.java | 0
.../support/Java8CompatibilityHelperTest.java | 0
.../vmlens/VmlensInterleavingSmokeTest.java | 0
.../SmolLM2-135M-Instruct-Q3_K_M.gguf | Bin
pom.xml | 2330 +---------------
134 files changed, 2396 insertions(+), 2336 deletions(-)
create mode 100644 llamacpp-ai-index-maven-plugin/pom.xml
rename spotbugs-exclude.xml => llamacpp-ai-index-maven-plugin/spotbugs-exclude.xml (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/module-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibration.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCondition.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluator.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroup.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounter.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinition.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractor.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfig.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelector.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContext.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfig.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKind.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinition.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategy.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeCondition.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/config/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationRequest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiGenerationResult.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatter.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocument.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodec.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeader.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodec.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractor.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/document/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurement.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunner.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlan.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculator.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexer.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexer.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexer.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/indexer/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AbstractAiIndexMojo.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregatePackagesMojo.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/AggregateProjectMojo.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/CalibrateMojo.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/GenerateMojo.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/mojo/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPrompt.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptDefinition.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/prompt/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParser.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProvider.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactory.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimings.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProvider.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniConfig.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProvider.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/provider/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummary.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimator.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBar.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunker.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilter.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupport.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/ConvertToRecord.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelper.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/main/java/net/ladenthin/maven/llamacpp/aiindex/support/package-info.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/site/ai/empty.md (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/CommonTestFixtures.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/PluginArchitectureTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiCalibrationTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionEvaluatorTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionGroupTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiConditionTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactCounterTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactDefinitionTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFactExtractorTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationConfigTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFieldGenerationSelectorTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiFileContextTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationConfigTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiGenerationKindLincheckTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiModelDefinitionTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiOversizeStrategyTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/AiRangeConditionTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/config/JavaStructureFactPatternsTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdChildEntryLineFormatterTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdDocumentCodecTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecProperties.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderCodecTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdHeaderTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/document/AiMdLeadExtractorTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationMeasurementTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiCalibrationRunnerTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportRealModelTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiFieldGenerationSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiIndexPlanTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/AiInputWindowCalculatorTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/PackageIndexerTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/ProjectIndexerTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/indexer/SourceFileIndexerTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/jcstress/AiGenerationKindRace.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/mojo/MojoPhaseSkipTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPreparedPromptTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptPreparationSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/prompt/AiPromptSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiCompletionParserTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderDefaultTimingsTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationProviderFactoryTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/AiGenerationTimingsTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/LlamaCppJniAiGenerationProviderTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/provider/MockAiGenerationProviderTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiChecksumSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiDeterministicSummaryTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiGenerationTimeEstimatorTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiPathSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiProgressBarTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceChunkerTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiSourceExcludeFilterTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/support/Java8CompatibilityHelperTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/java/net/ladenthin/maven/llamacpp/aiindex/vmlens/VmlensInterleavingSmokeTest.java (100%)
rename {src => llamacpp-ai-index-maven-plugin/src}/test/resources/SmolLM2-135M-Instruct-Q3_K_M.gguf (100%)
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/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
+
+
+Then output these sections as markdown. Omit any section that does not apply. Use '####' for section labels. Never use '###' or higher.
+
+#### Purpose
+One or two bullets: what the type is for.
+
+#### Type
+Kind (class / interface / enum / record / annotation) and modifiers (abstract, final, sealed). extends X; implements Y; key generics and type bounds. Notable annotations (@Mojo, @Entity, Lombok, etc.).
+
+#### Input
+What comes in: constructor and method parameters, injected dependencies, consumed fields, read resources (files, buffers, streams, config).
+
+#### Output
+What comes out: return types, produced state, mutated fields, written resources, side effects.
+
+#### Core logic
+The essential steps / algorithm / responsibility as bullets. This is the most important section.
+
+#### Public API
+Each public/protected member as `name(params) -> returnType` + a clause (max 6 words) on its purpose. For a FAMILY of near-identical members (e.g. `fooN`), do not list them all: in the analysis channel enumerate and count them one per line, then in the final answer emit only the exact total and index range, e.g. `foo1..fooN (N total)`.
+
+#### Dependencies
+Imports and referenced types, as searchable names.
+
+#### Exceptions / Errors
+Notable thrown/caught exceptions, null-handling, and error conditions.
+
+#### Concurrency
+Threading, synchronization, immutability, or thread-safety notes, if any.
+
+## Rules
+- Markdown bullets and short clauses, not prose paragraphs. Sentences allowed only where a bullet would lose meaning.
+- Weave class / type / domain names into the bullets so they are searchable.
+- No code fences, no ```markdown / ```java, no XML tags, no formatter comments.
+- COUNT EXACTLY. When you state a count of methods/fields/members, count them precisely from the source and recount before finalizing. Never round, approximate, or write "similar"/"~".
+- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
+
+## Critical
+If the source contains "[EOF - source was truncated]", index ONLY what is literally present. Never infer, guess, or invent any unit, field, or behavior beyond the shown source.
+
+The file path and its full source are provided in the next (user) message: the path on the first
+line, then a blank line, then the source. Index only what is literally present there.
+ ]]>
+
+
+ file-body-sql
+
+
+Then output these sections as markdown. Omit any section that does not apply. Use '####' for section labels. Never use '###' or higher.
+
+#### Purpose
+One or two bullets: what this SQL object is for.
+
+#### Type
+SQL object kind: table / view / materialized view / procedure / function / trigger / index / sequence. Note the dialect if evident (PostgreSQL, MySQL, Oracle, T-SQL).
+
+#### Schema
+For tables/views: each column as `name type` plus constraints (PK, FK, NOT NULL, UNIQUE, DEFAULT, CHECK). Mark the primary key and any indexes.
+
+#### Reads
+Tables and columns this object READS from (FROM / JOIN / subquery sources, function inputs).
+
+#### Writes
+Tables and columns this object WRITES (INSERT / UPDATE / DELETE / MERGE targets, or the table a trigger fires on).
+
+#### Relationships
+Foreign keys and join relationships to other tables, as searchable `table.column -> table.column` pairs.
+
+#### Routine logic
+For procedures / functions / triggers: parameters, the essential steps, and the result or effect, as bullets.
+
+#### Dependencies
+Other tables, views, functions, or sequences referenced, as searchable names.
+
+## Rules
+- Markdown bullets and short clauses, not prose paragraphs.
+- Weave table / column / constraint / domain names into the bullets so they are searchable.
+- No code fences, no ```markdown / ```sql, no XML tags, no formatter comments.
+- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
+
+## Critical
+If the source contains "[EOF - source was truncated]", index ONLY what is literally present. Never infer, guess, or invent any table, column, or relationship beyond the shown source.
+
+The file path and its full source are provided in the next (user) message: the path on the first
+line, then a blank line, then the source. Index only what is literally present there.
+ ]]>
+
+
+ file-body-fallback
+
+
+Then output these sections as markdown. Omit any section that does not apply. Use '####' for section labels. Never use '###' or higher.
+
+#### Purpose
+One or two bullets: what the file/unit is for.
+
+#### Type
+Kind (class / interface / enum / record / header / kernel / SQL object) and language. For OO code: extends X; implements Y; key generics. For C: header vs implementation, exported vs static. For SQL: table / view / procedure / function / trigger.
+
+#### Input
+What comes in: key parameters, consumed fields, read resources (files, buffers, streams, kernels, tables/columns, env/config).
+
+#### Output
+What comes out: return types, produced state, written resources/tables, side effects.
+
+#### Core logic
+The essential steps / algorithm / responsibility as bullets. This is the most important section.
+
+#### Public API
+Each public/exported unit as `name(params) -> returnType` + a clause (max 6 words) on its purpose. For SQL: procedures/functions with params and result.
+
+#### Dependencies
+Imports / includes / referenced modules or tables, as searchable names.
+
+#### Exceptions / Errors
+Notable thrown/handled exceptions or error conditions.
+
+## Rules
+- Markdown bullets and short clauses, not prose paragraphs. Sentences allowed only where a bullet would lose meaning.
+- Weave class / type / table / domain names into the bullets so they are searchable.
+- No code fences, no ```markdown / ```java / ```sql, no XML tags, no formatter comments.
+- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
+
+## Critical
+If the source contains "[EOF - source was truncated]", index ONLY what is literally present. Never infer, guess, or invent any unit, field, table, or behavior beyond the shown source.
+
+The file path and its full source are provided in the next (user) message: the path on the first
+line, then a blank line, then the source. Index only what is literally present there.
+ ]]>
+
+
+ package-body
+
+
+Then output these sections as markdown. Omit any that do not apply. Use '####' for labels. Never '###' or higher.
+
+#### Purpose
+One or two bullets: the package's overall responsibility.
+
+#### Responsibilities
+The main functional groups inside the package, as bullets. Group files by role; do not list every file separately for large packages.
+
+#### Key units
+The central classes / interfaces / modules / SQL objects and their job, one clause each, with their searchable names.
+
+#### Data flow
+How inputs move through the package to outputs, if a clear pipeline or collaboration exists across the files.
+
+#### Dependencies
+Notable internal collaborations and external modules/packages/tables the package depends on.
+
+#### Cross-cutting
+Recurring patterns across files: shared base types/interfaces, common exception/error handling, threading/concurrency notes, configuration.
+
+## Rules
+- Markdown bullets and short clauses, not prose paragraphs.
+- Weave type / module / table / domain names in as searchable terms.
+- Base every statement only on the provided file summaries. Do NOT invent units, methods, tables, or behavior not present in them.
+- No code fences, no ```markdown, no XML tags, no formatter comments.
+- The package-name heading is already rendered above your output. Start immediately with the blockquote lead. Never empty.
+
+## Critical
+If the input contains "[EOF - source was truncated]", summarize ONLY what is present. Never infer or invent files or content beyond the provided summaries.
+
+The package path and its already-generated per-file summaries are provided in the next (user)
+message: the path on the first line, then a blank line, then the summaries to synthesize.
+ ]]>
+
+
+ project-body
+
+
+
+
+ file-body-java-v2
+
+
+Then output ONLY the sections below that carry real information. OMIT any section that would be empty, "none", or "not applicable" - do not emit a heading just to say nothing. Use '####' for section labels, never '###' or higher.
+
+TRIVIAL-FILE RULE: if the unit has no public behavior to describe (e.g. a marker/annotation, an enum that only lists constants, or a near-empty type), output ONLY the blockquote lead and a single '#### Purpose' line, and stop.
+
+#### Purpose
+One or two bullets: what the type is for.
+
+#### Type
+One line: kind (class/interface/enum/record/annotation) + modifiers; extends/implements; key generics; notable annotations (@Mojo, Lombok, etc.).
+
+#### Input
+What comes in: constructor/method parameters, injected dependencies, consumed fields, read resources.
+
+#### Output
+What comes out: return types, produced/mutated state, written resources, side effects.
+
+#### Core logic
+The essential steps/algorithm/responsibility as bullets. The most important section.
+
+#### Public API
+Each public/protected member as `name(params) -> returnType` + a <=6-word purpose clause. EXCEPTION: for plain data/config classes that are only getters/setters (e.g. Lombok beans), DO NOT list each accessor - write one line: "JavaBean getters/setters for: ".
+
+#### Dependencies
+Referenced types as searchable names. EXCLUDE this file's own type and java.lang.* .
+
+#### Exceptions / Errors
+Notable thrown/caught exceptions, null-handling, error conditions.
+
+#### Concurrency
+Threading, immutability, or thread-safety notes - only if the source actually shows them.
+
+## Rules
+- Markdown bullets and short clauses, not prose paragraphs.
+- Weave class/type/domain names into the bullets so they are searchable.
+- Describe ONLY what is literally in the source. NEVER invent units, fields, behavior, or concepts; in particular never mention keywords, tags, embeddings, search, or features the code does not contain.
+- No code fences, no ```markdown/```java, no XML tags, no formatter comments.
+- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
+
+## Critical
+If the source contains "[EOF - source was truncated]", index ONLY what is literally present.
+
+The file path and its full source are provided in the next (user) message: the path on the first
+line, then a blank line, then the source. Index only what is literally present there.
+ ]]>
+
+
+ package-body-v2
+
+
+SINGLE-CHILD RULE: if the input describes only ONE child package/file and no other content, output ONLY the blockquote lead restating that child's responsibility, and stop - emit no sections.
+
+Otherwise output ONLY the sections below that carry real information. OMIT any that would be empty. Use '####' for labels, never '###' or higher.
+
+#### Purpose
+One or two bullets: the package's overall responsibility.
+
+#### Responsibilities
+The main functional groups inside the package, as bullets. Group files by role; do not list every file for large packages.
+
+#### Key units
+The central classes/interfaces/modules and their job, one clause each, with searchable names.
+
+#### Data flow
+How inputs move through the package to outputs, if a clear pipeline exists across the files.
+
+#### Dependencies
+Notable internal collaborations and external modules the package depends on. Focus on cross-unit/cross-package relationships, not raw JDK/Lombok imports.
+
+#### Cross-cutting
+Recurring patterns across files: shared base types, common error handling, concurrency, configuration.
+
+## Rules
+- Markdown bullets and short clauses, not prose paragraphs.
+- Weave type/module/domain names in as searchable terms.
+- Base every statement ONLY on the provided file summaries. NEVER invent units, methods, behavior, or concepts (in particular never mention keywords, tags, or embeddings) not present in them.
+- No code fences, no ```markdown, no XML tags, no formatter comments.
+- The package-name heading is already rendered above your output. Start immediately with the blockquote lead. Never empty.
+
+## Critical
+If the input contains "[EOF - source was truncated]", summarize ONLY what is present.
+
+The package path and its already-generated per-file summaries are provided in the next (user)
+message: the path on the first line, then a blank line, then the summaries to synthesize.
+ ]]>
+
+
+
+
+
+
+
+
+ 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 100%
rename from spotbugs-exclude.xml
rename to llamacpp-ai-index-maven-plugin/spotbugs-exclude.xml
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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 100%
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
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/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
similarity index 100%
rename from src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java
rename to llamacpp-ai-index-maven-plugin/src/test/java/net/ladenthin/maven/llamacpp/aiindex/support/AiTimeSupportTest.java
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 c240661..31c443f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,12 +11,12 @@ SPDX-License-Identifier: Apache-2.0
4.0.0net.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
+
@@ -159,669 +87,12 @@ SPDX-License-Identifier: Apache-2.0
-
-
- 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
-
-
-
release
@@ -829,6 +100,9 @@ SPDX-License-Identifier: Apache-2.0
org.apache.maven.pluginsmaven-gpg-plugin
+
+ 3.2.8sign-artifacts
@@ -848,6 +122,9 @@ SPDX-License-Identifier: Apache-2.0
org.sonatype.centralcentral-publishing-maven-plugin
+
+ 0.11.0truecentral
@@ -861,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
-
-
-Then output these sections as markdown. Omit any section that does not apply. Use '####' for section labels. Never use '###' or higher.
-
-#### Purpose
-One or two bullets: what the type is for.
-
-#### Type
-Kind (class / interface / enum / record / annotation) and modifiers (abstract, final, sealed). extends X; implements Y; key generics and type bounds. Notable annotations (@Mojo, @Entity, Lombok, etc.).
-
-#### Input
-What comes in: constructor and method parameters, injected dependencies, consumed fields, read resources (files, buffers, streams, config).
-
-#### Output
-What comes out: return types, produced state, mutated fields, written resources, side effects.
-
-#### Core logic
-The essential steps / algorithm / responsibility as bullets. This is the most important section.
-
-#### Public API
-Each public/protected member as `name(params) -> returnType` + a clause (max 6 words) on its purpose. For a FAMILY of near-identical members (e.g. `fooN`), do not list them all: in the analysis channel enumerate and count them one per line, then in the final answer emit only the exact total and index range, e.g. `foo1..fooN (N total)`.
-
-#### Dependencies
-Imports and referenced types, as searchable names.
-
-#### Exceptions / Errors
-Notable thrown/caught exceptions, null-handling, and error conditions.
-
-#### Concurrency
-Threading, synchronization, immutability, or thread-safety notes, if any.
-
-## Rules
-- Markdown bullets and short clauses, not prose paragraphs. Sentences allowed only where a bullet would lose meaning.
-- Weave class / type / domain names into the bullets so they are searchable.
-- No code fences, no ```markdown / ```java, no XML tags, no formatter comments.
-- COUNT EXACTLY. When you state a count of methods/fields/members, count them precisely from the source and recount before finalizing. Never round, approximate, or write "similar"/"~".
-- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
-
-## Critical
-If the source contains "[EOF - source was truncated]", index ONLY what is literally present. Never infer, guess, or invent any unit, field, or behavior beyond the shown source.
-
-The file path and its full source are provided in the next (user) message: the path on the first
-line, then a blank line, then the source. Index only what is literally present there.
- ]]>
-
-
- file-body-sql
-
-
-Then output these sections as markdown. Omit any section that does not apply. Use '####' for section labels. Never use '###' or higher.
-
-#### Purpose
-One or two bullets: what this SQL object is for.
-
-#### Type
-SQL object kind: table / view / materialized view / procedure / function / trigger / index / sequence. Note the dialect if evident (PostgreSQL, MySQL, Oracle, T-SQL).
-
-#### Schema
-For tables/views: each column as `name type` plus constraints (PK, FK, NOT NULL, UNIQUE, DEFAULT, CHECK). Mark the primary key and any indexes.
-
-#### Reads
-Tables and columns this object READS from (FROM / JOIN / subquery sources, function inputs).
-
-#### Writes
-Tables and columns this object WRITES (INSERT / UPDATE / DELETE / MERGE targets, or the table a trigger fires on).
-
-#### Relationships
-Foreign keys and join relationships to other tables, as searchable `table.column -> table.column` pairs.
-
-#### Routine logic
-For procedures / functions / triggers: parameters, the essential steps, and the result or effect, as bullets.
-
-#### Dependencies
-Other tables, views, functions, or sequences referenced, as searchable names.
-
-## Rules
-- Markdown bullets and short clauses, not prose paragraphs.
-- Weave table / column / constraint / domain names into the bullets so they are searchable.
-- No code fences, no ```markdown / ```sql, no XML tags, no formatter comments.
-- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
-
-## Critical
-If the source contains "[EOF - source was truncated]", index ONLY what is literally present. Never infer, guess, or invent any table, column, or relationship beyond the shown source.
-
-The file path and its full source are provided in the next (user) message: the path on the first
-line, then a blank line, then the source. Index only what is literally present there.
- ]]>
-
-
- file-body-fallback
-
-
-Then output these sections as markdown. Omit any section that does not apply. Use '####' for section labels. Never use '###' or higher.
-
-#### Purpose
-One or two bullets: what the file/unit is for.
-
-#### Type
-Kind (class / interface / enum / record / header / kernel / SQL object) and language. For OO code: extends X; implements Y; key generics. For C: header vs implementation, exported vs static. For SQL: table / view / procedure / function / trigger.
-
-#### Input
-What comes in: key parameters, consumed fields, read resources (files, buffers, streams, kernels, tables/columns, env/config).
-
-#### Output
-What comes out: return types, produced state, written resources/tables, side effects.
-
-#### Core logic
-The essential steps / algorithm / responsibility as bullets. This is the most important section.
-
-#### Public API
-Each public/exported unit as `name(params) -> returnType` + a clause (max 6 words) on its purpose. For SQL: procedures/functions with params and result.
-
-#### Dependencies
-Imports / includes / referenced modules or tables, as searchable names.
-
-#### Exceptions / Errors
-Notable thrown/handled exceptions or error conditions.
-
-## Rules
-- Markdown bullets and short clauses, not prose paragraphs. Sentences allowed only where a bullet would lose meaning.
-- Weave class / type / table / domain names into the bullets so they are searchable.
-- No code fences, no ```markdown / ```java / ```sql, no XML tags, no formatter comments.
-- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
-
-## Critical
-If the source contains "[EOF - source was truncated]", index ONLY what is literally present. Never infer, guess, or invent any unit, field, table, or behavior beyond the shown source.
-
-The file path and its full source are provided in the next (user) message: the path on the first
-line, then a blank line, then the source. Index only what is literally present there.
- ]]>
-
-
- package-body
-
-
-Then output these sections as markdown. Omit any that do not apply. Use '####' for labels. Never '###' or higher.
-
-#### Purpose
-One or two bullets: the package's overall responsibility.
-
-#### Responsibilities
-The main functional groups inside the package, as bullets. Group files by role; do not list every file separately for large packages.
-
-#### Key units
-The central classes / interfaces / modules / SQL objects and their job, one clause each, with their searchable names.
-
-#### Data flow
-How inputs move through the package to outputs, if a clear pipeline or collaboration exists across the files.
-
-#### Dependencies
-Notable internal collaborations and external modules/packages/tables the package depends on.
-
-#### Cross-cutting
-Recurring patterns across files: shared base types/interfaces, common exception/error handling, threading/concurrency notes, configuration.
-
-## Rules
-- Markdown bullets and short clauses, not prose paragraphs.
-- Weave type / module / table / domain names in as searchable terms.
-- Base every statement only on the provided file summaries. Do NOT invent units, methods, tables, or behavior not present in them.
-- No code fences, no ```markdown, no XML tags, no formatter comments.
-- The package-name heading is already rendered above your output. Start immediately with the blockquote lead. Never empty.
-
-## Critical
-If the input contains "[EOF - source was truncated]", summarize ONLY what is present. Never infer or invent files or content beyond the provided summaries.
-
-The package path and its already-generated per-file summaries are provided in the next (user)
-message: the path on the first line, then a blank line, then the summaries to synthesize.
- ]]>
-
-
- project-body
-
-
-
-
- file-body-java-v2
-
-
-Then output ONLY the sections below that carry real information. OMIT any section that would be empty, "none", or "not applicable" - do not emit a heading just to say nothing. Use '####' for section labels, never '###' or higher.
-
-TRIVIAL-FILE RULE: if the unit has no public behavior to describe (e.g. a marker/annotation, an enum that only lists constants, or a near-empty type), output ONLY the blockquote lead and a single '#### Purpose' line, and stop.
-
-#### Purpose
-One or two bullets: what the type is for.
-
-#### Type
-One line: kind (class/interface/enum/record/annotation) + modifiers; extends/implements; key generics; notable annotations (@Mojo, Lombok, etc.).
-
-#### Input
-What comes in: constructor/method parameters, injected dependencies, consumed fields, read resources.
-
-#### Output
-What comes out: return types, produced/mutated state, written resources, side effects.
-
-#### Core logic
-The essential steps/algorithm/responsibility as bullets. The most important section.
-
-#### Public API
-Each public/protected member as `name(params) -> returnType` + a <=6-word purpose clause. EXCEPTION: for plain data/config classes that are only getters/setters (e.g. Lombok beans), DO NOT list each accessor - write one line: "JavaBean getters/setters for: ".
-
-#### Dependencies
-Referenced types as searchable names. EXCLUDE this file's own type and java.lang.* .
-
-#### Exceptions / Errors
-Notable thrown/caught exceptions, null-handling, error conditions.
-
-#### Concurrency
-Threading, immutability, or thread-safety notes - only if the source actually shows them.
-
-## Rules
-- Markdown bullets and short clauses, not prose paragraphs.
-- Weave class/type/domain names into the bullets so they are searchable.
-- Describe ONLY what is literally in the source. NEVER invent units, fields, behavior, or concepts; in particular never mention keywords, tags, embeddings, search, or features the code does not contain.
-- No code fences, no ```markdown/```java, no XML tags, no formatter comments.
-- The filename heading is already rendered above your output. Start immediately with the blockquote lead. Never produce empty output.
-
-## Critical
-If the source contains "[EOF - source was truncated]", index ONLY what is literally present.
-
-The file path and its full source are provided in the next (user) message: the path on the first
-line, then a blank line, then the source. Index only what is literally present there.
- ]]>
-
-
- package-body-v2
-
-
-SINGLE-CHILD RULE: if the input describes only ONE child package/file and no other content, output ONLY the blockquote lead restating that child's responsibility, and stop - emit no sections.
-
-Otherwise output ONLY the sections below that carry real information. OMIT any that would be empty. Use '####' for labels, never '###' or higher.
-
-#### Purpose
-One or two bullets: the package's overall responsibility.
-
-#### Responsibilities
-The main functional groups inside the package, as bullets. Group files by role; do not list every file for large packages.
-
-#### Key units
-The central classes/interfaces/modules and their job, one clause each, with searchable names.
-
-#### Data flow
-How inputs move through the package to outputs, if a clear pipeline exists across the files.
-
-#### Dependencies
-Notable internal collaborations and external modules the package depends on. Focus on cross-unit/cross-package relationships, not raw JDK/Lombok imports.
-
-#### Cross-cutting
-Recurring patterns across files: shared base types, common error handling, concurrency, configuration.
-
-## Rules
-- Markdown bullets and short clauses, not prose paragraphs.
-- Weave type/module/domain names in as searchable terms.
-- Base every statement ONLY on the provided file summaries. NEVER invent units, methods, behavior, or concepts (in particular never mention keywords, tags, or embeddings) not present in them.
-- No code fences, no ```markdown, no XML tags, no formatter comments.
-- The package-name heading is already rendered above your output. Start immediately with the blockquote lead. Never empty.
-
-## Critical
-If the input contains "[EOF - source was truncated]", summarize ONLY what is present.
-
-The package path and its already-generated per-file summaries are provided in the next (user)
-message: the path on the first line, then a blank line, then the summaries to synthesize.
- ]]>
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-