From 39951490dec98ced6b1456725491c7e373983fc2 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:10:59 -0600 Subject: [PATCH 1/5] chore: gitignore logs/ and .idea/; drop local build artifacts --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 7f6e365..f712832 100644 --- a/.gitignore +++ b/.gitignore @@ -148,3 +148,7 @@ application-local.yml # Superpowers generated artifacts docs/superpowers/ + +# Local dev artifacts +logs/ +.idea/ From 842014ec32bad10965f7915107c881fcce71cd26 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:11:07 -0600 Subject: [PATCH 2/5] chore: remove vestigial .hintrc webhint config Nothing in the build or repo uses webhint; the only reference was a descriptive line in context/knowledge/STACK.md, removed here too. --- .hintrc | 5 ----- context/knowledge/STACK.md | 1 - 2 files changed, 6 deletions(-) delete mode 100644 .hintrc diff --git a/.hintrc b/.hintrc deleted file mode 100644 index aa8de6b..0000000 --- a/.hintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": [ - "development" - ] -} \ No newline at end of file diff --git a/context/knowledge/STACK.md b/context/knowledge/STACK.md index 8d1846b..cb886b2 100644 --- a/context/knowledge/STACK.md +++ b/context/knowledge/STACK.md @@ -34,7 +34,6 @@ - `net.researchgate.release` 3.1.0 — release automation; `release { git { requireBranch = 'main|release/.*' } }` allows releases from `main` or `release/*` maintenance branches, wires `generateAIChangelog` before release builds and `publishMavenCentral` after. - No static-analysis/linting plugin is configured in `build.gradle` (no checkstyle, spotless, PMD, SonarQube, or Jacoco found). - Custom JDK test tasks: `testJdk21` and `testJdk25` (via `registerJdkTestTask`) run the full test suite against JDK 21 and JDK 25 toolchains respectively; `testAll` runs both. Standard `test` task also enables JUnit 5 parallel execution (`junit.jupiter.execution.parallel.*` system properties, `maxParallelForks` = half of available cores). -- `.hintrc` — webhint linting config (`extends: development`), likely for the docs/site assets rather than Java code. - Dependabot (`.github/dependabot.yml`): weekly `gradle` ecosystem updates on `/`. ## Test Frameworks & Tools From 97d8b2e1cc364d48dace407179e25bf81d142bd0 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:11:45 -0600 Subject: [PATCH 3/5] chore: move extension/testing/release docs under docs/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TESTING.md, PROFILE.md, REGISTRATION-GUARD.md, PUBLISH.md, and RELEASE-TESTING.md move to docs/; references updated in README.md, CLAUDE.md, and the release-integration-test command. CONFIG.md and MIGRATION.md stay at root deliberately — they are the most externally deep-linked docs (release notes, old PRs) and GitHub does not redirect moved files. CHANGELOG's historical mentions are left as written. --- .claude/commands/release-integration-test.md | 2 +- CLAUDE.md | 8 ++++---- README.md | 4 ++-- PROFILE.md => docs/PROFILE.md | 0 PUBLISH.md => docs/PUBLISH.md | 0 REGISTRATION-GUARD.md => docs/REGISTRATION-GUARD.md | 0 RELEASE-TESTING.md => docs/RELEASE-TESTING.md | 0 TESTING.md => docs/TESTING.md | 0 8 files changed, 7 insertions(+), 7 deletions(-) rename PROFILE.md => docs/PROFILE.md (100%) rename PUBLISH.md => docs/PUBLISH.md (100%) rename REGISTRATION-GUARD.md => docs/REGISTRATION-GUARD.md (100%) rename RELEASE-TESTING.md => docs/RELEASE-TESTING.md (100%) rename TESTING.md => docs/TESTING.md (100%) diff --git a/.claude/commands/release-integration-test.md b/.claude/commands/release-integration-test.md index 39c33d9..e46e060 100644 --- a/.claude/commands/release-integration-test.md +++ b/.claude/commands/release-integration-test.md @@ -3,7 +3,7 @@ description: Pre-release integration test — publish the library locally and ru argument-hint: "[demo-repo-path] [version] (both optional)" --- -Execute the release integration test defined in `RELEASE-TESTING.md` (in this framework repo). +Execute the release integration test defined in `docs/RELEASE-TESTING.md` (in this framework repo). Read that runbook first and follow it exactly — it is the source of truth for the steps, commands, and the local docker-compose gotcha. diff --git a/CLAUDE.md b/CLAUDE.md index 5f7a7ec..1317016 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -115,7 +115,7 @@ com.digitalsanctuary.spring.user - `HtmxAwareAuthenticationEntryPoint` - Returns 401 JSON for HTMX requests instead of 302 redirect on session expiry **Extension Points:** -- `BaseUserProfile` - Extend for custom user data (see PROFILE.md) +- `BaseUserProfile` - Extend for custom user data (see docs/PROFILE.md) - `UserProfileService` - Interface for profile management - `BaseSessionProfile` - Session-scoped profile access - `UserPreDeleteEvent` - Listen for user deletion to clean up related data @@ -195,9 +195,9 @@ Integration tests use `TestApplication` (in `test.app` package) as their Spring ## Related Documentation -- `TESTING.md` - Comprehensive testing guide with patterns and troubleshooting -- `PROFILE.md` - User profile extension framework -- `REGISTRATION-GUARD.md` - Registration Guard SPI for pre-registration hooks +- `docs/TESTING.md` - Comprehensive testing guide with patterns and troubleshooting +- `docs/PROFILE.md` - User profile extension framework +- `docs/REGISTRATION-GUARD.md` - Registration Guard SPI for pre-registration hooks - `CONFIG.md` - Configuration reference - `MIGRATION.md` - Version migration guide - `CONTRIBUTING.md` - Contributor guidelines (fork/branch/PR workflow) diff --git a/README.md b/README.md index ae5e799..4ce5a20 100644 --- a/README.md +++ b/README.md @@ -469,7 +469,7 @@ user: ### Next Steps - Read the [Configuration Guide](CONFIG.md) for advanced settings -- See [Extension Examples](PROFILE.md) for custom user profiles +- See [Extension Examples](docs/PROFILE.md) for custom user profiles - Check out the [Demo Application](https://github.com/devondragon/SpringUserFrameworkDemoApp) for a complete example ## Configuration @@ -945,7 +945,7 @@ public class CustomUserProfileService implements UserProfileService Date: Fri, 14 Aug 2026 23:12:56 -0600 Subject: [PATCH 4/5] chore: move Python release tooling to scripts/ generate_changelog.py, test_generate_changelog.py, and requirements.txt move to scripts/; the generateAIChangelog Exec task and the context/knowledge docs point at the new paths. The script's CHANGELOG.md path is CWD-relative and the Gradle Exec task keeps the project root as working directory, so behavior is unchanged. Verified: 28 unittest tests OK from scripts/, gradle configuration parses. --- build.gradle | 2 +- context/knowledge/README.md | 2 +- context/knowledge/STACK.md | 8 ++++---- generate_changelog.py => scripts/generate_changelog.py | 0 requirements.txt => scripts/requirements.txt | 0 .../test_generate_changelog.py | 0 6 files changed, 6 insertions(+), 6 deletions(-) rename generate_changelog.py => scripts/generate_changelog.py (100%) rename requirements.txt => scripts/requirements.txt (100%) rename test_generate_changelog.py => scripts/test_generate_changelog.py (100%) diff --git a/build.gradle b/build.gradle index 4b9aa97..eba480a 100644 --- a/build.gradle +++ b/build.gradle @@ -267,7 +267,7 @@ tasks.register("publishLocal") { task generateAIChangelog(type: Exec) { def newVersion = project.version - commandLine 'mise', 'x', '--', 'python', 'generate_changelog.py', newVersion + commandLine 'mise', 'x', '--', 'python', 'scripts/generate_changelog.py', newVersion } release { diff --git a/context/knowledge/README.md b/context/knowledge/README.md index 52ae64d..5d1f8fb 100644 --- a/context/knowledge/README.md +++ b/context/knowledge/README.md @@ -26,7 +26,7 @@ This library auto-configures itself into any Spring Boot app that adds it as a d - **Inconsistent `Dto`/`DTO` casing** across the codebase (`UserDto` vs. `AuditEventDTO`/`GdprExportDTO`) — no single convention enforced. - **Field visibility inconsistency**: `UserService.userEmailService`/`userVerificationService` are `public final` rather than `private final`, breaking the otherwise-consistent DI pattern. - **Split Spring Boot compatibility across branches** (`main` = Boot 4.x/Java 21+, `release/3.x` = Boot 3.5.x/Java 17+, security-maintenance only) — worth remembering that this branch's `build.gradle` only reflects the 4.x line; don't assume both live in one build file. -- **Python release tooling** (`generate_changelog.py`, using OpenAI's API) is a separate concern from the Java library itself — not shipped, but does execute during `./gradlew release`. +- **Python release tooling** (`scripts/generate_changelog.py`, using OpenAI's API) is a separate concern from the Java library itself — not shipped, but does execute during `./gradlew release`. ## Detailed Documentation - [STACK.md](./STACK.md) - Technology stack details diff --git a/context/knowledge/STACK.md b/context/knowledge/STACK.md index cb886b2..7b9887c 100644 --- a/context/knowledge/STACK.md +++ b/context/knowledge/STACK.md @@ -2,7 +2,7 @@ ## Languages - Java: compiled with toolchain `JavaLanguageVersion.of(21)` (build.gradle `java.toolchain`); `mise.toml` pins `java = "17"` for the local dev shell (min supported runtime). CI runs on Java 21 (compile) and additionally on Java 25 (`testJdk25` task). Library published for consumers on Java 21+ (Spring Boot 4.x) via `main`, and Java 17+ (Spring Boot 3.5.x) via the separate `release/3.x` maintenance branch — the `main` branch's `build.gradle` only targets Spring Boot 4.1.0/Java 21; the 3.5/Java 17 line lives on `release/3.x`, not in this branch's build file. -- Python: 3.13 (`mise.toml`), used only for release tooling (`generate_changelog.py`, `test_generate_changelog.py`), not part of the shipped library. +- Python: 3.13 (`mise.toml`), used only for release tooling (`scripts/generate_changelog.py`, `scripts/test_generate_changelog.py`), not part of the shipped library. - HTML: Thymeleaf templates under `src/main/resources/templates/mail/` (registration/forgot-password emails). - Properties/YAML: Spring config metadata and i18n message bundles. @@ -53,7 +53,7 @@ - Spring Mail (SMTP): used for account registration confirmation and forgot-password emails, rendered via Thymeleaf templates (`src/main/resources/templates/mail/registration-token.html`, `forgot-password-token.html`); consuming app supplies actual mail server config/credentials. - OAuth2/OIDC providers: supported generically via `spring-boot-starter-oauth2-client` for social login (`registration`/`security` packages) — no specific provider (Google/GitHub/etc.) is hardcoded in build.gradle; providers are configured by the consuming application. - WebAuthn/Passkey: `spring-security-webauthn` — passwordless/FIDO2 authentication support. -- OpenAI API: used only by the release-tooling script `generate_changelog.py` (via `openai==1.105.0` in `requirements.txt`) to generate AI-assisted changelog entries during releases — not part of the runtime library. +- OpenAI API: used only by the release-tooling script `scripts/generate_changelog.py` (via `openai==1.105.0` in `scripts/requirements.txt`) to generate AI-assisted changelog entries during releases — not part of the runtime library. - GitHub Actions / Claude Code Action (`anthropics/claude-code-action@v1`): automated PR review (`claude-code-review.yml`) and `@claude`-mention-triggered assistant (`claude.yml`). - CodeQL (`github/codeql-action`): security scanning (`security-extended` query pack) on `java-kotlin` in `build.yml`. @@ -66,7 +66,7 @@ - `settings.gradle`: single root project, `rootProject.name = 'ds-spring-user-framework'`. - `gradle.properties`: current version (`5.1.1-SNAPSHOT`) and Maven Central publishing flags (`mavenCentralPublishing=true`, `mavenCentralAutomaticPublishing=true`). - `gradle/wrapper/gradle-wrapper.properties`: Gradle 9.6.1 wrapper distribution. -- `mise.toml`: pins local toolchain versions — Java 17, Python 3.13 (mise is used for tool version management, e.g. `mise x -- python generate_changelog.py`). +- `mise.toml`: pins local toolchain versions — Java 17, Python 3.13 (mise is used for tool version management, e.g. `mise x -- python scripts/generate_changelog.py`). - `lombok.config`: enables `@Generated` annotation on Lombok output to suppress Javadoc missing-constructor warnings. - `src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`: registers auto-configuration classes (`UserConfiguration`, `AuditMailAutoConfiguration`, `UserSecurityBeansAutoConfiguration`, `WebSecurityFilterChainAutoConfiguration`) — the standard Spring Boot 3+/4 auto-config discovery mechanism (replacing `spring.factories`). - `src/main/resources/META-INF/spring/org.springframework.boot.env.EnvironmentPostProcessor.imports`: registers `MessageSourceEnvironmentPostProcessor` for i18n message source setup. @@ -76,4 +76,4 @@ - `.github/workflows/build.yml`: CI — compile+test on Java 21, runtime test on Java 25, plus a CodeQL security-scan job. - `.github/workflows/claude.yml` / `claude-code-review.yml`: Claude Code GitHub Action integrations for automated PR review and `@claude`-triggered assistance. - `.github/dependabot.yml`: weekly automated Gradle dependency update PRs. -- `requirements.txt` / `generate_changelog.py` / `test_generate_changelog.py`: standalone Python release tooling (OpenAI-powered changelog generation invoked via `mise x -- python generate_changelog.py` from the Gradle `release` plugin's `beforeReleaseBuild` hook) — not part of the shipped Java library. +- `scripts/requirements.txt` / `scripts/generate_changelog.py` / `scripts/test_generate_changelog.py`: standalone Python release tooling (OpenAI-powered changelog generation invoked via `mise x -- python scripts/generate_changelog.py` from the Gradle `release` plugin's `beforeReleaseBuild` hook) — not part of the shipped Java library. diff --git a/generate_changelog.py b/scripts/generate_changelog.py similarity index 100% rename from generate_changelog.py rename to scripts/generate_changelog.py diff --git a/requirements.txt b/scripts/requirements.txt similarity index 100% rename from requirements.txt rename to scripts/requirements.txt diff --git a/test_generate_changelog.py b/scripts/test_generate_changelog.py similarity index 100% rename from test_generate_changelog.py rename to scripts/test_generate_changelog.py From f9448cbeac7e7d10a7566483f4ae2354090b9cda Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:12:56 -0600 Subject: [PATCH 5/5] chore: untrack .idea/ IDE state IDE-generated config (dataSources.xml, dbnavigator.xml, module files) churns per machine and does not belong in the library repo; .idea/ is now gitignored. .vscode/ stays tracked deliberately. --- .idea/.gitignore | 8 - .idea/.name | 1 - .idea/compiler.xml | 16 -- .idea/dataSources.xml | 17 -- .idea/dbnavigator.xml | 529 ------------------------------------ .idea/gradle.xml | 16 -- .idea/jarRepositories.xml | 20 -- .idea/misc.xml | 15 - .idea/modules.xml | 8 - .idea/modules/user.main.iml | 8 - .idea/uiDesigner.xml | 124 --------- .idea/vcs.xml | 6 - 12 files changed, 768 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/.name delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/dbnavigator.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/modules/user.main.iml delete mode 100644 .idea/uiDesigner.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index b219360..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -user \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 2882170..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index d80b535..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - h2.unified - true - org.h2.Driver - jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 - - - - - - $ProjectFileDir$ - - - \ No newline at end of file diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml deleted file mode 100644 index 8d2fd49..0000000 --- a/.idea/dbnavigator.xml +++ /dev/null @@ -1,529 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
\ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index ce1c62c..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index fdc392f..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index ecc79d5..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a12d40b..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/user.main.iml b/.idea/modules/user.main.iml deleted file mode 100644 index afc1871..0000000 --- a/.idea/modules/user.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index 2b63946..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file