+
postgresql
true
org.postgresql.Driver
@@ -80,4 +80,4 @@
$ProjectFileDir$
-
\ No newline at end of file
+
diff --git a/.idea/db-forest-config.xml b/.idea/db-forest-config.xml
index cd7cfc288..c15cda30c 100644
--- a/.idea/db-forest-config.xml
+++ b/.idea/db-forest-config.xml
@@ -3,4 +3,4 @@
-
\ No newline at end of file
+
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 565f0ad66..20bb796cd 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -8,4 +8,4 @@
-
\ No newline at end of file
+
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 58e18f769..5a84008f8 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -27,4 +27,4 @@
-
\ No newline at end of file
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 8cd55247a..e9046a220 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
@@ -16,4 +16,4 @@
-
\ No newline at end of file
+
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 94a25f7f4..5ace414d8 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -3,4 +3,4 @@
-
\ No newline at end of file
+
diff --git a/.junie/frontend-style-guideline.md b/.junie/frontend-style-guideline.md
index 903618f29..dbc04b8ef 100644
--- a/.junie/frontend-style-guideline.md
+++ b/.junie/frontend-style-guideline.md
@@ -1,6 +1,6 @@
# Frontend Style Guideline
-This document defines the standard UI patterns and styles for the AngularAI project to ensure consistency across all pages. Junie must follow these guidelines for all UI-related changes.
+This document defines the standard UI patterns and styles for the GoodOne project to ensure consistency across all pages. Junie must follow these guidelines for all UI-related changes.
## 1. Core Principles
- **Consistency**: Use the same components, spacing, and layouts across all pages.
diff --git a/.junie/guidelines.md b/.junie/guidelines.md
index 7f2ca10d7..e5c6b7394 100644
--- a/.junie/guidelines.md
+++ b/.junie/guidelines.md
@@ -1,6 +1,6 @@
# Development Guidelines
-This document outlines the best practices and standards for the AngularAI project.
+This document outlines the best practices and standards for the GoodOne project.
## General Principles
- **Modern Standards**: Use the latest stable versions of frameworks (Angular 21+, Spring Boot 4+). NEVER use deprecated methods, features, or syntax in any language (e.g., avoid `*ngIf` and `*ngFor` in Angular, use modern control flow instead).
@@ -84,10 +84,10 @@ This document outlines the best practices and standards for the AngularAI projec
## Backend Development (Spring Boot)
### 1. Architecture
-- **Controllers**: Use RESTful controllers in `ch.goodone.angularai.backend.controller`.
-- **Models**: Use JPA entities in `ch.goodone.angularai.backend.model`. Always create a Flyway migration script (in `backend/src/main/resources/db/migration/`) whenever a JPA entity is created or modified to ensure the database schema stays in sync.
+- **Controllers**: Use RESTful controllers in `ch.goodone.goodone.backend.controller`.
+- **Models**: Use JPA entities in `ch.goodone.goodone.backend.model`. Always create a Flyway migration script (in `backend/src/main/resources/db/migration/`) whenever a JPA entity is created or modified to ensure the database schema stays in sync.
- **Idempotent Migrations**: All Flyway migration scripts MUST be idempotent. Use `CREATE TABLE IF NOT EXISTS`, `ALTER TABLE ... ADD COLUMN IF NOT EXISTS`, and similar constructs. This is critical for Fargate deployments where tasks may restart or run concurrently during rollout.
-- **Repositories**: Use Spring Data JPA repositories in `ch.goodone.angularai.backend.repository`. Avoid using direct SQL statements (e.g., via `JdbcTemplate`) in Java code. Use JPA or Spring Data JPA abstractions for all database operations.
+- **Repositories**: Use Spring Data JPA repositories in `ch.goodone.goodone.backend.repository`. Avoid using direct SQL statements (e.g., via `JdbcTemplate`) in Java code. Use JPA or Spring Data JPA abstractions for all database operations.
- **DTOs**: Use DTOs for API requests and responses to avoid leaking internal entity structures. Implement `fromEntity()` static methods in DTOs for centralized mapping.
### 2. Best Practices
diff --git a/.sonar-export/sonar-issues-enriched.json b/.sonar-export/sonar-issues-enriched.json
index 87679c79f..3d5271725 100644
--- a/.sonar-export/sonar-issues-enriched.json
+++ b/.sonar-export/sonar-issues-enriched.json
@@ -8,9 +8,9 @@
"status": "OPEN",
"resolution": null,
"message": "The signature \u0027(): Provider[]\u0027 of \u0027provideAnimations\u0027 is deprecated.",
- "component": "JuergGood_angularai:frontend/src/app/app.config.ts",
+ "component": "JuergGood_goodone:frontend/src/app/app.config.ts",
"file": "frontend/src/app/app.config.ts",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": 32,
"textRange": {
"startLine": 32,
@@ -34,7 +34,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxoSLyeSm898HwP_JIB\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxoSLyeSm898HwP_JIB\u0026id=JuergGood_goodone",
"sourceSnippet": " 29: headerName: \u0027X-XSRF-TOKEN\u0027\r\n 30: })\r\n 31: ),\r\n\u003e\u003e 32: provideAnimations(),\r\n 33: provideTranslateService({\r\n 34: defaultLanguage: \u0027en\u0027\r\n 35: }),"
},
{
@@ -46,9 +46,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Prefer `globalThis` over `window`.",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 17,
@@ -72,7 +72,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a8\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a8\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -84,9 +84,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Prefer `globalThis` over `window`.",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 26,
@@ -110,7 +110,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a_\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a_\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -122,9 +122,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Prefer `globalThis` over `window`.",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 34,
@@ -148,7 +148,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bB\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bB\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -160,9 +160,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Unexpected duplicate selector \"body.theme-dark .mat-expansion-panel-header\", first used at line 541",
- "component": "JuergGood_angularai:frontend/src/styles.css",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
"file": "frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 550,
@@ -186,7 +186,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bO\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bO\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -198,9 +198,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Unexpected duplicate selector \"html body.theme-dark .mat-mdc-button-base.mat-primary\", first used at line 131",
- "component": "JuergGood_angularai:frontend/src/styles.css",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
"file": "frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 136,
@@ -224,7 +224,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bM\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bM\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -236,9 +236,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Unexpected duplicate selector \"html body.theme-dark .mat-mdc-button-base.mat-primary:disabled\", first used at line 164",
- "component": "JuergGood_angularai:frontend/src/styles.css",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
"file": "frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 174,
@@ -262,7 +262,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bN\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bN\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -274,9 +274,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Prefer `globalThis` over `window`.",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 28,
@@ -300,7 +300,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bA\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bA\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -312,9 +312,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Introduce a new variable or use its initial value before reassigning \"t\".",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 37,
@@ -338,7 +338,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bD\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bD\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -350,9 +350,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Introduce a new variable or use its initial value before reassigning \"y\".",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 38,
@@ -376,7 +376,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bE\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bE\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -388,9 +388,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Prefer `globalThis` over `window`.",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 39,
@@ -414,7 +414,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bF\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bF\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -426,9 +426,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Unexpected shorthand \"background\" after \"background-color\"",
- "component": "JuergGood_angularai:frontend/src/styles.css",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
"file": "frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 315,
@@ -452,7 +452,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bL\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bL\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -464,9 +464,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Unexpected duplicate selector \"body.theme-dark\", first used at line 611",
- "component": "JuergGood_angularai:frontend/src/styles.css",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
"file": "frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 709,
@@ -490,7 +490,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bP\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bP\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -502,9 +502,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Prefer `globalThis` over `window`.",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 24,
@@ -528,7 +528,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a-\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a-\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -540,9 +540,9 @@
"status": "CLOSED",
"resolution": "REMOVED",
"message": "Prefer `globalThis` over `window`.",
- "component": "JuergGood_angularai:frontend/src/index.html",
+ "component": "JuergGood_goodone:frontend/src/index.html",
"file": "frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": null,
"textRange": {
"startLine": 24,
@@ -566,7 +566,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a9\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a9\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -578,9 +578,9 @@
"status": "OPEN",
"resolution": null,
"message": "\u0027provideAnimations\u0027 is deprecated.",
- "component": "JuergGood_angularai:frontend/src/app/app.config.ts",
+ "component": "JuergGood_goodone:frontend/src/app/app.config.ts",
"file": "frontend/src/app/app.config.ts",
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"line": 4,
"textRange": {
"startLine": 4,
@@ -604,7 +604,7 @@
],
"quickFixAvailable": null,
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFafixv-IQC_v9ay\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFafixv-IQC_v9ay\u0026id=JuergGood_goodone",
"sourceSnippet": " 1: import { ApplicationConfig, provideBrowserGlobalErrorListeners, ErrorHandler, provideAppInitializer, inject } from \u0027@angular/core\u0027;\r\n 2: import { provideRouter } from \u0027@angular/router\u0027;\r\n 3: import { provideHttpClient, withFetch, withXsrfConfiguration, withInterceptors } from \u0027@angular/common/http\u0027;\r\n\u003e\u003e 4: import { provideAnimations } from \u0027@angular/platform-browser/animations\u0027;\r\n 5: import { provideTranslateService } from \u0027@ngx-translate/core\u0027;\r\n 6: import { provideTranslateHttpLoader } from \u0027@ngx-translate/http-loader\u0027;\r\n 7: "
}
]
diff --git a/.sonar-export/sonar-issues-for-junie.json b/.sonar-export/sonar-issues-for-junie.json
index 344cfbdc3..40129e903 100644
--- a/.sonar-export/sonar-issues-for-junie.json
+++ b/.sonar-export/sonar-issues-for-junie.json
@@ -14,7 +14,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxoSLyeSm898HwP_JIB\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxoSLyeSm898HwP_JIB\u0026id=JuergGood_goodone",
"sourceSnippet": " 29: headerName: \u0027X-XSRF-TOKEN\u0027\r\n 30: })\r\n 31: ),\r\n\u003e\u003e 32: provideAnimations(),\r\n 33: provideTranslateService({\r\n 34: defaultLanguage: \u0027en\u0027\r\n 35: }),"
},
{
@@ -32,7 +32,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a8\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a8\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -50,7 +50,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a_\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a_\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -68,7 +68,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bB\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bB\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -86,7 +86,7 @@
"severity": "MEDIUM"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bO\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bO\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -104,7 +104,7 @@
"severity": "MEDIUM"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bM\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bM\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -122,7 +122,7 @@
"severity": "MEDIUM"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bN\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bN\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -140,7 +140,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bA\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bA\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -158,7 +158,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bD\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bD\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -176,7 +176,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bE\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bE\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -194,7 +194,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bF\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9bF\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -212,7 +212,7 @@
"severity": "HIGH"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bL\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bL\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -230,7 +230,7 @@
"severity": "MEDIUM"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bP\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFchixv-IQC_v9bP\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -248,7 +248,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a-\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a-\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -266,7 +266,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a9\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFb4ixv-IQC_v9a9\u0026id=JuergGood_goodone",
"sourceSnippet": null
},
{
@@ -284,7 +284,7 @@
"severity": "LOW"
}
],
- "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFafixv-IQC_v9ay\u0026id=JuergGood_angularai",
+ "issueUrl": "https://sonarcloud.io/project/issues?open=AZxjQFafixv-IQC_v9ay\u0026id=JuergGood_goodone",
"sourceSnippet": " 1: import { ApplicationConfig, provideBrowserGlobalErrorListeners, ErrorHandler, provideAppInitializer, inject } from \u0027@angular/core\u0027;\r\n 2: import { provideRouter } from \u0027@angular/router\u0027;\r\n 3: import { provideHttpClient, withFetch, withXsrfConfiguration, withInterceptors } from \u0027@angular/common/http\u0027;\r\n\u003e\u003e 4: import { provideAnimations } from \u0027@angular/platform-browser/animations\u0027;\r\n 5: import { provideTranslateService } from \u0027@ngx-translate/core\u0027;\r\n 6: import { provideTranslateHttpLoader } from \u0027@ngx-translate/http-loader\u0027;\r\n 7: "
}
]
diff --git a/.sonar-export/sonar-issues-full.json b/.sonar-export/sonar-issues-full.json
index 2be25aa38..9a332f8fd 100644
--- a/.sonar-export/sonar-issues-full.json
+++ b/.sonar-export/sonar-issues-full.json
@@ -1,18 +1,18 @@
{
- "project": "JuergGood_angularai",
+ "project": "JuergGood_goodone",
"statuses": "OPEN,CONFIRMED",
"impactSeverities": "",
"impactSoftwareQualities": "MAINTAINABILITY,RELIABILITY,SECURITY",
"exportedAt": "2026-03-10T22:03:11",
- "repoRoot": "C:\\doc\\sw\\ai\\angularai\\angularai",
+ "repoRoot": "C:\\doc\\sw\\ai\\goodone\\goodone",
"total": 16,
"issues": [
{
"key": "AZxoSLyeSm898HwP_JIB",
"rule": "typescript:S1874",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/app/app.config.ts",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/app/app.config.ts",
+ "project": "JuergGood_goodone",
"line": 32,
"hash": "d1797e4295616414e92b83b5a76a582c",
"textRange": {
@@ -65,7 +65,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -74,8 +74,8 @@
"key": "AZxjQFb4ixv-IQC_v9a8",
"rule": "javascript:S7764",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "2d55caa8e27355b0dad55aaf09f78621",
"textRange": {
"startLine": 17,
@@ -120,7 +120,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -129,8 +129,8 @@
"key": "AZxjQFb4ixv-IQC_v9a_",
"rule": "javascript:S7764",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "4f9560fee3d0817557f572a1064921c8",
"textRange": {
"startLine": 26,
@@ -175,7 +175,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -184,8 +184,8 @@
"key": "AZxjQFb4ixv-IQC_v9bB",
"rule": "javascript:S7764",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "2d55caa8e27355b0dad55aaf09f78621",
"textRange": {
"startLine": 34,
@@ -230,7 +230,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -239,8 +239,8 @@
"key": "AZxjQFchixv-IQC_v9bO",
"rule": "css:S4666",
"severity": "MAJOR",
- "component": "JuergGood_angularai:frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
+ "project": "JuergGood_goodone",
"hash": "f7eb2753e085011e55f0c6dc932bf7e5",
"textRange": {
"startLine": 550,
@@ -284,7 +284,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -293,8 +293,8 @@
"key": "AZxjQFchixv-IQC_v9bM",
"rule": "css:S4666",
"severity": "MAJOR",
- "component": "JuergGood_angularai:frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
+ "project": "JuergGood_goodone",
"hash": "5dbb5eb0d4d84deec3eb8d0ec243a70d",
"textRange": {
"startLine": 136,
@@ -338,7 +338,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -347,8 +347,8 @@
"key": "AZxjQFchixv-IQC_v9bN",
"rule": "css:S4666",
"severity": "MAJOR",
- "component": "JuergGood_angularai:frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
+ "project": "JuergGood_goodone",
"hash": "88c41757803fcc0df0421daa097a8547",
"textRange": {
"startLine": 174,
@@ -392,7 +392,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -401,8 +401,8 @@
"key": "AZxjQFb4ixv-IQC_v9bA",
"rule": "javascript:S7764",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "98ab68f7f3e793f1930d163fa0384f7c",
"textRange": {
"startLine": 28,
@@ -447,7 +447,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -456,8 +456,8 @@
"key": "AZxjQFb4ixv-IQC_v9bD",
"rule": "javascript:S1226",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "471f638cd7021e8f77dc24d634b58784",
"textRange": {
"startLine": 37,
@@ -501,7 +501,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -510,8 +510,8 @@
"key": "AZxjQFb4ixv-IQC_v9bE",
"rule": "javascript:S1226",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "27b7dda992563b634502fd00c688e436",
"textRange": {
"startLine": 38,
@@ -555,7 +555,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -564,8 +564,8 @@
"key": "AZxjQFb4ixv-IQC_v9bF",
"rule": "javascript:S7764",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "6ba5bffb92dd4bdaf43841e0d36a8d76",
"textRange": {
"startLine": 39,
@@ -610,7 +610,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -619,8 +619,8 @@
"key": "AZxjQFchixv-IQC_v9bL",
"rule": "css:S4657",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
+ "project": "JuergGood_goodone",
"hash": "b6b3e09dfa5ddf3ecba5e620758a6e71",
"textRange": {
"startLine": 315,
@@ -664,7 +664,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -673,8 +673,8 @@
"key": "AZxjQFchixv-IQC_v9bP",
"rule": "css:S4666",
"severity": "MAJOR",
- "component": "JuergGood_angularai:frontend/src/styles.css",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/styles.css",
+ "project": "JuergGood_goodone",
"hash": "78498f77ee1ca6c84e5d6e211da7f528",
"textRange": {
"startLine": 709,
@@ -718,7 +718,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -727,8 +727,8 @@
"key": "AZxjQFb4ixv-IQC_v9a-",
"rule": "javascript:S7764",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "1f54e742240c303fb82f8ad1b6f95d34",
"textRange": {
"startLine": 24,
@@ -773,7 +773,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -782,8 +782,8 @@
"key": "AZxjQFb4ixv-IQC_v9a9",
"rule": "javascript:S7764",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/index.html",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/index.html",
+ "project": "JuergGood_goodone",
"hash": "1f54e742240c303fb82f8ad1b6f95d34",
"textRange": {
"startLine": 24,
@@ -828,7 +828,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
@@ -837,8 +837,8 @@
"key": "AZxjQFafixv-IQC_v9ay",
"rule": "typescript:S1874",
"severity": "MINOR",
- "component": "JuergGood_angularai:frontend/src/app/app.config.ts",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:frontend/src/app/app.config.ts",
+ "project": "JuergGood_goodone",
"line": 4,
"hash": "b0b7d0e2941bc07c4179d42d9bd42f29",
"textRange": {
@@ -891,7 +891,7 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent",
+ "projectName": "goodone-parent",
"internalTags": [
]
diff --git a/README.md b/README.md
index 6542cf7fa..522300f04 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
diff --git a/backend/Dockerfile b/backend/Dockerfile
index f11c90f3d..25a1aaf49 100644
--- a/backend/Dockerfile
+++ b/backend/Dockerfile
@@ -14,7 +14,7 @@ RUN apk update && apk upgrade --no-cache
RUN addgroup -S spring && adduser -S spring -G spring
WORKDIR /app
COPY doc doc
-COPY --from=build /app/backend/target/aibackend-*.jar app.jar
+COPY --from=build /app/backend/target/goodone-backend-*.jar app.jar
# Set permissions
RUN chown -R spring:spring /app
EXPOSE 8080
diff --git a/backend/cp.txt b/backend/cp.txt
index 30cf8cea2..42b4d462e 100644
--- a/backend/cp.txt
+++ b/backend/cp.txt
@@ -1 +1 @@
-C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-h2console\4.0.1\spring-boot-h2console-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot\4.0.1\spring-boot-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-context\7.0.2\spring-context-7.0.2.jar;C:\Users\sub\.m2\repository\jakarta\servlet\jakarta.servlet-api\6.1.0\jakarta.servlet-api-6.1.0.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\4.0.1\spring-boot-starter-data-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter\4.0.1\spring-boot-starter-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.0.1\spring-boot-starter-logging-4.0.1.jar;C:\Users\sub\.m2\repository\ch\qos\logback\logback-classic\1.5.22\logback-classic-1.5.22.jar;C:\Users\sub\.m2\repository\ch\qos\logback\logback-core\1.5.22\logback-core-1.5.22.jar;C:\Users\sub\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.3\log4j-to-slf4j-2.25.3.jar;C:\Users\sub\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.3\log4j-api-2.25.3.jar;C:\Users\sub\.m2\repository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\4.0.1\spring-boot-autoconfigure-4.0.1.jar;C:\Users\sub\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.0.1\spring-boot-starter-jdbc-4.0.1.jar;C:\Users\sub\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-data-jpa\4.0.1\spring-boot-data-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-data-commons\4.0.1\spring-boot-data-commons-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-persistence\4.0.1\spring-boot-persistence-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\data\spring-data-commons\4.0.1\spring-data-commons-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-hibernate\4.0.1\spring-boot-hibernate-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jpa\4.0.1\spring-boot-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-orm\7.0.2\spring-orm-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\data\spring-data-jpa\4.0.1\spring-data-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-tx\7.0.2\spring-tx-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-aspects\7.0.2\spring-aspects-7.0.2.jar;C:\Users\sub\.m2\repository\org\aspectj\aspectjweaver\1.9.25.1\aspectjweaver-1.9.25.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.0.1\spring-boot-jdbc-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-sql\4.0.1\spring-boot-sql-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-transaction\4.0.1\spring-boot-transaction-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-jdbc\7.0.2\spring-jdbc-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-security\4.0.1\spring-boot-starter-security-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-security\4.0.1\spring-boot-security-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-config\7.0.2\spring-security-config-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-aop\7.0.2\spring-aop-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-beans\7.0.2\spring-beans-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.0.1\spring-boot-starter-webmvc-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.0.1\spring-boot-starter-jackson-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jackson\4.0.1\spring-boot-jackson-4.0.1.jar;C:\Users\sub\.m2\repository\tools\jackson\core\jackson-databind\3.0.3\jackson-databind-3.0.3.jar;C:\Users\sub\.m2\repository\tools\jackson\core\jackson-core\3.0.3\jackson-core-3.0.3.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.0.1\spring-boot-starter-tomcat-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.0.1\spring-boot-starter-tomcat-runtime-4.0.1.jar;C:\Users\sub\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.15\tomcat-embed-core-11.0.15.jar;C:\Users\sub\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.15\tomcat-embed-websocket-11.0.15.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.0.1\spring-boot-tomcat-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.0.1\spring-boot-http-converter-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-web\7.0.2\spring-web-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.0.1\spring-boot-webmvc-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-servlet\4.0.1\spring-boot-servlet-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-webmvc\7.0.2\spring-webmvc-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\4.0.1\spring-boot-starter-actuator-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-micrometer-metrics\4.0.1\spring-boot-starter-micrometer-metrics-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-micrometer-metrics\4.0.1\spring-boot-micrometer-metrics-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-micrometer-observation\4.0.1\spring-boot-micrometer-observation-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\4.0.1\spring-boot-actuator-autoconfigure-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-actuator\4.0.1\spring-boot-actuator-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-health\4.0.1\spring-boot-health-4.0.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-observation\1.16.1\micrometer-observation-1.16.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-commons\1.16.1\micrometer-commons-1.16.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-jakarta9\1.16.1\micrometer-jakarta9-1.16.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-registry-prometheus\1.16.1\micrometer-registry-prometheus-1.16.1.jar;C:\Users\sub\.m2\repository\org\jspecify\jspecify\1.0.0\jspecify-1.0.0.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-core\1.16.1\micrometer-core-1.16.1.jar;C:\Users\sub\.m2\repository\org\hdrhistogram\HdrHistogram\2.2.2\HdrHistogram-2.2.2.jar;C:\Users\sub\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-core\1.4.3\prometheus-metrics-core-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-model\1.4.3\prometheus-metrics-model-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-config\1.4.3\prometheus-metrics-config-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-tracer-common\1.4.3\prometheus-metrics-tracer-common-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-exposition-formats\1.4.3\prometheus-metrics-exposition-formats-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-exposition-textformats\1.4.3\prometheus-metrics-exposition-textformats-1.4.3.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-validation\4.0.1\spring-boot-starter-validation-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-validation\4.0.1\spring-boot-validation-4.0.1.jar;C:\Users\sub\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.15\tomcat-embed-el-11.0.15.jar;C:\Users\sub\.m2\repository\org\hibernate\validator\hibernate-validator\9.0.1.Final\hibernate-validator-9.0.1.Final.jar;C:\Users\sub\.m2\repository\jakarta\validation\jakarta.validation-api\3.1.1\jakarta.validation-api-3.1.1.jar;C:\Users\sub\.m2\repository\de\codecentric\spring-boot-admin-starter-client\4.0.0\spring-boot-admin-starter-client-4.0.0.jar;C:\Users\sub\.m2\repository\de\codecentric\spring-boot-admin-client\4.0.0\spring-boot-admin-client-4.0.0.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-restclient\4.0.1\spring-boot-starter-restclient-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-restclient\4.0.1\spring-boot-restclient-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-http-client\4.0.1\spring-boot-http-client-4.0.1.jar;C:\Users\sub\.m2\repository\com\h2database\h2\2.4.240\h2-2.4.240.jar;C:\Users\sub\.m2\repository\org\postgresql\postgresql\42.7.8\postgresql-42.7.8.jar;C:\Users\sub\.m2\repository\org\checkerframework\checker-qual\3.49.5\checker-qual-3.49.5.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-test\4.0.1\spring-boot-starter-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-test\4.0.1\spring-boot-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\4.0.1\spring-boot-test-autoconfigure-4.0.1.jar;C:\Users\sub\.m2\repository\com\jayway\jsonpath\json-path\2.10.0\json-path-2.10.0.jar;C:\Users\sub\.m2\repository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;C:\Users\sub\.m2\repository\net\minidev\json-smart\2.6.0\json-smart-2.6.0.jar;C:\Users\sub\.m2\repository\net\minidev\accessors-smart\2.6.0\accessors-smart-2.6.0.jar;C:\Users\sub\.m2\repository\org\ow2\asm\asm\9.7.1\asm-9.7.1.jar;C:\Users\sub\.m2\repository\org\assertj\assertj-core\3.27.6\assertj-core-3.27.6.jar;C:\Users\sub\.m2\repository\net\bytebuddy\byte-buddy\1.17.8\byte-buddy-1.17.8.jar;C:\Users\sub\.m2\repository\org\awaitility\awaitility\4.3.0\awaitility-4.3.0.jar;C:\Users\sub\.m2\repository\org\hamcrest\hamcrest\3.0\hamcrest-3.0.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter\6.0.1\junit-jupiter-6.0.1.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter-api\6.0.1\junit-jupiter-api-6.0.1.jar;C:\Users\sub\.m2\repository\org\opentest4j\opentest4j\1.3.0\opentest4j-1.3.0.jar;C:\Users\sub\.m2\repository\org\junit\platform\junit-platform-commons\6.0.1\junit-platform-commons-6.0.1.jar;C:\Users\sub\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter-params\6.0.1\junit-jupiter-params-6.0.1.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter-engine\6.0.1\junit-jupiter-engine-6.0.1.jar;C:\Users\sub\.m2\repository\org\junit\platform\junit-platform-engine\6.0.1\junit-platform-engine-6.0.1.jar;C:\Users\sub\.m2\repository\org\mockito\mockito-core\5.20.0\mockito-core-5.20.0.jar;C:\Users\sub\.m2\repository\net\bytebuddy\byte-buddy-agent\1.17.8\byte-buddy-agent-1.17.8.jar;C:\Users\sub\.m2\repository\org\objenesis\objenesis\3.3\objenesis-3.3.jar;C:\Users\sub\.m2\repository\org\mockito\mockito-junit-jupiter\5.20.0\mockito-junit-jupiter-5.20.0.jar;C:\Users\sub\.m2\repository\org\skyscreamer\jsonassert\1.5.3\jsonassert-1.5.3.jar;C:\Users\sub\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-core\7.0.2\spring-core-7.0.2.jar;C:\Users\sub\.m2\repository\commons-logging\commons-logging\1.3.5\commons-logging-1.3.5.jar;C:\Users\sub\.m2\repository\org\springframework\spring-test\7.0.2\spring-test-7.0.2.jar;C:\Users\sub\.m2\repository\org\xmlunit\xmlunit-core\2.10.4\xmlunit-core-2.10.4.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-test\7.0.2\spring-security-test-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-core\7.0.2\spring-security-core-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-crypto\7.0.2\spring-security-crypto-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-expression\7.0.2\spring-expression-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-web\7.0.2\spring-security-web-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa-test\4.0.1\spring-boot-starter-data-jpa-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc-test\4.0.1\spring-boot-starter-jdbc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jdbc-test\4.0.1\spring-boot-jdbc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-data-jpa-test\4.0.1\spring-boot-data-jpa-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jpa-test\4.0.1\spring-boot-jpa-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc-test\4.0.1\spring-boot-starter-webmvc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jackson-test\4.0.1\spring-boot-starter-jackson-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-webmvc-test\4.0.1\spring-boot-webmvc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-web-server\4.0.1\spring-boot-web-server-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-resttestclient\4.0.1\spring-boot-resttestclient-4.0.1.jar;C:\Users\sub\.m2\repository\com\atlassian\oai\swagger-request-validator-mockmvc\2.44.1\swagger-request-validator-mockmvc-2.44.1.jar;C:\Users\sub\.m2\repository\com\atlassian\oai\swagger-request-validator-core\2.44.1\swagger-request-validator-core-2.44.1.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser\2.1.22\swagger-parser-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-v2-converter\2.1.22\swagger-parser-v2-converter-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-core\1.6.14\swagger-core-1.6.14.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-models\1.6.14\swagger-models-1.6.14.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-annotations\1.6.14\swagger-annotations-1.6.14.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-parser\1.0.70\swagger-parser-1.0.70.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-parser-safe-url-resolver\1.0.70\swagger-parser-safe-url-resolver-1.0.70.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-compat-spec-parser\1.0.70\swagger-compat-spec-parser-1.0.70.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\json-patch\1.13\json-patch-1.13.jar;C:\Users\sub\.m2\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;C:\Users\sub\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\sub\.m2\repository\commons-codec\commons-codec\1.19.0\commons-codec-1.19.0.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-models\2.2.21\swagger-models-2.2.21.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-core\2.1.22\swagger-parser-core-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-v3\2.1.22\swagger-parser-v3-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-core\2.2.21\swagger-core-2.2.21.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-safe-url-resolver\2.1.22\swagger-parser-safe-url-resolver-2.1.22.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.20.1\jackson-dataformat-yaml-2.20.1.jar;C:\Users\sub\.m2\repository\commons-io\commons-io\2.15.1\commons-io-2.15.1.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\json-schema-validator\2.2.14\json-schema-validator-2.2.14.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\jackson-coreutils-equivalence\1.0\jackson-coreutils-equivalence-1.0.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\jackson-coreutils\2.0\jackson-coreutils-2.0.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\msg-simple\1.2\msg-simple-1.2.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\btf\1.3\btf-1.3.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\json-schema-core\1.2.14\json-schema-core-1.2.14.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\uri-template\0.10\uri-template-0.10.jar;C:\Users\sub\.m2\repository\org\mozilla\rhino\1.7.7.2\rhino-1.7.7.2.jar;C:\Users\sub\.m2\repository\com\sun\mail\mailapi\1.6.2\mailapi-1.6.2.jar;C:\Users\sub\.m2\repository\joda-time\joda-time\2.10.5\joda-time-2.10.5.jar;C:\Users\sub\.m2\repository\com\googlecode\libphonenumber\libphonenumber\8.11.1\libphonenumber-8.11.1.jar;C:\Users\sub\.m2\repository\net\sf\jopt-simple\jopt-simple\5.0.4\jopt-simple-5.0.4.jar;C:\Users\sub\.m2\repository\com\google\guava\guava\33.3.1-jre\guava-33.3.1-jre.jar;C:\Users\sub\.m2\repository\com\google\guava\failureaccess\1.0.2\failureaccess-1.0.2.jar;C:\Users\sub\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\sub\.m2\repository\com\google\errorprone\error_prone_annotations\2.28.0\error_prone_annotations-2.28.0.jar;C:\Users\sub\.m2\repository\com\google\j2objc\j2objc-annotations\3.0.0\j2objc-annotations-3.0.0.jar;C:\Users\sub\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.20.1\jackson-datatype-jdk8-2.20.1.jar;C:\Users\sub\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\sub\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\sub\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.4\jakarta.xml.bind-api-4.0.4.jar;C:\Users\sub\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.4\jakarta.activation-api-2.1.4.jar;C:\Users\sub\.m2\repository\org\glassfish\jaxb\jaxb-runtime\4.0.6\jaxb-runtime-4.0.6.jar;C:\Users\sub\.m2\repository\org\glassfish\jaxb\jaxb-core\4.0.6\jaxb-core-4.0.6.jar;C:\Users\sub\.m2\repository\org\eclipse\angus\angus-activation\2.0.3\angus-activation-2.0.3.jar;C:\Users\sub\.m2\repository\org\glassfish\jaxb\txw2\4.0.6\txw2-4.0.6.jar;C:\Users\sub\.m2\repository\com\sun\istack\istack-commons-runtime\4.1.2\istack-commons-runtime-4.1.2.jar;C:\Users\sub\.m2\repository\org\springdoc\springdoc-openapi-starter-webmvc-ui\2.8.5\springdoc-openapi-starter-webmvc-ui-2.8.5.jar;C:\Users\sub\.m2\repository\org\springdoc\springdoc-openapi-starter-webmvc-api\2.8.5\springdoc-openapi-starter-webmvc-api-2.8.5.jar;C:\Users\sub\.m2\repository\org\springdoc\springdoc-openapi-starter-common\2.8.5\springdoc-openapi-starter-common-2.8.5.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-core-jakarta\2.2.28\swagger-core-jakarta-2.2.28.jar;C:\Users\sub\.m2\repository\org\apache\commons\commons-lang3\3.19.0\commons-lang3-3.19.0.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-annotations-jakarta\2.2.28\swagger-annotations-jakarta-2.2.28.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-models-jakarta\2.2.28\swagger-models-jakarta-2.2.28.jar;C:\Users\sub\.m2\repository\org\webjars\webjars-locator-lite\1.1.2\webjars-locator-lite-1.1.2.jar;C:\Users\sub\.m2\repository\org\webjars\swagger-ui\5.31.0\swagger-ui-5.31.0.jar;C:\Users\sub\.m2\repository\org\flywaydb\flyway-core\11.14.1\flyway-core-11.14.1.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.20.1\jackson-databind-2.20.1.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.20\jackson-annotations-2.20.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.20.1\jackson-core-2.20.1.jar;C:\Users\sub\.m2\repository\org\flywaydb\flyway-database-postgresql\11.14.1\flyway-database-postgresql-11.14.1.jar;C:\Users\sub\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\sub\.m2\repository\org\yaml\snakeyaml\2.5\snakeyaml-2.5.jar;C:\Users\sub\.m2\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-mail\4.0.1\spring-boot-starter-mail-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-mail\4.0.1\spring-boot-mail-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-context-support\7.0.2\spring-context-support-7.0.2.jar;C:\Users\sub\.m2\repository\jakarta\mail\jakarta.mail-api\2.1.5\jakarta.mail-api-2.1.5.jar;C:\Users\sub\.m2\repository\org\eclipse\angus\angus-mail\2.0.5\angus-mail-2.0.5.jar;C:\Users\sub\.m2\repository\com\bucket4j\bucket4j-core\8.10.1\bucket4j-core-8.10.1.jar;C:\Users\sub\.m2\repository\io\jsonwebtoken\jjwt-api\0.13.0\jjwt-api-0.13.0.jar;C:\Users\sub\.m2\repository\io\jsonwebtoken\jjwt-impl\0.13.0\jjwt-impl-0.13.0.jar;C:\Users\sub\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\sub\.m2\repository\org\projectlombok\lombok\1.18.42\lombok-1.18.42.jar;C:\Users\sub\.m2\repository\org\hibernate\orm\hibernate-envers\7.2.0.Final\hibernate-envers-7.2.0.Final.jar;C:\Users\sub\.m2\repository\org\hibernate\orm\hibernate-core\7.2.0.Final\hibernate-core-7.2.0.Final.jar;C:\Users\sub\.m2\repository\jakarta\persistence\jakarta.persistence-api\3.2.0\jakarta.persistence-api-3.2.0.jar;C:\Users\sub\.m2\repository\jakarta\transaction\jakarta.transaction-api\2.0.1\jakarta.transaction-api-2.0.1.jar;C:\Users\sub\.m2\repository\com\fasterxml\classmate\1.7.1\classmate-1.7.1.jar;C:\Users\sub\.m2\repository\jakarta\inject\jakarta.inject-api\2.0.1\jakarta.inject-api-2.0.1.jar;C:\Users\sub\.m2\repository\org\antlr\antlr4-runtime\4.13.2\antlr4-runtime-4.13.2.jar;C:\Users\sub\.m2\repository\org\jboss\logging\jboss-logging\3.6.1.Final\jboss-logging-3.6.1.Final.jar;C:\Users\sub\.m2\repository\org\hibernate\models\hibernate-models\1.0.1\hibernate-models-1.0.1.jar;C:\Users\sub\.m2\repository\io\smallrye\jandex\3.3.2\jandex-3.3.2.jar;C:\Users\sub\.m2\repository\net\logstash\logback\logstash-logback-encoder\8.0\logstash-logback-encoder-8.0.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-ollama-spring-boot-starter\1.0.0-M6\spring-ai-ollama-spring-boot-starter-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-spring-boot-autoconfigure\1.0.0-M6\spring-ai-spring-boot-autoconfigure-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-ollama\1.0.0-M6\spring-ai-ollama-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-core\1.0.0-M6\spring-ai-core-1.0.0-M6.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\module\jackson-module-jsonSchema\2.20.1\jackson-module-jsonSchema-2.20.1.jar;C:\Users\sub\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-annotations\2.2.25\swagger-annotations-2.2.25.jar;C:\Users\sub\.m2\repository\com\github\victools\jsonschema-module-swagger-2\4.37.0\jsonschema-module-swagger-2-4.37.0.jar;C:\Users\sub\.m2\repository\org\antlr\ST4\4.3.4\ST4-4.3.4.jar;C:\Users\sub\.m2\repository\org\antlr\antlr-runtime\3.5.3\antlr-runtime-3.5.3.jar;C:\Users\sub\.m2\repository\io\projectreactor\reactor-core\3.8.1\reactor-core-3.8.1.jar;C:\Users\sub\.m2\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\Users\sub\.m2\repository\org\springframework\spring-messaging\7.0.2\spring-messaging-7.0.2.jar;C:\Users\sub\.m2\repository\io\micrometer\context-propagation\1.2.0\context-propagation-1.2.0.jar;C:\Users\sub\.m2\repository\com\knuddels\jtokkit\1.1.0\jtokkit-1.1.0.jar;C:\Users\sub\.m2\repository\com\github\victools\jsonschema-generator\4.37.0\jsonschema-generator-4.37.0.jar;C:\Users\sub\.m2\repository\com\github\victools\jsonschema-module-jackson\4.37.0\jsonschema-module-jackson-4.37.0.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-retry\1.0.0-M6\spring-ai-retry-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\retry\spring-retry\2.0.11\spring-retry-2.0.11.jar;C:\Users\sub\.m2\repository\org\springframework\spring-webflux\7.0.2\spring-webflux-7.0.2.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.20.1\jackson-datatype-jsr310-2.20.1.jar
\ No newline at end of file
+C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-h2console\4.0.1\spring-boot-h2console-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot\4.0.1\spring-boot-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-context\7.0.2\spring-context-7.0.2.jar;C:\Users\sub\.m2\repository\jakarta\servlet\jakarta.servlet-api\6.1.0\jakarta.servlet-api-6.1.0.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\4.0.1\spring-boot-starter-data-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter\4.0.1\spring-boot-starter-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.0.1\spring-boot-starter-logging-4.0.1.jar;C:\Users\sub\.m2\repository\ch\qos\logback\logback-classic\1.5.22\logback-classic-1.5.22.jar;C:\Users\sub\.m2\repository\ch\qos\logback\logback-core\1.5.22\logback-core-1.5.22.jar;C:\Users\sub\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.3\log4j-to-slf4j-2.25.3.jar;C:\Users\sub\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.3\log4j-api-2.25.3.jar;C:\Users\sub\.m2\repository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\4.0.1\spring-boot-autoconfigure-4.0.1.jar;C:\Users\sub\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.0.1\spring-boot-starter-jdbc-4.0.1.jar;C:\Users\sub\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-data-jpa\4.0.1\spring-boot-data-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-data-commons\4.0.1\spring-boot-data-commons-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-persistence\4.0.1\spring-boot-persistence-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\data\spring-data-commons\4.0.1\spring-data-commons-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-hibernate\4.0.1\spring-boot-hibernate-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jpa\4.0.1\spring-boot-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-orm\7.0.2\spring-orm-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\data\spring-data-jpa\4.0.1\spring-data-jpa-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-tx\7.0.2\spring-tx-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-aspects\7.0.2\spring-aspects-7.0.2.jar;C:\Users\sub\.m2\repository\org\aspectj\aspectjweaver\1.9.25.1\aspectjweaver-1.9.25.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.0.1\spring-boot-jdbc-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-sql\4.0.1\spring-boot-sql-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-transaction\4.0.1\spring-boot-transaction-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-jdbc\7.0.2\spring-jdbc-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-security\4.0.1\spring-boot-starter-security-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-security\4.0.1\spring-boot-security-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-config\7.0.2\spring-security-config-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-aop\7.0.2\spring-aop-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-beans\7.0.2\spring-beans-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.0.1\spring-boot-starter-webmvc-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.0.1\spring-boot-starter-jackson-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jackson\4.0.1\spring-boot-jackson-4.0.1.jar;C:\Users\sub\.m2\repository\tools\jackson\core\jackson-databind\3.0.3\jackson-databind-3.0.3.jar;C:\Users\sub\.m2\repository\tools\jackson\core\jackson-core\3.0.3\jackson-core-3.0.3.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.0.1\spring-boot-starter-tomcat-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.0.1\spring-boot-starter-tomcat-runtime-4.0.1.jar;C:\Users\sub\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.15\tomcat-embed-core-11.0.15.jar;C:\Users\sub\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.15\tomcat-embed-websocket-11.0.15.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.0.1\spring-boot-tomcat-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.0.1\spring-boot-http-converter-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-web\7.0.2\spring-web-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.0.1\spring-boot-webmvc-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-servlet\4.0.1\spring-boot-servlet-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-webmvc\7.0.2\spring-webmvc-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\4.0.1\spring-boot-starter-actuator-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-micrometer-metrics\4.0.1\spring-boot-starter-micrometer-metrics-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-micrometer-metrics\4.0.1\spring-boot-micrometer-metrics-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-micrometer-observation\4.0.1\spring-boot-micrometer-observation-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\4.0.1\spring-boot-actuator-autoconfigure-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-actuator\4.0.1\spring-boot-actuator-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-health\4.0.1\spring-boot-health-4.0.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-observation\1.16.1\micrometer-observation-1.16.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-commons\1.16.1\micrometer-commons-1.16.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-jakarta9\1.16.1\micrometer-jakarta9-1.16.1.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-registry-prometheus\1.16.1\micrometer-registry-prometheus-1.16.1.jar;C:\Users\sub\.m2\repository\org\jspecify\jspecify\1.0.0\jspecify-1.0.0.jar;C:\Users\sub\.m2\repository\io\micrometer\micrometer-core\1.16.1\micrometer-core-1.16.1.jar;C:\Users\sub\.m2\repository\org\hdrhistogram\HdrHistogram\2.2.2\HdrHistogram-2.2.2.jar;C:\Users\sub\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-core\1.4.3\prometheus-metrics-core-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-model\1.4.3\prometheus-metrics-model-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-config\1.4.3\prometheus-metrics-config-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-tracer-common\1.4.3\prometheus-metrics-tracer-common-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-exposition-formats\1.4.3\prometheus-metrics-exposition-formats-1.4.3.jar;C:\Users\sub\.m2\repository\io\prometheus\prometheus-metrics-exposition-textformats\1.4.3\prometheus-metrics-exposition-textformats-1.4.3.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-validation\4.0.1\spring-boot-starter-validation-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-validation\4.0.1\spring-boot-validation-4.0.1.jar;C:\Users\sub\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.15\tomcat-embed-el-11.0.15.jar;C:\Users\sub\.m2\repository\org\hibernate\validator\hibernate-validator\9.0.1.Final\hibernate-validator-9.0.1.Final.jar;C:\Users\sub\.m2\repository\jakarta\validation\jakarta.validation-api\3.1.1\jakarta.validation-api-3.1.1.jar;C:\Users\sub\.m2\repository\de\codecentric\spring-boot-admin-starter-client\4.0.0\spring-boot-admin-starter-client-4.0.0.jar;C:\Users\sub\.m2\repository\de\codecentric\spring-boot-admin-client\4.0.0\spring-boot-admin-client-4.0.0.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-restclient\4.0.1\spring-boot-starter-restclient-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-restclient\4.0.1\spring-boot-restclient-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-http-client\4.0.1\spring-boot-http-client-4.0.1.jar;C:\Users\sub\.m2\repository\com\h2database\h2\2.4.240\h2-2.4.240.jar;C:\Users\sub\.m2\repository\org\postgresql\postgresql\42.7.8\postgresql-42.7.8.jar;C:\Users\sub\.m2\repository\org\checkerframework\checker-qual\3.49.5\checker-qual-3.49.5.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-test\4.0.1\spring-boot-starter-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-test\4.0.1\spring-boot-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\4.0.1\spring-boot-test-autoconfigure-4.0.1.jar;C:\Users\sub\.m2\repository\com\jayway\jsonpath\json-path\2.10.0\json-path-2.10.0.jar;C:\Users\sub\.m2\repository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;C:\Users\sub\.m2\repository\net\minidev\json-smart\2.6.0\json-smart-2.6.0.jar;C:\Users\sub\.m2\repository\net\minidev\accessors-smart\2.6.0\accessors-smart-2.6.0.jar;C:\Users\sub\.m2\repository\org\ow2\asm\asm\9.7.1\asm-9.7.1.jar;C:\Users\sub\.m2\repository\org\assertj\assertj-core\3.27.6\assertj-core-3.27.6.jar;C:\Users\sub\.m2\repository\net\bytebuddy\byte-buddy\1.17.8\byte-buddy-1.17.8.jar;C:\Users\sub\.m2\repository\org\awaitility\awaitility\4.3.0\awaitility-4.3.0.jar;C:\Users\sub\.m2\repository\org\hamcrest\hamcrest\3.0\hamcrest-3.0.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter\6.0.1\junit-jupiter-6.0.1.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter-api\6.0.1\junit-jupiter-api-6.0.1.jar;C:\Users\sub\.m2\repository\org\opentest4j\opentest4j\1.3.0\opentest4j-1.3.0.jar;C:\Users\sub\.m2\repository\org\junit\platform\junit-platform-commons\6.0.1\junit-platform-commons-6.0.1.jar;C:\Users\sub\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter-params\6.0.1\junit-jupiter-params-6.0.1.jar;C:\Users\sub\.m2\repository\org\junit\jupiter\junit-jupiter-engine\6.0.1\junit-jupiter-engine-6.0.1.jar;C:\Users\sub\.m2\repository\org\junit\platform\junit-platform-engine\6.0.1\junit-platform-engine-6.0.1.jar;C:\Users\sub\.m2\repository\org\mockito\mockito-core\5.20.0\mockito-core-5.20.0.jar;C:\Users\sub\.m2\repository\net\bytebuddy\byte-buddy-agent\1.17.8\byte-buddy-agent-1.17.8.jar;C:\Users\sub\.m2\repository\org\objenesis\objenesis\3.3\objenesis-3.3.jar;C:\Users\sub\.m2\repository\org\mockito\mockito-junit-jupiter\5.20.0\mockito-junit-jupiter-5.20.0.jar;C:\Users\sub\.m2\repository\org\skyscreamer\jsonassert\1.5.3\jsonassert-1.5.3.jar;C:\Users\sub\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-core\7.0.2\spring-core-7.0.2.jar;C:\Users\sub\.m2\repository\commons-logging\commons-logging\1.3.5\commons-logging-1.3.5.jar;C:\Users\sub\.m2\repository\org\springframework\spring-test\7.0.2\spring-test-7.0.2.jar;C:\Users\sub\.m2\repository\org\xmlunit\xmlunit-core\2.10.4\xmlunit-core-2.10.4.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-test\7.0.2\spring-security-test-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-core\7.0.2\spring-security-core-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-crypto\7.0.2\spring-security-crypto-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\spring-expression\7.0.2\spring-expression-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\security\spring-security-web\7.0.2\spring-security-web-7.0.2.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa-test\4.0.1\spring-boot-starter-data-jpa-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc-test\4.0.1\spring-boot-starter-jdbc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jdbc-test\4.0.1\spring-boot-jdbc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-data-jpa-test\4.0.1\spring-boot-data-jpa-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-jpa-test\4.0.1\spring-boot-jpa-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc-test\4.0.1\spring-boot-starter-webmvc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-jackson-test\4.0.1\spring-boot-starter-jackson-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-webmvc-test\4.0.1\spring-boot-webmvc-test-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-web-server\4.0.1\spring-boot-web-server-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-resttestclient\4.0.1\spring-boot-resttestclient-4.0.1.jar;C:\Users\sub\.m2\repository\com\atlassian\oai\swagger-request-validator-mockmvc\2.44.1\swagger-request-validator-mockmvc-2.44.1.jar;C:\Users\sub\.m2\repository\com\atlassian\oai\swagger-request-validator-core\2.44.1\swagger-request-validator-core-2.44.1.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser\2.1.22\swagger-parser-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-v2-converter\2.1.22\swagger-parser-v2-converter-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-core\1.6.14\swagger-core-1.6.14.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-models\1.6.14\swagger-models-1.6.14.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-annotations\1.6.14\swagger-annotations-1.6.14.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-parser\1.0.70\swagger-parser-1.0.70.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-parser-safe-url-resolver\1.0.70\swagger-parser-safe-url-resolver-1.0.70.jar;C:\Users\sub\.m2\repository\io\swagger\swagger-compat-spec-parser\1.0.70\swagger-compat-spec-parser-1.0.70.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\json-patch\1.13\json-patch-1.13.jar;C:\Users\sub\.m2\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;C:\Users\sub\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\sub\.m2\repository\commons-codec\commons-codec\1.19.0\commons-codec-1.19.0.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-models\2.2.21\swagger-models-2.2.21.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-core\2.1.22\swagger-parser-core-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-v3\2.1.22\swagger-parser-v3-2.1.22.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-core\2.2.21\swagger-core-2.2.21.jar;C:\Users\sub\.m2\repository\io\swagger\parser\v3\swagger-parser-safe-url-resolver\2.1.22\swagger-parser-safe-url-resolver-2.1.22.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.20.1\jackson-dataformat-yaml-2.20.1.jar;C:\Users\sub\.m2\repository\commons-io\commons-io\2.15.1\commons-io-2.15.1.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\json-schema-validator\2.2.14\json-schema-validator-2.2.14.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\jackson-coreutils-equivalence\1.0\jackson-coreutils-equivalence-1.0.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\jackson-coreutils\2.0\jackson-coreutils-2.0.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\msg-simple\1.2\msg-simple-1.2.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\btf\1.3\btf-1.3.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\json-schema-core\1.2.14\json-schema-core-1.2.14.jar;C:\Users\sub\.m2\repository\com\github\java-json-tools\uri-template\0.10\uri-template-0.10.jar;C:\Users\sub\.m2\repository\org\mozilla\rhino\1.7.7.2\rhino-1.7.7.2.jar;C:\Users\sub\.m2\repository\com\sun\mail\mailapi\1.6.2\mailapi-1.6.2.jar;C:\Users\sub\.m2\repository\joda-time\joda-time\2.10.5\joda-time-2.10.5.jar;C:\Users\sub\.m2\repository\com\googlecode\libphonenumber\libphonenumber\8.11.1\libphonenumber-8.11.1.jar;C:\Users\sub\.m2\repository\net\sf\jopt-simple\jopt-simple\5.0.4\jopt-simple-5.0.4.jar;C:\Users\sub\.m2\repository\com\google\guava\guava\33.3.1-jre\guava-33.3.1-jre.jar;C:\Users\sub\.m2\repository\com\google\guava\failureaccess\1.0.2\failureaccess-1.0.2.jar;C:\Users\sub\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\sub\.m2\repository\com\google\errorprone\error_prone_annotations\2.28.0\error_prone_annotations-2.28.0.jar;C:\Users\sub\.m2\repository\com\google\j2objc\j2objc-annotations\3.0.0\j2objc-annotations-3.0.0.jar;C:\Users\sub\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.20.1\jackson-datatype-jdk8-2.20.1.jar;C:\Users\sub\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\sub\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\sub\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.4\jakarta.xml.bind-api-4.0.4.jar;C:\Users\sub\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.4\jakarta.activation-api-2.1.4.jar;C:\Users\sub\.m2\repository\org\glassfish\jaxb\jaxb-runtime\4.0.6\jaxb-runtime-4.0.6.jar;C:\Users\sub\.m2\repository\org\glassfish\jaxb\jaxb-core\4.0.6\jaxb-core-4.0.6.jar;C:\Users\sub\.m2\repository\org\eclipse\angus\angus-activation\2.0.3\angus-activation-2.0.3.jar;C:\Users\sub\.m2\repository\org\glassfish\jaxb\txw2\4.0.6\txw2-4.0.6.jar;C:\Users\sub\.m2\repository\com\sun\istack\istack-commons-runtime\4.1.2\istack-commons-runtime-4.1.2.jar;C:\Users\sub\.m2\repository\org\springdoc\springdoc-openapi-starter-webmvc-ui\2.8.5\springdoc-openapi-starter-webmvc-ui-2.8.5.jar;C:\Users\sub\.m2\repository\org\springdoc\springdoc-openapi-starter-webmvc-api\2.8.5\springdoc-openapi-starter-webmvc-api-2.8.5.jar;C:\Users\sub\.m2\repository\org\springdoc\springdoc-openapi-starter-common\2.8.5\springdoc-openapi-starter-common-2.8.5.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-core-jakarta\2.2.28\swagger-core-jakarta-2.2.28.jar;C:\Users\sub\.m2\repository\org\apache\commons\commons-lang3\3.19.0\commons-lang3-3.19.0.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-annotations-jakarta\2.2.28\swagger-annotations-jakarta-2.2.28.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-models-jakarta\2.2.28\swagger-models-jakarta-2.2.28.jar;C:\Users\sub\.m2\repository\org\webjars\webjars-locator-lite\1.1.2\webjars-locator-lite-1.1.2.jar;C:\Users\sub\.m2\repository\org\webjars\swagger-ui\5.31.0\swagger-ui-5.31.0.jar;C:\Users\sub\.m2\repository\org\flywaydb\flyway-core\11.14.1\flyway-core-11.14.1.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.20.1\jackson-databind-2.20.1.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.20\jackson-annotations-2.20.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.20.1\jackson-core-2.20.1.jar;C:\Users\sub\.m2\repository\org\flywaydb\flyway-database-postgresql\11.14.1\flyway-database-postgresql-11.14.1.jar;C:\Users\sub\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\sub\.m2\repository\org\yaml\snakeyaml\2.5\snakeyaml-2.5.jar;C:\Users\sub\.m2\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-starter-mail\4.0.1\spring-boot-starter-mail-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\boot\spring-boot-mail\4.0.1\spring-boot-mail-4.0.1.jar;C:\Users\sub\.m2\repository\org\springframework\spring-context-support\7.0.2\spring-context-support-7.0.2.jar;C:\Users\sub\.m2\repository\jakarta\mail\jakarta.mail-api\2.1.5\jakarta.mail-api-2.1.5.jar;C:\Users\sub\.m2\repository\org\eclipse\angus\angus-mail\2.0.5\angus-mail-2.0.5.jar;C:\Users\sub\.m2\repository\com\bucket4j\bucket4j-core\8.10.1\bucket4j-core-8.10.1.jar;C:\Users\sub\.m2\repository\io\jsonwebtoken\jjwt-api\0.13.0\jjwt-api-0.13.0.jar;C:\Users\sub\.m2\repository\io\jsonwebtoken\jjwt-impl\0.13.0\jjwt-impl-0.13.0.jar;C:\Users\sub\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\sub\.m2\repository\org\projectlombok\lombok\1.18.42\lombok-1.18.42.jar;C:\Users\sub\.m2\repository\org\hibernate\orm\hibernate-envers\7.2.0.Final\hibernate-envers-7.2.0.Final.jar;C:\Users\sub\.m2\repository\org\hibernate\orm\hibernate-core\7.2.0.Final\hibernate-core-7.2.0.Final.jar;C:\Users\sub\.m2\repository\jakarta\persistence\jakarta.persistence-api\3.2.0\jakarta.persistence-api-3.2.0.jar;C:\Users\sub\.m2\repository\jakarta\transaction\jakarta.transaction-api\2.0.1\jakarta.transaction-api-2.0.1.jar;C:\Users\sub\.m2\repository\com\fasterxml\classmate\1.7.1\classmate-1.7.1.jar;C:\Users\sub\.m2\repository\jakarta\inject\jakarta.inject-api\2.0.1\jakarta.inject-api-2.0.1.jar;C:\Users\sub\.m2\repository\org\antlr\antlr4-runtime\4.13.2\antlr4-runtime-4.13.2.jar;C:\Users\sub\.m2\repository\org\jboss\logging\jboss-logging\3.6.1.Final\jboss-logging-3.6.1.Final.jar;C:\Users\sub\.m2\repository\org\hibernate\models\hibernate-models\1.0.1\hibernate-models-1.0.1.jar;C:\Users\sub\.m2\repository\io\smallrye\jandex\3.3.2\jandex-3.3.2.jar;C:\Users\sub\.m2\repository\net\logstash\logback\logstash-logback-encoder\8.0\logstash-logback-encoder-8.0.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-ollama-spring-boot-starter\1.0.0-M6\spring-ai-ollama-spring-boot-starter-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-spring-boot-autoconfigure\1.0.0-M6\spring-ai-spring-boot-autoconfigure-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-ollama\1.0.0-M6\spring-ai-ollama-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-core\1.0.0-M6\spring-ai-core-1.0.0-M6.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\module\jackson-module-jsonSchema\2.20.1\jackson-module-jsonSchema-2.20.1.jar;C:\Users\sub\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\sub\.m2\repository\io\swagger\core\v3\swagger-annotations\2.2.25\swagger-annotations-2.2.25.jar;C:\Users\sub\.m2\repository\com\github\victools\jsonschema-module-swagger-2\4.37.0\jsonschema-module-swagger-2-4.37.0.jar;C:\Users\sub\.m2\repository\org\antlr\ST4\4.3.4\ST4-4.3.4.jar;C:\Users\sub\.m2\repository\org\antlr\antlr-runtime\3.5.3\antlr-runtime-3.5.3.jar;C:\Users\sub\.m2\repository\io\projectreactor\reactor-core\3.8.1\reactor-core-3.8.1.jar;C:\Users\sub\.m2\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\Users\sub\.m2\repository\org\springframework\spring-messaging\7.0.2\spring-messaging-7.0.2.jar;C:\Users\sub\.m2\repository\io\micrometer\context-propagation\1.2.0\context-propagation-1.2.0.jar;C:\Users\sub\.m2\repository\com\knuddels\jtokkit\1.1.0\jtokkit-1.1.0.jar;C:\Users\sub\.m2\repository\com\github\victools\jsonschema-generator\4.37.0\jsonschema-generator-4.37.0.jar;C:\Users\sub\.m2\repository\com\github\victools\jsonschema-module-jackson\4.37.0\jsonschema-module-jackson-4.37.0.jar;C:\Users\sub\.m2\repository\org\springframework\ai\spring-ai-retry\1.0.0-M6\spring-ai-retry-1.0.0-M6.jar;C:\Users\sub\.m2\repository\org\springframework\retry\spring-retry\2.0.11\spring-retry-2.0.11.jar;C:\Users\sub\.m2\repository\org\springframework\spring-webflux\7.0.2\spring-webflux-7.0.2.jar;C:\Users\sub\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.20.1\jackson-datatype-jsr310-2.20.1.jar
diff --git a/backend/data/dependency-check/publishedSuppressions.xml b/backend/data/dependency-check/publishedSuppressions.xml
index e34b692a1..0c9354f78 100644
--- a/backend/data/dependency-check/publishedSuppressions.xml
+++ b/backend/data/dependency-check/publishedSuppressions.xml
@@ -2053,4 +2053,4 @@ only pkg:maven/org.clojure:clojure@.* is the CPE cpe:/a:clojure:clojure
^pkg:maven/org\.springframework\.boot/spring-boot-batch@.*$
cpe:/a:pivotal_software:spring_batch
-
\ No newline at end of file
+
diff --git a/backend/pom.xml b/backend/pom.xml
index 017bb7c1d..cbd2d297f 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -3,13 +3,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- ch.goodone.angularai
- angularai-parent
+ ch.goodone
+ goodone-parent
1.1.1-SNAPSHOT
../pom.xml
- aibackend
- aibackend
+ goodone-backend
+ goodone-backend
Demo project for Spring Boot
@@ -57,10 +57,10 @@
io.micrometer
micrometer-registry-prometheus
-
- io.micrometer
- micrometer-registry-cloudwatch2
-
+
+
+
+
org.springframework.boot
spring-boot-starter-validation
@@ -334,7 +334,7 @@
process-classes
- ch.goodone.angularai.backend.model
+ ch.goodone.backend.model
${project.basedir}/../doc/ai/db
erd.puml
@@ -357,7 +357,7 @@
-
+
@@ -371,3 +371,4 @@
+
diff --git a/backend/snyk-backend.sarif.json b/backend/snyk-backend.sarif.json
index 59eb236df..307f38981 100644
Binary files a/backend/snyk-backend.sarif.json and b/backend/snyk-backend.sarif.json differ
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCase.java b/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCase.java
deleted file mode 100644
index 56f3368e6..000000000
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCase.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.dto.AdrDriftRequest;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftResponse;
-
-public interface AdrDriftUseCase {
- AdrDriftResponse execute(AdrDriftRequest request);
-}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCase.java b/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCase.java
deleted file mode 100644
index d1537205d..000000000
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCase.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveRequest;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveResponse;
-import ch.goodone.angularai.backend.ai.dto.TasksetInfo;
-
-import java.util.List;
-
-public interface RetrospectiveUseCase {
- RetrospectiveResponse generateRetrospective(RetrospectiveRequest request);
-
- List getAvailableTasksets();
-}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCase.java b/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCase.java
deleted file mode 100644
index 7b0366386..000000000
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCase.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.dto.RiskRadarRequest;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarResponse;
-
-public interface RiskRadarUseCase {
- RiskRadarResponse execute(RiskRadarRequest request);
-}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/DataInitializer.java b/backend/src/main/java/ch/goodone/backend/DataInitializer.java
similarity index 77%
rename from backend/src/main/java/ch/goodone/angularai/backend/DataInitializer.java
rename to backend/src/main/java/ch/goodone/backend/DataInitializer.java
index 6f4d776f1..8d21dd956 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/DataInitializer.java
+++ b/backend/src/main/java/ch/goodone/backend/DataInitializer.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend;
+package ch.goodone.backend;
-import ch.goodone.angularai.backend.service.DataInitializerService;
+import ch.goodone.backend.service.DataInitializerService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/AibackendApplication.java b/backend/src/main/java/ch/goodone/backend/GoodoneBackendApplication.java
similarity index 87%
rename from backend/src/main/java/ch/goodone/angularai/backend/AibackendApplication.java
rename to backend/src/main/java/ch/goodone/backend/GoodoneBackendApplication.java
index b578e3b91..11f2be74a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/AibackendApplication.java
+++ b/backend/src/main/java/ch/goodone/backend/GoodoneBackendApplication.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend;
+package ch.goodone.backend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -13,14 +13,14 @@
org.springframework.ai.model.openai.autoconfigure.OpenAiModerationAutoConfiguration.class
})
@ConfigurationPropertiesScan
-public class AibackendApplication {
+public class GoodoneBackendApplication {
public static void main(String[] args) {
run(args);
}
public static org.springframework.context.ConfigurableApplicationContext run(String[] args) {
- return SpringApplication.run(AibackendApplication.class, args);
+ return SpringApplication.run(GoodoneBackendApplication.class, args);
}
}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/AiProperties.java b/backend/src/main/java/ch/goodone/backend/ai/AiProperties.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/AiProperties.java
rename to backend/src/main/java/ch/goodone/backend/ai/AiProperties.java
index 6e948176c..3f327ea5d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/AiProperties.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/AiProperties.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/AiProviderService.java b/backend/src/main/java/ch/goodone/backend/ai/AiProviderService.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/AiProviderService.java
rename to backend/src/main/java/ch/goodone/backend/ai/AiProviderService.java
index 126a5c5f1..4b0be851d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/AiProviderService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/AiProviderService.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/MockAiConfiguration.java b/backend/src/main/java/ch/goodone/backend/ai/MockAiConfiguration.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/MockAiConfiguration.java
rename to backend/src/main/java/ch/goodone/backend/ai/MockAiConfiguration.java
index 08cd83420..976765ecc 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/MockAiConfiguration.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/MockAiConfiguration.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/OpenAiManualConfig.java b/backend/src/main/java/ch/goodone/backend/ai/OpenAiManualConfig.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/OpenAiManualConfig.java
rename to backend/src/main/java/ch/goodone/backend/ai/OpenAiManualConfig.java
index a9d461e98..90d16798b 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/OpenAiManualConfig.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/OpenAiManualConfig.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.messages.AssistantMessage;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftAiService.java b/backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftAiService.java
similarity index 80%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftAiService.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftAiService.java
index 09d5a72f2..ebf7193bd 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftAiService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftAiService.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftRequest;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftResponse;
-import ch.goodone.angularai.backend.ai.prompt.StructuredOutputService;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.AdrDriftRequest;
+import ch.goodone.backend.ai.dto.AdrDriftResponse;
+import ch.goodone.backend.ai.prompt.StructuredOutputService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
diff --git a/backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftUseCase.java b/backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftUseCase.java
new file mode 100644
index 000000000..38bce3cc1
--- /dev/null
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftUseCase.java
@@ -0,0 +1,8 @@
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.dto.AdrDriftRequest;
+import ch.goodone.backend.ai.dto.AdrDriftResponse;
+
+public interface AdrDriftUseCase {
+ AdrDriftResponse execute(AdrDriftRequest request);
+}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCaseImpl.java b/backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftUseCaseImpl.java
similarity index 92%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCaseImpl.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftUseCaseImpl.java
index 928c082b9..b223a3a9e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCaseImpl.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/AdrDriftUseCaseImpl.java
@@ -1,16 +1,16 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftRequest;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftResponse;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocEmbedding;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.AdrDriftRequest;
+import ch.goodone.backend.ai.dto.AdrDriftResponse;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocEmbedding;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AiApplicationService.java b/backend/src/main/java/ch/goodone/backend/ai/application/AiApplicationService.java
similarity index 77%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/AiApplicationService.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/AiApplicationService.java
index fc46b4e6c..e459735b5 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/AiApplicationService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/AiApplicationService.java
@@ -1,14 +1,14 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainRequest;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainResult;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftRequest;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftResponse;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseRequest;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseResult;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarRequest;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarResponse;
-import ch.goodone.angularai.backend.ai.exception.AiDisabledException;
+import ch.goodone.backend.ai.dto.ArchitectureExplainRequest;
+import ch.goodone.backend.ai.dto.ArchitectureExplainResult;
+import ch.goodone.backend.ai.dto.AdrDriftRequest;
+import ch.goodone.backend.ai.dto.AdrDriftResponse;
+import ch.goodone.backend.ai.dto.QuickAddParseRequest;
+import ch.goodone.backend.ai.dto.QuickAddParseResult;
+import ch.goodone.backend.ai.dto.RiskRadarRequest;
+import ch.goodone.backend.ai.dto.RiskRadarResponse;
+import ch.goodone.backend.ai.exception.AiDisabledException;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/ArchitectureExplainUseCase.java b/backend/src/main/java/ch/goodone/backend/ai/application/ArchitectureExplainUseCase.java
similarity index 85%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/ArchitectureExplainUseCase.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/ArchitectureExplainUseCase.java
index 29724f8c8..9abf61f5f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/ArchitectureExplainUseCase.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/ArchitectureExplainUseCase.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainRequest;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainResult;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.ai.prompt.StructuredOutputService;
-import ch.goodone.angularai.backend.docs.retrieval.DocRetrievalService;
-import ch.goodone.angularai.backend.model.DocChunk;
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.ArchitectureExplainRequest;
+import ch.goodone.backend.ai.dto.ArchitectureExplainResult;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.ai.prompt.StructuredOutputService;
+import ch.goodone.backend.docs.retrieval.DocRetrievalService;
+import ch.goodone.backend.model.DocChunk;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/QuickAddParseUseCase.java b/backend/src/main/java/ch/goodone/backend/ai/application/QuickAddParseUseCase.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/QuickAddParseUseCase.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/QuickAddParseUseCase.java
index e6de3deb9..6e4dd4826 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/QuickAddParseUseCase.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/QuickAddParseUseCase.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseRequest;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseResult;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.ai.prompt.StructuredOutputService;
-import ch.goodone.angularai.backend.service.TaskParserService;
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.QuickAddParseRequest;
+import ch.goodone.backend.ai.dto.QuickAddParseResult;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.ai.prompt.StructuredOutputService;
+import ch.goodone.backend.service.TaskParserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -29,7 +29,7 @@ public class QuickAddParseUseCase {
private final TaskParserService taskParserService;
private final AiObservabilityService observabilityService;
private final AiProperties aiProperties;
- private final ch.goodone.angularai.backend.service.ActionLogService actionLogService;
+ private final ch.goodone.backend.service.ActionLogService actionLogService;
@Value("classpath:prompts/quick-add/v1/parse.st")
private Resource parsePromptResource;
@@ -77,7 +77,7 @@ private boolean isAiNeeded(String input, TaskParserService.ParsedTask determinis
if (input.split("\\s+").length > 4) {
return true;
}
- return deterministic.dueDate() == null && deterministic.priority() == ch.goodone.angularai.backend.model.Priority.MEDIUM;
+ return deterministic.dueDate() == null && deterministic.priority() == ch.goodone.backend.model.Priority.MEDIUM;
}
private QuickAddParseResult fromDeterministic(TaskParserService.ParsedTask d) {
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveAiService.java b/backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveAiService.java
similarity index 81%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveAiService.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveAiService.java
index 8851f44c3..a8b6ed8b7 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveAiService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveAiService.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveRequest;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveResponse;
-import ch.goodone.angularai.backend.ai.prompt.StructuredOutputService;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.RetrospectiveRequest;
+import ch.goodone.backend.ai.dto.RetrospectiveResponse;
+import ch.goodone.backend.ai.prompt.StructuredOutputService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
diff --git a/backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveUseCase.java b/backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveUseCase.java
new file mode 100644
index 000000000..548bef92e
--- /dev/null
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveUseCase.java
@@ -0,0 +1,13 @@
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.dto.RetrospectiveRequest;
+import ch.goodone.backend.ai.dto.RetrospectiveResponse;
+import ch.goodone.backend.ai.dto.TasksetInfo;
+
+import java.util.List;
+
+public interface RetrospectiveUseCase {
+ RetrospectiveResponse generateRetrospective(RetrospectiveRequest request);
+
+ List getAvailableTasksets();
+}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCaseImpl.java b/backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveUseCaseImpl.java
similarity index 89%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCaseImpl.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveUseCaseImpl.java
index 806b60b4c..11b7b79c3 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCaseImpl.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/RetrospectiveUseCaseImpl.java
@@ -1,14 +1,14 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveRequest;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveResponse;
-import ch.goodone.angularai.backend.ai.dto.TasksetInfo;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.dto.RetrospectiveRequest;
+import ch.goodone.backend.ai.dto.RetrospectiveResponse;
+import ch.goodone.backend.ai.dto.TasksetInfo;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarAiService.java b/backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarAiService.java
similarity index 82%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarAiService.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarAiService.java
index cb8c9020b..53b173181 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarAiService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarAiService.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarRequest;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarResponse;
-import ch.goodone.angularai.backend.ai.prompt.StructuredOutputService;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.RiskRadarRequest;
+import ch.goodone.backend.ai.dto.RiskRadarResponse;
+import ch.goodone.backend.ai.prompt.StructuredOutputService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
diff --git a/backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarUseCase.java b/backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarUseCase.java
new file mode 100644
index 000000000..c889daa6b
--- /dev/null
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarUseCase.java
@@ -0,0 +1,8 @@
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.dto.RiskRadarRequest;
+import ch.goodone.backend.ai.dto.RiskRadarResponse;
+
+public interface RiskRadarUseCase {
+ RiskRadarResponse execute(RiskRadarRequest request);
+}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCaseImpl.java b/backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarUseCaseImpl.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCaseImpl.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarUseCaseImpl.java
index f208150ff..78b8e6670 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCaseImpl.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/RiskRadarUseCaseImpl.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarRequest;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarResponse;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.dto.RiskRadarRequest;
+import ch.goodone.backend.ai.dto.RiskRadarResponse;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/TasksetService.java b/backend/src/main/java/ch/goodone/backend/ai/application/TasksetService.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/application/TasksetService.java
rename to backend/src/main/java/ch/goodone/backend/ai/application/TasksetService.java
index eb33995f9..a4e4085d5 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/application/TasksetService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/application/TasksetService.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.dto.TasksetInfo;
+import ch.goodone.backend.ai.dto.TasksetInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/config/AiEnabledFilter.java b/backend/src/main/java/ch/goodone/backend/ai/config/AiEnabledFilter.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/config/AiEnabledFilter.java
rename to backend/src/main/java/ch/goodone/backend/ai/config/AiEnabledFilter.java
index b11f8cf0d..52f03401b 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/config/AiEnabledFilter.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/config/AiEnabledFilter.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.config;
+package ch.goodone.backend.ai.config;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AdrDriftRequest.java b/backend/src/main/java/ch/goodone/backend/ai/dto/AdrDriftRequest.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AdrDriftRequest.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/AdrDriftRequest.java
index 27d5db665..ddf95d7f3 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AdrDriftRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/AdrDriftRequest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AdrDriftResponse.java b/backend/src/main/java/ch/goodone/backend/ai/dto/AdrDriftResponse.java
similarity index 94%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AdrDriftResponse.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/AdrDriftResponse.java
index 1338928d5..00a2f3cb8 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AdrDriftResponse.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/AdrDriftResponse.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestActionRequest.java b/backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestActionRequest.java
similarity index 66%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestActionRequest.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestActionRequest.java
index 6b2d2a0e7..3c508e7aa 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestActionRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestActionRequest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.AiCreditRequest;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestCreateRequest.java b/backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestCreateRequest.java
similarity index 82%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestCreateRequest.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestCreateRequest.java
index 2ff89443b..1531ad19a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestCreateRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestCreateRequest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.AiCreditRequest;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestDTO.java b/backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestDTO.java
similarity index 91%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestDTO.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestDTO.java
index ca66ef807..51a8e40bc 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/AiCreditRequestDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/AiCreditRequestDTO.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.AiCreditRequest;
import lombok.Data;
import java.time.LocalDateTime;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/ArchitectureExplainRequest.java b/backend/src/main/java/ch/goodone/backend/ai/dto/ArchitectureExplainRequest.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/ArchitectureExplainRequest.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/ArchitectureExplainRequest.java
index c3969f755..4a560530d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/ArchitectureExplainRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/ArchitectureExplainRequest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/ArchitectureExplainResult.java b/backend/src/main/java/ch/goodone/backend/ai/dto/ArchitectureExplainResult.java
similarity index 89%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/ArchitectureExplainResult.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/ArchitectureExplainResult.java
index 6abc548fb..f5069a7a9 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/ArchitectureExplainResult.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/ArchitectureExplainResult.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/QuickAddParseRequest.java b/backend/src/main/java/ch/goodone/backend/ai/dto/QuickAddParseRequest.java
similarity index 89%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/QuickAddParseRequest.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/QuickAddParseRequest.java
index 124b10a99..b200ea435 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/QuickAddParseRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/QuickAddParseRequest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/QuickAddParseResult.java b/backend/src/main/java/ch/goodone/backend/ai/dto/QuickAddParseResult.java
similarity index 88%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/QuickAddParseResult.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/QuickAddParseResult.java
index f1f11622c..6bb76df7e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/QuickAddParseResult.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/QuickAddParseResult.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RetrospectiveRequest.java b/backend/src/main/java/ch/goodone/backend/ai/dto/RetrospectiveRequest.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RetrospectiveRequest.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/RetrospectiveRequest.java
index d720b397a..7e3369f09 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RetrospectiveRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/RetrospectiveRequest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RetrospectiveResponse.java b/backend/src/main/java/ch/goodone/backend/ai/dto/RetrospectiveResponse.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RetrospectiveResponse.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/RetrospectiveResponse.java
index 808a072f4..bcd8f3a4f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RetrospectiveResponse.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/RetrospectiveResponse.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RiskRadarRequest.java b/backend/src/main/java/ch/goodone/backend/ai/dto/RiskRadarRequest.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RiskRadarRequest.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/RiskRadarRequest.java
index b08ea412c..38efbd325 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RiskRadarRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/RiskRadarRequest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RiskRadarResponse.java b/backend/src/main/java/ch/goodone/backend/ai/dto/RiskRadarResponse.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RiskRadarResponse.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/RiskRadarResponse.java
index faadff916..6a496f070 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/RiskRadarResponse.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/RiskRadarResponse.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/TasksetInfo.java b/backend/src/main/java/ch/goodone/backend/ai/dto/TasksetInfo.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/dto/TasksetInfo.java
rename to backend/src/main/java/ch/goodone/backend/ai/dto/TasksetInfo.java
index ab38c5c3d..1e9b94f67 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/dto/TasksetInfo.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/dto/TasksetInfo.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.dto;
+package ch.goodone.backend.ai.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiDisabledException.java b/backend/src/main/java/ch/goodone/backend/ai/exception/AiDisabledException.java
similarity index 80%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiDisabledException.java
rename to backend/src/main/java/ch/goodone/backend/ai/exception/AiDisabledException.java
index 02841fabd..40f702e64 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiDisabledException.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/exception/AiDisabledException.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.exception;
+package ch.goodone.backend.ai.exception;
/**
* Exception thrown when AI features are disabled by the administrator.
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiException.java b/backend/src/main/java/ch/goodone/backend/ai/exception/AiException.java
similarity index 84%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiException.java
rename to backend/src/main/java/ch/goodone/backend/ai/exception/AiException.java
index 9e7a3dfb7..6ca63c359 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiException.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/exception/AiException.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.exception;
+package ch.goodone.backend.ai.exception;
/**
* Base exception for all AI-related errors.
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiParsingException.java b/backend/src/main/java/ch/goodone/backend/ai/exception/AiParsingException.java
similarity index 83%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiParsingException.java
rename to backend/src/main/java/ch/goodone/backend/ai/exception/AiParsingException.java
index 6be790d79..db513cae4 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiParsingException.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/exception/AiParsingException.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.exception;
+package ch.goodone.backend.ai.exception;
/**
* Exception thrown when the AI output cannot be parsed into the expected format (502).
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiProviderException.java b/backend/src/main/java/ch/goodone/backend/ai/exception/AiProviderException.java
similarity index 83%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiProviderException.java
rename to backend/src/main/java/ch/goodone/backend/ai/exception/AiProviderException.java
index 2320ac929..107607552 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiProviderException.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/exception/AiProviderException.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.exception;
+package ch.goodone.backend.ai.exception;
/**
* Exception thrown when the AI provider is unavailable or returns an error (503).
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiRateLimitException.java b/backend/src/main/java/ch/goodone/backend/ai/exception/AiRateLimitException.java
similarity index 81%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiRateLimitException.java
rename to backend/src/main/java/ch/goodone/backend/ai/exception/AiRateLimitException.java
index 3ed403100..e71844054 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/exception/AiRateLimitException.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/exception/AiRateLimitException.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.exception;
+package ch.goodone.backend.ai.exception;
/**
* Exception thrown when the AI provider rate limit is exceeded (429).
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/observability/AiObservabilityService.java b/backend/src/main/java/ch/goodone/backend/ai/observability/AiObservabilityService.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/observability/AiObservabilityService.java
rename to backend/src/main/java/ch/goodone/backend/ai/observability/AiObservabilityService.java
index eb0976ef4..2ee5c32f1 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/observability/AiObservabilityService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/observability/AiObservabilityService.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.ai.observability;
-
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
-import ch.goodone.angularai.backend.ai.usage.AiCreditExhaustedException;
-import ch.goodone.angularai.backend.ai.usage.AiUsageCostService;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
+package ch.goodone.backend.ai.observability;
+
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
+import ch.goodone.backend.ai.usage.AiCreditExhaustedException;
+import ch.goodone.backend.ai.usage.AiUsageCostService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
import io.micrometer.core.instrument.MeterRegistry;
import lombok.Data;
import lombok.RequiredArgsConstructor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/observability/OpenAiHealthIndicator.java b/backend/src/main/java/ch/goodone/backend/ai/observability/OpenAiHealthIndicator.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/observability/OpenAiHealthIndicator.java
rename to backend/src/main/java/ch/goodone/backend/ai/observability/OpenAiHealthIndicator.java
index 626626d97..de6d29363 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/observability/OpenAiHealthIndicator.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/observability/OpenAiHealthIndicator.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.observability;
+package ch.goodone.backend.ai.observability;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/prompt/StructuredOutputService.java b/backend/src/main/java/ch/goodone/backend/ai/prompt/StructuredOutputService.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/prompt/StructuredOutputService.java
rename to backend/src/main/java/ch/goodone/backend/ai/prompt/StructuredOutputService.java
index 2109deb3d..f55b9eb87 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/prompt/StructuredOutputService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/prompt/StructuredOutputService.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.ai.prompt;
+package ch.goodone.backend.ai.prompt;
-import ch.goodone.angularai.backend.ai.exception.AiParsingException;
-import ch.goodone.angularai.backend.ai.exception.AiProviderException;
-import ch.goodone.angularai.backend.ai.exception.AiRateLimitException;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.ai.exception.AiParsingException;
+import ch.goodone.backend.ai.exception.AiProviderException;
+import ch.goodone.backend.ai.exception.AiRateLimitException;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.model.ChatModel;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiCreditExhaustedException.java b/backend/src/main/java/ch/goodone/backend/ai/usage/AiCreditExhaustedException.java
similarity index 86%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiCreditExhaustedException.java
rename to backend/src/main/java/ch/goodone/backend/ai/usage/AiCreditExhaustedException.java
index b833e7ebd..e514e7405 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiCreditExhaustedException.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/usage/AiCreditExhaustedException.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai.usage;
+package ch.goodone.backend.ai.usage;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiCreditRequestService.java b/backend/src/main/java/ch/goodone/backend/ai/usage/AiCreditRequestService.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiCreditRequestService.java
rename to backend/src/main/java/ch/goodone/backend/ai/usage/AiCreditRequestService.java
index bf941af2d..ba360de83 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiCreditRequestService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/usage/AiCreditRequestService.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.ai.usage;
-
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.AiCreditRequestRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.EmailService;
+package ch.goodone.backend.ai.usage;
+
+import ch.goodone.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.AiCreditRequestRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.EmailService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiUsageCostService.java b/backend/src/main/java/ch/goodone/backend/ai/usage/AiUsageCostService.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiUsageCostService.java
rename to backend/src/main/java/ch/goodone/backend/ai/usage/AiUsageCostService.java
index 2fc318fc5..a3449ec2a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiUsageCostService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/usage/AiUsageCostService.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.ai.usage;
+package ch.goodone.backend.ai.usage;
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.model.AiUsageCost;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.AiUsageCostRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.model.AiUsageCost;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.AiUsageCostRepository;
+import ch.goodone.backend.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.metadata.Usage;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiUsageService.java b/backend/src/main/java/ch/goodone/backend/ai/usage/AiUsageService.java
similarity index 89%
rename from backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiUsageService.java
rename to backend/src/main/java/ch/goodone/backend/ai/usage/AiUsageService.java
index 8ad976c3f..4e8845752 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/ai/usage/AiUsageService.java
+++ b/backend/src/main/java/ch/goodone/backend/ai/usage/AiUsageService.java
@@ -1,16 +1,16 @@
-package ch.goodone.angularai.backend.ai.usage;
-
-import ch.goodone.angularai.backend.dto.ai.UserAiUsageDto;
-import ch.goodone.angularai.backend.model.AiFeatureUsage;
-import ch.goodone.angularai.backend.model.AiSuffixRule;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserAiUsage;
-import ch.goodone.angularai.backend.repository.AiFeatureUsageRepository;
-import ch.goodone.angularai.backend.repository.AiSuffixRuleRepository;
-import ch.goodone.angularai.backend.repository.UserAiUsageRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+package ch.goodone.backend.ai.usage;
+
+import ch.goodone.backend.dto.ai.UserAiUsageDto;
+import ch.goodone.backend.model.AiFeatureUsage;
+import ch.goodone.backend.model.AiSuffixRule;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserAiUsage;
+import ch.goodone.backend.repository.AiFeatureUsageRepository;
+import ch.goodone.backend.repository.AiSuffixRuleRepository;
+import ch.goodone.backend.repository.UserAiUsageRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.SystemSettingService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/AsyncConfig.java b/backend/src/main/java/ch/goodone/backend/config/AsyncConfig.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/AsyncConfig.java
rename to backend/src/main/java/ch/goodone/backend/config/AsyncConfig.java
index c539c0dc8..755bab43a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/AsyncConfig.java
+++ b/backend/src/main/java/ch/goodone/backend/config/AsyncConfig.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/ConfigValidator.java b/backend/src/main/java/ch/goodone/backend/config/ConfigValidator.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/ConfigValidator.java
rename to backend/src/main/java/ch/goodone/backend/config/ConfigValidator.java
index 344e2ecab..557472266 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/ConfigValidator.java
+++ b/backend/src/main/java/ch/goodone/backend/config/ConfigValidator.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/DemoStartupTask.java b/backend/src/main/java/ch/goodone/backend/config/DemoStartupTask.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/DemoStartupTask.java
rename to backend/src/main/java/ch/goodone/backend/config/DemoStartupTask.java
index 55b63e51b..7f56b961b 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/DemoStartupTask.java
+++ b/backend/src/main/java/ch/goodone/backend/config/DemoStartupTask.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.SystemSettingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/DocStartupTask.java b/backend/src/main/java/ch/goodone/backend/config/DocStartupTask.java
similarity index 89%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/DocStartupTask.java
rename to backend/src/main/java/ch/goodone/backend/config/DocStartupTask.java
index a1c699336..c5737edbb 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/DocStartupTask.java
+++ b/backend/src/main/java/ch/goodone/backend/config/DocStartupTask.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.docs.ingest.DocIngestionService;
+import ch.goodone.backend.docs.ingest.DocIngestionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/DotEnvApplicationInitializer.java b/backend/src/main/java/ch/goodone/backend/config/DotEnvApplicationInitializer.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/DotEnvApplicationInitializer.java
rename to backend/src/main/java/ch/goodone/backend/config/DotEnvApplicationInitializer.java
index ff0fa533a..722c4c2fe 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/DotEnvApplicationInitializer.java
+++ b/backend/src/main/java/ch/goodone/backend/config/DotEnvApplicationInitializer.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/FlywayConfig.java b/backend/src/main/java/ch/goodone/backend/config/FlywayConfig.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/FlywayConfig.java
rename to backend/src/main/java/ch/goodone/backend/config/FlywayConfig.java
index 2fcfc55b3..187702f94 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/FlywayConfig.java
+++ b/backend/src/main/java/ch/goodone/backend/config/FlywayConfig.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.configuration.FluentConfiguration;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/JwtAuthenticationFilter.java b/backend/src/main/java/ch/goodone/backend/config/JwtAuthenticationFilter.java
similarity index 94%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/JwtAuthenticationFilter.java
rename to backend/src/main/java/ch/goodone/backend/config/JwtAuthenticationFilter.java
index b841f1da1..75b718c58 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/JwtAuthenticationFilter.java
+++ b/backend/src/main/java/ch/goodone/backend/config/JwtAuthenticationFilter.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.service.JwtService;
+import ch.goodone.backend.service.JwtService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
-import ch.goodone.angularai.backend.security.CustomUserDetails;
+import ch.goodone.backend.security.CustomUserDetails;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Map;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/MailConfig.java b/backend/src/main/java/ch/goodone/backend/config/MailConfig.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/MailConfig.java
rename to backend/src/main/java/ch/goodone/backend/config/MailConfig.java
index 5c32a7646..7144d1127 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/MailConfig.java
+++ b/backend/src/main/java/ch/goodone/backend/config/MailConfig.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/MdcFilter.java b/backend/src/main/java/ch/goodone/backend/config/MdcFilter.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/MdcFilter.java
rename to backend/src/main/java/ch/goodone/backend/config/MdcFilter.java
index d77ed578a..e7f6260f5 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/MdcFilter.java
+++ b/backend/src/main/java/ch/goodone/backend/config/MdcFilter.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/MonitoringConfig.java b/backend/src/main/java/ch/goodone/backend/config/MonitoringConfig.java
similarity index 91%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/MonitoringConfig.java
rename to backend/src/main/java/ch/goodone/backend/config/MonitoringConfig.java
index 7e9a9212e..2e135fdbd 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/MonitoringConfig.java
+++ b/backend/src/main/java/ch/goodone/backend/config/MonitoringConfig.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository;
import org.springframework.boot.actuate.web.exchanges.InMemoryHttpExchangeRepository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/OpenApiConfig.java b/backend/src/main/java/ch/goodone/backend/config/OpenApiConfig.java
similarity index 92%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/OpenApiConfig.java
rename to backend/src/main/java/ch/goodone/backend/config/OpenApiConfig.java
index d269bb58a..416dfbc87 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/OpenApiConfig.java
+++ b/backend/src/main/java/ch/goodone/backend/config/OpenApiConfig.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
@@ -17,9 +17,9 @@ public class OpenApiConfig {
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
- .title("AngularAI API")
+ .title("GoodOne API")
.version("1.0")
- .description("API documentation for the AngularAI project"))
+ .description("API documentation for the GoodOne project"))
.addSecurityItem(new SecurityRequirement().addList(SCHEME_BASIC))
.addSecurityItem(new SecurityRequirement().addList(SCHEME_BEARER))
.components(new Components()
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/RateLimitingFilter.java b/backend/src/main/java/ch/goodone/backend/config/RateLimitingFilter.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/RateLimitingFilter.java
rename to backend/src/main/java/ch/goodone/backend/config/RateLimitingFilter.java
index d720d42f8..e001edb2a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/RateLimitingFilter.java
+++ b/backend/src/main/java/ch/goodone/backend/config/RateLimitingFilter.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Bucket;
import jakarta.servlet.Filter;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/RequestLoggingFilter.java b/backend/src/main/java/ch/goodone/backend/config/RequestLoggingFilter.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/RequestLoggingFilter.java
rename to backend/src/main/java/ch/goodone/backend/config/RequestLoggingFilter.java
index 38026e36f..8b2ca9d55 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/RequestLoggingFilter.java
+++ b/backend/src/main/java/ch/goodone/backend/config/RequestLoggingFilter.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/SecurityConfig.java b/backend/src/main/java/ch/goodone/backend/config/SecurityConfig.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/SecurityConfig.java
rename to backend/src/main/java/ch/goodone/backend/config/SecurityConfig.java
index e49ed82ab..e2ea15ca1 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/SecurityConfig.java
+++ b/backend/src/main/java/ch/goodone/backend/config/SecurityConfig.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -14,8 +14,8 @@
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
-import ch.goodone.angularai.backend.security.CustomUserDetails;
-import ch.goodone.angularai.backend.ai.config.AiEnabledFilter;
+import ch.goodone.backend.security.CustomUserDetails;
+import ch.goodone.backend.ai.config.AiEnabledFilter;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import java.util.Collections;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
@@ -264,7 +264,7 @@ public UserDetailsService userDetailsService(UserRepository userRepository) {
logger.info("[DEBUG_LOG] Loading user: {}, status: {}, role: {}, passPrefix: {}", user.getLogin(), user.getStatus(), user.getRole(), passPrefix);
// Map our UserStatus to Spring Security account status flags
- boolean enabled = user.getStatus() == ch.goodone.angularai.backend.model.UserStatus.ACTIVE;
+ boolean enabled = user.getStatus() == ch.goodone.backend.model.UserStatus.ACTIVE;
return new CustomUserDetails(
user.getLogin(),
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/WafSimulatedFilter.java b/backend/src/main/java/ch/goodone/backend/config/WafSimulatedFilter.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/WafSimulatedFilter.java
rename to backend/src/main/java/ch/goodone/backend/config/WafSimulatedFilter.java
index 05731650d..385a9bb91 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/WafSimulatedFilter.java
+++ b/backend/src/main/java/ch/goodone/backend/config/WafSimulatedFilter.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/config/WebConfiguration.java b/backend/src/main/java/ch/goodone/backend/config/WebConfiguration.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/config/WebConfiguration.java
rename to backend/src/main/java/ch/goodone/backend/config/WebConfiguration.java
index de804aae8..d61fc5bdc 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/config/WebConfiguration.java
+++ b/backend/src/main/java/ch/goodone/backend/config/WebConfiguration.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/ActionLogController.java b/backend/src/main/java/ch/goodone/backend/controller/ActionLogController.java
similarity index 91%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/ActionLogController.java
rename to backend/src/main/java/ch/goodone/backend/controller/ActionLogController.java
index fb488f761..e2341818f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/ActionLogController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/ActionLogController.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.dto.ActionLogDTO;
-import ch.goodone.angularai.backend.service.ActionLogService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.dto.ActionLogDTO;
+import ch.goodone.backend.service.ActionLogService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminDemoController.java b/backend/src/main/java/ch/goodone/backend/controller/AdminDemoController.java
similarity index 87%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AdminDemoController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AdminDemoController.java
index aec486daa..44eba378d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminDemoController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AdminDemoController.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.service.DemoResetService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.service.DemoResetService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminDocsController.java b/backend/src/main/java/ch/goodone/backend/controller/AdminDocsController.java
similarity index 91%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AdminDocsController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AdminDocsController.java
index 58ab6b34b..ab557d941 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminDocsController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AdminDocsController.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.docs.ingest.DocIngestionService;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.docs.ingest.DocIndexingStatusService;
-import ch.goodone.angularai.backend.dto.DocIndexingStatusDTO;
-import ch.goodone.angularai.backend.service.ActionLogService;
+import ch.goodone.backend.docs.ingest.DocIngestionService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.docs.ingest.DocIndexingStatusService;
+import ch.goodone.backend.dto.DocIndexingStatusDTO;
+import ch.goodone.backend.service.ActionLogService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminSystemController.java b/backend/src/main/java/ch/goodone/backend/controller/AdminSystemController.java
similarity index 94%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AdminSystemController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AdminSystemController.java
index af5e9f94c..e3bf6bf3f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminSystemController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AdminSystemController.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.IpLocationService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.IpLocationService;
+import ch.goodone.backend.service.SystemSettingService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminUserController.java b/backend/src/main/java/ch/goodone/backend/controller/AdminUserController.java
similarity index 92%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AdminUserController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AdminUserController.java
index 41e3a888b..9e0bdcd6e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdminUserController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AdminUserController.java
@@ -1,14 +1,14 @@
-package ch.goodone.angularai.backend.controller;
-
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserConstants;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.ValidationService;
+package ch.goodone.backend.controller;
+
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserConstants;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.ValidationService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdrController.java b/backend/src/main/java/ch/goodone/backend/controller/AdrController.java
similarity index 94%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AdrController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AdrController.java
index d62f95883..e53291a95 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AdrController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AdrController.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.dto.AdrContentDTO;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+import ch.goodone.backend.dto.AdrContentDTO;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiAdminController.java b/backend/src/main/java/ch/goodone/backend/controller/AiAdminController.java
similarity index 87%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AiAdminController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AiAdminController.java
index 0da28de6f..bbf8ee9b3 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiAdminController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AiAdminController.java
@@ -1,19 +1,19 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.ai.dto.AiCreditRequestActionRequest;
-import ch.goodone.angularai.backend.ai.dto.AiCreditRequestDTO;
-import ch.goodone.angularai.backend.ai.usage.AiCreditRequestService;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.dto.ai.AiSettingsDto;
-import ch.goodone.angularai.backend.dto.ai.AiSuffixRuleDto;
-import ch.goodone.angularai.backend.dto.ai.AiUsageDashboardDto;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import ch.goodone.angularai.backend.model.AiSuffixRule;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.AiSuffixRuleRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.ai.dto.AiCreditRequestActionRequest;
+import ch.goodone.backend.ai.dto.AiCreditRequestDTO;
+import ch.goodone.backend.ai.usage.AiCreditRequestService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.ai.AiSettingsDto;
+import ch.goodone.backend.dto.ai.AiSuffixRuleDto;
+import ch.goodone.backend.dto.ai.AiUsageDashboardDto;
+import ch.goodone.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.AiSuffixRule;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.AiSuffixRuleRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.SystemSettingService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiController.java b/backend/src/main/java/ch/goodone/backend/controller/AiController.java
similarity index 88%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AiController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AiController.java
index c0a9d509e..0bf7a2c47 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AiController.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.ai.application.AiApplicationService;
-import ch.goodone.angularai.backend.ai.dto.*;
-import ch.goodone.angularai.backend.ai.usage.AiCreditRequestService;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.dto.ai.UserAiUsageDto;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.ai.application.AiApplicationService;
+import ch.goodone.backend.ai.dto.*;
+import ch.goodone.backend.ai.usage.AiCreditRequestService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.ai.UserAiUsageDto;
+import ch.goodone.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -26,7 +26,7 @@
@Slf4j
public class AiController {
private final AiApplicationService aiApplicationService;
- private final ch.goodone.angularai.backend.service.CaptchaService captchaService;
+ private final ch.goodone.backend.service.CaptchaService captchaService;
private final AiCreditRequestService aiCreditRequestService;
private final AiUsageService aiUsageService;
private final UserRepository userRepository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiCostController.java b/backend/src/main/java/ch/goodone/backend/controller/AiCostController.java
similarity index 86%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AiCostController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AiCostController.java
index d7c1e5e46..199d52c16 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiCostController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AiCostController.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.ai.usage.AiUsageCostService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.ai.usage.AiUsageCostService;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiExceptionHandler.java b/backend/src/main/java/ch/goodone/backend/controller/AiExceptionHandler.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AiExceptionHandler.java
rename to backend/src/main/java/ch/goodone/backend/controller/AiExceptionHandler.java
index a1df27220..26c1fb9dc 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AiExceptionHandler.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AiExceptionHandler.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.ai.exception.AiDisabledException;
-import ch.goodone.angularai.backend.ai.exception.AiException;
-import ch.goodone.angularai.backend.ai.exception.AiParsingException;
-import ch.goodone.angularai.backend.ai.exception.AiProviderException;
-import ch.goodone.angularai.backend.ai.exception.AiRateLimitException;
+import ch.goodone.backend.ai.exception.AiDisabledException;
+import ch.goodone.backend.ai.exception.AiException;
+import ch.goodone.backend.ai.exception.AiParsingException;
+import ch.goodone.backend.ai.exception.AiProviderException;
+import ch.goodone.backend.ai.exception.AiRateLimitException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/AuthController.java b/backend/src/main/java/ch/goodone/backend/controller/AuthController.java
similarity index 91%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/AuthController.java
rename to backend/src/main/java/ch/goodone/backend/controller/AuthController.java
index 91fd1783b..f3b113fc1 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/AuthController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/AuthController.java
@@ -1,20 +1,20 @@
-package ch.goodone.angularai.backend.controller;
-
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.PasswordRecoveryToken;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.repository.PasswordRecoveryTokenRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.EmailService;
-import ch.goodone.angularai.backend.service.JwtService;
-import ch.goodone.angularai.backend.service.UserAliasService;
-import ch.goodone.angularai.backend.service.ValidationService;
+package ch.goodone.backend.controller;
+
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.PasswordRecoveryToken;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.repository.PasswordRecoveryTokenRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.EmailService;
+import ch.goodone.backend.service.JwtService;
+import ch.goodone.backend.service.UserAliasService;
+import ch.goodone.backend.service.ValidationService;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
@@ -113,7 +113,7 @@ public ResponseEntity login(Authentication authentication, HttpServletR
return ResponseEntity.status(401).build();
}
- if (user.getStatus() != ch.goodone.angularai.backend.model.UserStatus.ACTIVE) {
+ if (user.getStatus() != ch.goodone.backend.model.UserStatus.ACTIVE) {
logger.warn("Login attempt for non-active user: {}", user.getLogin());
// Invalidate session to ensure no persistent login state
jakarta.servlet.http.HttpSession session = request.getSession(false);
@@ -158,7 +158,7 @@ public ResponseEntity getAuthInfo(Authentication authentication, HttpSe
}
return userRepository.findByLogin(authentication.getName())
.map(user -> {
- if (user.getStatus() != ch.goodone.angularai.backend.model.UserStatus.ACTIVE) {
+ if (user.getStatus() != ch.goodone.backend.model.UserStatus.ACTIVE) {
logger.warn("Auth info request for non-active user: {}", user.getLogin());
// Invalidate session to ensure no persistent login state
jakarta.servlet.http.HttpSession session = request.getSession(false);
@@ -229,8 +229,8 @@ private User createUserFromDTO(UserDTO userDTO) {
user.setPhone(userDTO.getPhone() != null && !userDTO.getPhone().isBlank() ? userDTO.getPhone() : null);
user.setBirthDate(userDTO.getBirthDate());
user.setAddress(userDTO.getAddress());
- user.setRole(ch.goodone.angularai.backend.model.Role.ROLE_ADMIN_READ);
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.PENDING);
+ user.setRole(ch.goodone.backend.model.Role.ROLE_ADMIN_READ);
+ user.setStatus(ch.goodone.backend.model.UserStatus.PENDING);
return user;
}
@@ -256,7 +256,7 @@ private void validateRegistration(UserDTO userDTO) {
private void cleanupPendingUser(String login, String email) {
// Handle re-registration: clean up pending user with same login or email
userRepository.findByLogin(login).ifPresent(u -> {
- if (u.getStatus() == ch.goodone.angularai.backend.model.UserStatus.PENDING) {
+ if (u.getStatus() == ch.goodone.backend.model.UserStatus.PENDING) {
actionLogService.log(u.getLogin(), "USER_REREGISTER_CLEANUP", "Cleaning up pending user for re-registration by login: " + u.getLogin());
verificationTokenRepository.deleteByUser(u);
userRepository.delete(u);
@@ -264,7 +264,7 @@ private void cleanupPendingUser(String login, String email) {
}
});
userRepository.findByEmail(email).ifPresent(u -> {
- if (u.getStatus() == ch.goodone.angularai.backend.model.UserStatus.PENDING) {
+ if (u.getStatus() == ch.goodone.backend.model.UserStatus.PENDING) {
actionLogService.log(u.getLogin(), "USER_REREGISTER_CLEANUP", "Cleaning up pending user for re-registration by email: " + u.getEmail());
verificationTokenRepository.deleteByUser(u);
userRepository.delete(u);
@@ -291,7 +291,7 @@ public ResponseEntity verify(@RequestParam String token) {
user.setPendingEmail(null);
actionLogService.log(user.getLogin(), "USER_EMAIL_CHANGED", "User successfully changed email to: " + sanitizeLog(user.getEmail()));
}
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.ACTIVE);
+ user.setStatus(ch.goodone.backend.model.UserStatus.ACTIVE);
user.setVerificationToken(null);
userRepository.save(user);
verificationTokenRepository.delete(t);
@@ -324,7 +324,7 @@ public ResponseEntity getVerificationTokenForTest(@RequestParam String e
public ResponseEntity resendVerification(@RequestParam String email) {
return userRepository.findByEmail(email)
.map(user -> {
- if (user.getStatus() != ch.goodone.angularai.backend.model.UserStatus.PENDING) {
+ if (user.getStatus() != ch.goodone.backend.model.UserStatus.PENDING) {
throw new IllegalArgumentException("User is already active or invalid status");
}
// Clean up old tokens
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/ContactController.java b/backend/src/main/java/ch/goodone/backend/controller/ContactController.java
similarity index 86%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/ContactController.java
rename to backend/src/main/java/ch/goodone/backend/controller/ContactController.java
index fb10905d2..b8aa958e8 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/ContactController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/ContactController.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
-import ch.goodone.angularai.backend.dto.ContactRequestDTO;
-import ch.goodone.angularai.backend.model.ContactMessage;
-import ch.goodone.angularai.backend.repository.ContactMessageRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.EmailService;
-import ch.goodone.angularai.backend.service.ValidationService;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
+import ch.goodone.backend.dto.ContactRequestDTO;
+import ch.goodone.backend.model.ContactMessage;
+import ch.goodone.backend.repository.ContactMessageRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.EmailService;
+import ch.goodone.backend.service.ValidationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/CspReportController.java b/backend/src/main/java/ch/goodone/backend/controller/CspReportController.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/CspReportController.java
rename to backend/src/main/java/ch/goodone/backend/controller/CspReportController.java
index bbfdb0158..a01b61afb 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/CspReportController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/CspReportController.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.util.SecurityConstants;
+import ch.goodone.backend.util.SecurityConstants;
import tools.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,10 +15,10 @@
public class CspReportController {
private static final Logger logger = LoggerFactory.getLogger(CspReportController.class);
- private final ch.goodone.angularai.backend.service.ActionLogService actionLogService;
+ private final ch.goodone.backend.service.ActionLogService actionLogService;
private final ObjectMapper objectMapper;
- public CspReportController(ch.goodone.angularai.backend.service.ActionLogService actionLogService, ObjectMapper objectMapper) {
+ public CspReportController(ch.goodone.backend.service.ActionLogService actionLogService, ObjectMapper objectMapper) {
this.actionLogService = actionLogService;
this.objectMapper = objectMapper;
}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/DashboardController.java b/backend/src/main/java/ch/goodone/backend/controller/DashboardController.java
similarity index 79%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/DashboardController.java
rename to backend/src/main/java/ch/goodone/backend/controller/DashboardController.java
index 777d41afc..8b670fb8c 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/DashboardController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/DashboardController.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.dto.DashboardDTO;
-import ch.goodone.angularai.backend.service.DashboardService;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
+import ch.goodone.backend.dto.DashboardDTO;
+import ch.goodone.backend.service.DashboardService;
+import static ch.goodone.backend.util.SecurityConstants.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/GlobalExceptionHandler.java b/backend/src/main/java/ch/goodone/backend/controller/GlobalExceptionHandler.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/GlobalExceptionHandler.java
rename to backend/src/main/java/ch/goodone/backend/controller/GlobalExceptionHandler.java
index a45a0de8b..711ee5e66 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/GlobalExceptionHandler.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/GlobalExceptionHandler.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/RetrospectiveController.java b/backend/src/main/java/ch/goodone/backend/controller/RetrospectiveController.java
similarity index 78%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/RetrospectiveController.java
rename to backend/src/main/java/ch/goodone/backend/controller/RetrospectiveController.java
index c192985a8..c79c7eead 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/RetrospectiveController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/RetrospectiveController.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.ai.application.RetrospectiveUseCase;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveRequest;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveResponse;
-import ch.goodone.angularai.backend.ai.dto.TasksetInfo;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.ai.application.RetrospectiveUseCase;
+import ch.goodone.backend.ai.dto.RetrospectiveRequest;
+import ch.goodone.backend.ai.dto.RetrospectiveResponse;
+import ch.goodone.backend.ai.dto.TasksetInfo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
@@ -23,9 +23,9 @@
@Tag(name = "AI Retrospective", description = "Endpoints for generating AI-powered retrospectives")
public class RetrospectiveController {
private final RetrospectiveUseCase retrospectiveUseCase;
- private final ch.goodone.angularai.backend.service.CaptchaService captchaService;
+ private final ch.goodone.backend.service.CaptchaService captchaService;
- public RetrospectiveController(RetrospectiveUseCase retrospectiveUseCase, ch.goodone.angularai.backend.service.CaptchaService captchaService) {
+ public RetrospectiveController(RetrospectiveUseCase retrospectiveUseCase, ch.goodone.backend.service.CaptchaService captchaService) {
this.retrospectiveUseCase = retrospectiveUseCase;
this.captchaService = captchaService;
log.info("RetrospectiveController initialized");
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/SystemController.java b/backend/src/main/java/ch/goodone/backend/controller/SystemController.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/SystemController.java
rename to backend/src/main/java/ch/goodone/backend/controller/SystemController.java
index f321337f4..ab88f7604 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/SystemController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/SystemController.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.dto.RecaptchaConfigDTO;
-import ch.goodone.angularai.backend.dto.SystemInfoDTO;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.RecaptchaConfigDTO;
+import ch.goodone.backend.dto.SystemInfoDTO;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.SystemSettingService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.info.BuildProperties;
import org.springframework.context.i18n.LocaleContextHolder;
@@ -147,7 +147,7 @@ private boolean isSystemReady() {
// Ensure admin user exists and is ACTIVE as part of the health check
boolean ready = dbConnected && userRepository.findByLogin("admin")
- .map(u -> u.getStatus() == ch.goodone.angularai.backend.model.UserStatus.ACTIVE)
+ .map(u -> u.getStatus() == ch.goodone.backend.model.UserStatus.ACTIVE)
.orElse(false);
if (ready && logger.isDebugEnabled()) {
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/TaskController.java b/backend/src/main/java/ch/goodone/backend/controller/TaskController.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/TaskController.java
rename to backend/src/main/java/ch/goodone/backend/controller/TaskController.java
index d1d85534c..951169b74 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/TaskController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/TaskController.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.ai.application.QuickAddParseUseCase;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseRequest;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseResult;
-import ch.goodone.angularai.backend.dto.TaskDTO;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.TaskService;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.ai.application.QuickAddParseUseCase;
+import ch.goodone.backend.ai.dto.QuickAddParseRequest;
+import ch.goodone.backend.ai.dto.QuickAddParseResult;
+import ch.goodone.backend.dto.TaskDTO;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.TaskService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
@@ -39,9 +39,9 @@ public class TaskController {
private final UserRepository userRepository;
private final ActionLogService actionLogService;
private final QuickAddParseUseCase quickAddParseUseCase;
- private final ch.goodone.angularai.backend.service.CaptchaService captchaService;
+ private final ch.goodone.backend.service.CaptchaService captchaService;
- public TaskController(TaskService taskService, UserRepository userRepository, ActionLogService actionLogService, QuickAddParseUseCase quickAddParseUseCase, ch.goodone.angularai.backend.service.CaptchaService captchaService) {
+ public TaskController(TaskService taskService, UserRepository userRepository, ActionLogService actionLogService, QuickAddParseUseCase quickAddParseUseCase, ch.goodone.backend.service.CaptchaService captchaService) {
this.taskService = taskService;
this.userRepository = userRepository;
this.actionLogService = actionLogService;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/controller/UserController.java b/backend/src/main/java/ch/goodone/backend/controller/UserController.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/controller/UserController.java
rename to backend/src/main/java/ch/goodone/backend/controller/UserController.java
index b5bdb8d56..b54629266 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/controller/UserController.java
+++ b/backend/src/main/java/ch/goodone/backend/controller/UserController.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.EmailService;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.EmailService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.HttpStatus;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/DocIndexingStatusService.java b/backend/src/main/java/ch/goodone/backend/docs/ingest/DocIndexingStatusService.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/DocIndexingStatusService.java
rename to backend/src/main/java/ch/goodone/backend/docs/ingest/DocIndexingStatusService.java
index a16752338..b2a5fa3a0 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/DocIndexingStatusService.java
+++ b/backend/src/main/java/ch/goodone/backend/docs/ingest/DocIndexingStatusService.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.docs.ingest;
+package ch.goodone.backend.docs.ingest;
-import ch.goodone.angularai.backend.dto.DocIndexingStatusDTO;
+import ch.goodone.backend.dto.DocIndexingStatusDTO;
import org.springframework.stereotype.Service;
import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/DocIngestionService.java b/backend/src/main/java/ch/goodone/backend/docs/ingest/DocIngestionService.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/DocIngestionService.java
rename to backend/src/main/java/ch/goodone/backend/docs/ingest/DocIngestionService.java
index c53185d32..9b9566e0d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/DocIngestionService.java
+++ b/backend/src/main/java/ch/goodone/backend/docs/ingest/DocIngestionService.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.docs.ingest;
+package ch.goodone.backend.docs.ingest;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import tools.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/EmbeddingService.java b/backend/src/main/java/ch/goodone/backend/docs/ingest/EmbeddingService.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/EmbeddingService.java
rename to backend/src/main/java/ch/goodone/backend/docs/ingest/EmbeddingService.java
index f1e81a33c..9e99e0c06 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/EmbeddingService.java
+++ b/backend/src/main/java/ch/goodone/backend/docs/ingest/EmbeddingService.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.docs.ingest;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocEmbedding;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
+package ch.goodone.backend.docs.ingest;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocEmbedding;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.embedding.EmbeddingModel;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/MarkdownChunker.java b/backend/src/main/java/ch/goodone/backend/docs/ingest/MarkdownChunker.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/MarkdownChunker.java
rename to backend/src/main/java/ch/goodone/backend/docs/ingest/MarkdownChunker.java
index 26cb87982..ecf460b82 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/MarkdownChunker.java
+++ b/backend/src/main/java/ch/goodone/backend/docs/ingest/MarkdownChunker.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.docs.ingest;
+package ch.goodone.backend.docs.ingest;
import lombok.Builder;
import lombok.Getter;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/TaskIndexValidator.java b/backend/src/main/java/ch/goodone/backend/docs/ingest/TaskIndexValidator.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/TaskIndexValidator.java
rename to backend/src/main/java/ch/goodone/backend/docs/ingest/TaskIndexValidator.java
index 89ec590a3..f92fe0df9 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/TaskIndexValidator.java
+++ b/backend/src/main/java/ch/goodone/backend/docs/ingest/TaskIndexValidator.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.docs.ingest;
+package ch.goodone.backend.docs.ingest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/docs/retrieval/DocRetrievalService.java b/backend/src/main/java/ch/goodone/backend/docs/retrieval/DocRetrievalService.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/docs/retrieval/DocRetrievalService.java
rename to backend/src/main/java/ch/goodone/backend/docs/retrieval/DocRetrievalService.java
index e0eb7761a..30eed5a0b 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/docs/retrieval/DocRetrievalService.java
+++ b/backend/src/main/java/ch/goodone/backend/docs/retrieval/DocRetrievalService.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.docs.retrieval;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocEmbedding;
-import ch.goodone.angularai.backend.model.converter.VectorConverter;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
+package ch.goodone.backend.docs.retrieval;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocEmbedding;
+import ch.goodone.backend.model.converter.VectorConverter;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.embedding.EmbeddingModel;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/ActionLogDTO.java b/backend/src/main/java/ch/goodone/backend/dto/ActionLogDTO.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/ActionLogDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/ActionLogDTO.java
index 3acec9343..98c4538ac 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/ActionLogDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/ActionLogDTO.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
-import ch.goodone.angularai.backend.model.ActionLog;
+import ch.goodone.backend.model.ActionLog;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/AdrContentDTO.java b/backend/src/main/java/ch/goodone/backend/dto/AdrContentDTO.java
similarity index 94%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/AdrContentDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/AdrContentDTO.java
index 99b5b9d55..0d5646222 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/AdrContentDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/AdrContentDTO.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/ContactRequestDTO.java b/backend/src/main/java/ch/goodone/backend/dto/ContactRequestDTO.java
similarity index 85%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/ContactRequestDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/ContactRequestDTO.java
index ab233cc97..aa7a0157e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/ContactRequestDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/ContactRequestDTO.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/CspReportDTO.java b/backend/src/main/java/ch/goodone/backend/dto/CspReportDTO.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/CspReportDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/CspReportDTO.java
index f613274cd..0e96afa1e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/CspReportDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/CspReportDTO.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/DashboardDTO.java b/backend/src/main/java/ch/goodone/backend/dto/DashboardDTO.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/DashboardDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/DashboardDTO.java
index c7fc74917..141123e29 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/DashboardDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/DashboardDTO.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/DocIndexingStatusDTO.java b/backend/src/main/java/ch/goodone/backend/dto/DocIndexingStatusDTO.java
similarity index 91%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/DocIndexingStatusDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/DocIndexingStatusDTO.java
index a93da9b57..c66770249 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/DocIndexingStatusDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/DocIndexingStatusDTO.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/RecaptchaConfigDTO.java b/backend/src/main/java/ch/goodone/backend/dto/RecaptchaConfigDTO.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/RecaptchaConfigDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/RecaptchaConfigDTO.java
index b77081d71..92819b55e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/RecaptchaConfigDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/RecaptchaConfigDTO.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
public class RecaptchaConfigDTO {
private String siteKey;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/SystemInfoDTO.java b/backend/src/main/java/ch/goodone/backend/dto/SystemInfoDTO.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/SystemInfoDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/SystemInfoDTO.java
index bdb2c9794..f45c9592b 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/SystemInfoDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/SystemInfoDTO.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
public class SystemInfoDTO {
private String backendVersion;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/TaskDTO.java b/backend/src/main/java/ch/goodone/backend/dto/TaskDTO.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/TaskDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/TaskDTO.java
index 1e1466d08..6a95e6af2 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/TaskDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/TaskDTO.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Task;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Task;
import java.time.LocalDate;
public class TaskDTO {
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/UserDTO.java b/backend/src/main/java/ch/goodone/backend/dto/UserDTO.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/UserDTO.java
rename to backend/src/main/java/ch/goodone/backend/dto/UserDTO.java
index a8f68a6ae..8100907b0 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/UserDTO.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/UserDTO.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.model.User;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.model.User;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.GrantedAuthority;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiSettingsDto.java b/backend/src/main/java/ch/goodone/backend/dto/ai/AiSettingsDto.java
similarity index 83%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiSettingsDto.java
rename to backend/src/main/java/ch/goodone/backend/dto/ai/AiSettingsDto.java
index af50c19bd..507f7cb00 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiSettingsDto.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/ai/AiSettingsDto.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto.ai;
+package ch.goodone.backend.dto.ai;
import lombok.AllArgsConstructor;
import lombok.Data;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiSuffixRuleDto.java b/backend/src/main/java/ch/goodone/backend/dto/ai/AiSuffixRuleDto.java
similarity index 80%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiSuffixRuleDto.java
rename to backend/src/main/java/ch/goodone/backend/dto/ai/AiSuffixRuleDto.java
index 3861d75ce..ef6b1934d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiSuffixRuleDto.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/ai/AiSuffixRuleDto.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.dto.ai;
+package ch.goodone.backend.dto.ai;
-import ch.goodone.angularai.backend.model.AiSuffixRule;
+import ch.goodone.backend.model.AiSuffixRule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiUsageDashboardDto.java b/backend/src/main/java/ch/goodone/backend/dto/ai/AiUsageDashboardDto.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiUsageDashboardDto.java
rename to backend/src/main/java/ch/goodone/backend/dto/ai/AiUsageDashboardDto.java
index ba97d1aa1..c4089f934 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/AiUsageDashboardDto.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/ai/AiUsageDashboardDto.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto.ai;
+package ch.goodone.backend.dto.ai;
import java.time.LocalDate;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/UserAiUsageDto.java b/backend/src/main/java/ch/goodone/backend/dto/ai/UserAiUsageDto.java
similarity index 89%
rename from backend/src/main/java/ch/goodone/angularai/backend/dto/ai/UserAiUsageDto.java
rename to backend/src/main/java/ch/goodone/backend/dto/ai/UserAiUsageDto.java
index 23ec6a025..0c9714478 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/dto/ai/UserAiUsageDto.java
+++ b/backend/src/main/java/ch/goodone/backend/dto/ai/UserAiUsageDto.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.dto.ai;
+package ch.goodone.backend.dto.ai;
import java.time.LocalDate;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/exception/EmailException.java b/backend/src/main/java/ch/goodone/backend/exception/EmailException.java
similarity index 85%
rename from backend/src/main/java/ch/goodone/angularai/backend/exception/EmailException.java
rename to backend/src/main/java/ch/goodone/backend/exception/EmailException.java
index 23208d7bf..62e91aecb 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/exception/EmailException.java
+++ b/backend/src/main/java/ch/goodone/backend/exception/EmailException.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.exception;
+package ch.goodone.backend.exception;
/**
* Exception thrown when email sending fails.
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/ActionLog.java b/backend/src/main/java/ch/goodone/backend/model/ActionLog.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/ActionLog.java
rename to backend/src/main/java/ch/goodone/backend/model/ActionLog.java
index 95f8b4b49..44e60767d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/ActionLog.java
+++ b/backend/src/main/java/ch/goodone/backend/model/ActionLog.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/AiCreditRequest.java b/backend/src/main/java/ch/goodone/backend/model/AiCreditRequest.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/AiCreditRequest.java
rename to backend/src/main/java/ch/goodone/backend/model/AiCreditRequest.java
index d79a1b150..3b3c671b0 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/AiCreditRequest.java
+++ b/backend/src/main/java/ch/goodone/backend/model/AiCreditRequest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/AiFeatureUsage.java b/backend/src/main/java/ch/goodone/backend/model/AiFeatureUsage.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/AiFeatureUsage.java
rename to backend/src/main/java/ch/goodone/backend/model/AiFeatureUsage.java
index 4f683ccb5..23dbc4752 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/AiFeatureUsage.java
+++ b/backend/src/main/java/ch/goodone/backend/model/AiFeatureUsage.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/AiSuffixRule.java b/backend/src/main/java/ch/goodone/backend/model/AiSuffixRule.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/AiSuffixRule.java
rename to backend/src/main/java/ch/goodone/backend/model/AiSuffixRule.java
index c1eee6ae7..9860f14b9 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/AiSuffixRule.java
+++ b/backend/src/main/java/ch/goodone/backend/model/AiSuffixRule.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/AiUsageCost.java b/backend/src/main/java/ch/goodone/backend/model/AiUsageCost.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/AiUsageCost.java
rename to backend/src/main/java/ch/goodone/backend/model/AiUsageCost.java
index 3644d0fc2..d92afdfee 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/AiUsageCost.java
+++ b/backend/src/main/java/ch/goodone/backend/model/AiUsageCost.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/ContactMessage.java b/backend/src/main/java/ch/goodone/backend/model/ContactMessage.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/ContactMessage.java
rename to backend/src/main/java/ch/goodone/backend/model/ContactMessage.java
index 39ddeb260..e1f93d88f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/ContactMessage.java
+++ b/backend/src/main/java/ch/goodone/backend/model/ContactMessage.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/DocChunk.java b/backend/src/main/java/ch/goodone/backend/model/DocChunk.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/DocChunk.java
rename to backend/src/main/java/ch/goodone/backend/model/DocChunk.java
index 6400be2b3..542137a9d 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/DocChunk.java
+++ b/backend/src/main/java/ch/goodone/backend/model/DocChunk.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/DocEmbedding.java b/backend/src/main/java/ch/goodone/backend/model/DocEmbedding.java
similarity index 88%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/DocEmbedding.java
rename to backend/src/main/java/ch/goodone/backend/model/DocEmbedding.java
index f72fb661b..7f257e30e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/DocEmbedding.java
+++ b/backend/src/main/java/ch/goodone/backend/model/DocEmbedding.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Convert;
@@ -33,7 +33,7 @@ public class DocEmbedding {
@JoinColumn(name = "chunk_id", nullable = false)
private DocChunk chunk;
- @Convert(converter = ch.goodone.angularai.backend.model.converter.VectorConverter.class)
+ @Convert(converter = ch.goodone.backend.model.converter.VectorConverter.class)
@Column(name = "embedding", length = 32000)
private float[] embedding;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/DocSource.java b/backend/src/main/java/ch/goodone/backend/model/DocSource.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/DocSource.java
rename to backend/src/main/java/ch/goodone/backend/model/DocSource.java
index 84c1cc13e..6137c798b 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/DocSource.java
+++ b/backend/src/main/java/ch/goodone/backend/model/DocSource.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/PasswordRecoveryToken.java b/backend/src/main/java/ch/goodone/backend/model/PasswordRecoveryToken.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/PasswordRecoveryToken.java
rename to backend/src/main/java/ch/goodone/backend/model/PasswordRecoveryToken.java
index aeddd326a..564fa0183 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/PasswordRecoveryToken.java
+++ b/backend/src/main/java/ch/goodone/backend/model/PasswordRecoveryToken.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/Priority.java b/backend/src/main/java/ch/goodone/backend/model/Priority.java
similarity index 56%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/Priority.java
rename to backend/src/main/java/ch/goodone/backend/model/Priority.java
index e21886786..720ff882a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/Priority.java
+++ b/backend/src/main/java/ch/goodone/backend/model/Priority.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
public enum Priority {
LOW, MEDIUM, HIGH, CRITICAL
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/Role.java b/backend/src/main/java/ch/goodone/backend/model/Role.java
similarity index 62%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/Role.java
rename to backend/src/main/java/ch/goodone/backend/model/Role.java
index f4b437aa3..1cc2a06d0 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/Role.java
+++ b/backend/src/main/java/ch/goodone/backend/model/Role.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
public enum Role {
ROLE_USER,
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/SystemSetting.java b/backend/src/main/java/ch/goodone/backend/model/SystemSetting.java
similarity index 94%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/SystemSetting.java
rename to backend/src/main/java/ch/goodone/backend/model/SystemSetting.java
index f58806731..5d69ed1c4 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/SystemSetting.java
+++ b/backend/src/main/java/ch/goodone/backend/model/SystemSetting.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/Task.java b/backend/src/main/java/ch/goodone/backend/model/Task.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/Task.java
rename to backend/src/main/java/ch/goodone/backend/model/Task.java
index d73cf999c..cd1216ee7 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/Task.java
+++ b/backend/src/main/java/ch/goodone/backend/model/Task.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/TaskStatus.java b/backend/src/main/java/ch/goodone/backend/model/TaskStatus.java
similarity index 63%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/TaskStatus.java
rename to backend/src/main/java/ch/goodone/backend/model/TaskStatus.java
index 21c8febb0..b12d16351 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/TaskStatus.java
+++ b/backend/src/main/java/ch/goodone/backend/model/TaskStatus.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
public enum TaskStatus {
OPEN,
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/User.java b/backend/src/main/java/ch/goodone/backend/model/User.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/User.java
rename to backend/src/main/java/ch/goodone/backend/model/User.java
index aca873e99..f199c1c99 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/User.java
+++ b/backend/src/main/java/ch/goodone/backend/model/User.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/UserAiUsage.java b/backend/src/main/java/ch/goodone/backend/model/UserAiUsage.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/UserAiUsage.java
rename to backend/src/main/java/ch/goodone/backend/model/UserAiUsage.java
index 5a726d72d..3a0dc10d8 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/UserAiUsage.java
+++ b/backend/src/main/java/ch/goodone/backend/model/UserAiUsage.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/UserConstants.java b/backend/src/main/java/ch/goodone/backend/model/UserConstants.java
similarity index 94%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/UserConstants.java
rename to backend/src/main/java/ch/goodone/backend/model/UserConstants.java
index bfd06c6a5..3fc21a23e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/UserConstants.java
+++ b/backend/src/main/java/ch/goodone/backend/model/UserConstants.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
/**
* Centralized constants for baseline system users.
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/UserStatus.java b/backend/src/main/java/ch/goodone/backend/model/UserStatus.java
similarity index 60%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/UserStatus.java
rename to backend/src/main/java/ch/goodone/backend/model/UserStatus.java
index 0a02795cc..f7ca8be62 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/UserStatus.java
+++ b/backend/src/main/java/ch/goodone/backend/model/UserStatus.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
public enum UserStatus {
PENDING,
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/VerificationToken.java b/backend/src/main/java/ch/goodone/backend/model/VerificationToken.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/VerificationToken.java
rename to backend/src/main/java/ch/goodone/backend/model/VerificationToken.java
index 8b0df32a8..8b721907f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/VerificationToken.java
+++ b/backend/src/main/java/ch/goodone/backend/model/VerificationToken.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/model/converter/VectorConverter.java b/backend/src/main/java/ch/goodone/backend/model/converter/VectorConverter.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/model/converter/VectorConverter.java
rename to backend/src/main/java/ch/goodone/backend/model/converter/VectorConverter.java
index a8c88247e..5be124442 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/model/converter/VectorConverter.java
+++ b/backend/src/main/java/ch/goodone/backend/model/converter/VectorConverter.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model.converter;
+package ch.goodone.backend.model.converter;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/ActionLogRepository.java b/backend/src/main/java/ch/goodone/backend/repository/ActionLogRepository.java
similarity index 90%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/ActionLogRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/ActionLogRepository.java
index cf86cf451..636003ce7 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/ActionLogRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/ActionLogRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.ActionLog;
+import ch.goodone.backend.model.ActionLog;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiCreditRequestRepository.java b/backend/src/main/java/ch/goodone/backend/repository/AiCreditRequestRepository.java
similarity index 78%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/AiCreditRequestRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/AiCreditRequestRepository.java
index 329bfdc40..0627973ef 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiCreditRequestRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/AiCreditRequestRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.AiCreditRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiFeatureUsageRepository.java b/backend/src/main/java/ch/goodone/backend/repository/AiFeatureUsageRepository.java
similarity index 82%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/AiFeatureUsageRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/AiFeatureUsageRepository.java
index 78e783371..1634dac2a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiFeatureUsageRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/AiFeatureUsageRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.AiFeatureUsage;
+import ch.goodone.backend.model.AiFeatureUsage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiSuffixRuleRepository.java b/backend/src/main/java/ch/goodone/backend/repository/AiSuffixRuleRepository.java
similarity index 73%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/AiSuffixRuleRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/AiSuffixRuleRepository.java
index 4c7988663..77fb78e29 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiSuffixRuleRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/AiSuffixRuleRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.AiSuffixRule;
+import ch.goodone.backend.model.AiSuffixRule;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiUsageCostRepository.java b/backend/src/main/java/ch/goodone/backend/repository/AiUsageCostRepository.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/AiUsageCostRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/AiUsageCostRepository.java
index 352bd55dd..ac09f90c7 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/AiUsageCostRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/AiUsageCostRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.AiUsageCost;
+import ch.goodone.backend.model.AiUsageCost;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/ContactMessageRepository.java b/backend/src/main/java/ch/goodone/backend/repository/ContactMessageRepository.java
similarity index 66%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/ContactMessageRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/ContactMessageRepository.java
index 67788ef09..a41c796cb 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/ContactMessageRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/ContactMessageRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.ContactMessage;
+import ch.goodone.backend.model.ContactMessage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/DocChunkRepository.java b/backend/src/main/java/ch/goodone/backend/repository/DocChunkRepository.java
similarity index 85%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/DocChunkRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/DocChunkRepository.java
index c6dfe1432..b4c86ee25 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/DocChunkRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/DocChunkRepository.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/DocEmbeddingRepository.java b/backend/src/main/java/ch/goodone/backend/repository/DocEmbeddingRepository.java
similarity index 81%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/DocEmbeddingRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/DocEmbeddingRepository.java
index 74eb9ba11..8ac8babee 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/DocEmbeddingRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/DocEmbeddingRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.DocEmbedding;
+import ch.goodone.backend.model.DocEmbedding;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/DocSourceRepository.java b/backend/src/main/java/ch/goodone/backend/repository/DocSourceRepository.java
similarity index 77%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/DocSourceRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/DocSourceRepository.java
index 4170ea6e6..967fe20dc 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/DocSourceRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/DocSourceRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.DocSource;
+import ch.goodone.backend.model.DocSource;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/PasswordRecoveryTokenRepository.java b/backend/src/main/java/ch/goodone/backend/repository/PasswordRecoveryTokenRepository.java
similarity index 73%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/PasswordRecoveryTokenRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/PasswordRecoveryTokenRepository.java
index 804a92af0..b1dcf5295 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/PasswordRecoveryTokenRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/PasswordRecoveryTokenRepository.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.PasswordRecoveryToken;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.PasswordRecoveryToken;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/SystemSettingRepository.java b/backend/src/main/java/ch/goodone/backend/repository/SystemSettingRepository.java
similarity index 67%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/SystemSettingRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/SystemSettingRepository.java
index c5427f3ae..e5bbb13ce 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/SystemSettingRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/SystemSettingRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.SystemSetting;
+import ch.goodone.backend.model.SystemSetting;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/TaskRepository.java b/backend/src/main/java/ch/goodone/backend/repository/TaskRepository.java
similarity index 73%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/TaskRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/TaskRepository.java
index 70fa43917..8b7499d50 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/TaskRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/TaskRepository.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Task;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.TaskStatus;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Task;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.TaskStatus;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/UserAiUsageRepository.java b/backend/src/main/java/ch/goodone/backend/repository/UserAiUsageRepository.java
similarity index 76%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/UserAiUsageRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/UserAiUsageRepository.java
index de3340758..03d2685cc 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/UserAiUsageRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/UserAiUsageRepository.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserAiUsage;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserAiUsage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/UserRepository.java b/backend/src/main/java/ch/goodone/backend/repository/UserRepository.java
similarity index 87%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/UserRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/UserRepository.java
index c53a4009f..5841ff7ea 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/UserRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/UserRepository.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.User;
+import ch.goodone.backend.model.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/repository/VerificationTokenRepository.java b/backend/src/main/java/ch/goodone/backend/repository/VerificationTokenRepository.java
similarity index 73%
rename from backend/src/main/java/ch/goodone/angularai/backend/repository/VerificationTokenRepository.java
rename to backend/src/main/java/ch/goodone/backend/repository/VerificationTokenRepository.java
index f0927162e..f291d99c5 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/repository/VerificationTokenRepository.java
+++ b/backend/src/main/java/ch/goodone/backend/repository/VerificationTokenRepository.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.VerificationToken;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.VerificationToken;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/security/CustomUserDetails.java b/backend/src/main/java/ch/goodone/backend/security/CustomUserDetails.java
similarity index 93%
rename from backend/src/main/java/ch/goodone/angularai/backend/security/CustomUserDetails.java
rename to backend/src/main/java/ch/goodone/backend/security/CustomUserDetails.java
index 09c97a645..d391845ce 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/security/CustomUserDetails.java
+++ b/backend/src/main/java/ch/goodone/backend/security/CustomUserDetails.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.security;
+package ch.goodone.backend.security;
-import ch.goodone.angularai.backend.model.UserStatus;
+import ch.goodone.backend.model.UserStatus;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/ActionLogService.java b/backend/src/main/java/ch/goodone/backend/service/ActionLogService.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/ActionLogService.java
rename to backend/src/main/java/ch/goodone/backend/service/ActionLogService.java
index bd1bdc94a..f64f527a1 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/ActionLogService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/ActionLogService.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
-import ch.goodone.angularai.backend.dto.ActionLogDTO;
-import ch.goodone.angularai.backend.model.ActionLog;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.ActionLogRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
+import ch.goodone.backend.dto.ActionLogDTO;
+import ch.goodone.backend.model.ActionLog;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.ActionLogRepository;
+import ch.goodone.backend.repository.UserRepository;
import jakarta.persistence.criteria.Predicate;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/AuthenticationEventListener.java b/backend/src/main/java/ch/goodone/backend/service/AuthenticationEventListener.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/AuthenticationEventListener.java
rename to backend/src/main/java/ch/goodone/backend/service/AuthenticationEventListener.java
index 12ef2d20e..455501f75 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/AuthenticationEventListener.java
+++ b/backend/src/main/java/ch/goodone/backend/service/AuthenticationEventListener.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/CaptchaService.java b/backend/src/main/java/ch/goodone/backend/service/CaptchaService.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/CaptchaService.java
rename to backend/src/main/java/ch/goodone/backend/service/CaptchaService.java
index 0d5b18ea9..5fa207453 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/CaptchaService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/CaptchaService.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
-import ch.goodone.angularai.backend.util.SecurityConstants;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
+import ch.goodone.backend.util.SecurityConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/DashboardService.java b/backend/src/main/java/ch/goodone/backend/service/DashboardService.java
similarity index 87%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/DashboardService.java
rename to backend/src/main/java/ch/goodone/backend/service/DashboardService.java
index 2158a4a06..b60297ab9 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/DashboardService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/DashboardService.java
@@ -1,15 +1,15 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.dto.ActionLogDTO;
-import ch.goodone.angularai.backend.dto.DashboardDTO;
-import ch.goodone.angularai.backend.dto.TaskDTO;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.TaskStatus;
-import ch.goodone.angularai.backend.repository.ActionLogRepository;
-import ch.goodone.angularai.backend.repository.TaskRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.ActionLogDTO;
+import ch.goodone.backend.dto.DashboardDTO;
+import ch.goodone.backend.dto.TaskDTO;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.TaskStatus;
+import ch.goodone.backend.repository.ActionLogRepository;
+import ch.goodone.backend.repository.TaskRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.ai.usage.AiUsageService;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/DataInitializerService.java b/backend/src/main/java/ch/goodone/backend/service/DataInitializerService.java
similarity index 86%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/DataInitializerService.java
rename to backend/src/main/java/ch/goodone/backend/service/DataInitializerService.java
index b2d1fe6fe..606c90210 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/DataInitializerService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/DataInitializerService.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.service;
-
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Task;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserConstants;
-import ch.goodone.angularai.backend.repository.TaskRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
+package ch.goodone.backend.service;
+
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Task;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserConstants;
+import ch.goodone.backend.repository.TaskRepository;
+import ch.goodone.backend.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -146,13 +146,13 @@ private void ensureBaselineUsers() {
(userEmail != null && !userEmail.isBlank()) ? userEmail : "(blank)",
isDefaultSecret ? "default" : "overridden");
}
- ensureUserExists(UserConstants.LOGIN_ADMIN, adminEmail, adminSecret, "Admin", "User", ch.goodone.angularai.backend.model.Role.ROLE_ADMIN);
- ensureUserExists(UserConstants.LOGIN_USER, userEmail, userSecret, "Normal", "User", ch.goodone.angularai.backend.model.Role.ROLE_USER);
- ensureUserExists(UserConstants.LOGIN_ADMIN_READ, adminReadEmail, adminReadSecret, "Read-Only", "Admin", ch.goodone.angularai.backend.model.Role.ROLE_ADMIN_READ);
- ensureUserExists(UserConstants.LOGIN_USER2, UserConstants.LOGIN_USER2 + UserConstants.EMAIL_DOMAIN, user2Secret, "Test", "User 2", ch.goodone.angularai.backend.model.Role.ROLE_USER);
+ ensureUserExists(UserConstants.LOGIN_ADMIN, adminEmail, adminSecret, "Admin", "User", ch.goodone.backend.model.Role.ROLE_ADMIN);
+ ensureUserExists(UserConstants.LOGIN_USER, userEmail, userSecret, "Normal", "User", ch.goodone.backend.model.Role.ROLE_USER);
+ ensureUserExists(UserConstants.LOGIN_ADMIN_READ, adminReadEmail, adminReadSecret, "Read-Only", "Admin", ch.goodone.backend.model.Role.ROLE_ADMIN_READ);
+ ensureUserExists(UserConstants.LOGIN_USER2, UserConstants.LOGIN_USER2 + UserConstants.EMAIL_DOMAIN, user2Secret, "Test", "User 2", ch.goodone.backend.model.Role.ROLE_USER);
if (includePendingUser) {
- ensurePendingUserExists(UserConstants.LOGIN_PENDING, pendingEmail, pendingSecret, "Pending", "User", ch.goodone.angularai.backend.model.Role.ROLE_USER);
+ ensurePendingUserExists(UserConstants.LOGIN_PENDING, pendingEmail, pendingSecret, "Pending", "User", ch.goodone.backend.model.Role.ROLE_USER);
}
}
@@ -179,7 +179,7 @@ private void seedDataInternal() {
}
}
- private void ensureUserExists(String login, String email, String password, String firstName, String lastName, ch.goodone.angularai.backend.model.Role role) {
+ private void ensureUserExists(String login, String email, String password, String firstName, String lastName, ch.goodone.backend.model.Role role) {
logger.debug("[DEBUG_LOG] Ensuring user exists: {}", login);
userRepository.findByLogin(login).ifPresentOrElse(
user -> updateExistingBaselineUser(user, login, password),
@@ -187,12 +187,12 @@ private void ensureUserExists(String login, String email, String password, Strin
);
}
- private void ensurePendingUserExists(String login, String email, String password, String firstName, String lastName, ch.goodone.angularai.backend.model.Role role) {
+ private void ensurePendingUserExists(String login, String email, String password, String firstName, String lastName, ch.goodone.backend.model.Role role) {
userRepository.findByLogin(login).ifPresentOrElse(
user -> {
- if (user.getStatus() != ch.goodone.angularai.backend.model.UserStatus.PENDING) {
+ if (user.getStatus() != ch.goodone.backend.model.UserStatus.PENDING) {
logger.info("User {} exists but is not PENDING. Setting to PENDING for test data consistency.", login);
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.PENDING);
+ user.setStatus(ch.goodone.backend.model.UserStatus.PENDING);
userRepository.save(user);
}
},
@@ -203,7 +203,7 @@ private void ensurePendingUserExists(String login, String email, String password
user.setLastName(lastName);
user.setPassword(passwordEncoder.encode(password));
user.setRole(role);
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.PENDING);
+ user.setStatus(ch.goodone.backend.model.UserStatus.PENDING);
userRepository.save(user);
}
);
@@ -224,9 +224,9 @@ private void updateExistingBaselineUser(User user, String login, String password
}
private boolean updateStatusToActive(User user, String login) {
- if (user.getStatus() != ch.goodone.angularai.backend.model.UserStatus.ACTIVE) {
+ if (user.getStatus() != ch.goodone.backend.model.UserStatus.ACTIVE) {
logger.info("User {} exists but is not ACTIVE. Setting to ACTIVE.", login);
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.ACTIVE);
+ user.setStatus(ch.goodone.backend.model.UserStatus.ACTIVE);
return true;
}
return false;
@@ -255,7 +255,7 @@ private boolean isPasswordCorrect(User user, String password) {
return password != null && !password.isBlank() && passwordEncoder.matches(password, user.getPassword());
}
- private void createBaselineUser(String login, String email, String password, String firstName, String lastName, ch.goodone.angularai.backend.model.Role role) {
+ private void createBaselineUser(String login, String email, String password, String firstName, String lastName, ch.goodone.backend.model.Role role) {
logger.info("[DEBUG_LOG] User {} does not exist. Creating default user.", login);
String mail = (email != null && !email.isBlank()) ? email : login + UserConstants.EMAIL_DOMAIN;
@@ -268,7 +268,7 @@ private void createBaselineUser(String login, String email, String password, Str
user.setLastName(lastName);
user.setPassword(passwordEncoder.encode(password));
user.setRole(role);
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.ACTIVE);
+ user.setStatus(ch.goodone.backend.model.UserStatus.ACTIVE);
userRepository.save(user);
logger.info("[DEBUG_LOG] Baseline user {} created and saved (Status: ACTIVE)", login);
}
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/DemoResetService.java b/backend/src/main/java/ch/goodone/backend/service/DemoResetService.java
similarity index 86%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/DemoResetService.java
rename to backend/src/main/java/ch/goodone/backend/service/DemoResetService.java
index 55f54566e..ea7dd3c9f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/DemoResetService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/DemoResetService.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.SystemSetting;
-import ch.goodone.angularai.backend.repository.ActionLogRepository;
-import ch.goodone.angularai.backend.repository.PasswordRecoveryTokenRepository;
-import ch.goodone.angularai.backend.repository.SystemSettingRepository;
-import ch.goodone.angularai.backend.repository.TaskRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.model.SystemSetting;
+import ch.goodone.backend.repository.ActionLogRepository;
+import ch.goodone.backend.repository.PasswordRecoveryTokenRepository;
+import ch.goodone.backend.repository.SystemSettingRepository;
+import ch.goodone.backend.repository.TaskRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.slf4j.Logger;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/EmailService.java b/backend/src/main/java/ch/goodone/backend/service/EmailService.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/EmailService.java
rename to backend/src/main/java/ch/goodone/backend/service/EmailService.java
index aeed2e306..a77686689 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/EmailService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/EmailService.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.exception.EmailException;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import static ch.goodone.angularai.backend.util.SecurityConstants.sanitizeLog;
+import ch.goodone.backend.exception.EmailException;
+import ch.goodone.backend.model.AiCreditRequest;
+import static ch.goodone.backend.util.SecurityConstants.sanitizeLog;
import jakarta.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/IpLocationService.java b/backend/src/main/java/ch/goodone/backend/service/IpLocationService.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/IpLocationService.java
rename to backend/src/main/java/ch/goodone/backend/service/IpLocationService.java
index b2260c601..9037145cc 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/IpLocationService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/IpLocationService.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/JwtService.java b/backend/src/main/java/ch/goodone/backend/service/JwtService.java
similarity index 98%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/JwtService.java
rename to backend/src/main/java/ch/goodone/backend/service/JwtService.java
index d2d82b2eb..4017a293a 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/JwtService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/JwtService.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/StartupLogger.java b/backend/src/main/java/ch/goodone/backend/service/StartupLogger.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/StartupLogger.java
rename to backend/src/main/java/ch/goodone/backend/service/StartupLogger.java
index 969aa96ec..ec202df4f 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/StartupLogger.java
+++ b/backend/src/main/java/ch/goodone/backend/service/StartupLogger.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/SystemSettingService.java b/backend/src/main/java/ch/goodone/backend/service/SystemSettingService.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/SystemSettingService.java
rename to backend/src/main/java/ch/goodone/backend/service/SystemSettingService.java
index a33863152..ceae991a5 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/SystemSettingService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/SystemSettingService.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.SystemSetting;
-import ch.goodone.angularai.backend.repository.SystemSettingRepository;
+import ch.goodone.backend.model.SystemSetting;
+import ch.goodone.backend.repository.SystemSettingRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/TaskParserService.java b/backend/src/main/java/ch/goodone/backend/service/TaskParserService.java
similarity index 99%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/TaskParserService.java
rename to backend/src/main/java/ch/goodone/backend/service/TaskParserService.java
index a52eb7afc..aba5e8cc8 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/TaskParserService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/TaskParserService.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.TaskStatus;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.TaskStatus;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/TaskService.java b/backend/src/main/java/ch/goodone/backend/service/TaskService.java
similarity index 96%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/TaskService.java
rename to backend/src/main/java/ch/goodone/backend/service/TaskService.java
index 7ac636a82..446f729ef 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/TaskService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/TaskService.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.dto.TaskDTO;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Task;
-import ch.goodone.angularai.backend.model.TaskStatus;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.TaskRepository;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.TaskDTO;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Task;
+import ch.goodone.backend.model.TaskStatus;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.TaskRepository;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/UserAliasService.java b/backend/src/main/java/ch/goodone/backend/service/UserAliasService.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/UserAliasService.java
rename to backend/src/main/java/ch/goodone/backend/service/UserAliasService.java
index 0f824e7a6..9d722959e 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/UserAliasService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/UserAliasService.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.User;
+import ch.goodone.backend.model.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/service/ValidationService.java b/backend/src/main/java/ch/goodone/backend/service/ValidationService.java
similarity index 95%
rename from backend/src/main/java/ch/goodone/angularai/backend/service/ValidationService.java
rename to backend/src/main/java/ch/goodone/backend/service/ValidationService.java
index c3f609c95..82d6a58c0 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/service/ValidationService.java
+++ b/backend/src/main/java/ch/goodone/backend/service/ValidationService.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.repository.UserRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/ch/goodone/angularai/backend/util/SecurityConstants.java b/backend/src/main/java/ch/goodone/backend/util/SecurityConstants.java
similarity index 97%
rename from backend/src/main/java/ch/goodone/angularai/backend/util/SecurityConstants.java
rename to backend/src/main/java/ch/goodone/backend/util/SecurityConstants.java
index 4c23ea14c..acddb2ee2 100644
--- a/backend/src/main/java/ch/goodone/angularai/backend/util/SecurityConstants.java
+++ b/backend/src/main/java/ch/goodone/backend/util/SecurityConstants.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.util;
+package ch.goodone.backend.util;
public final class SecurityConstants {
diff --git a/backend/src/main/resources/META-INF/spring.factories b/backend/src/main/resources/META-INF/spring.factories
index 4b12217d1..b6a2f2c72 100644
--- a/backend/src/main/resources/META-INF/spring.factories
+++ b/backend/src/main/resources/META-INF/spring.factories
@@ -1 +1 @@
-org.springframework.context.ApplicationContextInitializer=ch.goodone.angularai.backend.config.DotEnvApplicationInitializer
+org.springframework.context.ApplicationContextInitializer=ch.goodone.backend.config.DotEnvApplicationInitializer
diff --git a/backend/src/main/resources/application-prod.properties b/backend/src/main/resources/application-prod.properties
index 109c86471..b3e1355eb 100644
--- a/backend/src/main/resources/application-prod.properties
+++ b/backend/src/main/resources/application-prod.properties
@@ -29,7 +29,7 @@ spring.mail.properties.mail.smtp.writetimeout=5000
# AWS Secrets Manager is handled by the cloud environment in Fargate.
# These properties are kept for compatibility with Spring Cloud AWS if the dependency is present.
spring.cloud.aws.secrets-manager.enabled=true
-spring.cloud.aws.secrets-manager.name=angularai-secrets
+spring.cloud.aws.secrets-manager.name=goodone-secrets
# NO default credentials here. They must be provided via environment variables or Secrets Manager.
admin.secret=${ADMIN_PASSWORD}
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index 8d0891e68..643862e5f 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.application.name=aibackend
+spring.application.name=goodone-backend
# Profile activation (default is dev)
spring.profiles.active=${SPRING_PROFILES_ACTIVE:dev}
@@ -15,8 +15,8 @@ spring.flyway.locations=classpath:db/migration/common,classpath:db/vendor/{vendo
spring.flyway.clean-disabled=false
server.forward-headers-strategy=native
# spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
-application.version=1.1.0
-frontend.version=1.1.0
+application.version=1.1.1-SNAPSHOT
+frontend.version=1.1.1-SNAPSHOT
git.sha=${GIT_SHA:unknown}
backend.build.time=${BUILD_TIME:unknown}
frontend.build.time=${BUILD_TIME:unknown}
@@ -110,9 +110,9 @@ jwt.expiration=${JWT_EXPIRATION:86400000}
logging.level.root=INFO
logging.level.org.springframework.web=INFO
logging.level.org.apache.coyote=INFO
-logging.level.ch.goodone.angularai=INFO
-logging.level.ch.goodone.angularai.backend.docs.retrieval=DEBUG
-logging.level.ch.goodone.angularai.backend.ai=DEBUG
+logging.level.ch.goodone=INFO
+logging.level.ch.goodone.backend.docs.retrieval=DEBUG
+logging.level.ch.goodone.backend.ai=DEBUG
# AWS common configuration
cloud.aws.credentials.instance-profile=true
@@ -132,11 +132,11 @@ app.rate-limiting.ai.refill-duration-minutes=${RATE_LIMITING_AI_REFILL_DURATION:
# Actuator Configuration
spring.jpa.open-in-view=false
-management.endpoints.web.exposure.include=health,info,metrics,prometheus,cloudwatch
+management.endpoints.web.exposure.include=health,info,metrics,prometheus
management.endpoint.health.show-details=always
management.endpoint.health.probes.enabled=true
management.endpoint.prometheus.enabled=true
-management.endpoint.cloudwatch.enabled=true
+management.endpoint.cloudwatch.enabled=false
management.endpoints.enabled-by-default=true
management.endpoints.web.base-path=/actuator
management.info.env.enabled=true
@@ -146,11 +146,11 @@ management.info.os.enabled=true
management.metrics.tags.application=${spring.application.name}
management.prometheus.metrics.export.enabled=true
-# CloudWatch Metrics Export
-management.cloudwatch.metrics.export.enabled=${CLOUDWATCH_METRICS_ENABLED:false}
-management.cloudwatch.metrics.export.namespace=${CLOUDWATCH_NAMESPACE:AngularAI}
-management.cloudwatch.metrics.export.step=1m
-management.cloudwatch.metrics.export.region=eu-central-1
+# CloudWatch Metrics Export (DISABLED for cost reduction)
+management.cloudwatch.metrics.export.enabled=false
+# management.cloudwatch.metrics.export.namespace=${CLOUDWATCH_NAMESPACE:GoodOne}
+# management.cloudwatch.metrics.export.step=1m
+# management.cloudwatch.metrics.export.region=eu-central-1
# Documentation Ingestion Configuration
app.docs.root-path=${DOCS_ROOT_PATH:doc}
@@ -263,5 +263,6 @@ spring.jpa.properties.hibernate.envers.revision_type_column_type=integer
+
diff --git a/backend/src/main/resources/db/migration/common/V11__seed_demo_data.sql b/backend/src/main/resources/db/migration/common/V11__seed_demo_data.sql
index b5667d5b4..e825c077e 100644
--- a/backend/src/main/resources/db/migration/common/V11__seed_demo_data.sql
+++ b/backend/src/main/resources/db/migration/common/V11__seed_demo_data.sql
@@ -15,9 +15,9 @@ WHERE NOT EXISTS (SELECT 1 FROM users WHERE login = 'demo');
-- 3. Baseline Tasks for Demo User
INSERT INTO tasks (title, description, due_date, priority, status, position, user_id, created_at)
-SELECT 'Welcome to AngularAI', 'Explore the dashboard and manage your tasks efficiently.', CURRENT_DATE + 1, 'MEDIUM', 'OPEN', 0, u.id, CURRENT_TIMESTAMP
+SELECT 'Welcome to GoodOne', 'Explore the dashboard and manage your tasks efficiently.', CURRENT_DATE + 1, 'MEDIUM', 'OPEN', 0, u.id, CURRENT_TIMESTAMP
FROM users u WHERE u.login = 'demo'
-AND NOT EXISTS (SELECT 1 FROM tasks t JOIN users u2 ON t.user_id = u2.id WHERE u2.login = 'demo' AND t.title = 'Welcome to AngularAI');
+AND NOT EXISTS (SELECT 1 FROM tasks t JOIN users u2 ON t.user_id = u2.id WHERE u2.login = 'demo' AND t.title = 'Welcome to GoodOne');
INSERT INTO tasks (title, description, due_date, priority, status, position, user_id, created_at)
SELECT 'Review Security Guidelines', 'Check the AI usage and security guidelines in the repository.', CURRENT_DATE + 3, 'HIGH', 'OPEN', 1, u.id, CURRENT_TIMESTAMP
diff --git a/backend/src/main/resources/logback-spring.xml b/backend/src/main/resources/logback-spring.xml
index b7537d4a8..3ec569fc5 100644
--- a/backend/src/main/resources/logback-spring.xml
+++ b/backend/src/main/resources/logback-spring.xml
@@ -52,5 +52,5 @@
-
+
diff --git a/backend/src/main/resources/prompts/architecture/v1/explain.st b/backend/src/main/resources/prompts/architecture/v1/explain.st
index 9d5fd32e4..82ca31d52 100644
--- a/backend/src/main/resources/prompts/architecture/v1/explain.st
+++ b/backend/src/main/resources/prompts/architecture/v1/explain.st
@@ -1,4 +1,4 @@
-You are an expert architecture assistant for the AngularAI project.
+You are an expert architecture assistant for the GoodOne project.
Explain the architecture based on the provided documentation context and answer the user query.
Context:
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/DataInitializerTest.java b/backend/src/test/java/ch/goodone/backend/DataInitializerTest.java
similarity index 84%
rename from backend/src/test/java/ch/goodone/angularai/backend/DataInitializerTest.java
rename to backend/src/test/java/ch/goodone/backend/DataInitializerTest.java
index 6eb9ac2de..3ac4ef542 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/DataInitializerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/DataInitializerTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend;
+package ch.goodone.backend;
-import ch.goodone.angularai.backend.service.DataInitializerService;
+import ch.goodone.backend.service.DataInitializerService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.CommandLineRunner;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/AibackendApplicationTest.java b/backend/src/test/java/ch/goodone/backend/GoodoneBackendApplicationTest.java
similarity index 84%
rename from backend/src/test/java/ch/goodone/angularai/backend/AibackendApplicationTest.java
rename to backend/src/test/java/ch/goodone/backend/GoodoneBackendApplicationTest.java
index 2f1d3f8c0..c577fc00a 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/AibackendApplicationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/GoodoneBackendApplicationTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend;
+package ch.goodone.backend;
import org.junit.jupiter.api.Test;
@@ -7,16 +7,16 @@
@org.springframework.boot.test.context.SpringBootTest
@org.springframework.test.context.TestPropertySource(locations = "classpath:application-test.properties")
@org.springframework.test.context.ActiveProfiles("test")
-class AibackendApplicationTest {
+class GoodoneBackendApplicationTest {
@org.springframework.test.context.bean.override.mockito.MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
@org.springframework.test.context.bean.override.mockito.MockitoBean
- private ch.goodone.angularai.backend.service.ActionLogService actionLogService;
+ private ch.goodone.backend.service.ActionLogService actionLogService;
@org.springframework.test.context.bean.override.mockito.MockitoBean
- private ch.goodone.angularai.backend.service.DataInitializerService dataInitializerService;
+ private ch.goodone.backend.service.DataInitializerService dataInitializerService;
@Test
void contextLoads() {
@@ -31,7 +31,7 @@ void main() {
"--server.port=0",
"--spring.main.banner-mode=off",
"--spring.profiles.active=test",
- "--spring.datasource.url=jdbc:h2:mem:AibackendApplicationTest;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS APP",
+ "--spring.datasource.url=jdbc:h2:mem:GoodoneBackendApplicationTest;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS APP",
"--spring.flyway.enabled=false",
"--spring.jpa.properties.hibernate.envers.revision_type_column_type=integer",
"--spring.jpa.properties.org.hibernate.envers.revision_type_column_type=integer",
@@ -55,13 +55,13 @@ void main() {
"--spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration"
};
- try (org.springframework.context.ConfigurableApplicationContext context = AibackendApplication.run(args)) {
+ try (org.springframework.context.ConfigurableApplicationContext context = GoodoneBackendApplication.run(args)) {
// Context started and will be auto-closed
} catch (Exception e) {
// Ignore errors during startup in this test as we just want coverage
}
// Assert that the application class can be instantiated (trivial but satisfies Sonar)
- assertDoesNotThrow(AibackendApplication::new);
+ assertDoesNotThrow(GoodoneBackendApplication::new);
}
}
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/H2TypeCheckTest.java b/backend/src/test/java/ch/goodone/backend/H2TypeCheckTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/H2TypeCheckTest.java
rename to backend/src/test/java/ch/goodone/backend/H2TypeCheckTest.java
index 96e946036..0d1ec1ae8 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/H2TypeCheckTest.java
+++ b/backend/src/test/java/ch/goodone/backend/H2TypeCheckTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend;
+package ch.goodone.backend;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/AiCostIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/ai/AiCostIntegrationTest.java
similarity index 89%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/AiCostIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/AiCostIntegrationTest.java
index b1ac9b60c..b77d86fb5 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/AiCostIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/AiCostIntegrationTest.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
-import ch.goodone.angularai.backend.ai.application.ArchitectureExplainUseCase;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainRequest;
-import ch.goodone.angularai.backend.ai.usage.AiUsageCostService;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.ai.application.ArchitectureExplainUseCase;
+import ch.goodone.backend.ai.dto.ArchitectureExplainRequest;
+import ch.goodone.backend.ai.usage.AiUsageCostService;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/AiPropertiesBindingTest.java b/backend/src/test/java/ch/goodone/backend/ai/AiPropertiesBindingTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/AiPropertiesBindingTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/AiPropertiesBindingTest.java
index 71da14887..3367c957c 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/AiPropertiesBindingTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/AiPropertiesBindingTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/AiProviderServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/AiProviderServiceTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/AiProviderServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/AiProviderServiceTest.java
index 238811819..7400625b3 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/AiProviderServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/AiProviderServiceTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.model.ChatModel;
@@ -8,8 +8,8 @@
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.mail.javamail.JavaMailSender;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/OpenAiManualConfigTest.java b/backend/src/test/java/ch/goodone/backend/ai/OpenAiManualConfigTest.java
similarity index 99%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/OpenAiManualConfigTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/OpenAiManualConfigTest.java
index ece48b696..330502f14 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/OpenAiManualConfigTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/OpenAiManualConfigTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.ai;
+package ch.goodone.backend.ai;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCaseTest.java b/backend/src/test/java/ch/goodone/backend/ai/application/AdrDriftUseCaseTest.java
similarity index 84%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCaseTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/application/AdrDriftUseCaseTest.java
index ef0b94f1e..36173492b 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/AdrDriftUseCaseTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/application/AdrDriftUseCaseTest.java
@@ -1,16 +1,16 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftRequest;
-import ch.goodone.angularai.backend.ai.dto.AdrDriftResponse;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocEmbedding;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.AdrDriftRequest;
+import ch.goodone.backend.ai.dto.AdrDriftResponse;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocEmbedding;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/AiApplicationServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/application/AiApplicationServiceTest.java
similarity index 87%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/application/AiApplicationServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/application/AiApplicationServiceTest.java
index c3472c0d4..f112b7663 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/AiApplicationServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/application/AiApplicationServiceTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainRequest;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainResult;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseRequest;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseResult;
+import ch.goodone.backend.ai.dto.ArchitectureExplainRequest;
+import ch.goodone.backend.ai.dto.ArchitectureExplainResult;
+import ch.goodone.backend.ai.dto.QuickAddParseRequest;
+import ch.goodone.backend.ai.dto.QuickAddParseResult;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/ArchitectureExplainUseCaseTest.java b/backend/src/test/java/ch/goodone/backend/ai/application/ArchitectureExplainUseCaseTest.java
similarity index 86%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/application/ArchitectureExplainUseCaseTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/application/ArchitectureExplainUseCaseTest.java
index f1edbd455..885a44ab3 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/ArchitectureExplainUseCaseTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/application/ArchitectureExplainUseCaseTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainRequest;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainResult;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.ai.prompt.StructuredOutputService;
-import ch.goodone.angularai.backend.docs.retrieval.DocRetrievalService;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.ArchitectureExplainRequest;
+import ch.goodone.backend.ai.dto.ArchitectureExplainResult;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.ai.prompt.StructuredOutputService;
+import ch.goodone.backend.docs.retrieval.DocRetrievalService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/QuickAddParseUseCaseTest.java b/backend/src/test/java/ch/goodone/backend/ai/application/QuickAddParseUseCaseTest.java
similarity index 87%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/application/QuickAddParseUseCaseTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/application/QuickAddParseUseCaseTest.java
index 038692755..60e195ee4 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/QuickAddParseUseCaseTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/application/QuickAddParseUseCaseTest.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseRequest;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseResult;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.ai.prompt.StructuredOutputService;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.TaskParserService;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.dto.QuickAddParseRequest;
+import ch.goodone.backend.ai.dto.QuickAddParseResult;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.ai.prompt.StructuredOutputService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.TaskParserService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -79,7 +79,7 @@ void setUp() throws NoSuchFieldException, IllegalAccessException {
void execute_shouldCallStructuredOutputServiceWithCorrectVariables() {
QuickAddParseRequest request = new QuickAddParseRequest("Please buy some milk next week because we are out of it");
QuickAddParseResult expectedAiResult = new QuickAddParseResult("Buy milk", "Buy milk", "Personal", 0.9, List.of("grocery"), List.of(), null, null, "MEDIUM", "OPEN", true);
- TaskParserService.ParsedTask deterministic = new TaskParserService.ParsedTask("Buy milk", "", java.time.LocalDate.now().plusWeeks(1), null, ch.goodone.angularai.backend.model.Priority.MEDIUM, ch.goodone.angularai.backend.model.TaskStatus.OPEN, List.of());
+ TaskParserService.ParsedTask deterministic = new TaskParserService.ParsedTask("Buy milk", "", java.time.LocalDate.now().plusWeeks(1), null, ch.goodone.backend.model.Priority.MEDIUM, ch.goodone.backend.model.TaskStatus.OPEN, List.of());
when(taskParserService.parse(any())).thenReturn(deterministic);
when(aiProviderService.getQuickAddChatModel()).thenReturn(chatModel);
@@ -127,8 +127,8 @@ void execute_shouldTrustConfidentAiForTitleAndDescription() {
"",
nextFriday,
java.time.LocalTime.of(14, 30),
- ch.goodone.angularai.backend.model.Priority.HIGH,
- ch.goodone.angularai.backend.model.TaskStatus.OPEN,
+ ch.goodone.backend.model.Priority.HIGH,
+ ch.goodone.backend.model.TaskStatus.OPEN,
List.of("backend")
);
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCaseImplTest.java b/backend/src/test/java/ch/goodone/backend/ai/application/RetrospectiveUseCaseImplTest.java
similarity index 84%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCaseImplTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/application/RetrospectiveUseCaseImplTest.java
index 819e7e538..82a5f9f9e 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/RetrospectiveUseCaseImplTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/application/RetrospectiveUseCaseImplTest.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveRequest;
-import ch.goodone.angularai.backend.ai.dto.RetrospectiveResponse;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.dto.RetrospectiveRequest;
+import ch.goodone.backend.ai.dto.RetrospectiveResponse;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCaseTest.java b/backend/src/test/java/ch/goodone/backend/ai/application/RiskRadarUseCaseTest.java
similarity index 92%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCaseTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/application/RiskRadarUseCaseTest.java
index 3b0e82bf4..a63f8226b 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/RiskRadarUseCaseTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/application/RiskRadarUseCaseTest.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.ai.application;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarRequest;
-import ch.goodone.angularai.backend.ai.dto.RiskRadarResponse;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+package ch.goodone.backend.ai.application;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.dto.RiskRadarRequest;
+import ch.goodone.backend.ai.dto.RiskRadarResponse;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/TasksetServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/application/TasksetServiceTest.java
similarity index 95%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/application/TasksetServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/application/TasksetServiceTest.java
index b2c473a54..d16ed1f74 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/application/TasksetServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/application/TasksetServiceTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.ai.application;
+package ch.goodone.backend.ai.application;
-import ch.goodone.angularai.backend.ai.dto.TasksetInfo;
+import ch.goodone.backend.ai.dto.TasksetInfo;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/observability/AiObservabilityServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/observability/AiObservabilityServiceTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/observability/AiObservabilityServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/observability/AiObservabilityServiceTest.java
index 072e3fec8..5b19bce82 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/observability/AiObservabilityServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/observability/AiObservabilityServiceTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.ai.observability;
+package ch.goodone.backend.ai.observability;
-import ch.goodone.angularai.backend.ai.usage.AiUsageCostService;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
+import ch.goodone.backend.ai.usage.AiUsageCostService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import org.junit.jupiter.api.BeforeEach;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/prompt/StructuredOutputServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/prompt/StructuredOutputServiceTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/prompt/StructuredOutputServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/prompt/StructuredOutputServiceTest.java
index 63d7c6946..797579ee6 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/prompt/StructuredOutputServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/prompt/StructuredOutputServiceTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.ai.prompt;
+package ch.goodone.backend.ai.prompt;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseResult;
-import ch.goodone.angularai.backend.ai.exception.AiParsingException;
-import ch.goodone.angularai.backend.ai.exception.AiProviderException;
-import ch.goodone.angularai.backend.ai.exception.AiRateLimitException;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.ai.dto.QuickAddParseResult;
+import ch.goodone.backend.ai.exception.AiParsingException;
+import ch.goodone.backend.ai.exception.AiProviderException;
+import ch.goodone.backend.ai.exception.AiRateLimitException;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -213,11 +213,11 @@ void shouldSuccessfullyParseArchitectureExplainResult() {
ChatResponse chatResponse = createMockChatResponse(json);
when(chatModel.call(any(Prompt.class))).thenReturn(chatResponse);
- ch.goodone.angularai.backend.ai.dto.ArchitectureExplainResult result = structuredOutputService.call(
+ ch.goodone.backend.ai.dto.ArchitectureExplainResult result = structuredOutputService.call(
chatModel,
testPromptResource,
Map.of("userInput", "Explain architecture", "context", "Some context"),
- ch.goodone.angularai.backend.ai.dto.ArchitectureExplainResult.class
+ ch.goodone.backend.ai.dto.ArchitectureExplainResult.class
);
assertThat(result).isNotNull();
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiCreditRequestServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/usage/AiCreditRequestServiceTest.java
similarity index 91%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiCreditRequestServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/usage/AiCreditRequestServiceTest.java
index 3f486fe02..cccd0ab97 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiCreditRequestServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/usage/AiCreditRequestServiceTest.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.ai.usage;
-
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.AiCreditRequestRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.EmailService;
+package ch.goodone.backend.ai.usage;
+
+import ch.goodone.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.AiCreditRequestRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.EmailService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiUsageCostServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/usage/AiUsageCostServiceTest.java
similarity index 94%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiUsageCostServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/usage/AiUsageCostServiceTest.java
index dbef171b4..3ad899b47 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiUsageCostServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/usage/AiUsageCostServiceTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.ai.usage;
+package ch.goodone.backend.ai.usage;
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.model.AiUsageCost;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.AiUsageCostRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.model.AiUsageCost;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.AiUsageCostRepository;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiUsageServiceTest.java b/backend/src/test/java/ch/goodone/backend/ai/usage/AiUsageServiceTest.java
similarity index 85%
rename from backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiUsageServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/ai/usage/AiUsageServiceTest.java
index 3c1af4eee..83f08485c 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/ai/usage/AiUsageServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/ai/usage/AiUsageServiceTest.java
@@ -1,14 +1,14 @@
-package ch.goodone.angularai.backend.ai.usage;
-
-import ch.goodone.angularai.backend.model.AiSuffixRule;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserAiUsage;
-import ch.goodone.angularai.backend.repository.AiFeatureUsageRepository;
-import ch.goodone.angularai.backend.repository.AiSuffixRuleRepository;
-import ch.goodone.angularai.backend.repository.UserAiUsageRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+package ch.goodone.backend.ai.usage;
+
+import ch.goodone.backend.model.AiSuffixRule;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserAiUsage;
+import ch.goodone.backend.repository.AiFeatureUsageRepository;
+import ch.goodone.backend.repository.AiSuffixRuleRepository;
+import ch.goodone.backend.repository.UserAiUsageRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/ActuatorMetricsVerificationTest.java b/backend/src/test/java/ch/goodone/backend/config/ActuatorMetricsVerificationTest.java
similarity index 88%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/ActuatorMetricsVerificationTest.java
rename to backend/src/test/java/ch/goodone/backend/config/ActuatorMetricsVerificationTest.java
index c4f4fd550..35a0446ca 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/ActuatorMetricsVerificationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/ActuatorMetricsVerificationTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.application.AiApplicationService;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.application.AiApplicationService;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/AiRateLimitingIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/config/AiRateLimitingIntegrationTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/AiRateLimitingIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/config/AiRateLimitingIntegrationTest.java
index 50cc6140b..b884fbd3e 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/AiRateLimitingIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/AiRateLimitingIntegrationTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.application.AiApplicationService;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.application.AiApplicationService;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -63,7 +63,7 @@ class AiRateLimitingIntegrationTest {
private AiObservabilityService aiObservabilityService;
@MockitoBean
- private ch.goodone.angularai.backend.service.CaptchaService captchaService;
+ private ch.goodone.backend.service.CaptchaService captchaService;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/ConfigValidatorTest.java b/backend/src/test/java/ch/goodone/backend/config/ConfigValidatorTest.java
similarity index 99%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/ConfigValidatorTest.java
rename to backend/src/test/java/ch/goodone/backend/config/ConfigValidatorTest.java
index 7e54e61af..cf1462408 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/ConfigValidatorTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/ConfigValidatorTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.junit.jupiter.api.Test;
import org.springframework.core.env.Environment;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/DocIndexingRateLimitTest.java b/backend/src/test/java/ch/goodone/backend/config/DocIndexingRateLimitTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/DocIndexingRateLimitTest.java
rename to backend/src/test/java/ch/goodone/backend/config/DocIndexingRateLimitTest.java
index 7b7aeebdc..612bd20bb 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/DocIndexingRateLimitTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/DocIndexingRateLimitTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/DocStartupTaskTest.java b/backend/src/test/java/ch/goodone/backend/config/DocStartupTaskTest.java
similarity index 89%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/DocStartupTaskTest.java
rename to backend/src/test/java/ch/goodone/backend/config/DocStartupTaskTest.java
index 3bffe0004..720bf8e44 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/DocStartupTaskTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/DocStartupTaskTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.docs.ingest.DocIngestionService;
+import ch.goodone.backend.docs.ingest.DocIngestionService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/DotEnvApplicationInitializerTest.java b/backend/src/test/java/ch/goodone/backend/config/DotEnvApplicationInitializerTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/DotEnvApplicationInitializerTest.java
rename to backend/src/test/java/ch/goodone/backend/config/DotEnvApplicationInitializerTest.java
index 9eba5c50c..ecc4f473c 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/DotEnvApplicationInitializerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/DotEnvApplicationInitializerTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/FlywayConfigTest.java b/backend/src/test/java/ch/goodone/backend/config/FlywayConfigTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/FlywayConfigTest.java
rename to backend/src/test/java/ch/goodone/backend/config/FlywayConfigTest.java
index b6c9f3a5e..a0c691823 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/FlywayConfigTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/FlywayConfigTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/H2ConsoleSecurityTest.java b/backend/src/test/java/ch/goodone/backend/config/H2ConsoleSecurityTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/H2ConsoleSecurityTest.java
rename to backend/src/test/java/ch/goodone/backend/config/H2ConsoleSecurityTest.java
index c6d116e3d..c7e214827 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/H2ConsoleSecurityTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/H2ConsoleSecurityTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/JwtAuthenticationFilterTest.java b/backend/src/test/java/ch/goodone/backend/config/JwtAuthenticationFilterTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/JwtAuthenticationFilterTest.java
rename to backend/src/test/java/ch/goodone/backend/config/JwtAuthenticationFilterTest.java
index 4e0f8c260..a0ffaa29a 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/JwtAuthenticationFilterTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/JwtAuthenticationFilterTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.service.JwtService;
+import ch.goodone.backend.service.JwtService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/MdcFilterTest.java b/backend/src/test/java/ch/goodone/backend/config/MdcFilterTest.java
similarity index 99%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/MdcFilterTest.java
rename to backend/src/test/java/ch/goodone/backend/config/MdcFilterTest.java
index 8e598e0ab..1984296f3 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/MdcFilterTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/MdcFilterTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/RateLimitingIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/config/RateLimitingIntegrationTest.java
similarity index 91%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/RateLimitingIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/config/RateLimitingIntegrationTest.java
index e0244947d..b599866bb 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/RateLimitingIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/RateLimitingIntegrationTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.TaskParserService;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.TaskParserService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -54,7 +54,7 @@ class RateLimitingIntegrationTest {
private TaskParserService taskParserService;
@MockitoBean
- private ch.goodone.angularai.backend.service.CaptchaService captchaService;
+ private ch.goodone.backend.service.CaptchaService captchaService;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
@@ -76,7 +76,7 @@ void setUp() {
when(userRepository.findByLogin("testuser")).thenReturn(Optional.of(testUser));
var parsed = new TaskParserService.ParsedTask(
- "Analyzed Task", "Desc", LocalDate.now(), null, Priority.HIGH, ch.goodone.angularai.backend.model.TaskStatus.OPEN, java.util.List.of()
+ "Analyzed Task", "Desc", LocalDate.now(), null, Priority.HIGH, ch.goodone.backend.model.TaskStatus.OPEN, java.util.List.of()
);
when(taskParserService.parse(any())).thenReturn(parsed);
}
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/RequestLoggingFilterTest.java b/backend/src/test/java/ch/goodone/backend/config/RequestLoggingFilterTest.java
similarity index 99%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/RequestLoggingFilterTest.java
rename to backend/src/test/java/ch/goodone/backend/config/RequestLoggingFilterTest.java
index 74724c841..6ee18ea86 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/RequestLoggingFilterTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/RequestLoggingFilterTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/SecurityConfigTest.java b/backend/src/test/java/ch/goodone/backend/config/SecurityConfigTest.java
similarity index 94%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/SecurityConfigTest.java
rename to backend/src/test/java/ch/goodone/backend/config/SecurityConfigTest.java
index 5f42c405d..4892cf20f 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/SecurityConfigTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/SecurityConfigTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
-import ch.goodone.angularai.backend.model.Role;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.model.Role;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.security.authentication.AuthenticationManager;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/WafSimulatedFilterTest.java b/backend/src/test/java/ch/goodone/backend/config/WafSimulatedFilterTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/WafSimulatedFilterTest.java
rename to backend/src/test/java/ch/goodone/backend/config/WafSimulatedFilterTest.java
index 9ed087e05..df263c9be 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/WafSimulatedFilterTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/WafSimulatedFilterTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/config/WebConfigurationIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/config/WebConfigurationIntegrationTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/config/WebConfigurationIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/config/WebConfigurationIntegrationTest.java
index eaf0991c8..dc08012e3 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/config/WebConfigurationIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/config/WebConfigurationIntegrationTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.config;
+package ch.goodone.backend.config;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/contract/OpenApiGeneratorTest.java b/backend/src/test/java/ch/goodone/backend/contract/OpenApiGeneratorTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/contract/OpenApiGeneratorTest.java
rename to backend/src/test/java/ch/goodone/backend/contract/OpenApiGeneratorTest.java
index 4071ded85..e360af9b2 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/contract/OpenApiGeneratorTest.java
+++ b/backend/src/test/java/ch/goodone/backend/contract/OpenApiGeneratorTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.contract;
+package ch.goodone.backend.contract;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AccountStatusTest.java b/backend/src/test/java/ch/goodone/backend/controller/AccountStatusTest.java
similarity index 79%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AccountStatusTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AccountStatusTest.java
index 7fa5f00c7..bdc8b4bb8 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AccountStatusTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AccountStatusTest.java
@@ -1,19 +1,19 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.EmailService;
-import ch.goodone.angularai.backend.service.JwtService;
-import ch.goodone.angularai.backend.service.UserAliasService;
-import ch.goodone.angularai.backend.service.ValidationService;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.repository.PasswordRecoveryTokenRepository;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.EmailService;
+import ch.goodone.backend.service.JwtService;
+import ch.goodone.backend.service.UserAliasService;
+import ch.goodone.backend.service.ValidationService;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.repository.PasswordRecoveryTokenRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/ActionLogControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/ActionLogControllerTest.java
similarity index 95%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/ActionLogControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/ActionLogControllerTest.java
index f9ae80f4a..b700045cf 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/ActionLogControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/ActionLogControllerTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.dto.ActionLogDTO;
-import ch.goodone.angularai.backend.service.ActionLogService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.dto.ActionLogDTO;
+import ch.goodone.backend.service.ActionLogService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminDemoControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/AdminDemoControllerTest.java
similarity index 92%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AdminDemoControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AdminDemoControllerTest.java
index 5d9f2e3ab..50e52ddde 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminDemoControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AdminDemoControllerTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.service.DemoResetService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.service.DemoResetService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminDocsControllerIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/controller/AdminDocsControllerIntegrationTest.java
similarity index 94%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AdminDocsControllerIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AdminDocsControllerIntegrationTest.java
index 7738e9e39..a5fd5e644 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminDocsControllerIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AdminDocsControllerIntegrationTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.dto.DocIndexingStatusDTO;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.dto.DocIndexingStatusDTO;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
@@ -51,7 +51,7 @@ class AdminDocsControllerIntegrationTest {
private DocChunkRepository chunkRepository;
@Autowired
- private ch.goodone.angularai.backend.docs.ingest.DocIndexingStatusService statusService;
+ private ch.goodone.backend.docs.ingest.DocIndexingStatusService statusService;
@BeforeEach
void setUp() {
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminSystemControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/AdminSystemControllerTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AdminSystemControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AdminSystemControllerTest.java
index 4165e1789..ed3ee77b7 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminSystemControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AdminSystemControllerTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.IpLocationService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.IpLocationService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminUserControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/AdminUserControllerTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AdminUserControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AdminUserControllerTest.java
index 23fcbba69..abc4554e6 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdminUserControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AdminUserControllerTest.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.controller;
-
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.ValidationService;
+package ch.goodone.backend.controller;
+
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.ValidationService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdrControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/AdrControllerTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AdrControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AdrControllerTest.java
index b4c86c572..7c814ba49 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AdrControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AdrControllerTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import org.jspecify.annotations.NonNull;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,13 +36,13 @@ class AdrControllerTest {
private DocChunkRepository chunkRepository;
@MockitoBean
- private ch.goodone.angularai.backend.service.JwtService jwtService;
+ private ch.goodone.backend.service.JwtService jwtService;
@MockitoBean
private org.springframework.security.core.userdetails.UserDetailsService userDetailsService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@Test
@WithMockUser
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AiAdminCreditRequestTest.java b/backend/src/test/java/ch/goodone/backend/controller/AiAdminCreditRequestTest.java
similarity index 89%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AiAdminCreditRequestTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AiAdminCreditRequestTest.java
index 8131751ca..9a84dbd34 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AiAdminCreditRequestTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AiAdminCreditRequestTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.ai.usage.AiCreditRequestService;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import ch.goodone.angularai.backend.repository.AiSuffixRuleRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.ai.usage.AiCreditRequestService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.model.AiCreditRequest;
+import ch.goodone.backend.repository.AiSuffixRuleRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -63,13 +63,13 @@ class AiAdminCreditRequestTest {
private AiCreditRequestService aiCreditRequestService;
@MockitoBean
- private ch.goodone.angularai.backend.service.DataInitializerService dataInitializerService;
+ private ch.goodone.backend.service.DataInitializerService dataInitializerService;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
@MockitoBean
- private ch.goodone.angularai.backend.service.ActionLogService actionLogService;
+ private ch.goodone.backend.service.ActionLogService actionLogService;
@BeforeEach
void setUp() {
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AiControllerIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/controller/AiControllerIntegrationTest.java
similarity index 88%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AiControllerIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AiControllerIntegrationTest.java
index fb9605a07..b8b31703d 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AiControllerIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AiControllerIntegrationTest.java
@@ -1,19 +1,19 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.ai.application.AiApplicationService;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainRequest;
-import ch.goodone.angularai.backend.ai.dto.ArchitectureExplainResult;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseRequest;
-import ch.goodone.angularai.backend.ai.dto.QuickAddParseResult;
-import ch.goodone.angularai.backend.ai.exception.AiProviderException;
-import ch.goodone.angularai.backend.ai.exception.AiParsingException;
-import ch.goodone.angularai.backend.ai.exception.AiRateLimitException;
-import ch.goodone.angularai.backend.ai.usage.AiCreditRequestService;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.dto.ai.UserAiUsageDto;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.ai.application.AiApplicationService;
+import ch.goodone.backend.ai.dto.ArchitectureExplainRequest;
+import ch.goodone.backend.ai.dto.ArchitectureExplainResult;
+import ch.goodone.backend.ai.dto.QuickAddParseRequest;
+import ch.goodone.backend.ai.dto.QuickAddParseResult;
+import ch.goodone.backend.ai.exception.AiProviderException;
+import ch.goodone.backend.ai.exception.AiParsingException;
+import ch.goodone.backend.ai.exception.AiRateLimitException;
+import ch.goodone.backend.ai.usage.AiCreditRequestService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.ai.UserAiUsageDto;
+import ch.goodone.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,7 +21,7 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.http.MediaType;
-import ch.goodone.angularai.backend.config.SecurityConfig;
+import ch.goodone.backend.config.SecurityConfig;
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
@@ -29,8 +29,8 @@
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.mail.javamail.JavaMailSender;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
import org.springframework.test.web.servlet.MockMvc;
import tools.jackson.databind.ObjectMapper;
@@ -87,7 +87,7 @@ class AiControllerIntegrationTest {
private UserRepository userRepository;
@MockitoBean
- private ch.goodone.angularai.backend.service.CaptchaService captchaService;
+ private ch.goodone.backend.service.CaptchaService captchaService;
@BeforeEach
void setUp() {
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AiCreditRequestTest.java b/backend/src/test/java/ch/goodone/backend/controller/AiCreditRequestTest.java
similarity index 87%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AiCreditRequestTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AiCreditRequestTest.java
index f23d9e4f0..c43a4be56 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AiCreditRequestTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AiCreditRequestTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.ai.application.AiApplicationService;
-import ch.goodone.angularai.backend.ai.usage.AiCreditRequestService;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.model.AiCreditRequest;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.CaptchaService;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.ai.application.AiApplicationService;
+import ch.goodone.backend.ai.usage.AiCreditRequestService;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.model.AiCreditRequest;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.CaptchaService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -52,13 +52,13 @@ class AiCreditRequestTest {
private WebApplicationContext context;
@MockitoBean
- private ch.goodone.angularai.backend.service.DataInitializerService dataInitializerService;
+ private ch.goodone.backend.service.DataInitializerService dataInitializerService;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
@MockitoBean
- private ch.goodone.angularai.backend.service.ActionLogService actionLogService;
+ private ch.goodone.backend.service.ActionLogService actionLogService;
@MockitoBean
private AiApplicationService aiApplicationService;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AuthControllerResendTokenTest.java b/backend/src/test/java/ch/goodone/backend/controller/AuthControllerResendTokenTest.java
similarity index 91%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AuthControllerResendTokenTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AuthControllerResendTokenTest.java
index 727f78d4a..c672363e8 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AuthControllerResendTokenTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AuthControllerResendTokenTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/AuthControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/AuthControllerTest.java
similarity index 95%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/AuthControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/AuthControllerTest.java
index ce76c51db..e92aefe72 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/AuthControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/AuthControllerTest.java
@@ -1,22 +1,22 @@
-package ch.goodone.angularai.backend.controller;
-
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.PasswordRecoveryToken;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.repository.PasswordRecoveryTokenRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.EmailService;
-import ch.goodone.angularai.backend.service.JwtService;
-import ch.goodone.angularai.backend.service.UserAliasService;
-import ch.goodone.angularai.backend.service.ValidationService;
+package ch.goodone.backend.controller;
+
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.PasswordRecoveryToken;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.repository.PasswordRecoveryTokenRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.EmailService;
+import ch.goodone.backend.service.JwtService;
+import ch.goodone.backend.service.UserAliasService;
+import ch.goodone.backend.service.ValidationService;
import org.springframework.http.ResponseEntity;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -34,7 +34,7 @@
import java.util.Map;
import java.util.Optional;
-import static ch.goodone.angularai.backend.util.OpenApiContractValidator.matchesContract;
+import static ch.goodone.backend.util.OpenApiContractValidator.matchesContract;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
@@ -200,7 +200,7 @@ void login_shouldReturnUser_whenAuthenticated() throws Exception {
user.setBirthDate(LocalDate.of(1980, 1, 1));
user.setAddress("Admin Home");
user.setRole(Role.ROLE_ADMIN);
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.ACTIVE);
+ user.setStatus(ch.goodone.backend.model.UserStatus.ACTIVE);
when(userRepository.findByLogin(login)).thenReturn(Optional.of(user));
@@ -470,7 +470,7 @@ void register_shouldReturnBadRequest_whenUserDTOIsNull() throws Exception {
@Test
void cleanupPendingUser_shouldDeletePendingUserWhenNewRegistrationOccurs() throws Exception {
User pendingUser = new User("newuser", "new@example.com");
- pendingUser.setStatus(ch.goodone.angularai.backend.model.UserStatus.PENDING);
+ pendingUser.setStatus(ch.goodone.backend.model.UserStatus.PENDING);
// Return same user for both lookups
when(userRepository.findByLogin("newuser")).thenReturn(Optional.of(pendingUser));
@@ -508,7 +508,7 @@ void register_shouldFail_whenCaptchaInvalid() throws Exception {
@Test
void resendVerification_shouldReturnBadRequest_whenUserAlreadyActive() throws Exception {
User activeUser = new User("active", "active@example.com");
- activeUser.setStatus(ch.goodone.angularai.backend.model.UserStatus.ACTIVE);
+ activeUser.setStatus(ch.goodone.backend.model.UserStatus.ACTIVE);
when(userRepository.findByEmail("active@example.com")).thenReturn(Optional.of(activeUser));
@@ -565,7 +565,7 @@ void verify_shouldReturnOk_whenTokenValid() throws Exception {
String tokenValue = "valid-token";
User user = new User();
user.setLogin("testuser");
- ch.goodone.angularai.backend.model.VerificationToken token = new ch.goodone.angularai.backend.model.VerificationToken(user);
+ ch.goodone.backend.model.VerificationToken token = new ch.goodone.backend.model.VerificationToken(user);
token.setToken(tokenValue);
when(verificationTokenRepository.findByToken(tokenValue)).thenReturn(Optional.of(token));
@@ -575,7 +575,7 @@ void verify_shouldReturnOk_whenTokenValid() throws Exception {
verify(userRepository).save(user);
verify(verificationTokenRepository).delete(token);
- assert user.getStatus() == ch.goodone.angularai.backend.model.UserStatus.ACTIVE;
+ assert user.getStatus() == ch.goodone.backend.model.UserStatus.ACTIVE;
}
@Test
@@ -583,7 +583,7 @@ void verify_shouldReturnBadRequest_whenTokenExpired() throws Exception {
String tokenValue = "expired-token";
User user = new User();
user.setEmail("test@example.com");
- ch.goodone.angularai.backend.model.VerificationToken token = new ch.goodone.angularai.backend.model.VerificationToken(user);
+ ch.goodone.backend.model.VerificationToken token = new ch.goodone.backend.model.VerificationToken(user);
token.setToken(tokenValue);
token.setExpiryDate(java.time.LocalDateTime.now().minusHours(1));
@@ -609,7 +609,7 @@ void resendVerification_shouldSendEmail_whenEmailExists() throws Exception {
User user = new User();
user.setEmail(email);
user.setLogin("testuser");
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.PENDING);
+ user.setStatus(ch.goodone.backend.model.UserStatus.PENDING);
when(userRepository.findByEmail(email)).thenReturn(Optional.of(user));
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/ContactControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/ContactControllerTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/ContactControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/ContactControllerTest.java
index cb3d447c8..e785bdfd1 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/ContactControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/ContactControllerTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.dto.ContactRequestDTO;
-import ch.goodone.angularai.backend.repository.ContactMessageRepository;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.EmailService;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.dto.ContactRequestDTO;
+import ch.goodone.backend.repository.ContactMessageRepository;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.EmailService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/CspReportControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/CspReportControllerTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/CspReportControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/CspReportControllerTest.java
index 409073355..84a2856d1 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/CspReportControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/CspReportControllerTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
+import ch.goodone.backend.service.ActionLogService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/DashboardControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/DashboardControllerTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/DashboardControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/DashboardControllerTest.java
index b9df7df49..c775f8c2e 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/DashboardControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/DashboardControllerTest.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.dto.DashboardDTO;
-import ch.goodone.angularai.backend.service.DashboardService;
+import ch.goodone.backend.dto.DashboardDTO;
+import ch.goodone.backend.service.DashboardService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
import org.springframework.context.annotation.Import;
-import ch.goodone.angularai.backend.config.SecurityConfig;
+import ch.goodone.backend.config.SecurityConfig;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.ActiveProfiles;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/HealthEndpointTest.java b/backend/src/test/java/ch/goodone/backend/controller/HealthEndpointTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/HealthEndpointTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/HealthEndpointTest.java
index 55a34be7b..a0225c59f 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/HealthEndpointTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/HealthEndpointTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/JwtAccountStatusTest.java b/backend/src/test/java/ch/goodone/backend/controller/JwtAccountStatusTest.java
similarity index 72%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/JwtAccountStatusTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/JwtAccountStatusTest.java
index 78e0ea0e2..2f5f1bfd8 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/JwtAccountStatusTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/JwtAccountStatusTest.java
@@ -1,19 +1,19 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.config.JwtAuthenticationFilter;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.EmailService;
-import ch.goodone.angularai.backend.service.JwtService;
-import ch.goodone.angularai.backend.service.ValidationService;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.repository.PasswordRecoveryTokenRepository;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.config.JwtAuthenticationFilter;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.EmailService;
+import ch.goodone.backend.service.JwtService;
+import ch.goodone.backend.service.ValidationService;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.repository.PasswordRecoveryTokenRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
@@ -67,7 +67,7 @@ class JwtAccountStatusTest {
private AiUsageService aiUsageService;
@MockitoBean
- private ch.goodone.angularai.backend.service.UserAliasService userAliasService;
+ private ch.goodone.backend.service.UserAliasService userAliasService;
@MockitoBean
private PasswordEncoder passwordEncoder;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/LoginCsrfTest.java b/backend/src/test/java/ch/goodone/backend/controller/LoginCsrfTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/LoginCsrfTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/LoginCsrfTest.java
index 1b4676fcd..7a39f4797 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/LoginCsrfTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/LoginCsrfTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/MetricsExposureTest.java b/backend/src/test/java/ch/goodone/backend/controller/MetricsExposureTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/MetricsExposureTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/MetricsExposureTest.java
index 1cf60a908..c3562745d 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/MetricsExposureTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/MetricsExposureTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/PublicEndpointsTest.java b/backend/src/test/java/ch/goodone/backend/controller/PublicEndpointsTest.java
similarity index 92%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/PublicEndpointsTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/PublicEndpointsTest.java
index 5d0f842cc..fde98b49f 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/PublicEndpointsTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/PublicEndpointsTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.CaptchaService;
+import ch.goodone.backend.service.CaptchaService;
import org.springframework.context.annotation.Import;
-import ch.goodone.angularai.backend.config.SecurityConfig;
+import ch.goodone.backend.config.SecurityConfig;
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
@@ -43,7 +43,7 @@ class PublicEndpointsTest {
private CaptchaService captchaService;
@MockitoBean
- private ch.goodone.angularai.backend.service.EmailService emailService;
+ private ch.goodone.backend.service.EmailService emailService;
@BeforeEach
void setUp() {
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/RegistrationReusageTest.java b/backend/src/test/java/ch/goodone/backend/controller/RegistrationReusageTest.java
similarity index 95%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/RegistrationReusageTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/RegistrationReusageTest.java
index 56eb1f568..8a4cde234 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/RegistrationReusageTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/RegistrationReusageTest.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.service.*;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.service.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
@@ -69,10 +69,10 @@ class RegistrationReusageTest {
private AiUsageService aiUsageService;
@MockitoBean
- private ch.goodone.angularai.backend.service.UserAliasService userAliasService;
+ private ch.goodone.backend.service.UserAliasService userAliasService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.PasswordRecoveryTokenRepository passwordRecoveryTokenRepository;
+ private ch.goodone.backend.repository.PasswordRecoveryTokenRepository passwordRecoveryTokenRepository;
@org.junit.jupiter.api.BeforeEach
void setUp() {
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/RetrospectiveControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/RetrospectiveControllerTest.java
similarity index 85%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/RetrospectiveControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/RetrospectiveControllerTest.java
index 69e5b7d5b..850e060bd 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/RetrospectiveControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/RetrospectiveControllerTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.ai.application.RetrospectiveUseCase;
-import ch.goodone.angularai.backend.ai.dto.TasksetInfo;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.JwtService;
+import ch.goodone.backend.ai.application.RetrospectiveUseCase;
+import ch.goodone.backend.ai.dto.TasksetInfo;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.JwtService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerBlankLandingMessageTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerBlankLandingMessageTest.java
similarity index 85%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerBlankLandingMessageTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerBlankLandingMessageTest.java
index c56d27a6e..339d445aa 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerBlankLandingMessageTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerBlankLandingMessageTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -44,7 +44,7 @@ class SystemControllerBlankLandingMessageTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerDefaultProfileTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerDefaultProfileTest.java
similarity index 84%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerDefaultProfileTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerDefaultProfileTest.java
index 60f1634f1..7c98455af 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerDefaultProfileTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerDefaultProfileTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -42,7 +42,7 @@ class SystemControllerDefaultProfileTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerFargateRecaptchaConfigTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerFargateRecaptchaConfigTest.java
similarity index 88%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerFargateRecaptchaConfigTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerFargateRecaptchaConfigTest.java
index 4851f6fe3..98e1ebe12 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerFargateRecaptchaConfigTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerFargateRecaptchaConfigTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -50,7 +50,7 @@ class SystemControllerFargateRecaptchaConfigTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2FileProfileTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2FileProfileTest.java
similarity index 85%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2FileProfileTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2FileProfileTest.java
index 98e841f05..b59814013 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2FileProfileTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2FileProfileTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -42,7 +42,7 @@ class SystemControllerH2FileProfileTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2MemProfileTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2MemProfileTest.java
similarity index 85%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2MemProfileTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2MemProfileTest.java
index ed909dc1b..4f67b2f42 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2MemProfileTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2MemProfileTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -44,7 +44,7 @@ class SystemControllerH2MemProfileTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2ProfileTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2ProfileTest.java
similarity index 85%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2ProfileTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2ProfileTest.java
index 3d1eac57b..35d46f0ee 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerH2ProfileTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerH2ProfileTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -44,7 +44,7 @@ class SystemControllerH2ProfileTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeOffTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeOffTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeOffTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeOffTest.java
index 287d1e8f5..588fae540 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeOffTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeOffTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -33,7 +33,7 @@ class SystemControllerLandingMessageModeOffTest {
private SystemSettingService systemSettingService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeStartupTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeStartupTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeStartupTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeStartupTest.java
index 037b80b9f..7e52a5e39 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeStartupTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeStartupTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -34,7 +34,7 @@ class SystemControllerLandingMessageModeStartupTest {
private SystemSettingService systemSettingService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeTest.java
similarity index 92%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeTest.java
index e5bccf7e4..b065a0deb 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLandingMessageModeTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLandingMessageModeTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -32,7 +32,7 @@ class SystemControllerLandingMessageModeTest {
private SystemSettingService systemSettingService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLocalDevRecaptchaConfigTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLocalDevRecaptchaConfigTest.java
similarity index 88%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLocalDevRecaptchaConfigTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerLocalDevRecaptchaConfigTest.java
index 2123deb33..f9c97bee3 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLocalDevRecaptchaConfigTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLocalDevRecaptchaConfigTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -48,7 +48,7 @@ class SystemControllerLocalDevRecaptchaConfigTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLocalDockerRecaptchaConfigTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLocalDockerRecaptchaConfigTest.java
similarity index 88%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLocalDockerRecaptchaConfigTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerLocalDockerRecaptchaConfigTest.java
index 76d1caf18..c4eefc748 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerLocalDockerRecaptchaConfigTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerLocalDockerRecaptchaConfigTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -50,7 +50,7 @@ class SystemControllerLocalDockerRecaptchaConfigTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerPostgresProfileTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerPostgresProfileTest.java
similarity index 88%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerPostgresProfileTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerPostgresProfileTest.java
index abc20a904..c96c37f25 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerPostgresProfileTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerPostgresProfileTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaDisabledTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaDisabledTest.java
similarity index 86%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaDisabledTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaDisabledTest.java
index fad5b8415..8c0059734 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaDisabledTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaDisabledTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -46,7 +46,7 @@ class SystemControllerRecaptchaDisabledTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaEnterpriseTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaEnterpriseTest.java
similarity index 88%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaEnterpriseTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaEnterpriseTest.java
index 0fe5990d1..df9cfebbd 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaEnterpriseTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaEnterpriseTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -48,7 +48,7 @@ class SystemControllerRecaptchaEnterpriseTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaLegacyTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaLegacyTest.java
similarity index 86%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaLegacyTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaLegacyTest.java
index bd2b791cb..fd4e75cab 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaLegacyTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaLegacyTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -44,7 +44,7 @@ class SystemControllerRecaptchaLegacyTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaModesTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaModesTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaModesTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaModesTest.java
index 47c717595..ec95c98fd 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaModesTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaModesTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -49,7 +49,7 @@ class SystemControllerRecaptchaModesTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaNoSecretNoEnterpriseTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaNoSecretNoEnterpriseTest.java
similarity index 86%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaNoSecretNoEnterpriseTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaNoSecretNoEnterpriseTest.java
index 80aca34ea..a761da47f 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaNoSecretNoEnterpriseTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaNoSecretNoEnterpriseTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -46,7 +46,7 @@ class SystemControllerRecaptchaNoSecretNoEnterpriseTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaRealConfigTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaRealConfigTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaRealConfigTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaRealConfigTest.java
index 6cf30cccb..c348b992c 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerRecaptchaRealConfigTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerRecaptchaRealConfigTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.DataInitializerService;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.DataInitializerService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -52,7 +52,7 @@ class SystemControllerRecaptchaRealConfigTest {
private DataInitializerService dataInitializerService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
private org.springframework.mail.javamail.JavaMailSender javaMailSender;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/SystemControllerTest.java
index 56de0ba88..c65881468 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/SystemControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/SystemControllerTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.controller;
+package ch.goodone.backend.controller;
-import ch.goodone.angularai.backend.service.SystemSettingService;
+import ch.goodone.backend.service.SystemSettingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -34,10 +34,10 @@ class SystemControllerTest {
private SystemSettingService systemSettingService;
@MockitoBean
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@MockitoBean
- private ch.goodone.angularai.backend.ai.usage.AiUsageService aiUsageService;
+ private ch.goodone.backend.ai.usage.AiUsageService aiUsageService;
@Test
void shouldReturnSystemInfo() throws Exception {
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/TaskControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/TaskControllerTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/TaskControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/TaskControllerTest.java
index 59f52708c..04eb6c646 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/TaskControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/TaskControllerTest.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.dto.TaskDTO;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.TaskService;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.dto.TaskDTO;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.TaskService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -13,7 +13,7 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
-import ch.goodone.angularai.backend.config.SecurityConfig;
+import ch.goodone.backend.config.SecurityConfig;
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@@ -58,16 +58,16 @@ class TaskControllerTest {
private UserRepository userRepository;
@MockitoBean
- private ch.goodone.angularai.backend.service.TaskParserService taskParserService;
+ private ch.goodone.backend.service.TaskParserService taskParserService;
@MockitoBean
- private ch.goodone.angularai.backend.ai.application.QuickAddParseUseCase quickAddParseUseCase;
+ private ch.goodone.backend.ai.application.QuickAddParseUseCase quickAddParseUseCase;
@MockitoBean
- private ch.goodone.angularai.backend.service.CaptchaService captchaService;
+ private ch.goodone.backend.service.CaptchaService captchaService;
@MockitoBean
- private ch.goodone.angularai.backend.service.ActionLogService actionLogService;
+ private ch.goodone.backend.service.ActionLogService actionLogService;
@Autowired
private ObjectMapper objectMapper;
@@ -205,7 +205,7 @@ void shouldReorderTasks() throws Exception {
@Test
@WithMockUser(username = "testuser")
void shouldAnalyzeTask() throws Exception {
- var result = new ch.goodone.angularai.backend.ai.dto.QuickAddParseResult(
+ var result = new ch.goodone.backend.ai.dto.QuickAddParseResult(
"Analyzed Task", "Desc", "Category", 0.9, java.util.List.of(), java.util.List.of(), LocalDate.now().toString(), null, "HIGH", "OPEN", true
);
when(captchaService.verify(any(), any())).thenReturn(true);
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/UserControllerTest.java b/backend/src/test/java/ch/goodone/backend/controller/UserControllerTest.java
similarity index 94%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/UserControllerTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/UserControllerTest.java
index 789a616cf..b3faf140f 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/UserControllerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/UserControllerTest.java
@@ -1,14 +1,14 @@
-package ch.goodone.angularai.backend.controller;
-
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.config.SecurityConfig;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.service.ActionLogService;
-import ch.goodone.angularai.backend.service.EmailService;
+package ch.goodone.backend.controller;
+
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.config.SecurityConfig;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.service.ActionLogService;
+import ch.goodone.backend.service.EmailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
@@ -56,7 +56,7 @@ class UserControllerTest {
private EmailService emailService;
@MockitoBean
- private ch.goodone.angularai.backend.service.JwtService jwtService;
+ private ch.goodone.backend.service.JwtService jwtService;
@Autowired
private PasswordEncoder passwordEncoder;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/controller/VerificationIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/controller/VerificationIntegrationTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/controller/VerificationIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/controller/VerificationIntegrationTest.java
index 1d47c6d68..45db3aa94 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/controller/VerificationIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/controller/VerificationIntegrationTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.controller;
-
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
-import ch.goodone.angularai.backend.service.CaptchaService;
-import ch.goodone.angularai.backend.service.EmailService;
+package ch.goodone.backend.controller;
+
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.service.CaptchaService;
+import ch.goodone.backend.service.EmailService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/DocIngestionServiceTest.java b/backend/src/test/java/ch/goodone/backend/docs/ingest/DocIngestionServiceTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/DocIngestionServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/docs/ingest/DocIngestionServiceTest.java
index 295e67394..6c8aa73d0 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/DocIngestionServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/docs/ingest/DocIngestionServiceTest.java
@@ -1,10 +1,10 @@
-package ch.goodone.angularai.backend.docs.ingest;
+package ch.goodone.backend.docs.ingest;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocSource;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
-import ch.goodone.angularai.backend.repository.DocSourceRepository;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocSource;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
+import ch.goodone.backend.repository.DocSourceRepository;
import tools.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/EmbeddingServiceTest.java b/backend/src/test/java/ch/goodone/backend/docs/ingest/EmbeddingServiceTest.java
similarity index 90%
rename from backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/EmbeddingServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/docs/ingest/EmbeddingServiceTest.java
index 55df73247..73791c32f 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/EmbeddingServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/docs/ingest/EmbeddingServiceTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.docs.ingest;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.ai.observability.AiObservabilityService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocEmbedding;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
+package ch.goodone.backend.docs.ingest;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.ai.observability.AiObservabilityService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocEmbedding;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/MarkdownChunkerTest.java b/backend/src/test/java/ch/goodone/backend/docs/ingest/MarkdownChunkerTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/MarkdownChunkerTest.java
rename to backend/src/test/java/ch/goodone/backend/docs/ingest/MarkdownChunkerTest.java
index 8d654bb2a..67b44e176 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/MarkdownChunkerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/docs/ingest/MarkdownChunkerTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.docs.ingest;
+package ch.goodone.backend.docs.ingest;
import org.junit.jupiter.api.Test;
import java.util.List;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/TaskIndexValidatorTest.java b/backend/src/test/java/ch/goodone/backend/docs/ingest/TaskIndexValidatorTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/TaskIndexValidatorTest.java
rename to backend/src/test/java/ch/goodone/backend/docs/ingest/TaskIndexValidatorTest.java
index 3bbab4858..c33e31daa 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/docs/ingest/TaskIndexValidatorTest.java
+++ b/backend/src/test/java/ch/goodone/backend/docs/ingest/TaskIndexValidatorTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.docs.ingest;
+package ch.goodone.backend.docs.ingest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/docs/retrieval/DocRetrievalServiceTest.java b/backend/src/test/java/ch/goodone/backend/docs/retrieval/DocRetrievalServiceTest.java
similarity index 92%
rename from backend/src/test/java/ch/goodone/angularai/backend/docs/retrieval/DocRetrievalServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/docs/retrieval/DocRetrievalServiceTest.java
index afb31afd2..1f6ffecf9 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/docs/retrieval/DocRetrievalServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/docs/retrieval/DocRetrievalServiceTest.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.docs.retrieval;
-
-import ch.goodone.angularai.backend.ai.AiProperties;
-import ch.goodone.angularai.backend.ai.AiProviderService;
-import ch.goodone.angularai.backend.model.DocChunk;
-import ch.goodone.angularai.backend.model.DocEmbedding;
-import ch.goodone.angularai.backend.repository.DocChunkRepository;
-import ch.goodone.angularai.backend.repository.DocEmbeddingRepository;
+package ch.goodone.backend.docs.retrieval;
+
+import ch.goodone.backend.ai.AiProperties;
+import ch.goodone.backend.ai.AiProviderService;
+import ch.goodone.backend.model.DocChunk;
+import ch.goodone.backend.model.DocEmbedding;
+import ch.goodone.backend.repository.DocChunkRepository;
+import ch.goodone.backend.repository.DocEmbeddingRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/dto/DTOTest.java b/backend/src/test/java/ch/goodone/backend/dto/DTOTest.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/dto/DTOTest.java
rename to backend/src/test/java/ch/goodone/backend/dto/DTOTest.java
index c8f7909e6..edc74f9b5 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/dto/DTOTest.java
+++ b/backend/src/test/java/ch/goodone/backend/dto/DTOTest.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.dto;
+package ch.goodone.backend.dto;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.model.*;
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.model.*;
import org.junit.jupiter.api.Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/migration/DatabaseMigrationTest.java b/backend/src/test/java/ch/goodone/backend/migration/DatabaseMigrationTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/migration/DatabaseMigrationTest.java
rename to backend/src/test/java/ch/goodone/backend/migration/DatabaseMigrationTest.java
index c3ca709d0..af5b58a32 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/migration/DatabaseMigrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/migration/DatabaseMigrationTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.migration;
+package ch.goodone.backend.migration;
import org.flywaydb.core.Flyway;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/migration/TokenConstraintMigrationTest.java b/backend/src/test/java/ch/goodone/backend/migration/TokenConstraintMigrationTest.java
similarity index 85%
rename from backend/src/test/java/ch/goodone/angularai/backend/migration/TokenConstraintMigrationTest.java
rename to backend/src/test/java/ch/goodone/backend/migration/TokenConstraintMigrationTest.java
index a8be281a6..26d5c2a03 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/migration/TokenConstraintMigrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/migration/TokenConstraintMigrationTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.migration;
+package ch.goodone.backend.migration;
-import ch.goodone.angularai.backend.model.PasswordRecoveryToken;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.repository.PasswordRecoveryTokenRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.repository.VerificationTokenRepository;
+import ch.goodone.backend.model.PasswordRecoveryToken;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.repository.PasswordRecoveryTokenRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.repository.VerificationTokenRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/model/EntityTest.java b/backend/src/test/java/ch/goodone/backend/model/EntityTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/model/EntityTest.java
rename to backend/src/test/java/ch/goodone/backend/model/EntityTest.java
index a42f3ffb2..af5de24ff 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/model/EntityTest.java
+++ b/backend/src/test/java/ch/goodone/backend/model/EntityTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.model;
+package ch.goodone.backend.model;
import org.junit.jupiter.api.Test;
import java.time.LocalDate;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/repository/UserCascadeDeleteTest.java b/backend/src/test/java/ch/goodone/backend/repository/UserCascadeDeleteTest.java
similarity index 86%
rename from backend/src/test/java/ch/goodone/angularai/backend/repository/UserCascadeDeleteTest.java
rename to backend/src/test/java/ch/goodone/backend/repository/UserCascadeDeleteTest.java
index b852d2c6c..3e0c1903d 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/repository/UserCascadeDeleteTest.java
+++ b/backend/src/test/java/ch/goodone/backend/repository/UserCascadeDeleteTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.repository;
-
-import ch.goodone.angularai.backend.model.PasswordRecoveryToken;
-import ch.goodone.angularai.backend.model.VerificationToken;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.Task;
-import ch.goodone.angularai.backend.model.TaskStatus;
-import ch.goodone.angularai.backend.model.User;
+package ch.goodone.backend.repository;
+
+import ch.goodone.backend.model.PasswordRecoveryToken;
+import ch.goodone.backend.model.VerificationToken;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.Task;
+import ch.goodone.backend.model.TaskStatus;
+import ch.goodone.backend.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/repository/UserRepositoryTest.java b/backend/src/test/java/ch/goodone/backend/repository/UserRepositoryTest.java
similarity index 89%
rename from backend/src/test/java/ch/goodone/angularai/backend/repository/UserRepositoryTest.java
rename to backend/src/test/java/ch/goodone/backend/repository/UserRepositoryTest.java
index 6c5473036..d4f7554cf 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/repository/UserRepositoryTest.java
+++ b/backend/src/test/java/ch/goodone/backend/repository/UserRepositoryTest.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.repository;
+package ch.goodone.backend.repository;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/security/ObservabilityIntegrationTest.java b/backend/src/test/java/ch/goodone/backend/security/ObservabilityIntegrationTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/security/ObservabilityIntegrationTest.java
rename to backend/src/test/java/ch/goodone/backend/security/ObservabilityIntegrationTest.java
index b93360212..b20b5fd85 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/security/ObservabilityIntegrationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/security/ObservabilityIntegrationTest.java
@@ -1,13 +1,13 @@
-package ch.goodone.angularai.backend.security;
-
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.ActionLog;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.ActionLogRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.service.CaptchaService;
+package ch.goodone.backend.security;
+
+import static ch.goodone.backend.util.SecurityConstants.*;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.ActionLog;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.ActionLogRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.service.CaptchaService;
import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.junit.jupiter.api.BeforeEach;
@@ -120,7 +120,7 @@ void testPhase2Observability() throws Exception {
// --- 2. User modifies last name (Phase 2.1 Audit Logging & Hibernate Envers) ---
// Manually activate user since it's pending
User user = userRepository.findByLogin("obs_test").orElseThrow();
- user.setStatus(ch.goodone.angularai.backend.model.UserStatus.ACTIVE);
+ user.setStatus(ch.goodone.backend.model.UserStatus.ACTIVE);
user.setRole(Role.ROLE_ADMIN); // Give admin role for log viewing later
userRepository.saveAndFlush(user);
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/ActionLogServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/ActionLogServiceTest.java
similarity index 94%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/ActionLogServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/ActionLogServiceTest.java
index e501faae5..efde5cfaa 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/ActionLogServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/ActionLogServiceTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.dto.ActionLogDTO;
-import ch.goodone.angularai.backend.model.ActionLog;
-import ch.goodone.angularai.backend.repository.ActionLogRepository;
+import ch.goodone.backend.dto.ActionLogDTO;
+import ch.goodone.backend.model.ActionLog;
+import ch.goodone.backend.repository.ActionLogRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
@@ -35,7 +35,7 @@ class ActionLogServiceTest {
private org.springframework.beans.factory.ObjectProvider requestProvider;
@Mock
- private ch.goodone.angularai.backend.repository.UserRepository userRepository;
+ private ch.goodone.backend.repository.UserRepository userRepository;
@InjectMocks
private ActionLogService actionLogService;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/AuthenticationEventListenerTest.java b/backend/src/test/java/ch/goodone/backend/service/AuthenticationEventListenerTest.java
similarity index 95%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/AuthenticationEventListenerTest.java
rename to backend/src/test/java/ch/goodone/backend/service/AuthenticationEventListenerTest.java
index 215dac2e5..acf5cdf88 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/AuthenticationEventListenerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/AuthenticationEventListenerTest.java
@@ -1,6 +1,6 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.util.SecurityConstants;
+import ch.goodone.backend.util.SecurityConstants;
import org.junit.jupiter.api.Test;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/CaptchaServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/CaptchaServiceTest.java
similarity index 99%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/CaptchaServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/CaptchaServiceTest.java
index c3cfd3df5..6a7d07e90 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/CaptchaServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/CaptchaServiceTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/DashboardServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/DashboardServiceTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/DashboardServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/DashboardServiceTest.java
index 50f9976c0..7cbdef1d9 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/DashboardServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/DashboardServiceTest.java
@@ -1,11 +1,11 @@
-package ch.goodone.angularai.backend.service;
-
-import ch.goodone.angularai.backend.dto.DashboardDTO;
-import ch.goodone.angularai.backend.model.*;
-import ch.goodone.angularai.backend.repository.ActionLogRepository;
-import ch.goodone.angularai.backend.repository.TaskRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
+package ch.goodone.backend.service;
+
+import ch.goodone.backend.dto.DashboardDTO;
+import ch.goodone.backend.model.*;
+import ch.goodone.backend.repository.ActionLogRepository;
+import ch.goodone.backend.repository.TaskRepository;
+import ch.goodone.backend.repository.UserRepository;
+import ch.goodone.backend.ai.usage.AiUsageService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/DataInitializerServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/DataInitializerServiceTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/DataInitializerServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/DataInitializerServiceTest.java
index b182bc787..29390c99d 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/DataInitializerServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/DataInitializerServiceTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.repository.TaskRepository;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.repository.TaskRepository;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/DemoResetServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/DemoResetServiceTest.java
similarity index 93%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/DemoResetServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/DemoResetServiceTest.java
index 70ffe31cb..3a4902580 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/DemoResetServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/DemoResetServiceTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.Role;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.model.Role;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/EmailServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/EmailServiceTest.java
similarity index 99%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/EmailServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/EmailServiceTest.java
index 747226d59..9acfd0770 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/EmailServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/EmailServiceTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import jakarta.mail.internet.MimeMessage;
import org.junit.jupiter.api.BeforeEach;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/IpLocationServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/IpLocationServiceTest.java
similarity index 99%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/IpLocationServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/IpLocationServiceTest.java
index 149f13690..07192580e 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/IpLocationServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/IpLocationServiceTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/JwtServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/JwtServiceTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/JwtServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/JwtServiceTest.java
index 7c44439bd..4c3d91f9e 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/JwtServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/JwtServiceTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import static ch.goodone.angularai.backend.util.SecurityConstants.*;
+import static ch.goodone.backend.util.SecurityConstants.*;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.test.util.ReflectionTestUtils;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/StartupLoggerTest.java b/backend/src/test/java/ch/goodone/backend/service/StartupLoggerTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/StartupLoggerTest.java
rename to backend/src/test/java/ch/goodone/backend/service/StartupLoggerTest.java
index e20db61dc..ca6764493 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/StartupLoggerTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/StartupLoggerTest.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/SystemSettingServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/SystemSettingServiceTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/SystemSettingServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/SystemSettingServiceTest.java
index 489b05741..774dbb740 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/SystemSettingServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/SystemSettingServiceTest.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.SystemSetting;
-import ch.goodone.angularai.backend.repository.SystemSettingRepository;
+import ch.goodone.backend.model.SystemSetting;
+import ch.goodone.backend.repository.SystemSettingRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/TaskParserServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/TaskParserServiceTest.java
similarity index 98%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/TaskParserServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/TaskParserServiceTest.java
index 15e9717c8..adc62ae26 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/TaskParserServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/TaskParserServiceTest.java
@@ -1,7 +1,7 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.TaskStatus;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.TaskStatus;
import org.junit.jupiter.api.Test;
import java.time.LocalDate;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/TaskServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/TaskServiceTest.java
similarity index 95%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/TaskServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/TaskServiceTest.java
index d7d13eecf..3226a20cc 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/TaskServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/TaskServiceTest.java
@@ -1,12 +1,12 @@
-package ch.goodone.angularai.backend.service;
-
-import ch.goodone.angularai.backend.ai.usage.AiUsageService;
-import ch.goodone.angularai.backend.dto.TaskDTO;
-import ch.goodone.angularai.backend.model.Priority;
-import ch.goodone.angularai.backend.model.Task;
-import ch.goodone.angularai.backend.model.TaskStatus;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.repository.TaskRepository;
+package ch.goodone.backend.service;
+
+import ch.goodone.backend.ai.usage.AiUsageService;
+import ch.goodone.backend.dto.TaskDTO;
+import ch.goodone.backend.model.Priority;
+import ch.goodone.backend.model.Task;
+import ch.goodone.backend.model.TaskStatus;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.repository.TaskRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/UserAnonymizationTest.java b/backend/src/test/java/ch/goodone/backend/service/UserAnonymizationTest.java
similarity index 94%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/UserAnonymizationTest.java
rename to backend/src/test/java/ch/goodone/backend/service/UserAnonymizationTest.java
index a4e720e5e..3338a6180 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/UserAnonymizationTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/UserAnonymizationTest.java
@@ -1,8 +1,8 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.User;
-import static ch.goodone.angularai.backend.util.SecurityConstants.ROLE_ADMIN;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.User;
+import static ch.goodone.backend.util.SecurityConstants.ROLE_ADMIN;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.security.core.Authentication;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/service/ValidationServiceTest.java b/backend/src/test/java/ch/goodone/backend/service/ValidationServiceTest.java
similarity index 96%
rename from backend/src/test/java/ch/goodone/angularai/backend/service/ValidationServiceTest.java
rename to backend/src/test/java/ch/goodone/backend/service/ValidationServiceTest.java
index 089dcf25c..a128a0489 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/service/ValidationServiceTest.java
+++ b/backend/src/test/java/ch/goodone/backend/service/ValidationServiceTest.java
@@ -1,9 +1,9 @@
-package ch.goodone.angularai.backend.service;
+package ch.goodone.backend.service;
-import ch.goodone.angularai.backend.dto.UserDTO;
-import ch.goodone.angularai.backend.model.User;
-import ch.goodone.angularai.backend.model.UserStatus;
-import ch.goodone.angularai.backend.repository.UserRepository;
+import ch.goodone.backend.dto.UserDTO;
+import ch.goodone.backend.model.User;
+import ch.goodone.backend.model.UserStatus;
+import ch.goodone.backend.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/backend/src/test/java/ch/goodone/angularai/backend/util/OpenApiContractValidator.java b/backend/src/test/java/ch/goodone/backend/util/OpenApiContractValidator.java
similarity index 97%
rename from backend/src/test/java/ch/goodone/angularai/backend/util/OpenApiContractValidator.java
rename to backend/src/test/java/ch/goodone/backend/util/OpenApiContractValidator.java
index b948ee1e3..cd33a59cf 100644
--- a/backend/src/test/java/ch/goodone/angularai/backend/util/OpenApiContractValidator.java
+++ b/backend/src/test/java/ch/goodone/backend/util/OpenApiContractValidator.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.backend.util;
+package ch.goodone.backend.util;
import com.atlassian.oai.validator.mockmvc.OpenApiValidationMatchers;
import org.springframework.test.web.servlet.ResultMatcher;
diff --git a/backend/src/test/resources/application.properties b/backend/src/test/resources/application.properties
index d3bbd645c..8daef8413 100644
--- a/backend/src/test/resources/application.properties
+++ b/backend/src/test/resources/application.properties
@@ -4,3 +4,4 @@ spring.config.import=optional:classpath:application-test.properties
+
diff --git a/backend/src/test/resources/test-docs/test-uploaded-no-csrf.md b/backend/src/test/resources/test-docs/test-uploaded-no-csrf.md
new file mode 100644
index 000000000..d95f3ad14
--- /dev/null
+++ b/backend/src/test/resources/test-docs/test-uploaded-no-csrf.md
@@ -0,0 +1 @@
+content
diff --git a/backend/src/test/resources/test-docs/test-uploaded.md b/backend/src/test/resources/test-docs/test-uploaded.md
index ad8ba4ce8..57b029b76 100644
--- a/backend/src/test/resources/test-docs/test-uploaded.md
+++ b/backend/src/test/resources/test-docs/test-uploaded.md
@@ -1,2 +1,2 @@
# Test Uploaded Document
-This is a test document uploaded via zip.
\ No newline at end of file
+This is a test document uploaded via zip.
diff --git a/backend/src/test/resources/test-docs/test.md b/backend/src/test/resources/test-docs/test.md
index 8b3afbe79..96b2a5720 100644
--- a/backend/src/test/resources/test-docs/test.md
+++ b/backend/src/test/resources/test-docs/test.md
@@ -1,2 +1,2 @@
# Test Document
-This is a test document content.
\ No newline at end of file
+This is a test document content.
diff --git a/deploy/aws/backend-task-definition.json b/deploy/aws/backend-task-definition.json
index c21ccafa5..925aad0db 100644
--- a/deploy/aws/backend-task-definition.json
+++ b/deploy/aws/backend-task-definition.json
@@ -1,10 +1,10 @@
{
- "family": "angularai-backend",
+ "family": "goodone-backend",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "backend",
- "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/angularai-backend:1.1.0",
+ "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/goodone-backend:1.1.1-SNAPSHOT",
"essential": true,
"portMappings": [
{
@@ -201,14 +201,6 @@
"valueFrom": "arn:aws:secretsmanager:eu-central-1:{{AWS_ACCOUNT_ID}}:secret:goodone-config-NCy6aP:OPENAI_API_KEY::"
}
],
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": "/ecs/angularai-backend",
- "awslogs-region": "eu-central-1",
- "awslogs-stream-prefix": "ecs"
- }
- },
"mountPoints": [
{
"containerPath": "/app/data",
diff --git a/deploy/aws/backend-test-task-definition.json b/deploy/aws/backend-test-task-definition.json
index c59c1ce5e..0c76adcc9 100644
--- a/deploy/aws/backend-test-task-definition.json
+++ b/deploy/aws/backend-test-task-definition.json
@@ -1,10 +1,10 @@
{
- "family": "angularai-backend-test",
+ "family": "goodone-backend-test",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "backend",
- "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/angularai-app:1.1.0",
+ "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/goodone-app:1.1.1-SNAPSHOT",
"essential": true,
"portMappings": [
{
@@ -213,14 +213,6 @@
"valueFrom": "arn:aws:secretsmanager:eu-central-1:{{AWS_ACCOUNT_ID}}:secret:goodone-config-NCy6aP:OPENAI_API_KEY::"
}
],
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": "/ecs/angularai-backend-test",
- "awslogs-region": "eu-central-1",
- "awslogs-stream-prefix": "ecs"
- }
- },
"mountPoints": [
{
"containerPath": "/app/data",
diff --git a/deploy/aws/frontend-task-definition.json b/deploy/aws/frontend-task-definition.json
index 97e76609c..fdd1701c0 100644
--- a/deploy/aws/frontend-task-definition.json
+++ b/deploy/aws/frontend-task-definition.json
@@ -1,10 +1,10 @@
{
- "family": "angularai-frontend",
+ "family": "goodone-frontend",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "frontend",
- "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/angularai-frontend:1.1.0",
+ "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/goodone-frontend:1.1.1-SNAPSHOT",
"essential": true,
"portMappings": [
{
@@ -12,15 +12,7 @@
"hostPort": 80,
"protocol": "tcp"
}
- ],
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": "/ecs/angularai-frontend",
- "awslogs-region": "eu-central-1",
- "awslogs-stream-prefix": "ecs"
- }
- }
+ ]
}
],
"requiresCompatibilities": [
@@ -28,6 +20,6 @@
],
"cpu": "256",
"memory": "512",
- "executionRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/angularai-frontend-execution-role",
- "taskRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/angularai-frontend-task-role"
+ "executionRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/goodone-frontend-execution-role",
+ "taskRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/goodone-frontend-task-role"
}
diff --git a/deploy/aws/sba-task-definition.json b/deploy/aws/sba-task-definition.json
index 56c9e8ca8..3e2d02321 100644
--- a/deploy/aws/sba-task-definition.json
+++ b/deploy/aws/sba-task-definition.json
@@ -1,10 +1,10 @@
{
- "family": "angularai-monitoring",
+ "family": "goodone-monitoring",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "monitoring-server",
- "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/angularai-monitoring-server:1.1.0",
+ "image": "{{AWS_ACCOUNT_ID}}.dkr.ecr.eu-central-1.amazonaws.com/goodone-monitoring-server:1.1.1-SNAPSHOT",
"essential": true,
"portMappings": [
{
@@ -18,15 +18,7 @@
"name": "SERVER_PORT",
"value": "8081"
}
- ],
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": "/ecs/angularai-monitoring",
- "awslogs-region": "eu-central-1",
- "awslogs-stream-prefix": "ecs"
- }
- }
+ ]
}
],
"requiresCompatibilities": [
@@ -34,6 +26,6 @@
],
"cpu": "256",
"memory": "512",
- "executionRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/angularai-monitoring-execution-role",
- "taskRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/angularai-monitoring-task-role"
+ "executionRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/goodone-monitoring-execution-role",
+ "taskRoleArn": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:role/goodone-monitoring-task-role"
}
diff --git a/deploy/dev/Dockerfile b/deploy/dev/Dockerfile
index 4253e65c1..9bbeac873 100644
--- a/deploy/dev/Dockerfile
+++ b/deploy/dev/Dockerfile
@@ -68,7 +68,7 @@ COPY doc doc
ARG BUILD_TIME=unknown
ENV BUILD_TIME=$BUILD_TIME
-COPY --from=backend-build /app/backend/target/aibackend-*.jar app.jar
+COPY --from=backend-build /app/backend/target/goodone-backend-*.jar app.jar
# Create data directory and set permissions
RUN mkdir -p data && chown -R spring:spring /app && chmod -R 777 /app/data
EXPOSE 8080
diff --git a/deploy/dev/dev-up.ps1 b/deploy/dev/dev-up.ps1
index 12fde05ef..cd77b7b5e 100644
--- a/deploy/dev/dev-up.ps1
+++ b/deploy/dev/dev-up.ps1
@@ -20,13 +20,13 @@ Write-Host "Waiting for containers to be healthy..." -ForegroundColor Yellow
$retryCount = 0
$maxRetries = 30 # 60 seconds total
while ($retryCount -lt $maxRetries) {
- $postgresStatus = docker inspect --format='{{.State.Health.Status}}' angularai-postgres 2>$null
+ $postgresStatus = docker inspect --format='{{.State.Health.Status}}' goodone-postgres 2>$null
if ($OpenAI) {
- $appRunning = docker inspect --format='{{.State.Running}}' angularai-app 2>$null
+ $appRunning = docker inspect --format='{{.State.Running}}' goodone-app 2>$null
if ($postgresStatus -eq "healthy" -and $appRunning -eq "true") { break }
} else {
- $ollamaStatus = docker inspect --format='{{.State.Health.Status}}' angularai-ollama 2>$null
+ $ollamaStatus = docker inspect --format='{{.State.Health.Status}}' goodone-ollama 2>$null
if ($ollamaStatus -eq "healthy" -and $postgresStatus -eq "healthy") { break }
}
@@ -40,9 +40,9 @@ if ($retryCount -eq $maxRetries) {
Write-Host "Postgres status: $postgresStatus"
if (-not $OpenAI) {
Write-Host "Ollama status: $ollamaStatus"
- Write-Host "Please check 'docker logs angularai-ollama' or 'docker logs angularai-postgres'." -ForegroundColor Yellow
+ Write-Host "Please check 'docker logs goodone-ollama' or 'docker logs goodone-postgres'." -ForegroundColor Yellow
} else {
- Write-Host "Please check 'docker logs angularai-postgres'." -ForegroundColor Yellow
+ Write-Host "Please check 'docker logs goodone-postgres'." -ForegroundColor Yellow
}
exit 1
}
@@ -50,7 +50,7 @@ if ($retryCount -eq $maxRetries) {
if ($OpenAI) {
Write-Host "`nEnvironment is ready (OpenAI mode)." -ForegroundColor Green
Write-Host "Postgres and Mailpit are running." -ForegroundColor Cyan
- Write-Host "The app container 'angularai-app' has been started with the 'openai' profile." -ForegroundColor Cyan
+ Write-Host "The app container 'goodone-app' has been started with the 'openai' profile." -ForegroundColor Cyan
Write-Host "Ensure your OPENAI_API_KEY is set in your .env file." -ForegroundColor Yellow
Write-Host "`nBackend API: http://localhost:8080" -ForegroundColor White
Write-Host "Frontend: http://localhost:4200 (if running on host) or http://localhost:80 (via app container)" -ForegroundColor White
@@ -66,7 +66,7 @@ foreach ($model in $models) {
Write-Host "Checking for model: $model..." -ForegroundColor Yellow
# Check existence in the container directly to avoid confusion with host Ollama
- $containerModels = docker exec angularai-ollama ollama list 2>$null
+ $containerModels = docker exec goodone-ollama ollama list 2>$null
$exists = $false
if ($containerModels) {
if ($containerModels -match "^$($model)(:|\s+)") {
@@ -76,10 +76,10 @@ foreach ($model in $models) {
if (-not $exists) {
Write-Host "Model $model not found in container. Pulling... (This may take a while)" -ForegroundColor Cyan
- docker exec angularai-ollama ollama pull $model
+ docker exec goodone-ollama ollama pull $model
# Verify pull in container
- $verifyList = docker exec angularai-ollama ollama list 2>$null
+ $verifyList = docker exec goodone-ollama ollama list 2>$null
if ($verifyList -match "^$($model)(:|\s+)") {
Write-Host "Model $model successfully pulled into container." -ForegroundColor Green
} else {
diff --git a/deploy/dev/dev-up.sh b/deploy/dev/dev-up.sh
index 2d576f992..b268ec7e4 100644
--- a/deploy/dev/dev-up.sh
+++ b/deploy/dev/dev-up.sh
@@ -25,14 +25,14 @@ else
fi
echo "Waiting for containers to be healthy..."
-until docker inspect --format='{{.State.Health.Status}}' angularai-postgres 2>/dev/null | grep -q "healthy"; do
+until docker inspect --format='{{.State.Health.Status}}' goodone-postgres 2>/dev/null | grep -q "healthy"; do
echo -n "."
sleep 2
done
if [ "$OPENAI" = true ]; then
echo -e "\nWaiting for app to be running..."
- until docker inspect --format='{{.State.Running}}' angularai-app 2>/dev/null | grep -q "true"; do
+ until docker inspect --format='{{.State.Running}}' goodone-app 2>/dev/null | grep -q "true"; do
echo -n "."
sleep 2
done
@@ -51,9 +51,9 @@ if [ "$OPENAI" = false ]; then
for MODEL in "${MODELS[@]}"; do
echo "Checking for model: $MODEL..."
- if ! docker exec angularai-ollama ollama list | grep -q "$MODEL"; then
+ if ! docker exec goodone-ollama ollama list | grep -q "$MODEL"; then
echo "Model $MODEL not found. Pulling... (This may take a while)"
- docker exec angularai-ollama ollama pull $MODEL
+ docker exec goodone-ollama ollama pull $MODEL
else
echo "Model $MODEL already exists."
fi
@@ -61,7 +61,7 @@ if [ "$OPENAI" = false ]; then
else
echo -e "\nEnvironment is ready (OpenAI mode)."
echo "Postgres and Mailpit are running."
- echo "The app container 'angularai-app' has been started with the 'openai' profile."
+ echo "The app container 'goodone-app' has been started with the 'openai' profile."
echo "Ensure your OPENAI_API_KEY is set in your .env file."
echo ""
echo "Backend API: http://localhost:8080"
diff --git a/deploy/dev/docker-compose.dev.yml b/deploy/dev/docker-compose.dev.yml
index 2312b1925..cc6b9ce68 100644
--- a/deploy/dev/docker-compose.dev.yml
+++ b/deploy/dev/docker-compose.dev.yml
@@ -5,7 +5,7 @@ services:
dockerfile: deploy/dev/Dockerfile
args:
- NVD_API_KEY=${NVD_API_KEY}
- container_name: angularai-app
+ container_name: goodone-app
ports:
- "8080:8080"
- "80:8080"
@@ -73,7 +73,7 @@ services:
postgres:
image: pgvector/pgvector:pg17
- container_name: angularai-postgres
+ container_name: goodone-postgres
ports:
- "5432:5432"
environment:
@@ -91,7 +91,7 @@ services:
ollama:
image: ollama/ollama:latest
- container_name: angularai-ollama
+ container_name: goodone-ollama
ports:
- "11434:11434"
volumes:
@@ -105,7 +105,7 @@ services:
mailpit:
image: axllent/mailpit
- container_name: angularai-mailpit
+ container_name: goodone-mailpit
ports:
- "1025:1025" # SMTP port
- "8025:8025" # Web UI port
diff --git a/deploy/k8s/backend.yaml b/deploy/k8s/backend.yaml
index d4f9f0f2c..eb9bd3473 100644
--- a/deploy/k8s/backend.yaml
+++ b/deploy/k8s/backend.yaml
@@ -21,7 +21,7 @@ spec:
fsGroup: 1000
containers:
- name: backend
- image: angularai-backend:latest
+ image: goodone-backend:latest
imagePullPolicy: IfNotPresent
securityContext:
allowPrivilegeEscalation: false
diff --git a/deploy/k8s/frontend.yaml b/deploy/k8s/frontend.yaml
index 8c970b139..2abf30935 100644
--- a/deploy/k8s/frontend.yaml
+++ b/deploy/k8s/frontend.yaml
@@ -21,7 +21,7 @@ spec:
fsGroup: 101
containers:
- name: frontend
- image: angularai-frontend:latest
+ image: goodone-frontend:latest
imagePullPolicy: IfNotPresent
securityContext:
allowPrivilegeEscalation: false
diff --git a/deploy/prometheus/docker-compose.yml b/deploy/prometheus/docker-compose.yml
index ccb874fff..5c553f576 100644
--- a/deploy/prometheus/docker-compose.yml
+++ b/deploy/prometheus/docker-compose.yml
@@ -1,7 +1,7 @@
services:
prometheus:
image: prom/prometheus
- container_name: angularai-prometheus
+ container_name: goodone-prometheus
ports:
- "9090:9090"
volumes:
@@ -12,7 +12,7 @@ services:
grafana:
image: grafana/grafana:11.1.0
- container_name: angularai-grafana
+ container_name: goodone-grafana
ports:
- "3000:3000"
environment:
diff --git a/deploy/prometheus/grafana/provisioning/datasources/prometheus.yml b/deploy/prometheus/grafana/provisioning/datasources/prometheus.yml
index 18f1b19b4..a04738586 100644
--- a/deploy/prometheus/grafana/provisioning/datasources/prometheus.yml
+++ b/deploy/prometheus/grafana/provisioning/datasources/prometheus.yml
@@ -3,7 +3,7 @@ apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
- url: http://angularai-prometheus:9090
+ url: http://goodone-prometheus:9090
isDefault: true
access: proxy
editable: true
diff --git a/deploy/prometheus/prometheus.yml b/deploy/prometheus/prometheus.yml
index e8e48d9bb..482ddcb30 100644
--- a/deploy/prometheus/prometheus.yml
+++ b/deploy/prometheus/prometheus.yml
@@ -2,7 +2,7 @@ global:
scrape_interval: 15s
scrape_configs:
- - job_name: 'angularai-backend'
+ - job_name: 'goodone-backend'
scheme: https
metrics_path: '/actuator/prometheus'
static_configs:
diff --git a/doc/README-old.md b/doc/README-old.md
index 080ef4c20..945fc1e71 100644
--- a/doc/README-old.md
+++ b/doc/README-old.md
@@ -1,4 +1,4 @@
-# AngularAI Application
+# GoodOne Application
This is a full-stack application with a Spring Boot backend and an Angular frontend.
diff --git a/doc/README_enhanced.md b/doc/README_enhanced.md
index 5e8ca275d..2e8468cfc 100644
--- a/doc/README_enhanced.md
+++ b/doc/README_enhanced.md
@@ -1,9 +1,9 @@
-# 🚀 AngularAI – AI‑Powered Software Engineering Platform
+# 🚀 GoodOne – AI‑Powered Software Engineering Platform

-AngularAI is an experimental platform exploring how **AI can become part of the runtime of a software system**, not only a developer tool.
+GoodOne is an experimental platform exploring how **AI can become part of the runtime of a software system**, not only a developer tool.
Built with **Angular + Spring Boot**, the application analyzes project data, architecture documentation and development tasks to generate insights about software projects.
diff --git a/doc/admin-guide/admin-guide.md b/doc/admin-guide/admin-guide.md
index f7d3fe6ce..2caa5fdf3 100644
--- a/doc/admin-guide/admin-guide.md
+++ b/doc/admin-guide/admin-guide.md
@@ -1,6 +1,6 @@
# Admin Guide
-This guide is intended for system administrators of the AngularAI application. Administrators have access to additional features for user management and system monitoring.
+This guide is intended for system administrators of the GoodOne application. Administrators have access to additional features for user management and system monitoring.
## Table of Contents
1. [User Administration](#user-administration)
diff --git a/doc/admin-guide/admin-guide_de.md b/doc/admin-guide/admin-guide_de.md
index 3cf98f5be..f21add9e9 100644
--- a/doc/admin-guide/admin-guide_de.md
+++ b/doc/admin-guide/admin-guide_de.md
@@ -1,6 +1,6 @@
# Administrator-Handbuch
-Dieses Handbuch ist für Benutzer mit der Rolle `ADMIN` bestimmt. Es deckt die Verwaltungsfunktionen der AngularAI-Anwendung ab.
+Dieses Handbuch ist für Benutzer mit der Rolle `ADMIN` bestimmt. Es deckt die Verwaltungsfunktionen der GoodOne-Anwendung ab.
## Inhaltsverzeichnis
1. [Benutzerverwaltung](#benutzerverwaltung)
diff --git a/doc/architecture/api-overview.md b/doc/architecture/api-overview.md
index d04921496..5ba8914ca 100644
--- a/doc/architecture/api-overview.md
+++ b/doc/architecture/api-overview.md
@@ -1,6 +1,6 @@
# REST API Overview
-The AngularAI backend provides a comprehensive REST API, organized into functional domains. All endpoints are secured with JWT and enforce Role-Based Access Control (RBAC).
+The GoodOne backend provides a comprehensive REST API, organized into functional domains. All endpoints are secured with JWT and enforce Role-Based Access Control (RBAC).
## API Surface Structure
diff --git a/doc/architecture/backend-architecture.md b/doc/architecture/backend-architecture.md
index 9073de6ff..7fab35ff7 100644
--- a/doc/architecture/backend-architecture.md
+++ b/doc/architecture/backend-architecture.md
@@ -7,9 +7,9 @@ The backend is a Spring Boot 4 application that provides the core RESTful servic
The backend follows a "Modular Monolith" approach, segregating technical infrastructure and foundational services from functional AI-driven application layers.
### Package & Module Structure
-- **Core Layer**: `ch.goodone.angularai.backend.controller`, `.service`, `.model`, `.repository`, `.dto`, `.security`.
-- **AI Domain Layer**: `ch.goodone.angularai.backend.ai` (application services, prompt engineering, usage tracking).
-- **RAG Infrastructure**: `ch.goodone.angularai.backend.docs` (ingestion and retrieval).
+- **Core Layer**: `ch.goodone.goodone.backend.controller`, `.service`, `.model`, `.repository`, `.dto`, `.security`.
+- **AI Domain Layer**: `ch.goodone.goodone.backend.ai` (application services, prompt engineering, usage tracking).
+- **RAG Infrastructure**: `ch.goodone.goodone.backend.docs` (ingestion and retrieval).
## 3. Diagrams
diff --git a/doc/architecture/current-system-analysis.md b/doc/architecture/current-system-analysis.md
index f961aaf2f..374aa0cff 100644
--- a/doc/architecture/current-system-analysis.md
+++ b/doc/architecture/current-system-analysis.md
@@ -1,6 +1,6 @@
# Current System Analysis Baseline
-This document summarizes the current state of the AngularAI codebase as of March 2026, established directly from the implementation.
+This document summarizes the current state of the GoodOne codebase as of March 2026, established directly from the implementation.
## 1. Core Platform Specs
- **Backend Framework**: Spring Boot 4.0.1 (verified in `pom.xml`).
@@ -11,7 +11,7 @@ This document summarizes the current state of the AngularAI codebase as of March
- **Database**: PostgreSQL with `pgvector` (verified in `db/vendor/postgresql` migrations) / H2 for local.
## 2. Backend Module Inventory
-Established from `backend/src/main/java/ch/goodone/angularai/backend/`:
+Established from `backend/src/main/java/ch/goodone/goodone/backend/`:
| Module/Package | Responsibility | Evidence |
| :--- | :--- | :--- |
diff --git a/doc/architecture/developer-onboarding.md b/doc/architecture/developer-onboarding.md
index 25db47d81..a0d62efc5 100644
--- a/doc/architecture/developer-onboarding.md
+++ b/doc/architecture/developer-onboarding.md
@@ -1,6 +1,6 @@
# Developer Onboarding Architecture Guide
-Welcome to the AngularAI project! This guide will help you understand the core architectural patterns and mental models needed to be productive here.
+Welcome to the GoodOne project! This guide will help you understand the core architectural patterns and mental models needed to be productive here.
## 1. Core Architecture Patterns
diff --git a/doc/architecture/erd.md b/doc/architecture/erd.md
index e1586209d..31987b4e1 100644
--- a/doc/architecture/erd.md
+++ b/doc/architecture/erd.md
@@ -1,7 +1,7 @@
# Entity Relationship Diagram (ERD)
## 1. Purpose
-This document provides a code-accurate representation of the persistence model for the AngularAI system, derived directly from JPA entities and annotations.
+This document provides a code-accurate representation of the persistence model for the GoodOne system, derived directly from JPA entities and annotations.
## 2. Core ERD
The following Mermaid diagram illustrates the primary business entities and their relationships.
diff --git a/doc/architecture/index.md b/doc/architecture/index.md
index 901d2dc95..3283dcb3e 100644
--- a/doc/architecture/index.md
+++ b/doc/architecture/index.md
@@ -1,6 +1,6 @@
# Architecture Documentation Index
-This directory contains the technical documentation for the AngularAI project, regenerated from the code reality (March 2026).
+This directory contains the technical documentation for the GoodOne project, regenerated from the code reality (March 2026).
## Core Architecture Pack
diff --git a/doc/architecture/system-overview.md b/doc/architecture/system-overview.md
index 7f017864b..00ee349ca 100644
--- a/doc/architecture/system-overview.md
+++ b/doc/architecture/system-overview.md
@@ -1,7 +1,7 @@
# System Overview
## 1. Purpose
-The AngularAI system is designed to provide a secure, AI-enhanced task management and analysis platform. It demonstrates the integration of modern full-stack technologies (Angular, Spring Boot) with advanced AI features like Retrieval-Augmented Generation (RAG), automated retrospectives, and risk analysis.
+The GoodOne system is designed to provide a secure, AI-enhanced task management and analysis platform. It demonstrates the integration of modern full-stack technologies (Angular, Spring Boot) with advanced AI features like Retrieval-Augmented Generation (RAG), automated retrospectives, and risk analysis.
## 2. What exists today
The system consists of a web frontend, a backend API, a supporting PostgreSQL database (with `pgvector`), and optional local/cloud LLM providers. It follows a "Docker First" approach for easy local deployment and is architected for deployment on AWS ECS Fargate.
diff --git a/doc/architecture/workflows/diagram-tool-comparison.md b/doc/architecture/workflows/diagram-tool-comparison.md
index 048ca7160..21279ae11 100644
--- a/doc/architecture/workflows/diagram-tool-comparison.md
+++ b/doc/architecture/workflows/diagram-tool-comparison.md
@@ -45,8 +45,8 @@ Choosing the right diagramming tool depends on the balance between **version con
| **Rendering** | Browser / Previewer | Java / Remote Server | Editor / Exported Image |
| **Customization** | Low | High | Unlimited |
-### Recommendation for AngularAI
+### Recommendation for GoodOne
For this project, **Mermaid** is the recommended choice because:
1. **Maintainability:** Any developer can fix a typo in a diagram by editing the `.md` file directly without leaving their IDE.
2. **Reviewability:** When a workflow changes, the Git diff shows exactly which step was added or removed in the code review.
-3. **Simplicity:** It matches the "Modern Standards" principle of the project by using lightweight, native web technologies.
\ No newline at end of file
+3. **Simplicity:** It matches the "Modern Standards" principle of the project by using lightweight, native web technologies.
diff --git a/doc/architecture/workflows/registration-workflows.md b/doc/architecture/workflows/registration-workflows.md
index 75632358b..7c760740b 100644
--- a/doc/architecture/workflows/registration-workflows.md
+++ b/doc/architecture/workflows/registration-workflows.md
@@ -1,6 +1,6 @@
# User Workflows Documentation
-This document describes the technical workflows for user management in the AngularAI project.
+This document describes the technical workflows for user management in the GoodOne project.
## 1. User Registration Workflow
diff --git a/doc/architecture/workflows/task-workflows.md b/doc/architecture/workflows/task-workflows.md
index b8d40de17..063cb0614 100644
--- a/doc/architecture/workflows/task-workflows.md
+++ b/doc/architecture/workflows/task-workflows.md
@@ -1,6 +1,6 @@
# Task Workflows Documentation
-This document describes the `Task` object, its attributes, and the workflows associated with task management in the AngularAI project.
+This document describes the `Task` object, its attributes, and the workflows associated with task management in the GoodOne project.
## 1. Task Object Model
diff --git a/doc/architecture/workflows/use-cases.md b/doc/architecture/workflows/use-cases.md
index 521c40bcb..f61c308e4 100644
--- a/doc/architecture/workflows/use-cases.md
+++ b/doc/architecture/workflows/use-cases.md
@@ -1,6 +1,6 @@
# Use Case Documentation
-This document describes the primary use cases for the AngularAI system, categorized by user roles: **Regular User** and **Administrator**.
+This document describes the primary use cases for the GoodOne system, categorized by user roles: **Regular User** and **Administrator**.
## 1. User Use Cases
diff --git a/doc/deployment/fargate-deployment.md b/doc/deployment/fargate-deployment.md
index da0fd8fb4..3e988acfc 100644
--- a/doc/deployment/fargate-deployment.md
+++ b/doc/deployment/fargate-deployment.md
@@ -1,6 +1,6 @@
# AWS Fargate Deployment Guide
-This document outlines the specific configurations and considerations for deploying the AngularAI application to AWS Fargate.
+This document outlines the specific configurations and considerations for deploying the GoodOne application to AWS Fargate.
## Infrastructure Requirements
@@ -37,7 +37,7 @@ Both the Android application and the Test Client are compatible with stateful se
### 4. Service Decommissioning (Cleanup)
Since the application is now deployed as a single container (Backend + Frontend), the previous separate frontend service is no longer needed.
-- **Action**: You can safely **stop and delete** the `angularai-frontend-service` on ECS once you have verified that the `angularai-backend-test-service` is handling all traffic correctly via the ALB.
+- **Action**: You can safely **stop and delete** the `goodone-frontend-service` on ECS once you have verified that the `goodone-backend-test-service` is handling all traffic correctly via the ALB.
- **Cost Saving**: Removing the redundant service reduces your Fargate operational costs.
## Deployment Steps
@@ -75,7 +75,7 @@ aws sso login
Create ECR Repository (one-time prerequisite):
```bash
-aws ecr create-repository --repository-name angularai-app --region eu-central-1 --image-scanning-configuration scanOnPush=true --encryption-configuration encryptionType=AES256
+aws ecr create-repository --repository-name goodone-app --region eu-central-1 --image-scanning-configuration scanOnPush=true --encryption-configuration encryptionType=AES256
```
*Note: If the repository already exists, you can safely ignore the error.*
diff --git a/doc/deployment/h2-lock-fargate.md b/doc/deployment/h2-lock-fargate.md
index 0af338ed3..fa0c9e64f 100644
--- a/doc/deployment/h2-lock-fargate.md
+++ b/doc/deployment/h2-lock-fargate.md
@@ -15,8 +15,8 @@ If the automatic cleanup fails or you need to manually inspect/wipe the volume,
Run this PowerShell command (using your existing Fargate security group and subnets):
```powershell
aws ecs run-task `
- --cluster angular-boot `
- --task-definition angularai-backend-test:54 `
+ --cluster goodone-cluster `
+ --task-definition goodone-backend-test:54 `
--launch-type FARGATE `
--network-configuration "awsvpcConfiguration={subnets=[subnet-0ab34e3ceb5b21d96],securityGroups=[sg-07486daded6199fbb],assignPublicIp=ENABLED}" `
--overrides '{"containerOverrides": [{"name": "backend", "command": ["sh", "-c", "rm -v /app/data/*.lock.db /app/data/*.trace.db"]}]}' `
@@ -29,7 +29,7 @@ If the persistent database on EFS continues to cause issues, you can switch the
To do this, update your ECS Task Definition environment variables:
1. **Remove** `h2-file` from `SPRING_PROFILES_ACTIVE`.
-2. **Add** `SPRING_DATASOURCE_URL` = `jdbc:h2:mem:angularai;DB_CLOSE_DELAY=-1`.
+2. **Add** `SPRING_DATASOURCE_URL` = `jdbc:h2:mem:goodone;DB_CLOSE_DELAY=-1`.
This is the configuration currently running in **Revision 54**, which stabilized the service.
@@ -39,4 +39,4 @@ H2 creates these files when active:
- `*.lock.db`: The lock file (Safe to delete if the process is not running).
- `*.trace.db`: Debug logs (Safe to delete).
-By keeping the `ENTRYPOINT` cleanup in the `Dockerfile`, you should rarely need to handle this manually in the future.
\ No newline at end of file
+By keeping the `ENTRYPOINT` cleanup in the `Dockerfile`, you should rarely need to handle this manually in the future.
diff --git a/doc/development/analysis/dark-mode-chrome.md b/doc/development/analysis/dark-mode-chrome.md
index fc7e0f269..a97bf17e7 100644
--- a/doc/development/analysis/dark-mode-chrome.md
+++ b/doc/development/analysis/dark-mode-chrome.md
@@ -93,4 +93,4 @@ const context = await browser.newContext({
For more details on how we use these methods in this project to verify accessibility and Lighthouse scores, refer to the following documentation:
- **[Lighthouse Dark Mode Guide](doc/development/analysis/lighthouse-dark-mode-guide.md)**: Detailed instructions for auditing.
- **[Web Auditing Alternatives](doc/development/analysis/web-auditing-alternatives.md)**: Information on using Axe-core with dark mode.
-- **[Accessibility Tests](frontend/e2e/accessibility.spec.ts)**: Automated examples using Playwright's `colorScheme`.
\ No newline at end of file
+- **[Accessibility Tests](frontend/e2e/accessibility.spec.ts)**: Automated examples using Playwright's `colorScheme`.
diff --git a/doc/development/analysis/web-auditing-alternatives.md b/doc/development/analysis/web-auditing-alternatives.md
index cb4e9b98e..0760c4c33 100644
--- a/doc/development/analysis/web-auditing-alternatives.md
+++ b/doc/development/analysis/web-auditing-alternatives.md
@@ -1,6 +1,6 @@
# Web Auditing Alternatives to Lighthouse
-While Lighthouse is a powerful and integrated tool for web auditing, other tools can provide more specialized or automated analysis for Performance, Accessibility, SEO, and Security. This guide outlines several alternatives and how they fit into the AngularAI development workflow.
+While Lighthouse is a powerful and integrated tool for web auditing, other tools can provide more specialized or automated analysis for Performance, Accessibility, SEO, and Security. This guide outlines several alternatives and how they fit into the GoodOne development workflow.
## 1. Accessibility (a11y) Specialized Tools
@@ -57,7 +57,7 @@ Snyk is excellent for scanning dependencies (similar to our OWASP Dependency-Che
| **WebPageTest** | Performance | Granular waterfall analysis & real-device testing. | Partial |
| **SonarCloud** | Quality/Security | Source code analysis and tech debt tracking. | Yes |
-## Recommendation for AngularAI
+## Recommendation for GoodOne
For this project, we recommend:
1. **Lighthouse** for general SEO and basic Accessibility checks.
diff --git a/doc/development/android/Android-Development.md b/doc/development/android/Android-Development.md
index 86aae1692..7d04dba30 100644
--- a/doc/development/android/Android-Development.md
+++ b/doc/development/android/Android-Development.md
@@ -1,6 +1,6 @@
# Android Application
-The AngularAI project includes a native Android companion app built with modern development tools.
+The GoodOne project includes a native Android companion app built with modern development tools.
## Key Technologies
diff --git a/doc/development/android/android-build.md b/doc/development/android/android-build.md
index da6d0c52f..5cb3b47c6 100644
--- a/doc/development/android/android-build.md
+++ b/doc/development/android/android-build.md
@@ -19,8 +19,8 @@ If you have **Gradle** installed on your system:
### Important: Connecting to the Backend
* **Emulator**: The app is pre-configured to use `http://10.0.2.2:8080/` to connect to a backend running on your host's `localhost:8080`.
-* **Physical Device**: You will need to update the `baseUrl` in `android/app/src/main/java/ch/goodone/angularai/android/di/NetworkModule.kt` to your computer's local IP address (e.g., `http://192.168.1.15:8080/`).
+* **Physical Device**: You will need to update the `baseUrl` in `android/app/src/main/java/ch/goodone/goodone/android/di/NetworkModule.kt` to your computer's local IP address (e.g., `http://192.168.1.15:8080/`).
Detailed instructions, including prerequisites and troubleshooting, can be found in [Android Development](./Android-Development.md).
-The main `README.md` has also been updated to include these instructions.
\ No newline at end of file
+The main `README.md` has also been updated to include these instructions.
diff --git a/doc/development/android/android-studio-instructions.md b/doc/development/android/android-studio-instructions.md
index a7ed9c829..73fd3e2b7 100644
--- a/doc/development/android/android-studio-instructions.md
+++ b/doc/development/android/android-studio-instructions.md
@@ -22,7 +22,7 @@ To complete the build, run tests, and fix issues in Android Studio using Gemini
- **Optimize UI**: Highlight a Compose function and ask: *"How can I improve the performance or accessibility of this Composable?"*
#### 4. Debugging and Fixes
-- **Logcat**: Use the `Logcat` window to monitor runtime logs. Filter by `package:mine` to see logs from the AngularAI app.
+- **Logcat**: Use the `Logcat` window to monitor runtime logs. Filter by `package:mine` to see logs from the GoodOne app.
- **Debugger**: Set breakpoints by clicking in the gutter next to the line numbers and use `Run > Debug 'app'` to step through the code.
- **Apply Changes**: Use the "Apply Changes" (Ctrl+Alt+F10) or "Apply Code Changes" (Ctrl+F10) icons to see your edits without a full app restart.
diff --git a/doc/development/aws-technical-reference.md b/doc/development/aws-technical-reference.md
index 8e522069d..0ca6efa59 100644
--- a/doc/development/aws-technical-reference.md
+++ b/doc/development/aws-technical-reference.md
@@ -1,6 +1,6 @@
# AWS Technical Reference
-This document serves as a technical reference for common AWS CLI operations performed in the AngularAI project. It consolidates commands and configurations used for infrastructure management, deployment, and troubleshooting.
+This document serves as a technical reference for common AWS CLI operations performed in the GoodOne project. It consolidates commands and configurations used for infrastructure management, deployment, and troubleshooting.
## 1. Environment Preparation
@@ -35,8 +35,8 @@ Create a secret to store application configuration.
```bash
aws secretsmanager create-secret \
- --name angularai-secrets \
- --description "Configuration for AngularAI" \
+ --name goodone-secrets \
+ --description "Configuration for GoodOne" \
--secret-string '{"JWT_SECRET":"your-secret-key"}' \
--region eu-central-1 \
--no-cli-pager
@@ -47,7 +47,7 @@ Update the secret values.
```bash
aws secretsmanager update-secret \
- --secret-id angularai-secrets \
+ --secret-id goodone-secrets \
--secret-string '{"JWT_SECRET":"new-secret-key"}' \
--region eu-central-1 \
--no-cli-pager
@@ -59,7 +59,7 @@ Fargate tasks pull secrets via `valueFrom` in the container definitions.
```json
{
"name": "JWT_SECRET",
- "valueFrom": "arn:aws:secretsmanager:eu-central-1:AWS_ACCOUNT_ID:secret:angularai-secrets:JWT_SECRET::"
+ "valueFrom": "arn:aws:secretsmanager:eu-central-1:AWS_ACCOUNT_ID:secret:goodone-secrets:JWT_SECRET::"
}
```
@@ -74,7 +74,7 @@ Create a security group that allows NFS traffic (port 2049) from the Backend Far
```bash
aws ec2 create-security-group \
- --group-name angularai-efs-sg \
+ --group-name goodone-efs-sg \
--description "Security group for EFS access from backend" \
--vpc-id $env:VPC_ID \
--region eu-central-1 \
@@ -96,7 +96,7 @@ Provision the file system and an access point for the H2 data.
```bash
aws efs create-file-system \
- --creation-token angularai-h2-data \
+ --creation-token goodone-h2-data \
--region eu-central-1 \
--no-cli-pager
```
@@ -130,11 +130,11 @@ aws efs create-mount-target \
Build and tag the image locally to establish a baseline before pushing.
```bash
-docker build -t angularai-app -f Dockerfile .
+docker build -t goodone-app -f Dockerfile .
```
```bash
-docker tag angularai-app:latest $env:AWS_ACCOUNT_ID.dkr.ecr.eu-central-1.amazonaws.com/angularai-app:latest
+docker tag goodone-app:latest $env:AWS_ACCOUNT_ID.dkr.ecr.eu-central-1.amazonaws.com/goodone-app:latest
```
### Authenticate and Push
@@ -145,7 +145,7 @@ aws ecr get-login-password --region eu-central-1 --no-cli-pager | docker login -
```
```bash
-docker push $env:AWS_ACCOUNT_ID.dkr.ecr.eu-central-1.amazonaws.com/angularai-app:latest
+docker push $env:AWS_ACCOUNT_ID.dkr.ecr.eu-central-1.amazonaws.com/goodone-app:latest
```
### Verify Running Baseline on AWS
@@ -153,7 +153,7 @@ Check which image Digest is currently deployed in the ECS service.
```bash
aws ecs describe-tasks \
- --cluster angular-boot \
+ --cluster goodone-cluster \
--tasks TASK_ID \
--region eu-central-1 \
--query "tasks[0].containers[0].imageDigest" \
@@ -169,8 +169,8 @@ Force a new deployment to pick up configuration changes or new images.
```bash
aws ecs update-service \
- --cluster angular-boot \
- --service angularai-backend-test-service \
+ --cluster goodone-cluster \
+ --service goodone-backend-test-service \
--force-new-deployment \
--region eu-central-1 \
--no-cli-pager
@@ -186,7 +186,7 @@ aws ecs register-task-definition \
### Register New Task Definition
```bash
-aws ecs update-service --cluster angular-boot --service angularai-backend-test-service --force-new-deployment --region eu-central-1 --no-cli-pager
+aws ecs update-service --cluster goodone-cluster --service goodone-backend-test-service --force-new-deployment --region eu-central-1 --no-cli-pager
```
---
@@ -198,8 +198,8 @@ Monitor the status of a deployment in real-time.
```bash
aws ecs wait services-stable \
- --cluster angular-boot \
- --services angularai-backend-test-service \
+ --cluster goodone-cluster \
+ --services goodone-backend-test-service \
--region eu-central-1 \
--no-cli-pager
```
@@ -208,7 +208,7 @@ aws ecs wait services-stable \
Stream logs from CloudWatch for a specific log group.
```bash
-aws logs tail /ecs/angularai-backend-test \
+aws logs tail /ecs/goodone-backend-test \
--follow \
--region eu-central-1 \
--no-cli-pager
@@ -271,7 +271,7 @@ Retrieve IDs for specific security groups.
```bash
aws ec2 describe-security-groups \
- --filters Name=group-name,Values=angularai-efs-sg \
+ --filters Name=group-name,Values=goodone-efs-sg \
--query "SecurityGroups[0].GroupId" \
--output text \
--region eu-central-1 \
@@ -283,7 +283,7 @@ Find the ARN for your target groups.
```bash
aws elbv2 describe-target-groups \
- --query "TargetGroups[?TargetGroupName=='angular-boot-backend'].TargetGroupArn" \
+ --query "TargetGroups[?TargetGroupName=='goodone-cluster-backend'].TargetGroupArn" \
--output text \
--region eu-central-1 \
--no-cli-pager
@@ -321,8 +321,8 @@ aws ecs list-clusters --region eu-central-1 --no-cli-pager
```bash
aws ecs list-tasks \
- --cluster angular-boot \
- --service angularai-backend-test-service \
+ --cluster goodone-cluster \
+ --service goodone-backend-test-service \
--region eu-central-1 \
--no-cli-pager
```
@@ -371,8 +371,8 @@ Because the application (Spring Boot) loads these secrets as environment variabl
```bash
aws ecs update-service \
- --cluster angular-boot \
- --service angularai-backend-test-service \
+ --cluster goodone-cluster \
+ --service goodone-backend-test-service \
--force-new-deployment \
--region eu-central-1 \
--no-cli-pager
@@ -382,36 +382,36 @@ Wait for the deployment to complete:
```bash
aws ecs wait services-stable \
- --cluster angular-boot \
- --services angularai-backend-test-service \
+ --cluster goodone-cluster \
+ --services goodone-backend-test-service \
--region eu-central-1 \
--no-cli-pager
```
```bash
-aws logs tail /ecs/angularai-backend-test --region eu-central-1 --no-cli-pager --since 1h
+aws logs tail /ecs/goodone-backend-test --region eu-central-1 --no-cli-pager --since 1h
```
```bash
docker compose logs --tail 100
-docker logs angularai-app-1
-docker logs angularai-app-1 --tail 100
+docker logs goodone-app-1
+docker logs goodone-app-1 --tail 100
docker ps
```
```bash
-docker logs angularai-app-1
+docker logs goodone-app-1
```
```bash
-aws logs tail /ecs/angularai-backend-test --region eu-central-1 --no-cli-pager > C:\temp\fargate_full_log.txt
+aws logs tail /ecs/goodone-backend-test --region eu-central-1 --no-cli-pager > C:\temp\fargate_full_log.txt
```
```bash
-aws logs describe-log-streams --log-group-name /ecs/angularai-backend-test --order-by LastEventTime --descending --limit 3 --region eu-central-1 --no-cli-pager
+aws logs describe-log-streams --log-group-name /ecs/goodone-backend-test --order-by LastEventTime --descending --limit 3 --region eu-central-1 --no-cli-pager
-aws ecs describe-services --cluster angular-boot --services angularai-backend-test-service --region eu-central-1 --no-cli-pager
+aws ecs describe-services --cluster goodone-cluster --services goodone-backend-test-service --region eu-central-1 --no-cli-pager
```
---
diff --git a/doc/development/backend/Backend-Development.md b/doc/development/backend/Backend-Development.md
index 5f5ef0813..d550c3d7c 100644
--- a/doc/development/backend/Backend-Development.md
+++ b/doc/development/backend/Backend-Development.md
@@ -20,7 +20,7 @@ To run the backend locally:
3. **Run with IntelliJ**:
- Open the project in IntelliJ IDEA.
- Use the **EnvFile** plugin to load the `.env` file.
- - Run `AngularAiBackendApplication`.
+ - Run `GoodoneBackendApplication`.
4. **Run with Maven**:
```bash
mvn clean install
@@ -37,14 +37,14 @@ The application uses H2 as the default database for local development and testin
- **Settings**:
- **Driver Class**: `org.h2.Driver`
- **JDBC URL (Memory)**: `jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1` (Default for local IDE runs)
- - **JDBC URL (File/Docker)**: `jdbc:h2:file:./data/angularai-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE` (When using Docker or `h2-file` profile)
+ - **JDBC URL (File/Docker)**: `jdbc:h2:file:./data/goodone-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE` (When using Docker or `h2-file` profile)
- **User Name**: `sa`
- **Password**: (leave empty)
**Important**: When accessing the H2 console, ensure the **JDBC URL** starts with `jdbc:h2:`. For example:
- `jdbc:h2:file:./data/angularai-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE` (default for Docker if using `./data`)
+ `jdbc:h2:file:./data/goodone-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE` (default for Docker if using `./data`)
or
- `jdbc:h2:file:./backend/data/angularai-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE` (default for local IDE/Maven runs)
+ `jdbc:h2:file:./backend/data/goodone-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE` (default for local IDE/Maven runs)
### Resetting the Database
If the database file becomes corrupted (e.g., due to improper shutdown or concurrent access), you can reset it by deleting the corrupted files.
@@ -56,8 +56,8 @@ If the database file becomes corrupted (e.g., due to improper shutdown or concur
**Manual Reset:**
Simply delete the following files in the project root:
-- `backend\data\angularai-v2.mv.db`
-- `backend\data\angularai-v2.trace.db` (if present)
+- `backend\data\goodone-v2.mv.db`
+- `backend\data\goodone-v2.trace.db` (if present)
The application will automatically recreate the schema and default data using Flyway on the next start.
diff --git a/doc/development/backend/postgres_setup.md b/doc/development/backend/postgres_setup.md
index deebcb655..19cf8cda9 100644
--- a/doc/development/backend/postgres_setup.md
+++ b/doc/development/backend/postgres_setup.md
@@ -5,7 +5,7 @@ An additional configuration file has been created at:
`backend/src/main/resources/application-postgres.properties`
This file is configured to connect to a local PostgreSQL instance:
-* **URL**: `jdbc:postgresql://localhost:5432/angularai`
+* **URL**: `jdbc:postgresql://localhost:5432/goodone`
* **Username/Password**: `postgres` / `postgres` (Default)
* **DDL Auto**: `update` (Automatically manages the schema)
@@ -26,16 +26,16 @@ Open your terminal or a tool like `pgAdmin` or `psql` and execute the following
```sql
-- Connect as the default postgres user
-- Create the database used in the properties file
-CREATE DATABASE angularai;
+CREATE DATABASE goodone;
```
#### Step C: Database Schema Initialization
You do **not** need to manually create tables or the schema.
The application is configured with `spring.jpa.hibernate.ddl-auto=update`. When you start the Spring Boot application with the `postgres` profile active:
-1. Hibernate will connect to the `angularai` database.
+1. Hibernate will connect to the `goodone` database.
2. It will automatically detect the entities (`User`, `Task`) defined in the code.
3. It will create the corresponding tables (`users`, `tasks`) and constraints (unique emails, etc.) if they do not exist.
### 3. Project Updates
* Updated `backend/pom.xml` to include the `org.postgresql:postgresql` runtime dependency.
-* The `DataInitializer` remains active and will populate your local PostgreSQL database with sample admin and user accounts upon the first successful startup.
\ No newline at end of file
+* The `DataInitializer` remains active and will populate your local PostgreSQL database with sample admin and user accounts upon the first successful startup.
diff --git a/doc/development/common/Development-Standards.md b/doc/development/common/Development-Standards.md
index 3b3eb8b68..e6522a02e 100644
--- a/doc/development/common/Development-Standards.md
+++ b/doc/development/common/Development-Standards.md
@@ -1,6 +1,6 @@
# Development Standards
-This document outlines the core principles, naming conventions, and best practices for the AngularAI project.
+This document outlines the core principles, naming conventions, and best practices for the GoodOne project.
## General Principles
@@ -13,8 +13,8 @@ This document outlines the core principles, naming conventions, and best practic
## Backend Standards (Spring Boot)
### Architecture
-- **Controllers**: RESTful controllers in `ch.goodone.angularai.backend.controller`.
-- **Models**: JPA entities in `ch.goodone.angularai.backend.model`.
+- **Controllers**: RESTful controllers in `ch.goodone.goodone.backend.controller`.
+- **Models**: JPA entities in `ch.goodone.goodone.backend.model`.
- **DTOs**: Use DTOs for API requests and responses to avoid leaking internal entity structures.
- **Migrations**: Always use Flyway for database schema changes.
diff --git a/doc/development/common/mcp-server.md b/doc/development/common/mcp-server.md
index 33da731ac..4206c666b 100644
--- a/doc/development/common/mcp-server.md
+++ b/doc/development/common/mcp-server.md
@@ -1,9 +1,9 @@
# MCP Server Implementation Plan
-This document outlines the plan for implementing a Model Context Protocol (MCP) server for the AngularAI project. The goal is to provide AI assistants with specialized tools to interact with the project's codebase, documentation, and running services.
+This document outlines the plan for implementing a Model Context Protocol (MCP) server for the GoodOne project. The goal is to provide AI assistants with specialized tools to interact with the project's codebase, documentation, and running services.
## 1. Project Overview
-The MCP server will be a small, lightweight service that exposes a set of tools to MCP-compatible clients (like IDEs or AI chat interfaces). It will act as a bridge between the AI and the AngularAI ecosystem.
+The MCP server will be a small, lightweight service that exposes a set of tools to MCP-compatible clients (like IDEs or AI chat interfaces). It will act as a bridge between the AI and the GoodOne ecosystem.
## 2. Proposed Tools (Top 5+)
diff --git a/doc/development/devops/sonar-console-stall.md b/doc/development/devops/sonar-console-stall.md
index e92a1ee35..752faf3c5 100644
--- a/doc/development/devops/sonar-console-stall.md
+++ b/doc/development/devops/sonar-console-stall.md
@@ -7,7 +7,7 @@
### Concrete changes you now have locally
- Backend test properties consolidated and made safe: `backend/src/test/resources/test-common.properties` (Flyway off, AWS off, AI off, Envers fix, payload limits, etc.).
- Deleted the conflicting `application-test.properties` and ensured it won’t be resurrected by using clean builds.
-- Added async executor with daemon threads: `backend/src/main/java/ch/goodone/angularai/backend/config/AsyncConfig.java`.
+- Added async executor with daemon threads: `backend/src/main/java/ch/goodone/goodone/backend/config/AsyncConfig.java`.
- Made “prod/postgres” style tests safe (no AWS, Envers fixed) and aligned lots of tests to `@ActiveProfiles("test")` + `@TestPropertySource(test-common.properties)`.
- Updated `scripts/sonar-analysis.ps1` to run Maven in batch/non‑interactive mode, and to clean the build first:
- Now runs: `mvn -B -ntp clean verify sonar:sonar ... -DAI_EMBEDDING_ENABLED=false -DDOCS_REINDEX_ON_STARTUP=false`
@@ -48,4 +48,4 @@ mvn -B -ntp clean
- The H2 PostgreSQL-mode Envers `TINYINT` issue is handled by setting `spring.jpa.properties.hibernate.envers.revision_type_column_type=integer` where needed.
- Prod-like tests were explicitly protected from AWS Secrets Manager lookups to avoid timeouts.
-If anything still blocks, please paste the very last 30–50 log lines from PowerShell so I can pinpoint the next blocker immediately.
\ No newline at end of file
+If anything still blocks, please paste the very last 30–50 log lines from PowerShell so I can pinpoint the next blocker immediately.
diff --git a/doc/development/devops/sonar-integration.md b/doc/development/devops/sonar-integration.md
index b6493a437..47c31c2ea 100644
--- a/doc/development/devops/sonar-integration.md
+++ b/doc/development/devops/sonar-integration.md
@@ -11,7 +11,7 @@ TypeScript, Java, and other supported languages.
## Prerequisites
- A SonarCloud account
-- Access to the project: `JuergGood_angularai`
+- Access to the project: `JuergGood_goodone`
- `curl` installed
- A SonarCloud **user token**
@@ -80,7 +80,7 @@ This script will load the `SONAR_TOKEN` from your `.env` file and save the issue
```bash
# Load token and call API manually
export SONAR_TOKEN=$(grep SONAR_TOKEN .env | cut -d '=' -f2)
-curl -k -u "$SONAR_TOKEN:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&ps=500" -o sonar-issues.json
+curl -k -u "$SONAR_TOKEN:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&ps=500" -o sonar-issues.json
```
### Manual API Call
@@ -88,7 +88,7 @@ If you prefer to run the command manually:
#### Windows (PowerShell)
```powershell
-curl.exe -k -u "${env:SONAR_TOKEN}:" https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&ps=500 -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&ps=500 -o sonar-issues.json
```
---
@@ -162,7 +162,7 @@ $env:Path = "$($env:JAVA_HOME)\bin;" + $env:Path
```bash
# 2. Run the analysis (Ensure you are in the project root)
# Using -D"key=value" is the most robust way for PowerShell + IDE runners
-cd C:\doc\sw\ai\angularai\angularai
+cd C:\doc\sw\ai\goodone\goodone
mvn verify sonar:sonar -DskipTests -D"sonar.token=$env:SONAR_TOKEN"
```
diff --git a/doc/development/frontend/Frontend-Development.md b/doc/development/frontend/Frontend-Development.md
index 6dcec02c1..e1d0075c9 100644
--- a/doc/development/frontend/Frontend-Development.md
+++ b/doc/development/frontend/Frontend-Development.md
@@ -48,4 +48,4 @@ For more details, see [Updating Documentation Screenshots](Updating-Documentatio
Run lint:
```bash
npm run lint
-```
\ No newline at end of file
+```
diff --git a/doc/development/frontend/ui-primitives.md b/doc/development/frontend/ui-primitives.md
index 1befcbd09..0595995bf 100644
--- a/doc/development/frontend/ui-primitives.md
+++ b/doc/development/frontend/ui-primitives.md
@@ -1,6 +1,6 @@
# UI Primitives & CSS Design System
-This document outlines the standard UI primitives and CSS design system for the AngularAI project to ensure visual consistency and reduce CSS debt.
+This document outlines the standard UI primitives and CSS design system for the GoodOne project to ensure visual consistency and reduce CSS debt.
## Spacing Rhythm
diff --git a/doc/development/security/aws-waf-costs.md b/doc/development/security/aws-waf-costs.md
index e8aa8d445..b11687117 100644
--- a/doc/development/security/aws-waf-costs.md
+++ b/doc/development/security/aws-waf-costs.md
@@ -27,4 +27,4 @@ For a typical deployment with:
* 2 Million requests per month ($1.20)
* **Total Estimated Cost:** **$11.20 USD per month**.
-*Note: Prices vary slightly by region. The figures above reflect standard pricing for major regions like `us-east-1` and `eu-central-1`.*
\ No newline at end of file
+*Note: Prices vary slightly by region. The figures above reflect standard pricing for major regions like `us-east-1` and `eu-central-1`.*
diff --git a/doc/development/security/csrf-hardening-drawback.md b/doc/development/security/csrf-hardening-drawback.md
index 7457dbdcd..dd8ec459d 100644
--- a/doc/development/security/csrf-hardening-drawback.md
+++ b/doc/development/security/csrf-hardening-drawback.md
@@ -31,4 +31,4 @@ Moving away from flexible patterns to a strict, hardcoded allowlist has these ma
| **HTTPS Everywhere** | Protects credentials and session tokens in transit. | High friction for local development and proxy setup. |
| **CORS Allowlist** | Prevents unauthorized cross-site data access. | High maintenance burden and deployment friction. |
-For the **AngularAI** project, these measures are recommended for the final production rollout, but keeping the current flexible configuration is often preferred during the active development and rapid prototyping phase.
\ No newline at end of file
+For the **GoodOne** project, these measures are recommended for the final production rollout, but keeping the current flexible configuration is often preferred during the active development and rapid prototyping phase.
diff --git a/doc/development/security/lightweight-threat-model.md b/doc/development/security/lightweight-threat-model.md
index 4df286e92..6f2d4f477 100644
--- a/doc/development/security/lightweight-threat-model.md
+++ b/doc/development/security/lightweight-threat-model.md
@@ -1,10 +1,10 @@
-# Lightweight Threat Model: AngularAI
+# Lightweight Threat Model: GoodOne
-This document provides a concise security assessment of the AngularAI project, focusing on assets, entry points, trust boundaries, and the top 5 threats.
+This document provides a concise security assessment of the GoodOne project, focusing on assets, entry points, trust boundaries, and the top 5 threats.
## 1. System Overview & Assets
-AngularAI is a modern web application (Angular frontend, Spring Boot backend) deployed on AWS Fargate.
+GoodOne is a modern web application (Angular frontend, Spring Boot backend) deployed on AWS Fargate.
### Primary Assets
- **User Data:** Authentication credentials (hashed), user profiles, and session information.
diff --git a/doc/development/security/s3-gateway-endpoint-setup.md b/doc/development/security/s3-gateway-endpoint-setup.md
index 742a53df1..1becbf58e 100644
--- a/doc/development/security/s3-gateway-endpoint-setup.md
+++ b/doc/development/security/s3-gateway-endpoint-setup.md
@@ -32,7 +32,7 @@ resource "aws_vpc_endpoint" "s3" {
]
tags = {
- Name = "angularai-s3-gateway"
+ Name = "goodone-s3-gateway"
}
}
```
@@ -72,4 +72,4 @@ I have successfully configured the S3 Gateway Endpoint using the AWS CLI and upd
3. **Documentation Update**: Modified `doc/development/security/s3-gateway-endpoint-setup.md` to include a new section for AWS CLI implementation, providing clear steps and commands for users.
4. **Final Check**: Verified that the routes for S3 (via Prefix List `pl-6ea54007`) are now active in both route tables.
-The system is now fully configured for private, no-cost traffic to S3 within the `angular-boot` VPC.
\ No newline at end of file
+The system is now fully configured for private, no-cost traffic to S3 within the `goodone-cluster` VPC.
diff --git a/doc/development/security/security-assessment.md b/doc/development/security/security-assessment.md
index 0b26dabb6..7782021b7 100644
--- a/doc/development/security/security-assessment.md
+++ b/doc/development/security/security-assessment.md
@@ -1,10 +1,10 @@
# Security Assessment
-This document provides a security assessment of the AngularAI project, covering both the frontend (Angular) and backend (Spring Boot) modules. It identifies current security measures, potential vulnerabilities, and recommended metrics for ongoing monitoring.
+This document provides a security assessment of the GoodOne project, covering both the frontend (Angular) and backend (Spring Boot) modules. It identifies current security measures, potential vulnerabilities, and recommended metrics for ongoing monitoring.
## 1. Executive Summary
-The AngularAI project implements several core security features, including role-based access control (RBAC), password hashing with BCrypt, and action logging for auditing. However, the current implementation relies on HTTP Basic authentication and has CSRF protection disabled, which are areas for improvement as the project matures towards production readiness.
+The GoodOne project implements several core security features, including role-based access control (RBAC), password hashing with BCrypt, and action logging for auditing. However, the current implementation relies on HTTP Basic authentication and has CSRF protection disabled, which are areas for improvement as the project matures towards production readiness.
## 2. Methodology
@@ -49,7 +49,7 @@ To maintain a strong security posture, the following metrics are recommended for
## 5. OWASP Reference Mapping
-| AngularAI Component | OWASP Top 10 Reference | Status |
+| GoodOne Component | OWASP Top 10 Reference | Status |
|--------------------|------------------------|--------|
| AuthController / SecurityConfig | A01:2021-Broken Access Control | Partially Implemented (RBAC exists, but CSRF is off) |
| BCrypt / Password Storage | A02:2021-Cryptographic Failures | Implemented |
diff --git a/doc/development/security/security-roadmap-2.md b/doc/development/security/security-roadmap-2.md
index bf973b8a8..155d7500b 100644
--- a/doc/development/security/security-roadmap-2.md
+++ b/doc/development/security/security-roadmap-2.md
@@ -1,6 +1,6 @@
# Security Improvement Roadmap - Level 2 (Advanced) [DONE]
-Building upon the successful implementation of the initial security roadmap, this document outlines Level 2 improvements that have been fully implemented to further harden the AngularAI ecosystem.
+Building upon the successful implementation of the initial security roadmap, this document outlines Level 2 improvements that have been fully implemented to further harden the GoodOne ecosystem.
## Phase 1: Defensive Hardening [COMPLETED]
@@ -42,7 +42,7 @@ Building upon the successful implementation of the initial security roadmap, thi
### 3.2 Database Persistence (Fargate/H2) [DONE]
- **Implemented**: Added `h2-file` Spring profile.
-- **Config**: Mounts H2 database to `./data/angularai` for persistence across container restarts.
+- **Config**: Mounts H2 database to `./data/goodone` for persistence across container restarts.
### 3.3 Container & Dependency Security Scanning [DONE]
- **Implemented**: Integration of **Trivy** and **Snyk** into the GitHub Actions pipeline (`code-review.yml`).
diff --git a/doc/development/security/security-roadmap-3.md b/doc/development/security/security-roadmap-3.md
index 34754399f..e8a389eba 100644
--- a/doc/development/security/security-roadmap-3.md
+++ b/doc/development/security/security-roadmap-3.md
@@ -263,4 +263,4 @@ If the ~$30 - $60 / month for NAT/Endpoints is too high for a test environment,
### Summary of Choice
* **Maximum Security (Roadmap 3)**: Private Subnets + VPC Endpoints/NAT. (~$60+/month).
-* **Cost Optimized**: Public Subnets + Strict Security Groups + S3 Gateway Endpoint. (~$0.00 extra/month).
\ No newline at end of file
+* **Cost Optimized**: Public Subnets + Strict Security Groups + S3 Gateway Endpoint. (~$0.00 extra/month).
diff --git a/doc/development/security/security-roadmap-4.md b/doc/development/security/security-roadmap-4.md
index b0f40a671..3fcba3ea8 100644
--- a/doc/development/security/security-roadmap-4.md
+++ b/doc/development/security/security-roadmap-4.md
@@ -5,7 +5,7 @@ The following improvements can be implemented with minimal or no additional AWS
1. **S3 Gateway Endpoint:** Move S3 traffic to a private route ($0.00).
**Status: DONE** (Documentation provided in `doc/development/security/s3-gateway-endpoint-setup.md`)
2. **Enhanced IAM Scoping:** Further split the ECS Execution Role from the Task Role to enforce stricter least privilege.
- **Status: DONE** (Task definitions updated to use separate roles: `angularai-backend-execution-role` and `angularai-backend-task-role`)
+ **Status: DONE** (Task definitions updated to use separate roles: `goodone-backend-execution-role` and `goodone-backend-task-role`)
3. **Automated Security Reports:** Weekly automated summaries from Snyk/Trivy scans.
**Status: DONE** (Updated `.github/workflows/code-review.yml` with a "Generate Security Summary" step)
4. **Custom WAF Logic (Simulated):** Implement more advanced application-level request filtering in the Spring Boot `OncePerRequestFilter` to mimic WAF behavior without the cost.
@@ -41,4 +41,4 @@ The following improvements can be implemented with minimal or no additional AWS
**Expected Result:** 403 Forbidden.
## Iteration 1
-Implemented all hardening measures requested. The `WafSimulatedFilter` provides a basic but effective layer of protection. IAM role splitting ensures the principle of least privilege is followed at the infrastructure level. CI/CD integration provides visibility into security posture.
\ No newline at end of file
+Implemented all hardening measures requested. The `WafSimulatedFilter` provides a basic but effective layer of protection. IAM role splitting ensures the principle of least privilege is followed at the infrastructure level. CI/CD integration provides visibility into security posture.
diff --git a/doc/development/security/security-roadmap.md b/doc/development/security/security-roadmap.md
index bcbd91be9..a3ba48762 100644
--- a/doc/development/security/security-roadmap.md
+++ b/doc/development/security/security-roadmap.md
@@ -1,6 +1,6 @@
# Security Improvement Roadmap
-Based on the [Security Assessment](security-assessment.md), the following improvements are proposed to enhance the security posture of the AngularAI project.
+Based on the [Security Assessment](security-assessment.md), the following improvements are proposed to enhance the security posture of the GoodOne project.
## Phase 1: High Priority (Short Term)
diff --git a/doc/development/security/snyk-integration-guide.md b/doc/development/security/snyk-integration-guide.md
index 54a3d9134..94d6bbf78 100644
--- a/doc/development/security/snyk-integration-guide.md
+++ b/doc/development/security/snyk-integration-guide.md
@@ -1,6 +1,6 @@
# Snyk Integration Guide
-This guide explains how to properly integrate Snyk for security scanning in the AngularAI project's CI/CD pipeline.
+This guide explains how to properly integrate Snyk for security scanning in the GoodOne project's CI/CD pipeline.
## 1. Obtain a Snyk API Token
diff --git a/doc/development/security/transmitting-snyk-results.md b/doc/development/security/transmitting-snyk-results.md
index 698ab207d..b5917aee9 100644
--- a/doc/development/security/transmitting-snyk-results.md
+++ b/doc/development/security/transmitting-snyk-results.md
@@ -55,7 +55,7 @@ The **SARIF** (Static Analysis Results Interchange Format) is the best way to tr
**For Containers:**
```bash
- snyk-win container test angularai-app:latest --sarif > snyk-container.sarif.json
+ snyk-win container test goodone-app:latest --sarif > snyk-container.sarif.json
```
2. **Upload/Commit the file** to the repository (e.g., in a `tmp/snyk/` folder).
diff --git a/doc/development/snyk-frontend.sarif.json b/doc/development/snyk-frontend.sarif.json
index ce4143278..abcabb3b9 100644
Binary files a/doc/development/snyk-frontend.sarif.json and b/doc/development/snyk-frontend.sarif.json differ
diff --git a/doc/development/ux-improvement/reduce-styling-iterations.md b/doc/development/ux-improvement/reduce-styling-iterations.md
index 0e2cc48ed..3325f2bf0 100644
--- a/doc/development/ux-improvement/reduce-styling-iterations.md
+++ b/doc/development/ux-improvement/reduce-styling-iterations.md
@@ -19,4 +19,4 @@ To avoid these iteration loops in the future, I have documented the following "l
* **Theme Stability in E2E**: I will always include a "settling period" after toggling themes in automated tests to ensure consistent rendering for snapshots.
* **Variant Coverage**: I will proactively audit all four Material button variants (Basic, Raised, Flat, Unelevated) whenever a global style change is requested, as they often behave differently under the hood.
-I apologize for the frustration caused by the repeated attempts. These improvements have now been integrated into my workflow and the project's guardrail suite to prevent similar issues from recurring.
\ No newline at end of file
+I apologize for the frustration caused by the repeated attempts. These improvements have now been integrated into my workflow and the project's guardrail suite to prevent similar issues from recurring.
diff --git a/doc/development/ux-improvement/sidenav-toggle.md b/doc/development/ux-improvement/sidenav-toggle.md
index 9c7dab47c..55eec4813 100644
--- a/doc/development/ux-improvement/sidenav-toggle.md
+++ b/doc/development/ux-improvement/sidenav-toggle.md
@@ -44,4 +44,4 @@ Material sometimes uses a CSS variable (e.g., `--mat-drawer-content-margin`) to
2) `.mat-sidenav-content`/`.mat-drawer-content` computed `margin-left` (and from where: inline/CSS var/rule)
3) `.mat-sidenav-container` computed `background-color`
-With those three data points we can ship the precise fix (likely syncing the content margin with the collapsed 76px — either via a CSS variable override tied to the collapsed state, or toggling the drawer’s mode/state so Angular Material updates the margin automatically).
\ No newline at end of file
+With those three data points we can ship the precise fix (likely syncing the content margin with the collapsed 76px — either via a CSS variable override tied to the collapsed state, or toggling the drawer’s mode/state so Angular Material updates the margin automatically).
diff --git a/doc/development/ux-improvement/ux-review-assets-logs.md b/doc/development/ux-improvement/ux-review-assets-logs.md
index c23f37802..cf2dda2a5 100644
--- a/doc/development/ux-improvement/ux-review-assets-logs.md
+++ b/doc/development/ux-improvement/ux-review-assets-logs.md
@@ -32,4 +32,4 @@ I’ll adjust the Playwright docs generator to:
Once confirmed, I’ll update the spec accordingly and re-run:
- `cd frontend`
- `npx playwright test e2e/ux-review-docs.spec.ts --reporter=line`
-…to regenerate `doc/ux-review/assets/logs-mobile-dark.png` and `logs-mobile-light.png` with actual content.
\ No newline at end of file
+…to regenerate `doc/ux-review/assets/logs-mobile-dark.png` and `logs-mobile-light.png` with actual content.
diff --git a/doc/history/README.md b/doc/history/README.md
index de45e769c..70df487cd 100644
--- a/doc/history/README.md
+++ b/doc/history/README.md
@@ -1,6 +1,6 @@
# Project History & Archive
-This directory serves as a central repository for the evolution of the AngularAI project. It preserves historical implementation plans, architectural proposals, and development milestones that demonstrate the "Power of AI development" throughout the project's lifecycle.
+This directory serves as a central repository for the evolution of the GoodOne project. It preserves historical implementation plans, architectural proposals, and development milestones that demonstrate the "Power of AI development" throughout the project's lifecycle.
## 📂 Archive Structure
diff --git a/doc/history/feature-archive/AI-ARCH-19-Score-captcha-explain.md b/doc/history/feature-archive/AI-ARCH-19-Score-captcha-explain.md
index 7f52fe890..34138f92d 100644
--- a/doc/history/feature-archive/AI-ARCH-19-Score-captcha-explain.md
+++ b/doc/history/feature-archive/AI-ARCH-19-Score-captcha-explain.md
@@ -224,4 +224,4 @@ Avoid overengineering. We want a clean migration, not a security framework rewri
- Prefer targeted refactoring over broad rewrites.
- Reuse existing service boundaries where reasonable.
- Keep the solution understandable for future maintainers.
-- Highlight any assumptions explicitly if parts of the current implementation are unclear from the codebase.
\ No newline at end of file
+- Highlight any assumptions explicitly if parts of the current implementation are unclear from the codebase.
diff --git a/doc/history/feature-archive/Code_review_quodora.md b/doc/history/feature-archive/Code_review_quodora.md
index e8f8c060a..b6d157ca0 100644
--- a/doc/history/feature-archive/Code_review_quodora.md
+++ b/doc/history/feature-archive/Code_review_quodora.md
@@ -37,4 +37,4 @@ If you want to focus specifically on the "Software Bill of Materials" (SBOM).
### Summary Recommendation
I suggest starting by activating **Qodana** (since you already have the config) and **SonarCloud**. This combination gives you the best "Visual Dashboard" experience for both general code quality and security.
-Would you like me to help you set up a GitHub Action to automate any of these?
\ No newline at end of file
+Would you like me to help you set up a GitHub Action to automate any of these?
diff --git a/doc/history/feature-archive/action-log-menu-detail.md b/doc/history/feature-archive/action-log-menu-detail.md
index 2ce83f1fb..30fa6f8b7 100644
--- a/doc/history/feature-archive/action-log-menu-detail.md
+++ b/doc/history/feature-archive/action-log-menu-detail.md
@@ -21,7 +21,7 @@ Extend `ActionLogRepository` to support filtering and paging.
- Date range (from/to `LocalDateTime`).
##### 2.3. `ActionLogController`
-Create `ch.goodone.angularai.backend.controller.ActionLogController` with the following endpoints:
+Create `ch.goodone.goodone.backend.controller.ActionLogController` with the following endpoints:
- `GET /api/admin/logs`: Returns a paged and filtered list of `ActionLogDTO`.
- Parameters: `page`, `size`, `sort`, `type`, `startDate`, `endDate`.
- `DELETE /api/admin/logs`: Deletes all log entries (requires admin confirmation from UI).
diff --git a/doc/history/feature-archive/android-cr-1.md b/doc/history/feature-archive/android-cr-1.md
index 483782e1a..008ac20d3 100644
--- a/doc/history/feature-archive/android-cr-1.md
+++ b/doc/history/feature-archive/android-cr-1.md
@@ -12,7 +12,7 @@ I have addressed all the identified defects and implemented the requested change
* **Profile**: Added a "Profile" item to the navigation drawer for easy access to user details.
#### 3. Branding & Header Styling (CR 1 & 3)
-* **Title**: Changed the application title from "AngularAI" to **"GoodOne"**.
+* **Title**: Changed the application title from "GoodOne" to **"GoodOne"**.
* **Color Scheme**: Updated the `TopAppBar` (header) and the Navigation Drawer header to use a vibrant **Indigo Blue** (`#1A237E`) background with white text.
* **Iconography**: Added the **"1" logo** (`filter_1` icon in pink) next to the "GoodOne" title in the navigation drawer header, matching the Angular UI's branding.
@@ -28,4 +28,4 @@ I have addressed all the identified defects and implemented the requested change
* **System API Integration**: Created `SystemApi`, `SystemRepository`, and `SystemInfoDTO` on the Android side to communicate with the backend's system info endpoint.
* **Navigation**: Refined navigation routes to support passing and retrieving numeric IDs for editing operations.
-Please rebuild the project in Android Studio to see these changes in action!
\ No newline at end of file
+Please rebuild the project in Android Studio to see these changes in action!
diff --git a/doc/history/feature-archive/android-frontend.md b/doc/history/feature-archive/android-frontend.md
index 7d76158f6..f48d464d8 100644
--- a/doc/history/feature-archive/android-frontend.md
+++ b/doc/history/feature-archive/android-frontend.md
@@ -1,6 +1,6 @@
# Proposal: Android Frontend Implementation (Jetpack Compose)
-This document outlines the plan for developing an alternative Android frontend for the AngularAI application using modern Android technologies.
+This document outlines the plan for developing an alternative Android frontend for the GoodOne application using modern Android technologies.
## 1. Objective
Create a native Android application that mirrors the features and UX of the existing Angular web application, communicating with the same Spring Boot REST API.
diff --git a/doc/history/feature-archive/android-task-sorting-and-logs.md b/doc/history/feature-archive/android-task-sorting-and-logs.md
index bb7825fee..a198a4ab8 100644
--- a/doc/history/feature-archive/android-task-sorting-and-logs.md
+++ b/doc/history/feature-archive/android-task-sorting-and-logs.md
@@ -6,11 +6,11 @@ This proposal outlines the implementation of the "Log" menu item and enhancement
#### 2. Log Menu Implementation
##### 2.1. Data Layer
-- **`ActionLogDTO`**: Create `ch.goodone.angularai.android.data.remote.dto.ActionLogDTO` with fields: `id`, `timestamp`, `login`, `action`, `details`.
-- **`LogApi`**: Create `ch.goodone.angularai.android.data.remote.LogApi` with:
+- **`ActionLogDTO`**: Create `ch.goodone.goodone.android.data.remote.dto.ActionLogDTO` with fields: `id`, `timestamp`, `login`, `action`, `details`.
+- **`LogApi`**: Create `ch.goodone.goodone.android.data.remote.LogApi` with:
- `GET api/admin/logs`: returns paged results (need a `LogResponseDTO` similar to Angular's `ActionLogResponse`).
- `DELETE api/admin/logs`: clears logs.
-- **`LogRepository`**: Create `ch.goodone.angularai.android.data.repository.LogRepository` to handle API calls.
+- **`LogRepository`**: Create `ch.goodone.goodone.android.data.repository.LogRepository` to handle API calls.
##### 2.2. UI Layer
- **`LogViewModel`**: Manage state for logs, filtering (type, date range), and paging.
diff --git a/doc/history/feature-archive/captcha-google.md b/doc/history/feature-archive/captcha-google.md
index 07d52a3ec..281611cfb 100644
--- a/doc/history/feature-archive/captcha-google.md
+++ b/doc/history/feature-archive/captcha-google.md
@@ -33,4 +33,4 @@ For the future, if you want a completely seamless UX (no checkbox at all), you c
**Next Steps:**
1. Copy the keys from `doc/ai/login/captcha-google.txt` to your local `.env` file.
-2. Note that you still need a **Google Cloud API Key** (with reCAPTCHA Enterprise API enabled) to fill the `RECAPTCHA_API_KEY` field for the backend to successfully verify Enterprise tokens.
\ No newline at end of file
+2. Note that you still need a **Google Cloud API Key** (with reCAPTCHA Enterprise API enabled) to fill the `RECAPTCHA_API_KEY` field for the backend to successfully verify Enterprise tokens.
diff --git a/doc/history/feature-archive/captcha-google2.md b/doc/history/feature-archive/captcha-google2.md
index 04e6445d0..a6197261d 100644
--- a/doc/history/feature-archive/captcha-google2.md
+++ b/doc/history/feature-archive/captcha-google2.md
@@ -29,4 +29,4 @@ RECAPTCHA_API_KEY=YOUR_GOOGLE_CLOUD_API_KEY
RECAPTCHA_SECRET_KEY=disabled
```
-**Note:** If you get an error during registration, double-check that the **reCAPTCHA Enterprise API** is enabled in your Google Cloud project.
\ No newline at end of file
+**Note:** If you get an error during registration, double-check that the **reCAPTCHA Enterprise API** is enabled in your Google Cloud project.
diff --git a/doc/history/feature-archive/captcha-usage.md b/doc/history/feature-archive/captcha-usage.md
index 567b73bc3..005dbc2a3 100644
--- a/doc/history/feature-archive/captcha-usage.md
+++ b/doc/history/feature-archive/captcha-usage.md
@@ -21,4 +21,4 @@ I have updated the `.env.example` file to include these keys so you can easily c
RECAPTCHA_SITE_KEY=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
RECAPTCHA_SECRET_KEY=disabled
```
-*(Note: The `RECAPTCHA_SITE_KEY` above is Google's public test key, which is safe to use for testing UI rendering.)*
\ No newline at end of file
+*(Note: The `RECAPTCHA_SITE_KEY` above is Google's public test key, which is safe to use for testing UI rendering.)*
diff --git a/doc/history/feature-archive/captcha-visible.md b/doc/history/feature-archive/captcha-visible.md
index 748afc849..7f34fb637 100644
--- a/doc/history/feature-archive/captcha-visible.md
+++ b/doc/history/feature-archive/captcha-visible.md
@@ -56,4 +56,4 @@ docker compose up --build
### If you prefer score (invisible) locally
- Set `RECAPTCHA_DEFAULT_CONFIG=1` and provide enterprise keys for index 1 (projectId/apiKey). Without real keys, score mode will not execute; visible won’t render either. For local dev, the recommended setup is the visible + dummy approach shown above.
-If you want me to wire these `.env` defaults into `docker-compose.yml` (commented examples) or provide a quick check script, tell me and I’ll add it.
\ No newline at end of file
+If you want me to wire these `.env` defaults into `docker-compose.yml` (commented examples) or provide a quick check script, tell me and I’ll add it.
diff --git a/doc/history/feature-archive/cypress-coverage-report.md b/doc/history/feature-archive/cypress-coverage-report.md
index e14fa0793..b89377a6b 100644
--- a/doc/history/feature-archive/cypress-coverage-report.md
+++ b/doc/history/feature-archive/cypress-coverage-report.md
@@ -49,4 +49,4 @@ A full HTML report has been generated in `frontend/coverage/lcov-report/index.ht
2. Open `index.html` in your web browser.
3. You can now click through individual files to see exactly which lines of code were executed (green) and which were missed (red).
-**Note:** Since I cannot run the browser/server in this environment, the summary above is a representative example based on the typical coverage of the current test suite. Run the commands locally to see your actual real-time metrics!
\ No newline at end of file
+**Note:** Since I cannot run the browser/server in this environment, the summary above is a representative example based on the typical coverage of the current test suite. Run the commands locally to see your actual real-time metrics!
diff --git a/doc/history/feature-archive/db-increment.md b/doc/history/feature-archive/db-increment.md
index b33c5d3d1..1b2d655d8 100644
--- a/doc/history/feature-archive/db-increment.md
+++ b/doc/history/feature-archive/db-increment.md
@@ -1,6 +1,6 @@
# Proposal: Database Increment Handling (Flyway & Room)
-This document outlines the strategy for managing database schema changes (increments) for the AngularAI project, covering both the Spring Boot backend (Postgres) and the Android mobile client (Room).
+This document outlines the strategy for managing database schema changes (increments) for the GoodOne project, covering both the Spring Boot backend (Postgres) and the Android mobile client (Room).
## 1. Backend: Recommendation & Setup (Flyway)
diff --git a/doc/history/feature-archive/parsing_advice.md b/doc/history/feature-archive/parsing_advice.md
index 08f9c1f21..d3b701249 100644
--- a/doc/history/feature-archive/parsing_advice.md
+++ b/doc/history/feature-archive/parsing_advice.md
@@ -20,7 +20,7 @@ The parsing logic has been moved to the backend to ensure consistency across all
### 1. Unified Logic in Backend
The `TaskParserService` in the Spring Boot backend now handles both heuristic (space-based) and structured (separator-based) parsing.
-- **Location**: `ch.goodone.angularai.backend.service.TaskParserService`
+- **Location**: `ch.goodone.goodone.backend.service.TaskParserService`
- **Supported Formats**:
- `Title | Description | Due Date | Priority | Status` (Separators: `|`, `;`, `,`)
- `Title [Date] [Priority] [Status]` (Heuristic space-based)
diff --git a/doc/history/feature-archive/password-recovery.md b/doc/history/feature-archive/password-recovery.md
index 683b22afe..3af2b6714 100644
--- a/doc/history/feature-archive/password-recovery.md
+++ b/doc/history/feature-archive/password-recovery.md
@@ -1,6 +1,6 @@
# Password Recovery Workflow Proposal
-This document outlines the proposed workflow for the "Forgot Password" feature in the AngularAI project.
+This document outlines the proposed workflow for the "Forgot Password" feature in the GoodOne project.
## 1. Overview
The password recovery process allows users who have forgotten their password to securely reset it using a link sent to their registered email address.
@@ -19,7 +19,7 @@ The password recovery process allows users who have forgotten their password to
1. **Verification**: Backend checks if the email exists.
2. **Token Generation**: If the user exists, generate a cryptographically secure, time-limited recovery token (e.g., valid for 1 hour).
3. **Email Dispatch**: Send an HTML-formatted email to the user.
- * **Subject**: Password Recovery - AngularAI
+ * **Subject**: Password Recovery - GoodOne
* **Content**: Contains a link to `https:///reset-password?token=`.
### Step 3: Password Reset
diff --git a/doc/history/feature-archive/powershell-in-markdown.md b/doc/history/feature-archive/powershell-in-markdown.md
index 5856396d3..281befbe3 100644
--- a/doc/history/feature-archive/powershell-in-markdown.md
+++ b/doc/history/feature-archive/powershell-in-markdown.md
@@ -65,4 +65,4 @@ Given your specific version (2025.3.2), the functionality you are looking for is
I have finalized the project guidelines in `.junie/guidelines.md` to reflect that `bash` is the only tag currently capable of producing a native Run icon in this project, despite our efforts to enable `powershell`.
-I understand this is not the ideal "click the icon" solution you wanted for the `powershell` tag, but it is the current state of compatibility for build #IU-253.30387.90.
\ No newline at end of file
+I understand this is not the ideal "click the icon" solution you wanted for the `powershell` tag, but it is the current state of compatibility for build #IU-253.30387.90.
diff --git a/doc/history/feature-archive/rest-ui.md b/doc/history/feature-archive/rest-ui.md
index b93cc109d..37f2fcfed 100644
--- a/doc/history/feature-archive/rest-ui.md
+++ b/doc/history/feature-archive/rest-ui.md
@@ -1,6 +1,6 @@
# Proposal: REST API Web UI Integration
-This document proposes integrating a web-based UI to expose and document the REST API of the AngularAI application.
+This document proposes integrating a web-based UI to expose and document the REST API of the GoodOne application.
## 1. Objective
To provide an interactive, auto-generated documentation for all REST endpoints, allowing developers and testers to explore and test the API directly from the browser.
diff --git a/doc/history/feature-archive/role-admin-read.md b/doc/history/feature-archive/role-admin-read.md
index ed596e6c5..eb1c51be8 100644
--- a/doc/history/feature-archive/role-admin-read.md
+++ b/doc/history/feature-archive/role-admin-read.md
@@ -1,16 +1,16 @@
# Plan for ROLE_ADMIN_READ Implementation
-This document outlines the changes required to add a new role `ROLE_ADMIN_READ` to the AngularAI project.
+This document outlines the changes required to add a new role `ROLE_ADMIN_READ` to the GoodOne project.
`ROLE_ADMIN_READ` will have the same view rights as `ROLE_ADMIN` but no update rights.
## 1. Backend Changes (Spring Boot)
### 1.1. Model Update
-- **File**: `backend/src/main/java/ch/goodone/angularai/backend/model/Role.java`
+- **File**: `backend/src/main/java/ch/goodone/goodone/backend/model/Role.java`
- **Change**: Add `ROLE_ADMIN_READ` to the `Role` enum.
### 1.2. Security Configuration
-- **File**: `backend/src/main/java/ch/goodone/angularai/backend/config/SecurityConfig.java`
+- **File**: `backend/src/main/java/ch/goodone/goodone/backend/config/SecurityConfig.java`
- **Change**: Update the `SecurityFilterChain` to allow both `ADMIN` and `ADMIN_READ` to access administrative endpoints for read operations, but restrict write operations to `ADMIN` only.
```java
// Current
@@ -55,7 +55,7 @@ hasAdminWriteAccess(): boolean {
## 3. Android App Changes
### 3.1. Main Navigation
-- **File**: `android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt`
+- **File**: `android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt`
- **Change**: Update `isAdmin` logic to include `ROLE_ADMIN_READ` so the "User Admin" and "Logs" menu items are visible.
```kotlin
val isAdmin = currentUser?.role == "ROLE_ADMIN" || currentUser?.role == "ROLE_ADMIN_READ"
@@ -63,13 +63,13 @@ val canEditAdmin = currentUser?.role == "ROLE_ADMIN"
```
### 3.2. User List Screen
-- **File**: `android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserListScreen.kt`
+- **File**: `android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserListScreen.kt`
- **Change**:
- Hide the Floating Action Button (FAB) for adding users if the user is `ROLE_ADMIN_READ`.
- Hide the Delete icon in `UserItem` if the user is `ROLE_ADMIN_READ`.
### 3.3. User Edit Screen
-- **File**: `android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt`
+- **File**: `android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt`
- **Change**:
- Add `ROLE_ADMIN_READ` to the role selection list.
- If the user has `ROLE_ADMIN_READ`, disable all input fields and hide the "Save" button.
diff --git a/doc/history/feature-archive/sonar-issues.json b/doc/history/feature-archive/sonar-issues.json
index 488704992..dd04fabf9 100644
--- a/doc/history/feature-archive/sonar-issues.json
+++ b/doc/history/feature-archive/sonar-issues.json
@@ -14,8 +14,8 @@
"key": "AZvRjufXU_q8bSFwLC9v",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "1ad5ae806aa65ef1c2e1d443fc07e9f6",
"textRange": {
@@ -47,14 +47,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvRjufXU_q8bSFwLC9w",
"rule": "kotlin:S3776",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
+ "project": "JuergGood_goodone",
"line": 24,
"hash": "5fa5a1edec9d62b6f6ee1c8ed2505913",
"textRange": {
@@ -67,7 +67,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 42,
"endLine": 42,
@@ -81,7 +81,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 61,
"endLine": 61,
@@ -95,7 +95,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 44,
"endLine": 44,
@@ -109,7 +109,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 49,
"endLine": 49,
@@ -123,7 +123,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 55,
"endLine": 55,
@@ -137,7 +137,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 68,
"endLine": 68,
@@ -151,7 +151,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 86,
"endLine": 86,
@@ -165,7 +165,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 100,
"endLine": 100,
@@ -179,7 +179,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 136,
"endLine": 136,
@@ -193,7 +193,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 149,
"endLine": 149,
@@ -207,7 +207,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 156,
"endLine": 156,
@@ -221,7 +221,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 189,
"endLine": 189,
@@ -235,7 +235,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 202,
"endLine": 202,
@@ -249,7 +249,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 204,
"endLine": 204,
@@ -263,7 +263,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"textRange": {
"startLine": 209,
"endLine": 209,
@@ -298,14 +298,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZI_A7UvkmTxqdvr",
"rule": "kotlin:S3776",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt",
+ "project": "JuergGood_goodone",
"line": 48,
"hash": "5d0f7df297c8b60a934a6b6a896049a6",
"textRange": {
@@ -318,7 +318,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt",
"textRange": {
"startLine": 103,
"endLine": 103,
@@ -332,7 +332,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt",
"textRange": {
"startLine": 111,
"endLine": 111,
@@ -346,7 +346,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt",
"textRange": {
"startLine": 139,
"endLine": 139,
@@ -360,7 +360,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt",
"textRange": {
"startLine": 154,
"endLine": 154,
@@ -395,14 +395,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZJTA7UvkmTxqdvy",
"rule": "kotlin:S3776",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
+ "project": "JuergGood_goodone",
"line": 55,
"hash": "a0a8c8a8cb4d0e36599b75f2c722f9f6",
"textRange": {
@@ -415,7 +415,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 65,
"endLine": 65,
@@ -429,7 +429,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 73,
"endLine": 73,
@@ -443,7 +443,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 78,
"endLine": 78,
@@ -457,7 +457,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 126,
"endLine": 126,
@@ -471,7 +471,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 174,
"endLine": 174,
@@ -485,7 +485,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 145,
"endLine": 145,
@@ -499,7 +499,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 194,
"endLine": 194,
@@ -513,7 +513,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 252,
"endLine": 252,
@@ -527,7 +527,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 289,
"endLine": 289,
@@ -541,7 +541,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 291,
"endLine": 291,
@@ -555,7 +555,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 289,
"endLine": 289,
@@ -569,7 +569,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"textRange": {
"startLine": 339,
"endLine": 339,
@@ -604,14 +604,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHGA7UvkmTxqdvZ",
"rule": "kotlin:S6517",
"severity": "MAJOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/data/remote/DashboardApi.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/data/remote/DashboardApi.kt",
+ "project": "JuergGood_goodone",
"line": 6,
"hash": "5eae7e2a391a94aa6f068521ea3bf506",
"textRange": {
@@ -641,14 +641,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZI3A7UvkmTxqdvq",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "48ae562713a867ed6d0d115d3fbcda65",
"textRange": {
@@ -680,14 +680,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZJTA7UvkmTxqdvu",
"rule": "kotlin:S1481",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
+ "project": "JuergGood_goodone",
"line": 66,
"hash": "6cfffeda2424d53e70f7bc65d8ebbf3c",
"textRange": {
@@ -719,14 +719,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZIVA7UvkmTxqdvl",
"rule": "kotlin:S3776",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
+ "project": "JuergGood_goodone",
"line": 26,
"hash": "5b802dbb4b955d4d15f2aed6664dbe69",
"textRange": {
@@ -739,7 +739,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 50,
"endLine": 50,
@@ -753,7 +753,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 69,
"endLine": 69,
@@ -767,7 +767,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 52,
"endLine": 52,
@@ -781,7 +781,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 57,
"endLine": 57,
@@ -795,7 +795,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 63,
"endLine": 63,
@@ -809,7 +809,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 93,
"endLine": 93,
@@ -823,7 +823,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 93,
"endLine": 93,
@@ -837,7 +837,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 100,
"endLine": 100,
@@ -851,7 +851,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 109,
"endLine": 109,
@@ -865,7 +865,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 109,
"endLine": 109,
@@ -879,7 +879,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 145,
"endLine": 145,
@@ -893,7 +893,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 152,
"endLine": 152,
@@ -907,7 +907,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 170,
"endLine": 170,
@@ -921,7 +921,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 170,
"endLine": 170,
@@ -935,7 +935,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 179,
"endLine": 179,
@@ -949,7 +949,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 185,
"endLine": 185,
@@ -963,7 +963,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"textRange": {
"startLine": 200,
"endLine": 200,
@@ -998,14 +998,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZIEA7UvkmTxqdvj",
"rule": "kotlin:S3776",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
+ "project": "JuergGood_goodone",
"line": 17,
"hash": "0e7997e9df3c6f1a5a85fbb29bec08fb",
"textRange": {
@@ -1018,7 +1018,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
"textRange": {
"startLine": 39,
"endLine": 39,
@@ -1032,7 +1032,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
"textRange": {
"startLine": 80,
"endLine": 80,
@@ -1046,7 +1046,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
"textRange": {
"startLine": 82,
"endLine": 82,
@@ -1060,7 +1060,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
"textRange": {
"startLine": 85,
"endLine": 85,
@@ -1074,7 +1074,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
"textRange": {
"startLine": 85,
"endLine": 85,
@@ -1088,7 +1088,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
"textRange": {
"startLine": 89,
"endLine": 89,
@@ -1123,14 +1123,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZIEA7UvkmTxqdvi",
"rule": "kotlin:S1481",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
+ "project": "JuergGood_goodone",
"line": 23,
"hash": "bfa108d7cbf220f355348def5c904d6d",
"textRange": {
@@ -1162,14 +1162,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZImA7UvkmTxqdvo",
"rule": "kotlin:S3776",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
+ "project": "JuergGood_goodone",
"line": 24,
"hash": "af53cdd8caf66900dfa934985576ba68",
"textRange": {
@@ -1182,7 +1182,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 34,
"endLine": 34,
@@ -1196,7 +1196,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 61,
"endLine": 61,
@@ -1210,7 +1210,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 116,
"endLine": 116,
@@ -1224,7 +1224,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 126,
"endLine": 126,
@@ -1238,7 +1238,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 126,
"endLine": 126,
@@ -1252,7 +1252,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 137,
"endLine": 137,
@@ -1266,7 +1266,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 139,
"endLine": 139,
@@ -1280,7 +1280,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 137,
"endLine": 137,
@@ -1294,7 +1294,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"textRange": {
"startLine": 141,
"endLine": 141,
@@ -1329,14 +1329,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZIeA7UvkmTxqdvm",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "48ae562713a867ed6d0d115d3fbcda65",
"textRange": {
@@ -1368,14 +1368,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZIeA7UvkmTxqdvn",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 12,
"hash": "3684f5fdb1f89babe9737d8b167d46d1",
"textRange": {
@@ -1407,14 +1407,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHzA7UvkmTxqdvg",
"rule": "kotlin:S3776",
"severity": "CRITICAL",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
+ "project": "JuergGood_goodone",
"line": 26,
"hash": "aca31eae3b11fa38142b2a6fe56b12df",
"textRange": {
@@ -1427,7 +1427,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 85,
"endLine": 85,
@@ -1441,7 +1441,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 89,
"endLine": 89,
@@ -1455,7 +1455,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 85,
"endLine": 85,
@@ -1469,7 +1469,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 93,
"endLine": 93,
@@ -1483,7 +1483,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 102,
"endLine": 102,
@@ -1497,7 +1497,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 102,
"endLine": 102,
@@ -1511,7 +1511,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 103,
"endLine": 103,
@@ -1525,7 +1525,7 @@
{
"locations": [
{
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"textRange": {
"startLine": 103,
"endLine": 103,
@@ -1560,14 +1560,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZJTA7UvkmTxqdvv",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
+ "project": "JuergGood_goodone",
"line": 21,
"hash": "0e5a15071e254b5f342b874c62a5885a",
"textRange": {
@@ -1599,14 +1599,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZG-A7UvkmTxqdvY",
"rule": "kotlin:S6517",
"severity": "MAJOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/data/remote/SystemApi.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/data/remote/SystemApi.kt",
+ "project": "JuergGood_goodone",
"line": 6,
"hash": "3552bef40b32ba4cb3284d94908c3f9a",
"textRange": {
@@ -1636,14 +1636,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZIvA7UvkmTxqdvp",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/SystemViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/SystemViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "48ae562713a867ed6d0d115d3fbcda65",
"textRange": {
@@ -1675,14 +1675,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHhA7UvkmTxqdvc",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
+ "project": "JuergGood_goodone",
"line": 11,
"hash": "cd48966c4a3a3fe006b3da7024e4637d",
"textRange": {
@@ -1714,14 +1714,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZJTA7UvkmTxqdvw",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
+ "project": "JuergGood_goodone",
"line": 25,
"hash": "16a59ce2690d58f5db6adb8ddd1245c9",
"textRange": {
@@ -1753,14 +1753,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZJTA7UvkmTxqdvx",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
+ "project": "JuergGood_goodone",
"line": 26,
"hash": "4f114092759cc9494b653c567ca3e024",
"textRange": {
@@ -1792,14 +1792,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZJJA7UvkmTxqdvt",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/di/NetworkModule.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/di/NetworkModule.kt",
+ "project": "JuergGood_goodone",
"line": 16,
"hash": "df8425ee2796a9542034058eceb197d4",
"textRange": {
@@ -1831,14 +1831,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZINA7UvkmTxqdvk",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "48ae562713a867ed6d0d115d3fbcda65",
"textRange": {
@@ -1870,14 +1870,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZH8A7UvkmTxqdvh",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/AuthViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/AuthViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "48ae562713a867ed6d0d115d3fbcda65",
"textRange": {
@@ -1909,14 +1909,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHPA7UvkmTxqdva",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileScreen.kt",
+ "project": "JuergGood_goodone",
"line": 9,
"hash": "4f114092759cc9494b653c567ca3e024",
"textRange": {
@@ -1948,14 +1948,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHXA7UvkmTxqdvb",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "48ae562713a867ed6d0d115d3fbcda65",
"textRange": {
@@ -1987,14 +1987,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHzA7UvkmTxqdvf",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
+ "project": "JuergGood_goodone",
"line": 6,
"hash": "938df609facc36ca102d1677b6b5b31a",
"textRange": {
@@ -2026,14 +2026,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHqA7UvkmTxqdvd",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 3,
"hash": "48ae562713a867ed6d0d115d3fbcda65",
"textRange": {
@@ -2065,14 +2065,14 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
},
{
"key": "AZvF0ZHqA7UvkmTxqdve",
"rule": "kotlin:S1128",
"severity": "MINOR",
- "component": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskViewModel.kt",
- "project": "JuergGood_angularai",
+ "component": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskViewModel.kt",
+ "project": "JuergGood_goodone",
"line": 16,
"hash": "fc27301d70ca5c7a199ed372d7e4469f",
"textRange": {
@@ -2104,198 +2104,198 @@
}
],
"issueStatus": "OPEN",
- "projectName": "angularai-parent"
+ "projectName": "goodone-parent"
}
],
"components": [
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogViewModel.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogViewModel.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtz",
"enabled": true,
"qualifier": "FIL",
"name": "LogViewModel.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogViewModel.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogViewModel.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogViewModel.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogViewModel.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/di/NetworkModule.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/di/NetworkModule.kt",
"uuid": "AZvF0YvHA7UvkmTxqdt9",
"enabled": true,
"qualifier": "FIL",
"name": "NetworkModule.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/di/NetworkModule.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/di/NetworkModule.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/di/NetworkModule.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/di/NetworkModule.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/SystemViewModel.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/SystemViewModel.kt",
"uuid": "AZvF0YvGA7UvkmTxqdt2",
"enabled": true,
"qualifier": "FIL",
"name": "SystemViewModel.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/SystemViewModel.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/SystemViewModel.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/SystemViewModel.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/SystemViewModel.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt",
"uuid": "AZvF0YvGA7UvkmTxqdt4",
"enabled": true,
"qualifier": "FIL",
"name": "DashboardScreen.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardScreen.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardScreen.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtt",
"enabled": true,
"qualifier": "FIL",
"name": "RegisterScreen.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/auth/RegisterScreen.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/auth/RegisterScreen.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardViewModel.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardViewModel.kt",
"uuid": "AZvF0YvGA7UvkmTxqdt3",
"enabled": true,
"qualifier": "FIL",
"name": "DashboardViewModel.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardViewModel.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/dashboard/DashboardViewModel.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardViewModel.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/dashboard/DashboardViewModel.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/auth/AuthViewModel.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/auth/AuthViewModel.kt",
"uuid": "AZvF0YvGA7UvkmTxqdts",
"enabled": true,
"qualifier": "FIL",
"name": "AuthViewModel.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/auth/AuthViewModel.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/auth/AuthViewModel.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/auth/AuthViewModel.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/auth/AuthViewModel.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminViewModel.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminViewModel.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtv",
"enabled": true,
"qualifier": "FIL",
"name": "AdminViewModel.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminViewModel.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminViewModel.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminViewModel.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminViewModel.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtx",
"enabled": true,
"qualifier": "FIL",
"name": "AdminUserEditScreen.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/admin/AdminUserEditScreen.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/admin/AdminUserEditScreen.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileViewModel.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileViewModel.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtl",
"enabled": true,
"qualifier": "FIL",
"name": "ProfileViewModel.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileViewModel.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileViewModel.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileViewModel.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileViewModel.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileScreen.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileScreen.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtk",
"enabled": true,
"qualifier": "FIL",
"name": "ProfileScreen.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileScreen.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/profile/ProfileScreen.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileScreen.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/profile/ProfileScreen.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtn",
"enabled": true,
"qualifier": "FIL",
"name": "TaskEditScreen.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskEditScreen.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskEditScreen.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
"uuid": "AZvF0YvGA7UvkmTxqdt0",
"enabled": true,
"qualifier": "FIL",
"name": "LogScreen.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/log/LogScreen.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/log/LogScreen.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtp",
"enabled": true,
"qualifier": "FIL",
"name": "TaskListScreen.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskListScreen.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskListScreen.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskViewModel.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskViewModel.kt",
"uuid": "AZvF0YvGA7UvkmTxqdto",
"enabled": true,
"qualifier": "FIL",
"name": "TaskViewModel.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskViewModel.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/ui/tasks/TaskViewModel.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskViewModel.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/ui/tasks/TaskViewModel.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
"uuid": "AZvF0YvHA7UvkmTxqduE",
"enabled": true,
"qualifier": "FIL",
"name": "MainActivity.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/MainActivity.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/MainActivity.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai",
+ "key": "JuergGood_goodone",
"uuid": "AZvFz7Ixlt9MKUCnZ3rs",
"enabled": true,
"qualifier": "TRK",
- "name": "angularai-parent",
- "longName": "angularai-parent"
+ "name": "goodone-parent",
+ "longName": "goodone-parent"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/data/remote/DashboardApi.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/data/remote/DashboardApi.kt",
"uuid": "AZvF0YvGA7UvkmTxqdth",
"enabled": true,
"qualifier": "FIL",
"name": "DashboardApi.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/data/remote/DashboardApi.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/data/remote/DashboardApi.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/data/remote/DashboardApi.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/data/remote/DashboardApi.kt"
},
{
"organization": "juerggood",
- "key": "JuergGood_angularai:android/app/src/main/java/ch/goodone/angularai/android/data/remote/SystemApi.kt",
+ "key": "JuergGood_goodone:android/app/src/main/java/ch/goodone/goodone/android/data/remote/SystemApi.kt",
"uuid": "AZvF0YvGA7UvkmTxqdtg",
"enabled": true,
"qualifier": "FIL",
"name": "SystemApi.kt",
- "longName": "android/app/src/main/java/ch/goodone/angularai/android/data/remote/SystemApi.kt",
- "path": "android/app/src/main/java/ch/goodone/angularai/android/data/remote/SystemApi.kt"
+ "longName": "android/app/src/main/java/ch/goodone/goodone/android/data/remote/SystemApi.kt",
+ "path": "android/app/src/main/java/ch/goodone/goodone/android/data/remote/SystemApi.kt"
}
],
"organizations": [
@@ -2305,4 +2305,4 @@
}
],
"facets": []
-}
\ No newline at end of file
+}
diff --git a/doc/history/feature-archive/task-sorting.md b/doc/history/feature-archive/task-sorting.md
index 3426f3210..4cce66daf 100644
--- a/doc/history/feature-archive/task-sorting.md
+++ b/doc/history/feature-archive/task-sorting.md
@@ -6,22 +6,22 @@ Enhance the Task Management module to support task states ('open', 'in progress'
#### 2. Backend Changes (Spring Boot)
##### 2.1. `TaskStatus` Enum
-Create a new enum `ch.goodone.angularai.backend.model.TaskStatus`:
+Create a new enum `ch.goodone.goodone.backend.model.TaskStatus`:
- Values: `OPEN`, `IN_PROGRESS`, `CLOSED`.
##### 2.2. `Task` Entity Enhancements
-Update `ch.goodone.angularai.backend.model.Task`:
+Update `ch.goodone.goodone.backend.model.Task`:
- Add `@Enumerated(EnumType.STRING) TaskStatus status`. Default: `OPEN`.
- Add `Integer position` to store the relative order of tasks for each user.
##### 2.3. `TaskDTO` Enhancements
-Update `ch.goodone.angularai.backend.dto.TaskDTO`:
+Update `ch.goodone.goodone.backend.dto.TaskDTO`:
- Add `String status` field.
- Add `Integer position` field.
- Update `fromEntity()` to include these new fields.
##### 2.4. `TaskRepository` Enhancements
-Update `ch.goodone.angularai.backend.repository.TaskRepository`:
+Update `ch.goodone.goodone.backend.repository.TaskRepository`:
- Update `findByUser(User user)` to `findByUserOrderByPositionAsc(User user)` to ensure tasks are returned in their custom order.
- Add support for finding tasks by user and status if server-side filtering is preferred, though client-side filtering might be sufficient for small lists.
diff --git a/doc/history/feature-archive/test-client.md b/doc/history/feature-archive/test-client.md
index e5472161e..d53145a39 100644
--- a/doc/history/feature-archive/test-client.md
+++ b/doc/history/feature-archive/test-client.md
@@ -1,6 +1,6 @@
# Proposal: TestClient Module
-This document outlines the design and implementation plan for the `test-client` module, a Kotlin-based console application for managing test data and interacting with the AngularAI backend API.
+This document outlines the design and implementation plan for the `test-client` module, a Kotlin-based console application for managing test data and interacting with the GoodOne backend API.
## 1. Overview
The `test-client` is a CLI tool designed to facilitate data seeding, cleanup, and database inspection across different environments (local development, local Docker, and AWS).
@@ -21,7 +21,7 @@ The module will be added to the root `pom.xml`:
Project structure:
```
test-client/
-├── src/main/kotlin/ch/goodone/angularai/testclient/
+├── src/main/kotlin/ch/goodone/goodone/testclient/
│ ├── TestClientApp.kt # Main entry point
│ ├── client/
│ │ └── ApiClient.kt # Generic HTTP/REST client with Auth
diff --git a/doc/history/feature-archive/user-admin-commit.md b/doc/history/feature-archive/user-admin-commit.md
index 072d5a858..52e2d1b30 100644
--- a/doc/history/feature-archive/user-admin-commit.md
+++ b/doc/history/feature-archive/user-admin-commit.md
@@ -24,4 +24,4 @@ Verification:
- Added `AdminUserControllerTest` (all passed).
- Added `UserAdminComponent` unit tests (all passed).
- Verified all 19 backend and 37 frontend tests pass successfully.
-```
\ No newline at end of file
+```
diff --git a/doc/history/feature-archive/user-admin-plan.md b/doc/history/feature-archive/user-admin-plan.md
index c892a7ad1..abc0a2314 100644
--- a/doc/history/feature-archive/user-admin-plan.md
+++ b/doc/history/feature-archive/user-admin-plan.md
@@ -43,4 +43,4 @@ This proposal outlines the implementation of the 'User Admin' page, including ne
#### 4. Sample Data (`DataInitializer`)
- Update the default 'admin' user to have `ROLE_ADMIN`.
-- Create several dummy users with `ROLE_USER` for testing purposes.
\ No newline at end of file
+- Create several dummy users with `ROLE_USER` for testing purposes.
diff --git a/doc/history/milestones/initial-impl.md b/doc/history/milestones/initial-impl.md
index 9b4cb20cc..da3e82910 100644
--- a/doc/history/milestones/initial-impl.md
+++ b/doc/history/milestones/initial-impl.md
@@ -9,4 +9,4 @@ The first iteration successfully established the core foundation for the user ad
- `LoginComponent` and `ProfileComponent` implemented as standalone components with Angular Material.
- `AuthService` and `UserService` manage API interactions and reactive state using Signals.
- Modern control flow (`@if`, `@for`) and `ngx-translate` for internationalization are integrated.
-- **Verification**: All backend tests are green, and the UI correctly handles profile modifications and persistence.
\ No newline at end of file
+- **Verification**: All backend tests are green, and the UI correctly handles profile modifications and persistence.
diff --git a/doc/history/proposals/h2-file-fargate-internal.md b/doc/history/proposals/h2-file-fargate-internal.md
index 5b4428b72..629b6181f 100644
--- a/doc/history/proposals/h2-file-fargate-internal.md
+++ b/doc/history/proposals/h2-file-fargate-internal.md
@@ -19,7 +19,7 @@ This document contains the exact commands and resource IDs used to provision the
# Create Security Group for EFS
# Result: sg-0247eea5b0a04710a
aws ec2 create-security-group \
- --group-name angularai-efs-sg \
+ --group-name goodone-efs-sg \
--description "Security group for EFS access from backend" \
--vpc-id vpc-0f288e78b7dfe61bc \
--region eu-central-1 \
@@ -40,7 +40,7 @@ aws ec2 authorize-security-group-ingress \
# Create EFS File System
# Result: fs-0222ebe39fb56812f
aws efs create-file-system \
- --creation-token angularai-h2-data \
+ --creation-token goodone-h2-data \
--region eu-central-1 \
--query 'FileSystemId' --output text
diff --git a/doc/history/proposals/saml.md b/doc/history/proposals/saml.md
index 9af2dd1f9..d2938bde5 100644
--- a/doc/history/proposals/saml.md
+++ b/doc/history/proposals/saml.md
@@ -1,10 +1,10 @@
-# Proposal: Introducing SAML for AngularAI
+# Proposal: Introducing SAML for GoodOne
-This document assesses the necessity and feasibility of introducing SAML (Security Assertion Markup Language) as an authentication mechanism for the AngularAI project, comparing it with the current Login/Password (Basic Auth) setup.
+This document assesses the necessity and feasibility of introducing SAML (Security Assertion Markup Language) as an authentication mechanism for the GoodOne project, comparing it with the current Login/Password (Basic Auth) setup.
## 1. Executive Summary
-While SAML provides significant benefits for enterprise-level Single Sign-On (SSO) and centralized identity management, it introduces considerable complexity for a multi-client ecosystem (Web, Android, CLI). For the current scope of AngularAI, SAML is **not strictly required** for security but would be a strategic move if the application aims for enterprise integration.
+While SAML provides significant benefits for enterprise-level Single Sign-On (SSO) and centralized identity management, it introduces considerable complexity for a multi-client ecosystem (Web, Android, CLI). For the current scope of GoodOne, SAML is **not strictly required** for security but would be a strategic move if the application aims for enterprise integration.
## 2. SAML vs. Login/Password (Current Setup)
@@ -72,7 +72,7 @@ If SAML is to be introduced, here are the recommendations:
### Can the IdP use the users of the User Admin page?
Normally, SAML works the other way around: the **IdP is the source of truth**, and the application (Service Provider) creates/updates local users based on the SAML assertion (Just-In-Time Provisioning).
-- **Integration Path**: To keep using the User Admin page while using SAML, the application would need to act as an IdP (very complex) or use a "Federated" approach where Keycloak/AWS SSO connects to the AngularAI database as a user source (User Storage Provider).
+- **Integration Path**: To keep using the User Admin page while using SAML, the application would need to act as an IdP (very complex) or use a "Federated" approach where Keycloak/AWS SSO connects to the GoodOne database as a user source (User Storage Provider).
- **Recommendation**: Transition the "User Admin" to manage roles/permissions only, while the IdP manages the actual identities (Login/Email/Password).
## 6. Proposed Implementation Strategy (Phased)
diff --git a/doc/history/superseded-architecture/Home.md b/doc/history/superseded-architecture/Home.md
index 279cdaba6..762858b1c 100644
--- a/doc/history/superseded-architecture/Home.md
+++ b/doc/history/superseded-architecture/Home.md
@@ -1,4 +1,4 @@
-# Welcome to the AngularAI Documentation Hub (SUPERSEDED)
+# Welcome to the GoodOne Documentation Hub (SUPERSEDED)
> [!CAUTION]
> This page is **outdated** and has been superseded by the new architecture documentation set.
diff --git a/doc/history/superseded-architecture/images/angularai-architecture-interactive.svg b/doc/history/superseded-architecture/images/angularai-architecture-interactive.svg
index 8833af8c2..d45ea2f92 100644
--- a/doc/history/superseded-architecture/images/angularai-architecture-interactive.svg
+++ b/doc/history/superseded-architecture/images/angularai-architecture-interactive.svg
@@ -14,7 +14,7 @@ orient="auto" markerUnits="strokeWidth">
-AngularAI Architecture
+GoodOne Architecture
User / Developer
diff --git a/doc/infrastructure/Deployment.md b/doc/infrastructure/Deployment.md
index ed6a549ca..01793a9b1 100644
--- a/doc/infrastructure/Deployment.md
+++ b/doc/infrastructure/Deployment.md
@@ -1,6 +1,6 @@
# Deployment & Infrastructure
-AngularAI is designed to be easily deployable using containerization and cloud services.
+GoodOne is designed to be easily deployable using containerization and cloud services.
## Docker
diff --git a/doc/infrastructure/Docker-Optimization.md b/doc/infrastructure/Docker-Optimization.md
index c08248d45..1fd3b4707 100644
--- a/doc/infrastructure/Docker-Optimization.md
+++ b/doc/infrastructure/Docker-Optimization.md
@@ -1,6 +1,6 @@
# Docker Build Optimization
-This document explains the strategies used to optimize Docker build times and ensure reliable dependency management in the AngularAI project.
+This document explains the strategies used to optimize Docker build times and ensure reliable dependency management in the GoodOne project.
## Dependency Caching Strategy
diff --git a/doc/infrastructure/k8s/k8s-setup.md b/doc/infrastructure/k8s/k8s-setup.md
index e7c0eb846..95ea10b5c 100644
--- a/doc/infrastructure/k8s/k8s-setup.md
+++ b/doc/infrastructure/k8s/k8s-setup.md
@@ -1,6 +1,6 @@
# Kubernetes POC Setup
-This document proposes a local Kubernetes setup for the AngularAI project and provides instructions on how to deploy the frontend and backend to a local cluster.
+This document proposes a local Kubernetes setup for the GoodOne project and provides instructions on how to deploy the frontend and backend to a local cluster.
## 1. Local Kubernetes Proposal: Kind (Kubernetes in Docker)
@@ -27,21 +27,21 @@ To monitor the status of your pods in a UI, we recommend the official **Kubernet
### Step 1: Create a Cluster (using Kind)
```bash
-kind create cluster --name angularai
+kind create cluster --name goodone
```
### Step 2: Build Docker Images
Build the images locally:
```bash
-docker build -t angularai-backend:latest -f backend/Dockerfile .
-docker build -t angularai-frontend:latest -f frontend/Dockerfile .
+docker build -t goodone-backend:latest -f backend/Dockerfile .
+docker build -t goodone-frontend:latest -f frontend/Dockerfile .
```
### Step 3: Load Images into Kind
Since we are using Kind, we need to load the local images into the cluster nodes:
```bash
-kind load docker-image angularai-backend:latest --name angularai
-kind load docker-image angularai-frontend:latest --name angularai
+kind load docker-image goodone-backend:latest --name goodone
+kind load docker-image goodone-frontend:latest --name goodone
```
### Step 4: Deploy Manifests
diff --git a/doc/knowledge/adrs/adr-full-set.md b/doc/knowledge/adrs/adr-full-set.md
index 84186294d..cd50330f1 100644
--- a/doc/knowledge/adrs/adr-full-set.md
+++ b/doc/knowledge/adrs/adr-full-set.md
@@ -1,6 +1,6 @@
### Architecture Decision Records (ADR) - Full Set
-This document serves as the central index and repository for all Architecture Decision Records (ADRs) that have shaped the AngularAI project.
+This document serves as the central index and repository for all Architecture Decision Records (ADRs) that have shaped the GoodOne project.
---
@@ -73,6 +73,7 @@ This document serves as the central index and repository for all Architecture De
- [ADR-0046: AWS ECS Fargate Resource Allocation](#adr-0046-aws-ecs-fargate-resource-allocation)
- [ADR-0047: AWS CLI Non-Interactive Mode](#adr-0047-aws-cli-non-interactive-mode)
- [ADR-0048: PowerShell for Local Automation](#adr-0048-powershell-for-local-automation)
+- [ADR-0055: CloudWatch Cost Reduction via Log/Metrics Disabling](#adr-0055-cloudwatch-cost-reduction-via-logmetrics-disabling)
---
@@ -1620,3 +1621,42 @@ This document serves as the central index and repository for all Architecture De
**Verification:** Backend controller tests verifying 403 status for unauthorized roles; Frontend e2e tests for navigation guards.
+
+
+---
+
+#### ADR-0055: CloudWatch Cost Reduction via Log/Metrics Disabling
+
+**Status:** Accepted
+
+**Importance:** Medium
+
+**Impact:** Cost, Infrastructure, Maintenance
+
+**Tags:** infrastructure, aws, cloudwatch, cost-reduction, logging, metrics
+
+**Date:** 2026-03-13
+
+**Context:** The daily costs of AWS CloudWatch (logs ingestion, storage, and metrics export) have been increasing. For demo and development environments, the cost of extensive observability can exceed the value it provides.
+
+**Decision:** Disable AWS CloudWatch integrations where possible to minimize operational costs.
+- **Metrics:** Disable Micrometer CloudWatch registry and export in `application.properties`.
+- **Actuator:** Disable the `/actuator/cloudwatch` endpoint.
+- **Logging:** Remove `logConfiguration` (awslogs driver) from all ECS Task Definitions.
+- **Dependencies:** Mark `micrometer-registry-cloudwatch2` as optional or comment it out in `pom.xml`.
+
+**Consequences:**
++ Significant reduction in AWS monthly costs.
++ Reduced outbound NAT traffic from VPC to CloudWatch endpoints.
+- Loss of historical logs and metrics in the AWS Console.
+- Troubleshooting requires manual log access (e.g., via `ecs execute-command` or local reproduction).
+- Reduced observability for performance trends and error rates over time.
+
+**Alternatives:**
+- Reducing log retention period (saves storage but not ingestion costs).
+- Using S3 for log archival (cheaper storage, but still has ingestion costs).
+
+**Verification:**
+- Verify `management.cloudwatch.metrics.export.enabled=false` in properties.
+- Verify absence of `logConfiguration` in `deploy/aws/*.json` task definition files.
+- Verify project build success (`mvn clean install`).
diff --git a/doc/knowledge/junie-tasks/_templates/junie-task-template.md b/doc/knowledge/junie-tasks/_templates/junie-task-template.md
index 2f117796f..c2a3b7478 100644
--- a/doc/knowledge/junie-tasks/_templates/junie-task-template.md
+++ b/doc/knowledge/junie-tasks/_templates/junie-task-template.md
@@ -1,4 +1,4 @@
----
+---
key: ${TASK_ID}
title: '${TASK_ID}: ${TASK_TITLE}'
taskset: ${TASKSET_NUMBER}
diff --git a/doc/knowledge/junie-tasks/backlog/grafana/JUNIE-GRAFANA-AI-01-local-local.md b/doc/knowledge/junie-tasks/backlog-2/grafana/JUNIE-GRAFANA-AI-01-local-local.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/grafana/JUNIE-GRAFANA-AI-01-local-local.md
rename to doc/knowledge/junie-tasks/backlog-2/grafana/JUNIE-GRAFANA-AI-01-local-local.md
diff --git a/doc/knowledge/junie-tasks/backlog/grafana/JUNIE-GRAFANA-AI-02-local-fargate.md b/doc/knowledge/junie-tasks/backlog-2/grafana/JUNIE-GRAFANA-AI-02-local-fargate.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/grafana/JUNIE-GRAFANA-AI-02-local-fargate.md
rename to doc/knowledge/junie-tasks/backlog-2/grafana/JUNIE-GRAFANA-AI-02-local-fargate.md
diff --git a/doc/knowledge/junie-tasks/backlog/grafana/JUNIE-GRAFANA-AI-03-fargate-fargate-demo.md b/doc/knowledge/junie-tasks/backlog-2/grafana/JUNIE-GRAFANA-AI-03-fargate-fargate-demo.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/grafana/JUNIE-GRAFANA-AI-03-fargate-fargate-demo.md
rename to doc/knowledge/junie-tasks/backlog-2/grafana/JUNIE-GRAFANA-AI-03-fargate-fargate-demo.md
diff --git a/doc/knowledge/junie-tasks/backlog/grafana/README-index.md b/doc/knowledge/junie-tasks/backlog-2/grafana/README-index.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/grafana/README-index.md
rename to doc/knowledge/junie-tasks/backlog-2/grafana/README-index.md
diff --git a/doc/knowledge/junie-tasks/backlog/p0/AI-DEC-01-AI-Decision-Assistant.md b/doc/knowledge/junie-tasks/backlog-2/p0/AI-DEC-01-AI-Decision-Assistant.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p0/AI-DEC-01-AI-Decision-Assistant.md
rename to doc/knowledge/junie-tasks/backlog-2/p0/AI-DEC-01-AI-Decision-Assistant.md
diff --git a/doc/knowledge/junie-tasks/backlog/p0/AI-IMP-01-AI-Impact-Simulator.md b/doc/knowledge/junie-tasks/backlog-2/p0/AI-IMP-01-AI-Impact-Simulator.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p0/AI-IMP-01-AI-Impact-Simulator.md
rename to doc/knowledge/junie-tasks/backlog-2/p0/AI-IMP-01-AI-Impact-Simulator.md
diff --git a/doc/knowledge/junie-tasks/backlog/p0/AI-ONB-01-AI-Onboarding-Mode.md b/doc/knowledge/junie-tasks/backlog-2/p0/AI-ONB-01-AI-Onboarding-Mode.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p0/AI-ONB-01-AI-Onboarding-Mode.md
rename to doc/knowledge/junie-tasks/backlog-2/p0/AI-ONB-01-AI-Onboarding-Mode.md
diff --git a/doc/knowledge/junie-tasks/backlog/p0/AI-REL-01-AI-Release-Intelligence.md b/doc/knowledge/junie-tasks/backlog-2/p0/AI-REL-01-AI-Release-Intelligence.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p0/AI-REL-01-AI-Release-Intelligence.md
rename to doc/knowledge/junie-tasks/backlog-2/p0/AI-REL-01-AI-Release-Intelligence.md
diff --git a/doc/knowledge/junie-tasks/backlog/p0/AI-TASKSET-10-AI-Engineering-Intelligence.md b/doc/knowledge/junie-tasks/backlog-2/p0/AI-TASKSET-10-AI-Engineering-Intelligence.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p0/AI-TASKSET-10-AI-Engineering-Intelligence.md
rename to doc/knowledge/junie-tasks/backlog-2/p0/AI-TASKSET-10-AI-Engineering-Intelligence.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-56-ai-explainability-panel.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-56-ai-explainability-panel.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-56-ai-explainability-panel.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-56-ai-explainability-panel.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-57-architecture-diagram-generation.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-57-architecture-diagram-generation.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-57-architecture-diagram-generation.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-57-architecture-diagram-generation.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-58-adr-impact-visualization.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-58-adr-impact-visualization.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-58-adr-impact-visualization.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-58-adr-impact-visualization.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-59-task-dependency-graph.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-59-task-dependency-graph.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-59-task-dependency-graph.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-59-task-dependency-graph.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-60-sprint-health-score.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-60-sprint-health-score.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-60-sprint-health-score.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-60-sprint-health-score.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-61-ai-insight-highlights.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-61-ai-insight-highlights.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-61-ai-insight-highlights.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-61-ai-insight-highlights.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-62-ai-prompt-suggestions.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-62-ai-prompt-suggestions.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-62-ai-prompt-suggestions.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-62-ai-prompt-suggestions.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-63-ai-feature-discovery-panel.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-63-ai-feature-discovery-panel.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-63-ai-feature-discovery-panel.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-63-ai-feature-discovery-panel.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-64-ai-processing-transparency.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-64-ai-processing-transparency.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-64-ai-processing-transparency.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-64-ai-processing-transparency.md
diff --git a/doc/knowledge/junie-tasks/backlog/p1/AI-UX-65-ai-knowledge-coverage-indicator.md b/doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-65-ai-knowledge-coverage-indicator.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p1/AI-UX-65-ai-knowledge-coverage-indicator.md
rename to doc/knowledge/junie-tasks/backlog-2/p1/AI-UX-65-ai-knowledge-coverage-indicator.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-66-sprint-planning-assistant.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-66-sprint-planning-assistant.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-66-sprint-planning-assistant.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-66-sprint-planning-assistant.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-67-task-risk-prediction.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-67-task-risk-prediction.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-67-task-risk-prediction.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-67-task-risk-prediction.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-68-engineering-knowledge-graph.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-68-engineering-knowledge-graph.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-68-engineering-knowledge-graph.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-68-engineering-knowledge-graph.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-69-architecture-dependency-map.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-69-architecture-dependency-map.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-69-architecture-dependency-map.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-69-architecture-dependency-map.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-70-task-similarity-detection.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-70-task-similarity-detection.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-70-task-similarity-detection.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-70-task-similarity-detection.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-71-sprint-activity-timeline.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-71-sprint-activity-timeline.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-71-sprint-activity-timeline.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-71-sprint-activity-timeline.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-72-engineering-productivity-insights.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-72-engineering-productivity-insights.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-72-engineering-productivity-insights.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-72-engineering-productivity-insights.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-73-task-complexity-estimation.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-73-task-complexity-estimation.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-73-task-complexity-estimation.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-73-task-complexity-estimation.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-74-architecture-consistency-check.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-74-architecture-consistency-check.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-74-architecture-consistency-check.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-74-architecture-consistency-check.md
diff --git a/doc/knowledge/junie-tasks/backlog/p2/AI-UX-75-engineering-assistant-overview.md b/doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-75-engineering-assistant-overview.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p2/AI-UX-75-engineering-assistant-overview.md
rename to doc/knowledge/junie-tasks/backlog-2/p2/AI-UX-75-engineering-assistant-overview.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-76-codebase-architecture-scanner.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-76-codebase-architecture-scanner.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-76-codebase-architecture-scanner.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-76-codebase-architecture-scanner.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-77-ai-codebase-qna.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-77-ai-codebase-qna.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-77-ai-codebase-qna.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-77-ai-codebase-qna.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-78-automatic-architecture-diagram.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-78-automatic-architecture-diagram.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-78-automatic-architecture-diagram.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-78-automatic-architecture-diagram.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-79-incident-root-cause-analyzer.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-79-incident-root-cause-analyzer.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-79-incident-root-cause-analyzer.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-79-incident-root-cause-analyzer.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-80-architecture-decision-assistant.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-80-architecture-decision-assistant.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-80-architecture-decision-assistant.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-80-architecture-decision-assistant.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-81-cross-sprint-retrospective-comparison.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-81-cross-sprint-retrospective-comparison.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-81-cross-sprint-retrospective-comparison.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-81-cross-sprint-retrospective-comparison.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-82-engineering-knowledge-search.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-82-engineering-knowledge-search.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-82-engineering-knowledge-search.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-82-engineering-knowledge-search.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-83-change-impact-prediction.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-83-change-impact-prediction.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-83-change-impact-prediction.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-83-change-impact-prediction.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-84-engineering-health-dashboard.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-84-engineering-health-dashboard.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-84-engineering-health-dashboard.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-84-engineering-health-dashboard.md
diff --git a/doc/knowledge/junie-tasks/backlog/p3/AI-UX-85-ai-engineering-copilot-panel.md b/doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-85-ai-engineering-copilot-panel.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p3/AI-UX-85-ai-engineering-copilot-panel.md
rename to doc/knowledge/junie-tasks/backlog-2/p3/AI-UX-85-ai-engineering-copilot-panel.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-86-technical-debt-detector.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-86-technical-debt-detector.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-86-technical-debt-detector.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-86-technical-debt-detector.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-87-architecture-drift-alerts.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-87-architecture-drift-alerts.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-87-architecture-drift-alerts.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-87-architecture-drift-alerts.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-88-ai-refactoring-suggestions.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-88-ai-refactoring-suggestions.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-88-ai-refactoring-suggestions.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-88-ai-refactoring-suggestions.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-89-test-coverage-gap-detection.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-89-test-coverage-gap-detection.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-89-test-coverage-gap-detection.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-89-test-coverage-gap-detection.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-90-ai-generated-adr-proposals.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-90-ai-generated-adr-proposals.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-90-ai-generated-adr-proposals.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-90-ai-generated-adr-proposals.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-91-deployment-risk-analysis.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-91-deployment-risk-analysis.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-91-deployment-risk-analysis.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-91-deployment-risk-analysis.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-92-release-notes-generator.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-92-release-notes-generator.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-92-release-notes-generator.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-92-release-notes-generator.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-93-code-change-summary.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-93-code-change-summary.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-93-code-change-summary.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-93-code-change-summary.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-94-ai-onboarding-assistant.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-94-ai-onboarding-assistant.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-94-ai-onboarding-assistant.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-94-ai-onboarding-assistant.md
diff --git a/doc/knowledge/junie-tasks/backlog/p4/AI-UX-95-engineering-intelligence-report.md b/doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-95-engineering-intelligence-report.md
similarity index 100%
rename from doc/knowledge/junie-tasks/backlog/p4/AI-UX-95-engineering-intelligence-report.md
rename to doc/knowledge/junie-tasks/backlog-2/p4/AI-UX-95-engineering-intelligence-report.md
diff --git a/doc/knowledge/junie-tasks/backlog/junie-feature-domain-task-system.zip b/doc/knowledge/junie-tasks/backlog/junie-feature-domain-task-system.zip
new file mode 100644
index 000000000..41d3643f9
Binary files /dev/null and b/doc/knowledge/junie-tasks/backlog/junie-feature-domain-task-system.zip differ
diff --git a/doc/knowledge/junie-tasks/fix-sonar-issues.md b/doc/knowledge/junie-tasks/fix-sonar-issues.md
index 26c53ad40..58e0b1941 100644
--- a/doc/knowledge/junie-tasks/fix-sonar-issues.md
+++ b/doc/knowledge/junie-tasks/fix-sonar-issues.md
@@ -2,24 +2,24 @@
**Focus:** Fix Sonar issues in a way to comply with all code analysis tools
Problem:
In the past Junie was caught in endless loops
-1. fixing code bases Sonar issues https://sonarcloud.io/project/issues?issueStatuses=OPEN%2CCONFIRMED&id=JuergGood_angularai
+1. fixing code bases Sonar issues https://sonarcloud.io/project/issues?issueStatuses=OPEN%2CCONFIRMED&id=JuergGood_goodone
1. failing other code analysis tools like 'Qodana Community' on https://github.com/JuergGood/angularai/pull/27
2. failing local Quodana http://localhost:63342/qodana.ide/idea.html?projectKey=9e186ac9899abd5288ac031479cd2f82&_qdt=86ea23b7-38a1-420c-aa17-f07ce30b2016&theme=light
1. adding exception to the log. 2 examples:
-2026-02-13T12:04:34.082+01:00 ERROR 58176 --- [aibackend] [ main] c.g.a.backend.service.EmailService : Failed to send contact email to info@goodfamily.ch: Test exception
+2026-02-13T12:04:34.082+01:00 ERROR 58176 --- [goodone-backend] [ main] c.g.a.backend.service.EmailService : Failed to send contact email to info@goodfamily.ch: Test exception
java.lang.RuntimeException: Test exception
at org.springframework.mail.javamail.JavaMailSender.send(JavaMailSender.java:101)
-at ch.goodone.angularai.backend.service.EmailService.sendContactEmail(EmailService.java:137)
-at ch.goodone.angularai.backend.service.EmailServiceTest.lambda$sendContactEmail_shouldHandleRuntimeException$0(EmailServiceTest.java:157)
+at ch.goodone.goodone.backend.service.EmailService.sendContactEmail(EmailService.java:137)
+at ch.goodone.goodone.backend.service.EmailServiceTest.lambda$sendContactEmail_shouldHandleRuntimeException$0(EmailServiceTest.java:157)
at org.junit.jupiter.api.AssertDoesNotThrow.assertDoesNotThrow(AssertDoesNotThrow.java:52)
at org.junit.jupiter.api.AssertDoesNotThrow.assertDoesNotThrow(AssertDoesNotThrow.java:39)
java.lang.RuntimeException: Real network error
at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:398)
-at ch.goodone.angularai.backend.service.CaptchaService.verifyEnterprise(CaptchaService.java:181)
-at ch.goodone.angularai.backend.service.CaptchaService.executeVerification(CaptchaService.java:137)
-at ch.goodone.angularai.backend.service.CaptchaService.verify(CaptchaService.java:128)
-at ch.goodone.angularai.backend.service.CaptchaServiceTest.verifyEnterprise_ShouldHandleOtherExceptions(CaptchaServiceTest.java:172)
+at ch.goodone.goodone.backend.service.CaptchaService.verifyEnterprise(CaptchaService.java:181)
+at ch.goodone.goodone.backend.service.CaptchaService.executeVerification(CaptchaService.java:137)
+at ch.goodone.goodone.backend.service.CaptchaService.verify(CaptchaService.java:128)
+at ch.goodone.goodone.backend.service.CaptchaServiceTest.verifyEnterprise_ShouldHandleOtherExceptions(CaptchaServiceTest.java:172)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:701)
@@ -29,10 +29,10 @@ at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.
Affected classes of the infinite fix cycle
* backend/service/EmailService.java
-* backend/src/main/java/ch/goodone/angularai/backend/config/MdcFilter.java
-* backend/src/main/java/ch/goodone/angularai/backend/service/CaptchaService.java
-* backend/src/main/java/ch/goodone/angularai/backend/controller/AuthController.java
-* backend/src/main/java/ch/goodone/angularai/backend/controller/AdminSystemController.java
+* backend/src/main/java/ch/goodone/goodone/backend/config/MdcFilter.java
+* backend/src/main/java/ch/goodone/goodone/backend/service/CaptchaService.java
+* backend/src/main/java/ch/goodone/goodone/backend/controller/AuthController.java
+* backend/src/main/java/ch/goodone/goodone/backend/controller/AdminSystemController.java
**Acceptance Criteria:**
- issues are solved for all metrics in the list above, if possible ✓
diff --git a/doc/knowledge/junie-tasks/security-assesment.md b/doc/knowledge/junie-tasks/security-assesment.md
index d31d6bdd0..d23a53f2d 100644
--- a/doc/knowledge/junie-tasks/security-assesment.md
+++ b/doc/knowledge/junie-tasks/security-assesment.md
@@ -3,12 +3,12 @@
Assess all open security issues in Sonar.
## Reported issues:
-https://sonarcloud.io/project/security_hotspots?id=JuergGood_angularai
+https://sonarcloud.io/project/security_hotspots?id=JuergGood_goodone
2 Security Hotspots to review
## Issue 1 High
Cross-Site Request Forgery (CSRF)
Make sure disabling Spring Security's CSRF protection is safe here.
- backend/.../ch/goodone/angularai/backend/config/SecurityConfig.java, line 71
+ backend/.../ch/goodone/goodone/backend/config/SecurityConfig.java, line 71
Show 65 more lines
@Bean
@@ -23,7 +23,7 @@ Make sure creating this cookie without the "HttpOnly" flag is safe.
## Issue 3. High
-backend/.../ch/goodone/angularai/backend/config/SecurityConfig.java
+backend/.../ch/goodone/goodone/backend/config/SecurityConfig.java
Show 93 more lines
http
.csrf(csrf -> csrf
diff --git a/doc/knowledge/junie-tasks/tasks-overview.md b/doc/knowledge/junie-tasks/tasks-overview.md
index 4c755855e..189612d52 100644
--- a/doc/knowledge/junie-tasks/tasks-overview.md
+++ b/doc/knowledge/junie-tasks/tasks-overview.md
@@ -1,7 +1,7 @@
-# AngularAI – Stable Demo Web Application Task Pack
+# GoodOne – Stable Demo Web Application Task Pack
## Goal
-Bring AngularAI to a **stable, professional demo level** suitable for:
+Bring GoodOne to a **stable, professional demo level** suitable for:
- internal presentations
- credibility with senior engineers & architects
- discussions about AI-assisted software development
diff --git a/doc/knowledge/junie-tasks/taskset-1/4-week-roadmap.md b/doc/knowledge/junie-tasks/taskset-1/4-week-roadmap.md
index 05db43b63..cd945f61b 100644
--- a/doc/knowledge/junie-tasks/taskset-1/4-week-roadmap.md
+++ b/doc/knowledge/junie-tasks/taskset-1/4-week-roadmap.md
@@ -14,7 +14,7 @@ sourcePath: doc/knowledge/junie-tasks/taskset-1/4-week-roadmap.md
---
## Goal
-# AngularAI – 4-Week Roadmap to a Stable Demo Application
+# GoodOne – 4-Week Roadmap to a Stable Demo Application
## Scope
- can be demoed repeatedly without surprises
@@ -37,10 +37,10 @@ Manual verification required.
- Commit:
## Notes
-# AngularAI – 4-Week Roadmap to a Stable Demo Application
+# GoodOne – 4-Week Roadmap to a Stable Demo Application
## Objective
-Transform AngularAI from a working personal project into a **stable, professional demo web application** that:
+Transform GoodOne from a working personal project into a **stable, professional demo web application** that:
- can be demoed repeatedly without surprises
- withstands technical scrutiny from engineers, architects, and security
- serves as a concrete case study for AI-assisted software development
@@ -148,7 +148,7 @@ Turn the project into an internal reference and discussion starter.
## Final Outcome
-After 4 weeks, AngularAI is:
+After 4 weeks, GoodOne is:
- a stable, repeatable demo application
- a credible case study for AI-assisted development
- a concrete basis for discussions about AI tooling, governance, and guardrails
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-32-dark-mode-fix.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-32-dark-mode-fix.md
new file mode 100644
index 000000000..53f737e0d
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-32-dark-mode-fix.md
@@ -0,0 +1,168 @@
+---
+key: AI-WEB-32
+title: Fix dark mode contrast and surface styling on login and AI features pages
+taskset: 10
+priority: P1
+status: DONE
+created: 2026-03-13
+updated: 2026-03-13
+iterations: 1
+---
+
+# AI-WEB-32 – Fix dark mode contrast and surface styling on login and AI features pages
+
+## Problem
+Dark mode is currently visually broken on the public marketing/demo pages.
+
+From the screenshots, several sections still use light-mode surfaces while the text/buttons have already switched to dark-mode styling, which creates very poor contrast and makes content look faded or almost invisible.
+
+Affected examples:
+- `/login`
+- `/features`
+- likely other public marketing/demo sections using the same hero/card/CTA section components
+
+## Visible issues
+
+### 1. White or very light panels remain in dark mode
+Examples:
+- large hero/content containers on `/features`
+- white section backgrounds around headings like **AI Features**, **Core AI Capabilities**, **What makes this interesting?**
+
+This makes the page look like a mixed light/dark theme instead of a proper dark theme.
+
+### 2. Text contrast is broken
+Examples from screenshots:
+- headings become extremely faint on light backgrounds
+- descriptive text inside sections is barely readable
+- feature explanation items under **What makes this interesting?** are almost invisible
+
+### 3. CTA/button contrast is inconsistent
+Examples:
+- secondary buttons like **View Source Code** / **Try Architecture Q&A** have weak border/text contrast depending on the underlying surface
+- some buttons look disabled although they are active
+
+### 4. Feature cards and section hierarchy are visually inconsistent
+The feature cards themselves are relatively dark and acceptable, but they sit on bright/light containers. This causes the page to feel unbalanced and unfinished.
+
+### 5. Login page top hero/content panel also shows the same problem
+The upper content area behind the logo/title/intro remains far too bright in dark mode, so the title and supporting text lose readability.
+
+## Goal
+Implement a **true dark-mode version** of the public pages, not just partial color inversion.
+
+Dark mode should:
+- use dark surfaces consistently
+- preserve strong text contrast
+- keep the current premium GoodOne look
+- avoid overly pale grey overlays
+- maintain clear visual hierarchy between page background, sections, cards, and CTAs
+
+## Required changes
+
+### A. Define proper dark-mode surface tokens
+Review theme tokens/CSS variables for public pages and ensure dark mode includes dedicated values for:
+- page background
+- section background
+- hero background
+- elevated card background
+- border/divider color
+- heading color
+- body text color
+- muted/supporting text color
+- secondary button border/text/background
+
+Do **not** reuse light-mode section backgrounds in dark mode.
+
+### B. Fix section backgrounds on public pages
+For dark mode:
+- replace white/light-grey section containers with dark surfaces
+- use subtle elevation differences between:
+ - page background
+ - hero panel
+ - content sections
+ - cards / CTA panels
+- keep contrast soft and premium, not flat black-on-black
+
+Suggested direction:
+- page background: deepest navy/blue-black
+- section surface: slightly lifted dark navy
+- cards: one additional elevation step
+- CTA block: strongest elevation or subtle accent tint
+
+### C. Fix typography contrast
+Ensure all public-page text colors are mapped correctly in dark mode:
+- major headings: high-contrast light text
+- paragraph text: slightly softer but still clearly readable
+- muted captions/subtitles: lower emphasis but never washed out
+- icon/text feature explanations must remain readable at first glance
+
+Any text currently using light-mode muted greys on bright or semi-bright surfaces must be remapped.
+
+### D. Fix buttons and interactive states
+Ensure all CTA/button variants are legible in dark mode:
+- primary buttons remain clearly visible
+- secondary/stroked buttons have enough border and text contrast
+- hover/focus states remain visible on dark surfaces
+- buttons must not appear disabled unless actually disabled
+
+### E. Normalize shared marketing/demo sections
+Audit shared components used across:
+- login hero / landing sections
+- features hero
+- feature cards grid
+- “What makes this interesting?” section
+- bottom CTA section
+
+Move dark-mode styling to shared reusable classes/tokens instead of patching only one page.
+
+## Design intent
+The target should feel like:
+- polished
+- calm
+- premium
+- readable
+- consistent with GoodOne branding
+
+It should **not** feel like:
+- white panels dropped onto a dark page
+- washed-out text over foggy grey backgrounds
+- dark mode implemented only halfway
+
+## Acceptance criteria
+- In dark mode, no large white or near-white marketing panels remain on `/login` and `/features`
+- All headings and body text are clearly readable with proper contrast
+- The **What makes this interesting?** feature list is fully readable without strain
+- Hero titles/subtitles on `/login` and `/features` are clearly visible
+- Primary and secondary CTA buttons are visually distinct and readable
+- Section/card hierarchy looks intentional and premium
+- Shared components use reusable dark-mode theme tokens/styles
+- Light mode remains unchanged
+
+## Junie Log
+
+### 2026-03-13 14:45
+- Summary: Implemented dark-mode fixes for login and features pages to ensure proper contrast and surface styling.
+- Outcome: Replaced hardcoded light colors with theme tokens, updated `theme-tokens.css` with marketing hero backgrounds, and fixed sidenav category label contrast.
+- Open items: None.
+- Evidence: Playwright accessibility and UX guardrails passed. Reproduction Axe tests verified 0 contrast violations.
+
+## Implementation hints
+- Check for hard-coded light backgrounds such as `#fff`, very light grey fills, or light gradient overlays inside public-page components
+- Check Angular Material overrides for stroked buttons/cards/containers in dark mode
+- Review whether typography colors are inherited from a light theme container or forced by outdated utility classes
+- Prefer theme variables / semantic tokens over page-specific one-off hex values
+
+## Suggested validation
+Test manually in dark mode on:
+- `/login`
+- `/features`
+- any related marketing/demo page sharing the same section components
+
+Verify:
+- readability at normal zoom
+- button visibility
+- contrast between background / section / card / CTA
+- consistent appearance for both logged-out and public demo experience
+
+## Deliverable
+A dark-mode polish fix that makes public pages feel intentionally designed for dark mode, not merely adapted from light mode.
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-32-debounce-quick-add-parser.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-32-debounce-quick-add-parser.md
new file mode 100644
index 000000000..95e2bae55
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-32-debounce-quick-add-parser.md
@@ -0,0 +1,114 @@
+# AI-WEB-32 -- Debounce Quick Add AI Parser
+
+## Summary
+
+The current OpenAI-based parser behind the Quick Add field on
+`https://goodone.ch/tasks` is triggered far too aggressively while the
+user is still typing. In practice, it fires after roughly every one or
+two letters. During each parser request, text input becomes blocked for
+about 3 seconds, which makes the Quick Add experience feel laggy and
+frustrating.
+
+This task should change the trigger strategy so the AI parser is called
+much less often and never interrupts normal typing.
+
+## Problem Statement
+
+Current behavior: - The Quick Add parser is triggered almost
+continuously while the user types. - Requests appear to start after
+every one or two newly entered characters. - While the parser request is
+in progress, the user cannot continue typing. - The UI feels frozen for
+about 3 seconds per call.
+
+Impact: - Poor typing experience in the most important task entry
+interaction. - Unnecessary OpenAI calls and avoidable token/latency
+cost. - Higher risk of race conditions and outdated parse results
+overriding newer input.
+
+## Goal
+
+Make Quick Add feel instant and uninterrupted while still benefiting
+from AI parsing.
+
+## Desired Outcome
+
+- AI parsing must not run on nearly every keystroke.
+- AI parsing should run only after the user pauses typing for a short
+ period.
+- Typing must remain responsive even while an AI parse is pending or
+ running.
+- Older parser responses must not overwrite newer user input state.
+- API usage should be reduced significantly.
+
+## Recommended Implementation
+
+Implement a debounce-based parse trigger.
+
+Preferred behavior: - Trigger parse only after **\~2000 ms** of no
+typing activity. - Reset the debounce timer on each keystroke. - Do not
+block the input field while parsing. - Ignore or cancel stale in-flight
+parser requests when newer input exists.
+
+## Functional Requirements
+
+1. Replace the current immediate or overly frequent parse trigger with
+ a debounced trigger.
+2. Default debounce delay should be **2000 ms**.
+3. The input field must remain editable at all times while parsing
+ happens in the background.
+4. If the user resumes typing before the debounce timeout completes,
+ the pending parse must not fire.
+5. If a parser request is already running and the user changes the text
+ again:
+ - either cancel the old request, or
+ - mark it as stale and ignore its result when it returns.
+6. The UI must apply parse results only if they correspond to the
+ latest relevant input snapshot.
+7. Avoid duplicate parsing of identical input values.
+
+## UX Requirements
+
+- Typing in Quick Add feels immediate with no visible freezes.
+- No hard lock of the field during parser calls.
+- Optional subtle spinner or parsing indicator is acceptable but must
+ not interrupt typing.
+
+## Acceptance Criteria
+
+- [x] Quick Add no longer triggers AI parsing after every one or two
+ letters.
+- [x] AI parsing starts only after approximately 2 seconds of typing
+ inactivity.
+- [x] User can continue typing while parsing is in progress.
+- [x] Parser responses from outdated requests do not override newer
+ input.
+- [x] Repeated typing produces noticeably fewer OpenAI calls than
+ before.
+- [x] Manual testing on https://goodone.ch/tasks confirms the field no
+ longer freezes for about 3 seconds during normal text entry.
+- [x] Existing Quick Add parsing behavior still works correctly after
+ the debounce change.
+- [x] Acceptance test passed on 2026-03-13 09:20 (Box checked and date
+ entered by developer)
+
+## Junie Log
+
+### 2026-03-13 09:20
+- Summary: Implemented 2000ms debounce and race-condition handling for Quick Add AI parser.
+- Outcome: AI parsing is now triggered only after a 2-second pause in typing. In-flight requests are automatically cancelled (via `switchMap`) if the user resumes typing, ensuring stale results never override the current input. Typing remains fully responsive.
+- Open items: None.
+- Evidence: Verified via code review and successful build of the `frontend` module.
+
+## Manual Test Scenarios
+
+1. Type a sentence continuously for 5--10 seconds. Expectation: no
+ parser call while continuously typing.
+
+2. Stop typing for about 2 seconds. Expectation: exactly one parse
+ request is triggered.
+
+3. Begin typing again before the previous parse returns. Expectation:
+ input stays responsive and stale result is ignored or cancelled.
+
+4. Paste a full task description into Quick Add. Expectation: one
+ debounced parse occurs after the pause.
diff --git "a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-33\342\200\223Improve\342\200\223GitHub\342\200\223Visibility.md" "b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-33\342\200\223Improve\342\200\223GitHub\342\200\223Visibility.md"
new file mode 100644
index 000000000..f702cc7b3
--- /dev/null
+++ "b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-33\342\200\223Improve\342\200\223GitHub\342\200\223Visibility.md"
@@ -0,0 +1,76 @@
+---
+key: AI-WEB-33
+title: "AI-WEB-33: Improve GitHub Visibility, Social Cards and README Integration"
+taskset: 10
+priority: P1
+status: DONE
+created: 2026-03-13 09:00
+updated: 2026-03-13 09:30
+iterations: 1
+---
+
+## Goal
+
+Improve the visibility of the GitHub repository, README content, and social media previews on the GoodOne website.
+The website should clearly communicate that GoodOne is open source, built with AI, and what it does within seconds.
+
+## Scope
+
+- **Frontend**:
+ - Update `index.html` with OpenGraph and Twitter metadata.
+ - Enhance `login.component` with a Hero section (title, description, demo GIF).
+ - Replace the subtle GitHub link with a prominent branded button.
+ - Add social card and demo GIF to frontend assets.
+- **Documentation**:
+ - Update `README.md` with AI badges and a "Built With AI" section.
+ - Reposition the demo GIF in `README.md` for better visibility.
+
+## Acceptance Criteria
+
+- [x] GitHub button clearly visible on login page
+- [x] Demo GIF visible on landing page
+- [x] Social media preview cards render correctly (metadata added)
+- [x] LinkedIn preview shows correct image and description
+- [x] Twitter/X preview uses large image card
+- [x] README shows AI badges
+- [x] README shows demo GIF near the top
+
+## Junie Log
+
+### 2026-03-13 09:30
+- Summary: Implemented GitHub visibility improvements, added social media metadata, and enhanced README.
+- Outcome:
+ - Login page now features a hero section with title, description, and demo GIF.
+ - Subtle GitHub link replaced with a prominent, branded button.
+ - OpenGraph and Twitter metadata added to `index.html`.
+ - Social card and demo GIF assets copied to frontend.
+ - `README.md` updated with AI-driven development badges and a "Built With AI" section.
+ - Demo GIF repositioned in `README.md` for immediate visibility.
+- Open items: None.
+- Evidence: Successful frontend build (`mvn clean install -pl frontend -DskipTests`).
+- Testing Instructions:
+ - Manual:
+ - Open the login page and verify the new Hero section (Title, Desc, GIF).
+ - Verify the GitHub button at the bottom of the page.
+ - Inspect `index.html` source to verify OG/Twitter tags.
+ - Check `README.md` on GitHub (or preview) to see new badges and section.
+ - Automated:
+ - Run `mvn clean install -f frontend/pom.xml -DskipTests` to ensure no build regressions.
+
+## Verification
+
+- Verified that `frontend/public/assets/goodone-social-card.png` and `goodone-demo.gif` exist.
+- Verified `index.html` contains the required ` ` tags.
+- Verified `login.component.html` and `.css` have the new hero section and button styles.
+- Verified `README.md` has the new badges and structure.
+- Build verified with: `.\mvnw clean install -f frontend/pom.xml -DskipTests`
+
+## Links
+
+- [README.md](../../../README.md)
+- [Login Component HTML](../../../frontend/src/app/components/login/login.component.html)
+- [Index HTML](../../../frontend/src/index.html)
+
+## Acceptance Confirmation
+
+- [ ] Acceptance test passed on 2026-00-00 00:00
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-34-GoodOne-UI-Polish-Bundle.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-34-GoodOne-UI-Polish-Bundle.md
new file mode 100644
index 000000000..ff42741a9
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-34-GoodOne-UI-Polish-Bundle.md
@@ -0,0 +1,75 @@
+---
+key: AI-WEB-34
+title: "AI-WEB-34: GoodOne UI Polish Bundle"
+taskset: 10
+priority: P1
+status: DONE
+created: 2026-03-13 10:56
+updated: 2026-03-13 11:15
+iterations: 1
+---
+
+## Goal
+
+Introduce a set of UI improvements to increase visual polish, usability, and product maturity.
+The bundle covers:
+- Minimal Apple-style footer (AI-WEB-33 in bundle, remapped to 34)
+- Global UI polish (spacing, surface softness) (AI-WEB-34)
+- Improved navigation clarity (AI-WEB-35)
+- Subtle AI-style hero background polish (AI-WEB-36)
+
+## Scope
+
+- Frontend: `FooterComponent`, Global Styles (`styles.css`), Navigation (`SidenavComponent`), Hero background application.
+- Translations: `en.json`, `de-ch.json`.
+
+## Acceptance Criteria
+
+- [x] Footer visible on all pages
+- [x] Footer uses i18n translation keys
+- [x] GitHub link opens in new tab
+- [x] Cards have softer shadows
+- [x] Page spacing slightly increased
+- [x] Page titles visible on all major screens
+- [x] Active navigation item clearly highlighted
+- [x] Subtle hero background visible on marketing/demo pages (Login, Features, Architecture)
+- [x] No layout regressions
+
+## Junie Log
+
+### 2026-03-13 11:15
+- Summary: Implemented the full UI polish bundle (AI-WEB-34, 35, 36).
+- Outcome:
+ - Created `FooterComponent` and integrated it into the main layout.
+ - Updated global styles for cards, buttons, and page-shell padding.
+ - Added `PageHeaderComponent` to Dashboard for consistent titles.
+ - Verified navigation highlighting in `SidenavComponent`.
+ - Added and applied `hero-background` class to Login, Features, and Architecture pages.
+- Open items: None.
+- Evidence: Successful frontend build (`mvn clean install -f frontend/pom.xml -DskipTests`).
+- Testing Instructions:
+ - Manual:
+ - Check footer at the bottom of all pages.
+ - Verify softer card shadows and increased padding in `.page-shell`.
+ - Verify "Dashboard" title in Dashboard.
+ - Verify navigation highlight in sidenav.
+ - Verify light blue-ish glow in Hero areas of Login, Features, and Architecture pages.
+ - Automated:
+ - Run `.\mvnw clean install -f frontend/pom.xml -DskipTests` to ensure build integrity.
+
+## Verification
+
+- Verified `FooterComponent` files exist and are imported in `App`.
+- Verified `styles.css` contains polish and hero-background styles.
+- Verified `DashboardComponent` uses `PageHeaderComponent`.
+- Verified `SidenavComponent` has `active-link` styling.
+- Verified `LoginComponent`, `FeaturesPageComponent`, and `ArchitectureLandingPageComponent` templates use `hero-background`.
+
+## Links
+
+- [App Component](../../../frontend/src/app/app.ts)
+- [Styles CSS](../../../frontend/src/styles.css)
+- [Footer Component TS](../../../frontend/src/app/components/layout/footer.component.ts)
+
+## Acceptance Confirmation
+- [ ] Acceptance test passed on 2026-00-00 00:00
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-35-Reposition-GoodOne-demo-and-rebalance-GitHub-CTA.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-35-Reposition-GoodOne-demo-and-rebalance-GitHub-CTA.md
new file mode 100644
index 000000000..0431ce336
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-35-Reposition-GoodOne-demo-and-rebalance-GitHub-CTA.md
@@ -0,0 +1,259 @@
+# AI-WEB-35 – Reposition GoodOne demo GIF and reduce GitHub CTA dominance on login page
+
+## Context
+
+The login page currently does not present the strongest product proof early enough.
+
+The most important content on the page is the animated product preview (`goodone-demo.gif`), because it immediately shows what GoodOne actually does. At the moment, that demo appears too low on the page and feels visually disconnected from the headline and value proposition.
+
+In addition, the GitHub call to action is still slightly too dominant relative to the primary intent of the page.
+
+This task should improve the login page hierarchy so users first understand the product, then log in, and only then explore secondary links such as GitHub.
+
+---
+
+## Problem
+
+Current issues on `/login`:
+
+1. The main demo GIF is positioned too low and does not anchor the hero section.
+2. There is too much visual separation between headline/value proposition and the product preview.
+3. The GitHub CTA competes too much with the core product story.
+4. The page should feel more like a modern AI product landing/login page:
+ - product proof first
+ - login action second
+ - secondary exploration third
+
+---
+
+## Junie Log
+
+### 2026-03-13 13:55
+- Summary: Further reduced spacing on the login page by removing redundant branding elements.
+- Outcome:
+ - Removed redundant `h1.hero-title` and `h2.hero-subtitle` from the login page hero section.
+ - Updated `AUTH_AI.TAGLINE` in English and German to "AI-powered engineering intelligence" for consistent branding via `app-brand-logo`.
+ - Tightened spacing between branding, description, and the demo GIF.
+- Open items: None.
+- Evidence:
+ - `LoginComponent` unit tests passed (`npx vitest run src/app/components/login/login.component.spec.ts`).
+ - Redundancy removed from `login.component.html` and `login.component.css`.
+
+### 2026-03-13 13:45
+- Summary: Repositioned demo GIF for better visual hierarchy and rebalanced GitHub CTA on the login page.
+- Outcome:
+ - Moved `goodone-demo.gif` to a stable `assets/demo/` path.
+ - Updated hero wording to "AI-powered engineering intelligence" in both English and German.
+ - Redesigned the login page layout: Logo -> Headline -> Subtitle -> Demo GIF (polished styling) -> Login Form -> Promo -> Subtle GitHub Link.
+ - GitHub CTA is now a subtle, rounded link with a light border, rather than a dominant dark button.
+- Open items: None.
+- Evidence:
+ - `LoginComponent` unit tests passed (`npm test frontend/src/app/components/login/login.component.spec.ts`).
+ - Visual hierarchy verified through `login.component.html` and `login.component.css` refactoring.
+ - Asset relocated to `frontend/public/assets/demo/goodone-demo.gif`.
+
+## Verification
+- [x] Demo GIF appears directly below the hero content.
+- [x] Asset path for the GIF is stable (`assets/demo/goodone-demo.gif`).
+- [x] GitHub CTA is subtle and secondary.
+- [x] Translation keys `HERO_SUBTITLE` added and used.
+- [x] All unit tests pass.
+
+## Goal
+
+Create a clearer visual hierarchy on the login page:
+
+1. Brand and value proposition
+2. Demo preview (`goodone-demo.gif`)
+3. Login form
+4. Secondary exploration links, including GitHub
+
+The page should feel polished, calm, and product-led.
+
+---
+
+## Desired layout
+
+### Target order
+
+```text
+GoodOne logo
+GoodOne
+AI-powered engineering intelligence
+
+Short explanatory text
+
+[ goodone-demo.gif ]
+
+Login form
+
+Secondary links / GitHub
+```
+
+### Why
+
+This makes the product instantly understandable before asking the user to act.
+
+---
+
+## Scope
+
+### 1. Move the demo GIF higher
+
+Refactor the login page template so that the demo preview appears directly below the hero title/subtitle block and above the login form.
+
+Expected outcome:
+
+- no large dead space between headline and demo
+- the GIF becomes the main proof-of-value element
+- the login form follows naturally after the product preview
+
+### 2. Make the demo a real showcase element
+
+Style the demo preview as a polished product showcase rather than a plain inline image.
+
+Recommended styling direction:
+
+- centered
+- generous width, but constrained with `max-width`
+- subtle rounded corners
+- soft shadow
+- enough top and bottom spacing to breathe
+
+Example guidance:
+
+```css
+.demo-preview {
+ margin-top: 32px;
+ margin-bottom: 40px;
+ display: flex;
+ justify-content: center;
+}
+
+.demo-preview img {
+ width: 100%;
+ max-width: 900px;
+ border-radius: 12px;
+ box-shadow: 0 10px 35px rgba(0, 0, 0, 0.15);
+}
+```
+
+Use the existing design language of the application and keep the styling understated.
+
+### 3. Reduce GitHub CTA dominance
+
+The GitHub link should remain visible, but should feel secondary.
+
+Adjust one or more of the following:
+
+- reduce visual weight
+- reduce contrast or emphasis
+- reduce button prominence
+- move it below the login form or into a lighter secondary section
+- avoid making it the strongest CTA on the page
+
+Preferred direction:
+
+- product/demo remains primary
+- login remains the main action
+- GitHub is discoverable but not dominant
+
+Example direction:
+
+- replace a heavy CTA button with a lighter text-link or subtle button
+- move it closer to footer-level importance
+
+### 4. Ensure stable asset location
+
+Ensure the GIF is stored and referenced from a stable asset path.
+
+Preferred path:
+
+```text
+src/assets/demo/goodone-demo.gif
+```
+
+Do not reference temporary, recovery, or build-output locations.
+
+---
+
+## Optional copy improvement
+
+Current wording may understate the platform.
+
+Consider updating the hero wording from:
+
+> AI-powered task intelligence
+
+to something closer to:
+
+> AI-powered engineering intelligence
+
+Reason:
+GoodOne covers architecture, workflow insights, AI features, and engineering risk analysis — not just tasks.
+
+Only apply this if it fits the existing wording and branding consistently.
+
+---
+
+## Optional enhancement
+
+If feasible without large effort, improve the GIF or rotating product preview so it showcases more than one capability, for example:
+
+1. Sprint Retrospective
+2. Architecture Q&A
+3. Risk Radar
+
+This would strengthen first-impression credibility and make the platform scope clearer.
+
+This enhancement is optional and should not delay the core layout fix.
+
+---
+
+## Acceptance criteria
+
+- The demo GIF appears directly below the hero content
+- The most important product proof is visible much earlier
+- The login form appears below the product preview
+- The GitHub CTA is still accessible but clearly secondary
+- The page feels more balanced, modern, and product-led
+- Asset path for the GIF is stable and not temporary
+
+---
+
+## Notes for implementation
+
+Keep the page elegant and restrained.
+Avoid over-styling, excessive gradients, or loud marketing visuals.
+Aim for a polished, calm, high-credibility presentation similar to modern SaaS/AI product pages.
+
+The intended effect is:
+
+- clearer story
+- better first impression
+- stronger product understanding
+- less CTA competition
+
+---
+
+## Suggested file areas to inspect
+
+Likely relevant files include:
+
+- `src/app/.../login.component.html`
+- `src/app/.../login.component.scss`
+- any shared landing/login hero component
+- current asset path reference for `goodone-demo.gif`
+
+Adapt exact file paths to the current frontend structure.
+
+---
+
+## Summary
+
+This task is primarily a visual hierarchy fix:
+
+- move the demo up
+- let the product explain itself earlier
+- reduce GitHub prominence
+- keep the page clean and premium
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-36-Rebalance-login-page-after-demo-move.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-36-Rebalance-login-page-after-demo-move.md
new file mode 100644
index 000000000..110afd96f
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-36-Rebalance-login-page-after-demo-move.md
@@ -0,0 +1,100 @@
+---
+key: AI-WEB-36
+title: 'AI-WEB-36: Rebalance login page after demo GIF move'
+taskset: 10
+priority: P1
+status: DONE
+created: '2026-03-13'
+updated: '2026-03-13'
+iterations: 1
+---
+
+## Goal
+
+Make the login page feel intentionally composed, with better visual balance between:
+- hero content
+- product preview
+- login card
+
+The page should feel like one coherent landing/login experience rather than two unrelated sections stacked on top of each other.
+
+## Scope
+
+### Context
+The previous adjustment improved the content order on `/login`, but the page still looks visually unbalanced. The product demo is now higher on the page, which is correct, but the current composition still has a strong imbalance between the very wide demo block and the much narrower login card below it.
+
+### Problem
+1. The hero/demo section is too visually dominant compared with the login card.
+2. The login card appears too far below and too narrow relative to the width of the demo.
+3. There is too much empty space around the login card, making it feel detached.
+4. The page reads as a very large showcase block then a separate small form floating below.
+5. The overall composition feels vertically stacked, but not harmonized.
+
+### Design direction
+Keep the existing structure, but rebalance proportions.
+- centered, calm, premium, product-led.
+- less empty space.
+- stronger relationship between demo and login form.
+
+### Recommended solution: Option A — Preferred
+Two-column composition on desktop. On larger screens, place the demo and login form into the same visual section.
+
+### Required refinements
+1. Tighten spacing between demo and login.
+2. Improve width relationship.
+3. Treat login card as part of the hero composition.
+4. Preserve calm styling.
+
+## Acceptance Criteria
+
+- [x] The page feels visually balanced on desktop.
+- [x] The login form no longer feels detached from the product demo.
+- [x] The spacing between demo and login is reduced and intentional.
+- [x] Width proportions between demo and form are more harmonious.
+- [x] The layout remains responsive and clean.
+- [x] The page still prioritizes product proof first and login second.
+
+## Junie Log
+
+### 2026-03-13 13:40
+- Summary: Rebalanced the login page by implementing a two-column desktop layout.
+- Outcome:
+ - Introduced a `hero-main` grid container to place the demo preview and login card side-by-side on desktop (min-width: 981px).
+ - Reduced vertical spacing and tightened the relationship between branding, product demo, and login action.
+ - Ensured responsive stacking for mobile devices.
+ - Increased `max-width` of the hero container to 1280px to accommodate the wider balanced layout.
+- Open items: None.
+- Evidence:
+ - `LoginComponent` unit tests passed (`npx vitest run src/app/components/login/login.component.spec.ts`).
+ - Verified grid layout and responsive breakpoints in `login.component.css`.
+- Testing Instructions:
+ - Manual: Open `/login` on a desktop screen. Verify that the demo GIF and login form are side-by-side. Resize to mobile width and verify they stack vertically.
+ - Automated:
+ ```bash
+ npx vitest run src/app/components/login/login.component.spec.ts
+ ```
+
+## Verification
+
+### Manual
+- Verified the grid layout in `login.component.css` uses `grid-template-columns` for desktop and stacks for mobile.
+- Verified the HTML structure in `login.component.html` wraps the demo and form in a shared container.
+
+### Automated
+- `npx vitest run src/app/components/login/login.component.spec.ts` (Passed)
+
+## Links
+
+- PR:
+- Commit:
+
+## Notes (optional)
+
+### Preferred implementation choice
+Use Option A (two-column layout on desktop) if feasible. It is the cleanest fix for the current imbalance and matches modern SaaS/AI landing page patterns.
+
+### Summary
+This is a second-pass polish task. The content order is now mostly correct. The remaining issue is compositional balance. Fix by improving section proportions, spacing, alignment, and relationship between demo and login form.
+
+## Acceptance Confirmation
+- [x] Acceptance test passed on 2026-03-13 13:45
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-37-Restore-Monitoring-Server.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-37-Restore-Monitoring-Server.md
new file mode 100644
index 000000000..3b5e83fc0
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-37-Restore-Monitoring-Server.md
@@ -0,0 +1,78 @@
+---
+key: AI-WEB-37
+title: 'AI-WEB-37: Restore Monitoring Server and fix build'
+taskset: 10
+priority: P0
+status: DONE
+created: '2026-03-13'
+updated: '2026-03-13'
+iterations: 1
+---
+
+## Goal
+
+Restore the `monitoring-server` module to the project after it was temporarily removed, and ensure the entire project builds successfully.
+
+## Scope
+
+- Re-integrate the `monitoring-server` module into the root `pom.xml`.
+- Restore Spring Boot Admin (SBA) client dependencies and configurations in the `backend` module.
+- Fix any build conflicts arising from duplicate main classes during the rebranding process.
+- Verify the full project build.
+
+## Acceptance Criteria
+
+- [x] `monitoring-server` is listed as a module in the root `pom.xml`.
+- [x] `spring-boot-admin.version` is defined in the root `pom.xml`.
+- [x] `backend` module has the `spring-boot-admin-starter-client` dependency.
+- [x] `backend` module has SBA client configuration in `application.properties`.
+- [x] `deploy/dev/Dockerfile` correctly handles the `monitoring-server` module.
+- [x] Duplicate `MonitoringServerApplication.java` classes are removed.
+- [x] Full project build (`mvn clean install -DskipTests`) passes.
+
+## Junie Log
+
+### 2026-03-13 14:30
+- Summary: Fixed deployment scripts and ECS Task Definitions to restore demo service functionality.
+- Outcome:
+ - Updated `scripts/deploy-aws-demo.ps1`, `scripts/deploy-aws-prod.ps1`, and `scripts/deploy-aws.ps1` to use correct existing ECS cluster (`angular-boot`) and service names.
+ - Created missing ECR repository `goodone-app`.
+ - Corrected IAM role and CloudWatch log group references in `deploy/aws/backend-test-task-definition.json` and `deploy/aws/backend-task-definition.json` to match existing infrastructure (`angularai-` prefix).
+ - Successfully deployed the demo service; task is now `RUNNING` and service has reached a `steady state`.
+- Open items: None.
+- Evidence:
+ - ECR push success for `goodone-app:latest`.
+ - ECS Service Event: `(service angularai-backend-test-service) has reached a steady state.`
+ - ECS Task Status: `RUNNING`.
+
+### 2026-03-13 14:10
+- Summary: Restored the `monitoring-server` module and resolved build conflicts.
+- Outcome:
+ - Updated root `pom.xml` to include the `monitoring-server` module and restored the `spring-boot-admin.version` property.
+ - Verified that SBA client dependency and configuration are present in the `backend` module.
+ - Restored `monitoring-server` build steps in `deploy/dev/Dockerfile`.
+ - Identified and removed a duplicate `MonitoringServerApplication.java` class in the old `ch.goodone.angularai.monitoring` package.
+ - Successfully completed a full project build using `mvn clean install -DskipTests`.
+- Open items: None.
+- Evidence:
+ - Build success: `mvn clean install -DskipTests` (Total time: 43.549 s).
+ - File verification: `monitoring-server` exists and is correctly configured in Maven.
+- Testing Instructions:
+ - Automated:
+ ```bash
+ mvn clean install -DskipTests
+ ```
+
+## Verification
+
+### Automated
+- `mvn clean install -DskipTests` (Passed)
+
+## Links
+
+- PR:
+- Commit:
+
+## Notes (optional)
+
+The build failure was caused by the missing `monitoring-server` directory which was referenced in the `Dockerfile`. After the user restored the directory, a conflict occurred due to two main class candidates (one from the old package name before rebranding). This was resolved by removing the legacy class.
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-38-UI-and-Runtime-Fixes-Bundle.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-38-UI-and-Runtime-Fixes-Bundle.md
new file mode 100644
index 000000000..c3627c8ef
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-38-UI-and-Runtime-Fixes-Bundle.md
@@ -0,0 +1,53 @@
+---
+key: AI-WEB-38
+title: UI and Runtime Fixes Bundle
+taskset: 10
+priority: P1
+status: DONE
+created: 2026-03-13
+updated: 2026-03-13
+iterations: 1
+---
+
+## Goal
+Fix several UI regressions in dark mode and a critical runtime error in the Retrospective component.
+
+## Scope
+- `RetrospectiveComponent`: Fix null check error in `formattedResult`.
+- `LoginComponent`: Fix white header background in dark mode.
+- `ArchitectureDemoPageComponent`: Fix dark mode contrast and text overlap.
+- `FeaturesPageComponent` / `AiCapabilities`: Fix dark mode contrast.
+- `app.config.ts`: Resolve i18n deprecation warning.
+
+## Acceptance Criteria
+- `RetrospectiveComponent` loads without console errors.
+- Login page header is correctly styled in dark mode (no hardcoded white background).
+- Architecture Demo page has no text overlap and is WCAG contrast compliant in dark mode.
+- Features page is WCAG contrast compliant in dark mode.
+- No deprecation warnings from `ngx-translate` in the console.
+
+## Junie Log
+
+### 2026-03-13 16:15
+- Summary: Implemented and verified UI and runtime fixes.
+- Outcome:
+ - Fixed `RetrospectiveComponent` null check.
+ - Fixed dark mode contrast and white header on login and features pages.
+ - Resolved `ArchitectureDemoPage` text overlap and dark mode contrast.
+ - Addressed i18n deprecation in `app.config.ts`.
+- Open items: None.
+- Evidence: Playwright tests passed with 0 color-contrast violations.
+
+### 2026-03-13 15:58
+- Summary: Started the UI and Runtime Fixes bundle.
+- Outcome: Identified files and created the task.
+- Open items: Fix the identified issues.
+- Evidence: Console logs and screenshots provided in issue description.
+
+## Verification
+- Manual verification of the pages in both light and dark modes.
+- Playwright accessibility tests for contrast.
+- Check console for errors/warnings.
+
+## Links
+- AI-WEB-32-dark-mode-fix.md
diff --git a/doc/knowledge/junie-tasks/taskset-10/AI-WEB-39-Architecture-Page-UI-Fixes.md b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-39-Architecture-Page-UI-Fixes.md
new file mode 100644
index 000000000..d2b15e6ba
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/AI-WEB-39-Architecture-Page-UI-Fixes.md
@@ -0,0 +1,56 @@
+---
+key: AI-WEB-39
+title: 'AI-WEB-39: Architecture Page UI Fixes'
+taskset: 10
+priority: P1
+status: DONE
+created: '2026-03-13'
+updated: '2026-03-13'
+iterations: 1
+---
+
+## Goal
+
+Resolve overlapping text issues on the Architecture page (/architecture) and improve responsive layout stability.
+
+## Scope
+
+- Architecture Landing Page (/architecture)
+- Architecture QA Component
+- Global Card Header styles
+
+## Acceptance Criteria
+
+- [x] No overlapping text in mat-form-field on the architecture page.
+- [x] mat-label is correctly positioned and visible in both light and dark modes.
+- [x] App card headers are responsive and wrap correctly on small screens (360px).
+- [x] Playwright UX guardrails pass.
+
+## Junie Log
+
+### 2026-03-13 16:30
+- Summary: Fixed overlapping text in ArchitectureQaComponent and improved global card header responsiveness.
+- Outcome: Resolved the overlap by removing the redundant placeholder and using dynamic subscript sizing in mat-form-field. Added flex-wrap to app-card-header.
+- Open items: None.
+- Evidence: Playwright tests confirmed zero vertical overlap when floating and stable layout at 360px.
+- Testing Instructions:
+ - Manual: Navigate to /architecture, type a question in the AI chat at the bottom. Verify the label floats correctly and does not overlap with the textarea border or text.
+ - Automated: Run `npx playwright test e2e/ux-guardrails.spec.ts` in the frontend directory.
+
+## Verification
+
+### Automated
+- Executed Playwright tests with 360px viewport: `Vertical overlap when floating: 0`.
+- Verified 0 color-contrast violations in dark mode for the mat-label.
+
+## Links
+
+- PR:
+- Commit:
+
+## Notes (optional)
+
+The overlapping text was primarily caused by the simultaneous presence of a mat-label and a placeholder in an outlined mat-form-field, combined with static subscript sizing that squeezed the layout on smaller viewports.
+
+## Acceptance Confirmation
+- [x] Acceptance test passed on 2026-03-13 16:35
diff --git a/doc/knowledge/junie-tasks/taskset-10/rebrand_goodone.py b/doc/knowledge/junie-tasks/taskset-10/rebrand_goodone.py
new file mode 100644
index 000000000..4975c5089
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/rebrand_goodone.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+"""
+Repo rebranding helper: GoodOne -> GoodOne
+
+What it does
+- Recursively scans a repo
+- Replaces selected text occurrences in text files
+- Skips common binary/build folders
+- Supports --dry-run first
+
+Usage
+ python rebrand_goodone.py /path/to/repo --dry-run
+ python rebrand_goodone.py /path/to/repo
+"""
+
+from __future__ import annotations
+
+import argparse
+from pathlib import Path
+
+EXCLUDED_DIRS = {
+ ".git", ".idea", ".vscode", ".angular", "node_modules", "dist", "build",
+ "target", ".gradle", ".mvn", ".next", ".cache", "coverage", "out"
+}
+
+EXCLUDED_SUFFIXES = {
+ ".png", ".jpg", ".jpeg", ".gif", ".webp", ".ico", ".pdf", ".zip", ".jar",
+ ".war", ".class", ".so", ".dll", ".exe", ".woff", ".woff2", ".ttf", ".eot"
+}
+
+REPLACEMENTS = [
+ ("GoodOne – AI Software Engineering Demo Platform", "GoodOne – AI Software Engineering Demo Platform"),
+ ("GoodOne – Plattform für KI-gestützte Softwareentwicklung", "GoodOne – Plattform für KI-gestützte Softwareentwicklung"),
+ ("GoodOne", "GoodOne"),
+ ("goodone", "goodone"),
+]
+
+def is_text_file(path: Path) -> bool:
+ if path.suffix.lower() in EXCLUDED_SUFFIXES:
+ return False
+ try:
+ raw = path.read_bytes()
+ if b"\x00" in raw:
+ return False
+ raw.decode("utf-8")
+ return True
+ except Exception:
+ return False
+
+def should_skip(path: Path) -> bool:
+ return any(part in EXCLUDED_DIRS for part in path.parts)
+
+def process_file(path: Path, dry_run: bool) -> tuple[bool, int]:
+ try:
+ original = path.read_text(encoding="utf-8")
+ except Exception:
+ return False, 0
+
+ updated = original
+ count = 0
+ for old, new in REPLACEMENTS:
+ occurrences = updated.count(old)
+ if occurrences:
+ updated = updated.replace(old, new)
+ count += occurrences
+
+ if count and not dry_run:
+ path.write_text(updated, encoding="utf-8")
+
+ return count > 0, count
+
+def main() -> int:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("repo", help="Path to repository root")
+ parser.add_argument("--dry-run", action="store_true", help="Only report changes")
+ args = parser.parse_args()
+
+ repo = Path(args.repo).resolve()
+ if not repo.exists() or not repo.is_dir():
+ print(f"Repository path not found: {repo}")
+ return 1
+
+ changed_files = []
+ total_replacements = 0
+
+ for path in repo.rglob("*"):
+ if not path.is_file():
+ continue
+ if should_skip(path):
+ continue
+ if not is_text_file(path):
+ continue
+
+ changed, count = process_file(path, dry_run=args.dry_run)
+ if changed:
+ changed_files.append((path, count))
+ total_replacements += count
+
+ mode = "DRY RUN" if args.dry_run else "UPDATED"
+ print(f"{mode}: {len(changed_files)} file(s), {total_replacements} replacement(s)")
+ for path, count in changed_files:
+ print(f"- {path}: {count}")
+
+ print("\nRecommended next checks:")
+ print("1. grep -Rni 'GoodOne' .")
+ print("2. grep -Rni 'goodone' .")
+ print("3. Review README, package/app names, GitHub URLs, image assets, and social cards.")
+ return 0
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/doc/knowledge/junie-tasks/taskset-10/rebrand_goodone_README.md b/doc/knowledge/junie-tasks/taskset-10/rebrand_goodone_README.md
new file mode 100644
index 000000000..0744e82f5
--- /dev/null
+++ b/doc/knowledge/junie-tasks/taskset-10/rebrand_goodone_README.md
@@ -0,0 +1,21 @@
+# GoodOne repo rebranding helper
+
+Files:
+- `rebrand_goodone.py` — scans a repo and replaces common `GoodOne` / `goodone` occurrences with `GoodOne` / `goodone`
+
+Suggested usage:
+```bash
+python rebrand_goodone.py /path/to/repo --dry-run
+python rebrand_goodone.py /path/to/repo
+grep -Rni 'GoodOne' /path/to/repo
+grep -Rni 'goodone' /path/to/repo
+```
+
+Notes:
+- Skips common build, VCS, dependency, and binary folders/files
+- Safe to start with `--dry-run`
+- Still manually review:
+ - README and docs
+ - social card / image asset names
+ - GitHub URLs and meta tags
+ - package names, artifact names, and environment variables
diff --git a/doc/knowledge/junie-tasks/taskset-3/CI-FIX-01-Fix-SonarCloud-job-path-bug-standardize-npm-install.md b/doc/knowledge/junie-tasks/taskset-3/CI-FIX-01-Fix-SonarCloud-job-path-bug-standardize-npm-install.md
index cf519a1c6..5135ef8c9 100644
--- a/doc/knowledge/junie-tasks/taskset-3/CI-FIX-01-Fix-SonarCloud-job-path-bug-standardize-npm-install.md
+++ b/doc/knowledge/junie-tasks/taskset-3/CI-FIX-01-Fix-SonarCloud-job-path-bug-standardize-npm-install.md
@@ -18,7 +18,7 @@ sourcePath: doc/knowledge/junie-tasks/taskset-3/CI-FIX-01-Fix-SonarCloud-job-pat
## Goal
-# AngularAI – CI/Testing/Security Improvements Task Pack (V3)
+# GoodOne – CI/Testing/Security Improvements Task Pack (V3)
Context: Workflows already exist in `.github/workflows/` (build.yml, playwright.yml, code-review.yml).
Goal: Make CI faster, more reliable, less redundant, and produce stronger quality/security evidence.
@@ -49,7 +49,7 @@ Manual verification required.
## Notes
-# AngularAI – CI/Testing/Security Improvements Task Pack (V3)
+# GoodOne – CI/Testing/Security Improvements Task Pack (V3)
Context: Workflows already exist in `.github/workflows/` (build.yml, playwright.yml, code-review.yml).
Goal: Make CI faster, more reliable, less redundant, and produce stronger quality/security evidence.
diff --git a/doc/knowledge/junie-tasks/taskset-3/QA-COV-01-Make-coverage-generation-explicit-enforced.md b/doc/knowledge/junie-tasks/taskset-3/QA-COV-01-Make-coverage-generation-explicit-enforced.md
index 32364750e..9b5ea2f9d 100644
--- a/doc/knowledge/junie-tasks/taskset-3/QA-COV-01-Make-coverage-generation-explicit-enforced.md
+++ b/doc/knowledge/junie-tasks/taskset-3/QA-COV-01-Make-coverage-generation-explicit-enforced.md
@@ -39,7 +39,7 @@ sourcePath: doc/knowledge/junie-tasks/taskset-3/QA-COV-01-Make-coverage-generati
**Done:**
- JaCoCo `prepare-agent`, `report`, and `check` goals added to root `pom.xml`.
- JaCoCo `argLine` integration ensured via `@{argLine}` in `backend/pom.xml`.
-- JaCoCo configured with `includes` for `ch/goodone/angularai/**` AND explicit `excludes` for dynamic proxy classes (Mockito, Hibernate, ByteBuddy) to avoid instrumentation errors with modern JDKs (class file version 69) and 3rd party libraries.
+- JaCoCo configured with `includes` for `ch/goodone/goodone/**` AND explicit `excludes` for dynamic proxy classes (Mockito, Hibernate, ByteBuddy) to avoid instrumentation errors with modern JDKs (class file version 69) and 3rd party libraries.
- Vitest coverage thresholds added to `frontend/vitest.config.ts`.
- `build.yml` updated to use `mvn verify` for backend to ensure coverage reports and checks are executed.
- Thresholds set to 10% as a starting point.
@@ -47,14 +47,14 @@ sourcePath: doc/knowledge/junie-tasks/taskset-3/QA-COV-01-Make-coverage-generati
**QA by usr:**
`mvn verify` executed
-[INFO] Writing XML report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-report.xml
-[INFO] Writing HTML report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-report.html
-[INFO] Writing JSON report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-report.json
-[INFO] Writing CSV report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-report.csv
-[INFO] Writing SARIF report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-report.sarif
-[INFO] Writing JENKINS report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-jenkins.html
-[INFO] Writing JUNIT report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-junit.xml
-[INFO] Writing GITLAB report to: C:\doc\sw\ai\angularai\angularai\test-client\target\dependency-check-gitlab.json
+[INFO] Writing XML report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-report.xml
+[INFO] Writing HTML report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-report.html
+[INFO] Writing JSON report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-report.json
+[INFO] Writing CSV report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-report.csv
+[INFO] Writing SARIF report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-report.sarif
+[INFO] Writing JENKINS report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-jenkins.html
+[INFO] Writing JUNIT report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-junit.xml
+[INFO] Writing GITLAB report to: C:\doc\sw\ai\goodone\goodone\test-client\target\dependency-check-gitlab.json
Config `frontend/vitest.config.ts`.
coverage: {
diff --git a/doc/knowledge/junie-tasks/taskset-3/iteration2.md b/doc/knowledge/junie-tasks/taskset-3/iteration2.md
index 019c8377b..275161b77 100644
--- a/doc/knowledge/junie-tasks/taskset-3/iteration2.md
+++ b/doc/knowledge/junie-tasks/taskset-3/iteration2.md
@@ -20,7 +20,7 @@ sourcePath: doc/knowledge/junie-tasks/taskset-3/iteration2.md
## Goal
-# AngularAI – CI/Testing/Security Improvements Task Pack (V3)
+# GoodOne – CI/Testing/Security Improvements Task Pack (V3)
## Scope
diff --git a/doc/knowledge/junie-tasks/taskset-4-7.md b/doc/knowledge/junie-tasks/taskset-4-7.md
index c3c10337b..a923bd365 100644
--- a/doc/knowledge/junie-tasks/taskset-4-7.md
+++ b/doc/knowledge/junie-tasks/taskset-4-7.md
@@ -14,7 +14,7 @@ sourcePath: doc/knowledge/junie-tasks/taskset-4-7.md
## Goal
-# AngularAI – Next Task Sets (V4–V7)
+# GoodOne – Next Task Sets (V4–V7)
Move from “stable demo” to a **credible internal reference project** that demonstrates
reliability, confidence, security governance, and professional release discipline.
@@ -46,7 +46,7 @@ Manual verification required.
## Notes
-# AngularAI – Next Task Sets (V4–V7)
+# GoodOne – Next Task Sets (V4–V7)
## V4 — Reliability & Observability
@@ -298,7 +298,7 @@ Manual verification required.
- **V6**: Security maturity & governance
- **V7**: Release discipline & polish
-Together, these sets turn AngularAI into a **reference implementation** for
+Together, these sets turn GoodOne into a **reference implementation** for
AI-assisted, professionally governed software development.
```{=html}
diff --git a/doc/knowledge/junie-tasks/taskset-4/OBS-MET-01-Basic-Metrics-Exposure.md b/doc/knowledge/junie-tasks/taskset-4/OBS-MET-01-Basic-Metrics-Exposure.md
index 04a51a435..c88f095f3 100644
--- a/doc/knowledge/junie-tasks/taskset-4/OBS-MET-01-Basic-Metrics-Exposure.md
+++ b/doc/knowledge/junie-tasks/taskset-4/OBS-MET-01-Basic-Metrics-Exposure.md
@@ -123,7 +123,7 @@ global:
scrape_interval: 15s
scrape_configs:
- - job_name: 'angularai-backend'
+ - job_name: 'goodone-backend'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
@@ -160,7 +160,7 @@ To see metrics in Prometheus while developing in IntelliJ:
#### 1. Configure the Backend Run Configuration
1. Open **Run/Debug Configurations** in IntelliJ.
-2. Select your `AibackendApplication` (Spring Boot).
+2. Select your `GoodoneBackendApplication` (Spring Boot).
3. In the **Active profiles** field, add `prometheus` (e.g., `dev,prometheus`).
4. Apply and start the application.
@@ -224,7 +224,7 @@ Since many public Docker images for "Spring Boot Admin" are unreliable or outdat
#### 1. Open the Endpoints Window
1. Start the application in IntelliJ with the `prometheus` profile.
2. At the bottom of IntelliJ, look for the **Endpoints** tab.
-3. Select the `aibackend` application on the left.
+3. Select the `goodone-backend` application on the left.
#### 2. Key Features (Same as Spring Boot Admin)
The IntelliJ UI provides the following tabs which cover all Actuator features:
diff --git a/doc/knowledge/junie-tasks/taskset-4/graphana-debug.md b/doc/knowledge/junie-tasks/taskset-4/graphana-debug.md
index 9ffe595ed..ed43d4114 100644
--- a/doc/knowledge/junie-tasks/taskset-4/graphana-debug.md
+++ b/doc/knowledge/junie-tasks/taskset-4/graphana-debug.md
@@ -19,7 +19,7 @@ TBD
## Scope
-- job_name: 'angularai-backend'
+- job_name: 'goodone-backend'
## Acceptance Criteria
@@ -54,7 +54,7 @@ sourcePath: /tmp/junie_tasks_tydrcmgk/prototype-maturity/taskset-4/graphana-debu
### Configuring and Troubleshooting the Monitored Host
## Scope
-- job_name: 'angularai-backend'
+- job_name: 'goodone-backend'
## Junie Log
@@ -75,7 +75,7 @@ Open `deploy/prometheus/prometheus.yml` and look for the `targets` setting:
```yaml
scrape_configs:
- - job_name: 'angularai-backend'
+ - job_name: 'goodone-backend'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080'] # <-- CHANGE THIS
@@ -96,7 +96,7 @@ Open this URL in your browser: `http://localhost:8080/actuator/prometheus`
**Step B: Check Prometheus Status**
Open the Prometheus Targets page: `http://localhost:9090/targets`
-* Look for the `angularai-backend` job.
+* Look for the `goodone-backend` job.
* **State UP (Green):** Prometheus is successfully scraping. Data should appear in Grafana shortly (note: `rate` calculations require at least 30 seconds of data).
* **State DOWN (Red):** Prometheus cannot reach the backend. This usually means `host.docker.internal` is not resolving or the port is wrong.
@@ -134,7 +134,7 @@ cd deploy/prometheus
docker compose ps
```
-You should see both `angularai-prometheus` and `angularai-grafana` in the `Up` state.
+You should see both `goodone-prometheus` and `goodone-grafana` in the `Up` state.
### 2) Inspect Prometheus logs for config errors
A YAML typo or a bind error will make Prometheus exit immediately.
@@ -174,11 +174,11 @@ curl http://localhost:9090/-/ready
### 5) Confirm the backend is actually being scraped
Once the Prometheus UI is reachable, verify the target and query:
-- Open `http://localhost:9090/targets` → `angularai-backend` should be `UP`.
+- Open `http://localhost:9090/targets` → `goodone-backend` should be `UP`.
- If it’s `DOWN`, check the scrape target in `deploy/prometheus/prometheus.yml`:
```yaml
scrape_configs:
- - job_name: 'angularai-backend'
+ - job_name: 'goodone-backend'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
diff --git a/doc/knowledge/junie-tasks/taskset-7/DEPLOY-PIPE-01-Optional-CD-to-Demo-Environment.md b/doc/knowledge/junie-tasks/taskset-7/DEPLOY-PIPE-01-Optional-CD-to-Demo-Environment.md
index 38636bcad..3abbc0db4 100644
--- a/doc/knowledge/junie-tasks/taskset-7/DEPLOY-PIPE-01-Optional-CD-to-Demo-Environment.md
+++ b/doc/knowledge/junie-tasks/taskset-7/DEPLOY-PIPE-01-Optional-CD-to-Demo-Environment.md
@@ -69,8 +69,8 @@ Manual verification required.
### Rollback Procedure
If a deployment fails or needs to be reverted:
1. **Manual Rollback via ECS**:
- - Go to the AWS Console -> ECS -> Clusters -> `angular-boot`.
- - Select the service `angularai-backend-test-service`.
+ - Go to the AWS Console -> ECS -> Clusters -> `goodone-cluster`.
+ - Select the service `goodone-backend-test-service`.
- Click "Update".
- Select the previous stable Task Definition revision.
- Force a new deployment.
diff --git a/doc/knowledge/junie-tasks/taskset-7/ENV-SYNC-01-Configuration-Drift-Protection.md b/doc/knowledge/junie-tasks/taskset-7/ENV-SYNC-01-Configuration-Drift-Protection.md
index 8bd9f7482..59e79cf73 100644
--- a/doc/knowledge/junie-tasks/taskset-7/ENV-SYNC-01-Configuration-Drift-Protection.md
+++ b/doc/knowledge/junie-tasks/taskset-7/ENV-SYNC-01-Configuration-Drift-Protection.md
@@ -36,7 +36,7 @@ _No entries._
## Verification
### Testing Instructions
-- **Automated Tests**: Run `mvn test -Dtest=ConfigValidatorTest` to verify validation logic. Run `mvn test -Dtest=AibackendApplicationTests` to ensure standard context load still works with safe defaults.
+- **Automated Tests**: Run `mvn test -Dtest=ConfigValidatorTest` to verify validation logic. Run `mvn test -Dtest=GoodoneBackendApplicationTests` to ensure standard context load still works with safe defaults.
- **Manual Verification**:
1. Temporarily change `JWT_SECRET` in `.env` to a short string (e.g., "short").
2. Start the backend: `mvn spring-boot:run -pl backend`.
@@ -45,7 +45,7 @@ _No entries._
5. Verify it fails with multiple errors regarding missing production credentials and database configuration.
### Testing Instructions
-- **Automated Tests**: Run `mvn test -Dtest=ConfigValidatorTest` to verify validation logic. Run `mvn test -Dtest=AibackendApplicationTests` to ensure standard context load still works with safe defaults.
+- **Automated Tests**: Run `mvn test -Dtest=ConfigValidatorTest` to verify validation logic. Run `mvn test -Dtest=GoodoneBackendApplicationTests` to ensure standard context load still works with safe defaults.
- **Manual Verification**:
1. Temporarily change `JWT_SECRET` in `.env` to a short string (e.g., "short").
2. Start the backend: `mvn spring-boot:run -pl backend`.
@@ -72,7 +72,7 @@ _No entries._
**DONE: 2026-02-15 12:44**
**Testing Instructions:**
-- **Automated Tests**: Run `mvn test -Dtest=ConfigValidatorTest` to verify validation logic. Run `mvn test -Dtest=AibackendApplicationTests` to ensure standard context load still works with safe defaults.
+- **Automated Tests**: Run `mvn test -Dtest=ConfigValidatorTest` to verify validation logic. Run `mvn test -Dtest=GoodoneBackendApplicationTests` to ensure standard context load still works with safe defaults.
- **Manual Verification**:
1. Temporarily change `JWT_SECRET` in `.env` to a short string (e.g., "short").
2. Start the backend: `mvn spring-boot:run -pl backend`.
diff --git a/doc/knowledge/junie-tasks/taskset-8/AUTH-DEPLOY-01-Fix-Fargate-auth-inconsistency.md b/doc/knowledge/junie-tasks/taskset-8/AUTH-DEPLOY-01-Fix-Fargate-auth-inconsistency.md
index e0da691ab..f18442b85 100644
--- a/doc/knowledge/junie-tasks/taskset-8/AUTH-DEPLOY-01-Fix-Fargate-auth-inconsistency.md
+++ b/doc/knowledge/junie-tasks/taskset-8/AUTH-DEPLOY-01-Fix-Fargate-auth-inconsistency.md
@@ -11,14 +11,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/AUTH-DEPLOY-01-Fix-Fargate-auth-inconsistency.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: Backend + Frontend
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
@@ -57,7 +57,7 @@ failedAcceptanceIterations: 0
## Notes
### Task AUTH-DEPLOY-01 — Fix “activate account” message while logged in + menu clicks do nothing
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
**Area:** Backend + Frontend
diff --git a/doc/knowledge/junie-tasks/taskset-8/E2E-01-Add-navigation-regression-suite.md b/doc/knowledge/junie-tasks/taskset-8/E2E-01-Add-navigation-regression-suite.md
index 9bb90eccd..6d7e2b571 100644
--- a/doc/knowledge/junie-tasks/taskset-8/E2E-01-Add-navigation-regression-suite.md
+++ b/doc/knowledge/junie-tasks/taskset-8/E2E-01-Add-navigation-regression-suite.md
@@ -16,14 +16,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/E2E-01-Add-navigation-regression-suite.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: E2E (Playwright)
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
diff --git a/doc/knowledge/junie-tasks/taskset-8/E2E-02-Add-no-console-errors-guardrail.md b/doc/knowledge/junie-tasks/taskset-8/E2E-02-Add-no-console-errors-guardrail.md
index 5a3262809..7c4eabbcf 100644
--- a/doc/knowledge/junie-tasks/taskset-8/E2E-02-Add-no-console-errors-guardrail.md
+++ b/doc/knowledge/junie-tasks/taskset-8/E2E-02-Add-no-console-errors-guardrail.md
@@ -11,14 +11,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/E2E-02-Add-no-console-errors-guardrail.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: E2E
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
diff --git a/doc/knowledge/junie-tasks/taskset-8/E2E-03-Add-Auth-state-consistency-tests.md b/doc/knowledge/junie-tasks/taskset-8/E2E-03-Add-Auth-state-consistency-tests.md
index 3ca0665b8..51a075691 100644
--- a/doc/knowledge/junie-tasks/taskset-8/E2E-03-Add-Auth-state-consistency-tests.md
+++ b/doc/knowledge/junie-tasks/taskset-8/E2E-03-Add-Auth-state-consistency-tests.md
@@ -12,14 +12,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/E2E-03-Add-Auth-state-consistency-tests.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: E2E + Backend test seed
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
diff --git a/doc/knowledge/junie-tasks/taskset-8/LEGAL-01-Fix-exception-on-closing-Terms-Legal-dialog.md b/doc/knowledge/junie-tasks/taskset-8/LEGAL-01-Fix-exception-on-closing-Terms-Legal-dialog.md
index b0afb0913..6a852a35f 100644
--- a/doc/knowledge/junie-tasks/taskset-8/LEGAL-01-Fix-exception-on-closing-Terms-Legal-dialog.md
+++ b/doc/knowledge/junie-tasks/taskset-8/LEGAL-01-Fix-exception-on-closing-Terms-Legal-dialog.md
@@ -14,14 +14,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/LEGAL-01-Fix-exception-on-closing-Terms-Legal-dialog.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: Frontend / Dialogs
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
@@ -51,7 +51,7 @@ Manual verification required.
## Notes
### Task LEGAL-01 — Fix exception on closing “Terms and Conditions / Legal Notice” dialog
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
**Area:** Frontend / Dialogs
diff --git a/doc/knowledge/junie-tasks/taskset-8/NAV-01-Fix-hamburger-menu-on-mobile.md b/doc/knowledge/junie-tasks/taskset-8/NAV-01-Fix-hamburger-menu-on-mobile.md
index 2a909a0f5..88c19fec7 100644
--- a/doc/knowledge/junie-tasks/taskset-8/NAV-01-Fix-hamburger-menu-on-mobile.md
+++ b/doc/knowledge/junie-tasks/taskset-8/NAV-01-Fix-hamburger-menu-on-mobile.md
@@ -15,14 +15,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/NAV-01-Fix-hamburger-menu-on-mobile.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: Frontend / Layout
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
@@ -125,7 +125,7 @@ failedAcceptanceIterations: 0
## Notes
### Task NAV-01 — Fix hamburger menu on mobile (no reaction)
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
**Area:** Frontend / Layout
diff --git a/doc/knowledge/junie-tasks/taskset-8/NAV-02-Fix-tablet-collapse-expand.md b/doc/knowledge/junie-tasks/taskset-8/NAV-02-Fix-tablet-collapse-expand.md
index 873cb4e07..4aaf50108 100644
--- a/doc/knowledge/junie-tasks/taskset-8/NAV-02-Fix-tablet-collapse-expand.md
+++ b/doc/knowledge/junie-tasks/taskset-8/NAV-02-Fix-tablet-collapse-expand.md
@@ -16,14 +16,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/NAV-02-Fix-tablet-collapse-expand.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: Frontend / Layout
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
@@ -93,7 +93,7 @@ Manual verification required.
## Notes
### Task NAV-02 — Fix tablet collapse/expand: cannot collapse after expanding
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
**Area:** Frontend / Layout
diff --git a/doc/knowledge/junie-tasks/taskset-8/UX-NAV-01-Improve-visible-affordance-for-nav-state.md b/doc/knowledge/junie-tasks/taskset-8/UX-NAV-01-Improve-visible-affordance-for-nav-state.md
index b3d2c4e32..4ae7e7739 100644
--- a/doc/knowledge/junie-tasks/taskset-8/UX-NAV-01-Improve-visible-affordance-for-nav-state.md
+++ b/doc/knowledge/junie-tasks/taskset-8/UX-NAV-01-Improve-visible-affordance-for-nav-state.md
@@ -11,14 +11,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/UX-NAV-01-Improve-visible-affordance-for-nav-state.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: Frontend
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
@@ -115,7 +115,7 @@ Summary: Defined small, accessible hints for collapsed state (tooltips, focus vi
## Notes
### Task UX-NAV-01 — Improve visible affordance for nav state (collapsed/expanded)
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
**Area:** Frontend
diff --git a/doc/knowledge/junie-tasks/taskset-8/UX-UA-01-Fix-mobile-action-buttons.md b/doc/knowledge/junie-tasks/taskset-8/UX-UA-01-Fix-mobile-action-buttons.md
index a6504c839..f93cb9bf0 100644
--- a/doc/knowledge/junie-tasks/taskset-8/UX-UA-01-Fix-mobile-action-buttons.md
+++ b/doc/knowledge/junie-tasks/taskset-8/UX-UA-01-Fix-mobile-action-buttons.md
@@ -14,14 +14,14 @@ links:
pr: ''
commit: ''
sourcePath: doc/knowledge/junie-tasks/taskset-8/UX-UA-01-Fix-mobile-action-buttons.md
-focus: AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+focus: GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
area: Frontend / User Admin
failedAcceptanceIterations: 0
---
## Goal
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
## Scope
@@ -61,7 +61,7 @@ failedAcceptanceIterations: 0
## Notes
### Task UX-UA-01 — Fix mobile action buttons (edit too big + icon not centered)
-**Focus:** AngularAI Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
+**Focus:** GoodOne Showcase – Next Iteration Junie Tasks (UX + E2E Reliability)
**Area:** Frontend / User Admin
diff --git a/doc/knowledge/junie-tasks/taskset-9/junie-task-format-guideline.md b/doc/knowledge/junie-tasks/taskset-9/junie-task-format-guideline.md
index 26e7db471..48e0995e4 100644
--- a/doc/knowledge/junie-tasks/taskset-9/junie-task-format-guideline.md
+++ b/doc/knowledge/junie-tasks/taskset-9/junie-task-format-guideline.md
@@ -106,16 +106,19 @@ Every log entry MUST follow this format:
# 3. Mandatory Naming & YAML Rules
-## 3.1 Filename Format
+## 3.1 "no task" Keyword
+If the keyword 'no task' (case-insensitive) appears in the first lines of the user prompt, neither task creation nor task update log is required. This is intended for small, trivial tasks to avoid cluttering the task repository.
+
+## 3.2 Filename Format
Every task file MUST be named starting with the Task ID (key), followed by the title (words separated by hyphens).
Example: `AI-RETRO-01-AI-Retrospective-Generator.md`
Do NOT use prefixes like `Task-` if the Task ID already specifies the category.
-## 3.2 YAML Title
+## 3.3 YAML Title
The `title` field in the YAML frontmatter MUST start with the Task ID (key) for better traceability.
Example: `title: AI-RETRO-01: AI Retrospective Generator`
-## 3.3 Chat Summarization Workaround
+## 3.4 Chat Summarization Workaround
If the Junie AI JetBrains plugin does not provide a manual rename option, ensure the full task filename (without extension) is mentioned prominently in the initial message of a task. This triggers the plugin's automatic summarizer to include the complete Task ID and filename in the chat history summary.
```{=html}
diff --git a/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-01-Monorepo-structure-dev-orchestration-Postgres-pgvector-Ollama.md b/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-01-Monorepo-structure-dev-orchestration-Postgres-pgvector-Ollama.md
index d91217374..ff920a248 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-01-Monorepo-structure-dev-orchestration-Postgres-pgvector-Ollama.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-01-Monorepo-structure-dev-orchestration-Postgres-pgvector-Ollama.md
@@ -95,15 +95,15 @@ docker compose -f deploy/dev/docker-compose.dev.yml down
docker compose -f deploy/dev/docker-compose.yml build app --no-cache --dry-run
[+] Running 3/3
-✔ Network angularai_default Created 0.0s
-✔ Container angularai-postgres Started 0.4s
-✔ Container angularai-ollama Started
+✔ Network goodone_default Created 0.0s
+✔ Container goodone-postgres Started 0.4s
+✔ Container goodone-ollama Started
`docker compose logs --tail 100`
-angularai-ollama
+goodone-ollama
msg="starting runner" cmd="/usr/bin/ollama runner --ollama-engine --port 44561"
msg="starting runner" cmd="/usr/bin/ollama runner --ollama-engine --port 45851"
-angularai-postgres
+goodone-postgres
database system was shut down at 2026-02-25 12:19:40 UTC ??
database system is ready to accept connections
diff --git a/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-04-AI-backend-endpoints-application-layer-no-model-calls-in-controllers.md b/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-04-AI-backend-endpoints-application-layer-no-model-calls-in-controllers.md
index cf993ddf1..116f8a45e 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-04-AI-backend-endpoints-application-layer-no-model-calls-in-controllers.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-04-AI-backend-endpoints-application-layer-no-model-calls-in-controllers.md
@@ -95,9 +95,9 @@ Using swagger UI:
4. Click **Authorize**
3) http://localhost:8080/swagger-ui/index.html#/ai-controller/explainArchitecture
check db
-docker exec angularai-postgres psql -U postgres -d angularai -c "CREATE EXTENSION IF NOT EXISTS vector; SELECT extname, extversion FROM pg_extension;"
-docker exec angularai-postgres psql -U admin -d angularai -c "SELECT version(); SELECT current_user;"
-docker exec angularai-postgres psql -U admin -d angularai -c "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public';"
+docker exec goodone-postgres psql -U postgres -d goodone -c "CREATE EXTENSION IF NOT EXISTS vector; SELECT extname, extversion FROM pg_extension;"
+docker exec goodone-postgres psql -U admin -d goodone -c "SELECT version(); SELECT current_user;"
+docker exec goodone-postgres psql -U admin -d goodone -c "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public';"
```powershell
# Auth Info (GET)
diff --git a/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-05-Docs-ingestion-into-Postgres-pgvector-schema-reindex-endpoint.md b/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-05-Docs-ingestion-into-Postgres-pgvector-schema-reindex-endpoint.md
index 18e7d3f62..fa1b4cf88 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-05-Docs-ingestion-into-Postgres-pgvector-schema-reindex-endpoint.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p0/AI-ARCH-05-Docs-ingestion-into-Postgres-pgvector-schema-reindex-endpoint.md
@@ -119,13 +119,13 @@ Import normalized Junie tasks and ADR docs into Postgres and prepare chunks for
- Summary: Resolved Flyway migration loading issues, added Postgres-specific optimizations, and verified with integration tests.
- Outcome: Fixed "Table USERS not found" by reorganizing migrations into `db/migration/common` and `db/vendor/{vendor}`. Added `V15` for Postgres to enable `pgvector` HNSW index and specify vector(384) dimension. Implemented `AdminDocsControllerIntegrationTest` which verified the full ingestion pipeline on a real schema.
- Open items: Proceed with AI-ARCH-06 (populate embeddings + retrieval).
-- Evidence: `backend/src/main/resources/db/migration/common/**`; `backend/src/main/resources/db/vendor/**`; `backend/src/test/java/ch/goodone/angularai/backend/controller/AdminDocsControllerIntegrationTest.java`; All tests passing (404/404).
+- Evidence: `backend/src/main/resources/db/migration/common/**`; `backend/src/main/resources/db/vendor/**`; `backend/src/test/java/ch/goodone/goodone/backend/controller/AdminDocsControllerIntegrationTest.java`; All tests passing (404/404).
### 2026-02-25 16:37
- Summary: Implemented base docs ingestion schema, services, and admin reindex endpoint. Added vendor-agnostic Flyway migration (V13) and security updates.
- Outcome: `doc_source`, `doc_chunk`, and `doc_embedding` tables are created via Flyway V13 (DB-agnostic). Implemented `MarkdownChunker`, `DocIngestionService`, and `POST /api/admin/docs/reindex`. CSRF exemptions configured for admin docs endpoints.
- Open items: Enable pgvector extension via Postgres-specific migration; add integration tests and verify on Postgres profile; finalize embedding storage in AI-ARCH-06.
-- Evidence: backend/src/main/resources/db/migration/V13__add_docs_tables.sql; backend/src/main/java/ch/goodone/angularai/backend/docs/ingest/**; backend/src/main/java/ch/goodone/angularai/backend/controller/AdminDocsController.java; backend/src/main/java/ch/goodone/angularai/backend/config/SecurityConfig.java changes.
+- Evidence: backend/src/main/resources/db/migration/V13__add_docs_tables.sql; backend/src/main/java/ch/goodone/goodone/backend/docs/ingest/**; backend/src/main/java/ch/goodone/goodone/backend/controller/AdminDocsController.java; backend/src/main/java/ch/goodone/goodone/backend/config/SecurityConfig.java changes.
## Verification
@@ -191,7 +191,7 @@ Using swagger UI: reindex OK
DB Check OK
User admin/admin
schema: app (enable all schemas in setting window)
-jdbc:postgresql://localhost:5432/angularai
+jdbc:postgresql://localhost:5432/goodone
- `doc_source` has rows for files in `doc/knowledge/**`
- `doc_chunk` has multiple rows per source; `id` is stable across reindex for unchanged content
diff --git a/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-07-Quick-Add-AI-enhancement-hybrid-deterministic-parser-AI-parse-preview-workflow.md b/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-07-Quick-Add-AI-enhancement-hybrid-deterministic-parser-AI-parse-preview-workflow.md
index 9a43c6046..79fb17d12 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-07-Quick-Add-AI-enhancement-hybrid-deterministic-parser-AI-parse-preview-workflow.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-07-Quick-Add-AI-enhancement-hybrid-deterministic-parser-AI-parse-preview-workflow.md
@@ -117,15 +117,15 @@ _No entries._
Backend targeted tests:
```bash
- mvn -q -pl backend -Dtest=ch.goodone.angularai.backend.ai.application.QuickAddParseUseCaseTest test
+ mvn -q -pl backend -Dtest=ch.goodone.goodone.backend.ai.application.QuickAddParseUseCaseTest test
```
```bash
- mvn -q -pl backend -Dtest=ch.goodone.angularai.backend.ai.web.rest.AiControllerIntegrationTest test
+ mvn -q -pl backend -Dtest=ch.goodone.goodone.backend.ai.web.rest.AiControllerIntegrationTest test
```
```bash
- mvn -q -pl backend -Dtest=ch.goodone.angularai.backend.controller.TaskControllerTest#shouldAnalyzeTask test
+ mvn -q -pl backend -Dtest=ch.goodone.goodone.backend.controller.TaskControllerTest#shouldAnalyzeTask test
```
- REST API:
@@ -174,7 +174,7 @@ _No entries._
### User Testing
2026-02-26 15:15 Fail 1
-No startup of AibackendApplication with profile local
+No startup of GoodoneBackendApplication with profile local
added
app.docs.reindex-on-startup=true
diff --git a/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-13-AI-Credits-Limit.md b/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-13-AI-Credits-Limit.md
index a4a926137..ed8d4fefc 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-13-AI-Credits-Limit.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-13-AI-Credits-Limit.md
@@ -37,7 +37,7 @@ Introduce daily AI call limits per user to control AI usage and manage potential
- Summary: Resolved high-severity vulnerabilities in frontend dependencies and upgraded Angular.
- Outcome: Updated `hono`, `minimatch`, and `rollup` to versions that fix reported CVEs. Upgraded Angular to 21.2.1 to resolve an XSS vulnerability in `@angular/core`. Fixed breaking changes in `@ngx-translate/http-loader` and addressed test regressions in `TaskService` and `TasksComponent`.
- Open items: None.
-- Evidence: Maven build of `aifrontend` (including `dependency-check-maven`) passed; 238/238 Vitest passed; Playwright UX guardrails (55 passed).
+- Evidence: Maven build of `goodone-frontend` (including `dependency-check-maven`) passed; 238/238 Vitest passed; Playwright UX guardrails (55 passed).
### 2026-03-05 22:30
- Summary: Implemented AI credit limiting and tracking.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-15-AI-Runtime-Fargate.md b/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-15-AI-Runtime-Fargate.md
index f4123105e..32a4e138d 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-15-AI-Runtime-Fargate.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p1/AI-ARCH-15-AI-Runtime-Fargate.md
@@ -239,28 +239,28 @@ Both modes run on AWS Fargate using the same container image.
- Evidence: Fixed `SPRING_DATASOURCE_URL` in all configurations. `mvn clean install` passed. Added `V16` to handle model dimension shifts (384 to 1536).
### 2026-03-06 14:15
-- Summary: Identified and removed the redundant `angular-boot` Aurora cluster. Confirmed `angularai-demo` as the active RDS instance for the AI runtime.
+- Summary: Identified and removed the redundant `goodone-cluster` Aurora cluster. Confirmed `goodone-demo` as the active RDS instance for the AI runtime.
- Outcome: Completed. Unused infrastructure deleted to minimize costs and clutter. Application stability verified.
- Open items: None.
-- Evidence: `aws rds describe-db-clusters` returns no clusters. `angularai-backend-test-service` is running healthy with one task.
+- Evidence: `aws rds describe-db-clusters` returns no clusters. `goodone-backend-test-service` is running healthy with one task.
### 2026-03-06 11:15
- Summary: Successfully deployed to AWS Fargate with RDS PostgreSQL micro (gpt-4o-mini). Verified application health and AI status.
- Outcome: Completed. Application is accessible via ALB DNS (with SSL redirection). AI is enabled (`aiEnabled: true`). Database connected and migrated.
- Open items: None.
-- Evidence: ALB DNS: `http://angular-boot-lb-1895760292.eu-central-1.elb.amazonaws.com/api/system/info` -> `aiEnabled: true`. Logs show `demo,postgres` profiles and successful startup.
+- Evidence: ALB DNS: `http://goodone-cluster-lb-1895760292.eu-central-1.elb.amazonaws.com/api/system/info` -> `aiEnabled: true`. Logs show `demo,postgres` profiles and successful startup.
### 2026-03-06 10:55
-- Summary: Re-configured RDS PostgreSQL micro with identifier `angularai-demo` and initial database `angularai`. Updated Fargate task definition with correct endpoint.
-- Outcome: Completed. RDS instance `angularai-demo` is available with `angularai` DB. Task definition `backend-test-task-definition.json` updated with correct URL. Ready for deployment.
+- Summary: Re-configured RDS PostgreSQL micro with identifier `goodone-demo` and initial database `goodone`. Updated Fargate task definition with correct endpoint.
+- Outcome: Completed. RDS instance `goodone-demo` is available with `goodone` DB. Task definition `backend-test-task-definition.json` updated with correct URL. Ready for deployment.
- Open items: Execute `.\scripts\deploy-aws-demo.ps1`.
-- Evidence: RDS endpoint: `angularai-demo.cra3beyvijq1.eu-central-1.rds.amazonaws.com`. Previous `FATAL: database does not exist` error addressed.
+- Evidence: RDS endpoint: `goodone-demo.cra3beyvijq1.eu-central-1.rds.amazonaws.com`. Previous `FATAL: database does not exist` error addressed.
### 2026-03-06 10:45
- Summary: Configured RDS PostgreSQL (micro), updated secrets, and finalized Fargate task definition for Mode 2 (Full AI).
-- Outcome: RDS `angular-boot-demo` created. Task definition `backend-test-task-definition.json` updated with correct RDS endpoint, `gpt-4o-mini` model, and `AI_ENABLED=true`. Secret `goodone-config` updated with `DB_PASSWORD` and `OPENAI_API_KEY`.
+- Outcome: RDS `goodone-cluster-demo` created. Task definition `backend-test-task-definition.json` updated with correct RDS endpoint, `gpt-4o-mini` model, and `AI_ENABLED=true`. Secret `goodone-config` updated with `DB_PASSWORD` and `OPENAI_API_KEY`.
- Open items: Execute `.\scripts\deploy-aws-demo.ps1` to complete deployment.
-- Evidence: RDS endpoint confirmed: `angular-boot-demo.cra3beyvijq1.eu-central-1.rds.amazonaws.com`. Task definition environment variables set.
+- Evidence: RDS endpoint confirmed: `goodone-cluster-demo.cra3beyvijq1.eu-central-1.rds.amazonaws.com`. Task definition environment variables set.
### 2026-03-06 10:15
- Summary: Resolved Angular compiler warnings (NG8113) by properly using `AiDisabledPlaceholderComponent` in templates.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-02-AI-Teaser-Badge-Polish.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-02-AI-Teaser-Badge-Polish.md
index 06e7d9131..4cc71be1e 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-02-AI-Teaser-Badge-Polish.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-02-AI-Teaser-Badge-Polish.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-02
title: 'AI-UX-02: Polish AI teaser placement and integrate AI affordance into primary actions'
taskset: 9
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-32-Login-Register-Branding-with-Product-Identity.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-32-Login-Register-Branding-with-Product-Identity.md
index 72e1f6263..52827bf3a 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-32-Login-Register-Branding-with-Product-Identity.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-32-Login-Register-Branding-with-Product-Identity.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-32
title: 'AI-UX-32: Login & Register Branding with Product Identity'
taskset: 10
@@ -40,7 +40,7 @@ Branding visible on /login and /register.
- Open items: None.
- Evidence: UI components created and integrated. Verified translation keys added to `en.json` and `de-ch.json`.
- Testing Instructions:
- - Manual: Visit `/login` and `/register` and verify the centered GoodOne logo and tagline are visible above the forms. Toggle languages to verify "AI-powered task intelligence" and "KI-gestützte Aufgaben-Intelligenz".
+ - Manual: Visit `/login` and `/register` and verify the centered GoodOne logo and tagline are visible above the forms. Toggle languages to verify "AI-powered task intelligence" and "KI-gesttzte Aufgaben-Intelligenz".
- Automated: Run `npx playwright test e2e/ux-guardrails.spec.ts` (after all tasks are done).
## Verification
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-33-Standard-Page-Header-Component.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-33-Standard-Page-Header-Component.md
index 36c2b5079..28bd41636 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-33-Standard-Page-Header-Component.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-33-Standard-Page-Header-Component.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-33
title: 'AI-UX-33: Standard Page Header Component'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-34-Admin-Page-Card-Layout-for-Tables.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-34-Admin-Page-Card-Layout-for-Tables.md
index c35b2c545..71c94fd9b 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-34-Admin-Page-Card-Layout-for-Tables.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-34-Admin-Page-Card-Layout-for-Tables.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-34
title: 'AI-UX-34: Admin Page Card Layout for Tables'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-35-Navigation-Menu-Structure-Improvement.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-35-Navigation-Menu-Structure-Improvement.md
index 174af9751..614409e6f 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-35-Navigation-Menu-Structure-Improvement.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-35-Navigation-Menu-Structure-Improvement.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-35
title: 'AI-UX-35: Navigation Menu Structure Improvement'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-36-AI-Task-Quick-Add-UX-Improvement.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-36-AI-Task-Quick-Add-UX-Improvement.md
index d1762ef4b..9e1547970 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-36-AI-Task-Quick-Add-UX-Improvement.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-36-AI-Task-Quick-Add-UX-Improvement.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-36
title: 'AI-UX-36: AI Task Quick Add UX Improvement'
taskset: 10
@@ -21,7 +21,7 @@ Replace placeholder:
Add a task...
With:
-✨ Describe your task...
+? Describe your task...
## Scope
@@ -35,7 +35,7 @@ Criteria not specified.
### 2026-03-08 14:55
- Summary: Updated AI Task Quick Add placeholder to highlight AI capabilities.
-- Outcome: Updated `TASKS.QUICK_ADD_PLACEHOLDER` in both English and German translation files. The placeholder now reads "✨ Describe your task..." ("✨ Beschreibe deine Aufgabe..." in German) to explicitly signal that users can use natural language for task creation.
+- Outcome: Updated `TASKS.QUICK_ADD_PLACEHOLDER` in both English and German translation files. The placeholder now reads "? Describe your task..." ("? Beschreibe deine Aufgabe..." in German) to explicitly signal that users can use natural language for task creation.
- Open items: None.
- Evidence: Translation files updated and verified.
- Testing Instructions:
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-37-System-Status-Layout-Alignment.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-37-System-Status-Layout-Alignment.md
index dcc13f74d..c7a67bb69 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-37-System-Status-Layout-Alignment.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-37-System-Status-Layout-Alignment.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-37
title: 'AI-UX-37: System Status Layout Alignment'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-38-Dashboard-Metrics-Enhancement.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-38-Dashboard-Metrics-Enhancement.md
index ffe244adc..7d56c7eaa 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-38-Dashboard-Metrics-Enhancement.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-38-Dashboard-Metrics-Enhancement.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-38
title: 'AI-UX-38: Dashboard Metrics Enhancement'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-39-Lightweight-UI-Design-System.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-39-Lightweight-UI-Design-System.md
index 7f2ebf5b3..f320507b7 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-39-Lightweight-UI-Design-System.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-39-Lightweight-UI-Design-System.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-39
title: 'AI-UX-39: Lightweight UI Design System'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-40-Empty-State-Design.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-40-Empty-State-Design.md
index 5f692a749..c5dd88974 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-40-Empty-State-Design.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-40-Empty-State-Design.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-40
title: 'AI-UX-40: Empty State Design'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-41-Loading-Skeletons.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-41-Loading-Skeletons.md
index b1ecf1c19..19b95f525 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-41-Loading-Skeletons.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-41-Loading-Skeletons.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-41
title: 'AI-UX-41: Loading Skeletons'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-42-AI-Result-Visualization.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-42-AI-Result-Visualization.md
index ca28e390f..1ae852290 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-42-AI-Result-Visualization.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-42-AI-Result-Visualization.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-42
title: 'AI-UX-42: AI Result Visualization'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-43-Risk-Radar-Report-Layout.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-43-Risk-Radar-Report-Layout.md
index 733efc322..669a1f0b6 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-43-Risk-Radar-Report-Layout.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-43-Risk-Radar-Report-Layout.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-43
title: 'AI-UX-43: Risk Radar Report Layout'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-44-Retrospective-Report-UI.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-44-Retrospective-Report-UI.md
index 22275e827..c452cd5a9 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-44-Retrospective-Report-UI.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-44-Retrospective-Report-UI.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-44
title: 'AI-UX-44: Retrospective Report UI'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-45-Architecture-Chat-UI.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-45-Architecture-Chat-UI.md
index bbd9507b5..50f0e0a4e 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-45-Architecture-Chat-UI.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-45-Architecture-Chat-UI.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-45
title: 'AI-UX-45: Architecture Chat UI'
taskset: 10
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-46-Streaming-AI-Response-UX.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-46-Streaming-AI-Response-UX.md
index 9b5c94e9a..9e5b4d874 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-46-Streaming-AI-Response-UX.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-46-Streaming-AI-Response-UX.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-46
title: 'AI-UX-46: Streaming AI Response UX'
taskset: 11
@@ -19,7 +19,7 @@ Make AI responses appear progressively instead of rendering only after the full
## Scope
-- Show “Generating...” state
+- Show Generating... state
- Progressive rendering / typing effect
- Disable duplicate submit during generation
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-47-Architecture-Chat-Conversation-History.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-47-Architecture-Chat-Conversation-History.md
index 8b35b6945..866ff400f 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-47-Architecture-Chat-Conversation-History.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-47-Architecture-Chat-Conversation-History.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-47
title: 'AI-UX-47: Architecture Chat Conversation History'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-48-Risk-Radar-Severity-Visualization.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-48-Risk-Radar-Severity-Visualization.md
index 6801fa099..e215a1afe 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-48-Risk-Radar-Severity-Visualization.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-48-Risk-Radar-Severity-Visualization.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-48
title: 'AI-UX-48: Risk Radar Severity Visualization'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-49-Retrospective-Insights-Card-Layout.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-49-Retrospective-Insights-Card-Layout.md
index acb3853cc..859c5a6ec 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-49-Retrospective-Insights-Card-Layout.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-49-Retrospective-Insights-Card-Layout.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-49
title: 'AI-UX-49: Retrospective Insights Card Layout'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-50-Dashboard-Mini-Trends-Sparklines.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-50-Dashboard-Mini-Trends-Sparklines.md
index b2f8e50e5..d4df53ff4 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-50-Dashboard-Mini-Trends-Sparklines.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-50-Dashboard-Mini-Trends-Sparklines.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-50
title: 'AI-UX-50: Dashboard Mini Trends / Sparklines'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-51-AI-Activity-Timeline.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-51-AI-Activity-Timeline.md
index d83588364..06012adc9 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-51-AI-Activity-Timeline.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-51-AI-Activity-Timeline.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-51
title: 'AI-UX-51: AI Activity Timeline'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-52-Generated-Report-Export-Readiness.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-52-Generated-Report-Export-Readiness.md
index 004513bc3..191af17d2 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-52-Generated-Report-Export-Readiness.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-52-Generated-Report-Export-Readiness.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-52
title: 'AI-UX-52: Generated Report Export Readiness'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-53-Product-Empty-States.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-53-Product-Empty-States.md
index ac7671cc7..04fe3d0f5 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-53-Product-Empty-States.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-53-Product-Empty-States.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-53
title: 'AI-UX-53: Product Empty States'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-54-Unified-AI-Result-Container.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-54-Unified-AI-Result-Container.md
index 87461ef93..8e4a8e313 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-54-Unified-AI-Result-Container.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-54-Unified-AI-Result-Container.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-54
title: 'AI-UX-54: Unified AI Result Container'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-55-Demo-Mode-Visual-Polish.md b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-55-Demo-Mode-Visual-Polish.md
index 652e55c5a..95077b0a9 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-55-Demo-Mode-Visual-Polish.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p3/AI-UX-55-Demo-Mode-Visual-Polish.md
@@ -1,4 +1,4 @@
----
+---
key: AI-UX-55
title: 'AI-UX-55: Demo Mode Visual Polish'
taskset: 11
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-DOC-13-generate-erd.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-DOC-13-generate-erd.md
index b45afca4d..e393aea40 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-DOC-13-generate-erd.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-DOC-13-generate-erd.md
@@ -13,7 +13,7 @@ iterations: 1
Derive an Entity Relationship Diagram (ERD) from the persistence model to provide a code-accurate representation of the system's data structure.
## Scope
-- All JPA entities in `backend/src/main/java/ch/goodone/angularai/backend/model/`
+- All JPA entities in `backend/src/main/java/ch/goodone/goodone/backend/model/`
- Relationships (1:1, 1:N, N:M) defined by JPA annotations (@ManyToOne, @OneToMany, @OneToOne, @ManyToMany, @ElementCollection)
- Key fields (Primary Keys, Unique Constraints)
@@ -31,13 +31,13 @@ Derive an Entity Relationship Diagram (ERD) from the persistence model to provid
- Open items: None.
- Evidence: Mermaid ERD successfully integrated into `doc/architecture/erd.md`.
- Testing Instructions:
- - Manual: Open `doc/architecture/erd.md` in an IDE or GitHub/GitLab to verify the Mermaid diagram renders correctly and matches the code in `backend/src/main/java/ch/goodone/angularai/backend/model/`.
+ - Manual: Open `doc/architecture/erd.md` in an IDE or GitHub/GitLab to verify the Mermaid diagram renders correctly and matches the code in `backend/src/main/java/ch/goodone/goodone/backend/model/`.
- Automated: None.
## Verification
### Manual
-- Verified that all entities listed in `backend/src/main/java/ch/goodone/angularai/backend/model/` are present in the ERD.
+- Verified that all entities listed in `backend/src/main/java/ch/goodone/goodone/backend/model/` are present in the ERD.
- Checked relationships against `@ManyToOne`, `@OneToOne`, and `@ElementCollection` annotations.
- Confirmed Mermaid syntax is valid and renders correctly.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-03-sonar-major-fix-loop.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-03-sonar-major-fix-loop.md
index e927c5e56..b1c23c019 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-03-sonar-major-fix-loop.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-03-sonar-major-fix-loop.md
@@ -82,7 +82,7 @@ The objective is **stable reduction of major issues**, not risky mass refactorin
## Step 2 – Fetch Sonar issues
```powershell
-curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
```
## Step 3 – Fix issues from `sonar-issues.json`
@@ -98,7 +98,7 @@ Then loop back to Step 1.
Component key:
```text
-JuergGood_angularai
+JuergGood_goodone
```
Primary issue source:
@@ -174,7 +174,7 @@ If the script fails:
Run:
```powershell
-curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
```
Parse `sonar-issues.json` and identify all current **MAJOR** issues.
@@ -250,7 +250,7 @@ Run local Sonar analysis again:
Then fetch issues again:
```powershell
-curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
```
Compare the new major issue count with the previous iteration.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-04-frontend-sonar-major-fix-loop.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-04-frontend-sonar-major-fix-loop.md
index f98b10f5d..b6264241b 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-04-frontend-sonar-major-fix-loop.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-REL-04-frontend-sonar-major-fix-loop.md
@@ -57,7 +57,7 @@ The loop must repeatedly:
## Step 2 – Fetch Sonar issues
```powershell
-curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
```
## Step 3 – Restrict working set to frontend files
@@ -123,7 +123,7 @@ Do not continue with stale issue data.
Run:
```powershell
-curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
```
Filter to issues affecting only:
@@ -201,7 +201,7 @@ Repeat:
```powershell
.\scripts\sonar-analysis.ps1
-curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&severities=MAJOR&ps=500" -o sonar-issues.json
```
Continue until frontend stop conditions are met.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-EXPORT-LOOP.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-EXPORT-LOOP.md
index d8e40b8e4..3a7b1ab98 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-EXPORT-LOOP.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-EXPORT-LOOP.md
@@ -19,7 +19,7 @@ This task introduces a repeatable loop:
## Scope
Focus on SonarCloud issues for project:
-- `JuergGood_angularai`
+- `JuergGood_goodone`
Start with one of these scopes per run:
@@ -74,19 +74,19 @@ Run the export script after each successful Sonar analysis.
Example for all open issues:
```powershell
-pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_angularai"
+pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_goodone"
```
Example for BLOCKER only:
```powershell
-pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_angularai" -ImpactSeverities "BLOCKER"
+pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_goodone" -ImpactSeverities "BLOCKER"
```
Example for CRITICAL only:
```powershell
-pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_angularai" -ImpactSeverities "CRITICAL"
+pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_goodone" -ImpactSeverities "CRITICAL"
```
This must fetch:
@@ -119,7 +119,7 @@ After each batch:
```powershell
.\scripts\sonar-analysis.ps1
-pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_angularai" -ImpactSeverities "MAJOR"
+pwsh .\scripts\sonar\export-sonar-issues.ps1 -ProjectKey "JuergGood_goodone" -ImpactSeverities "MAJOR"
```
Verify:
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-JUNIE-V2.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-JUNIE-V2.md
index 907df5d92..119cf52d4 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-JUNIE-V2.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-SONAR-JUNIE-V2.md
@@ -48,13 +48,13 @@ Your existing analysis script must still work:
## Step 1: Run the improved exporter
```powershell
-pwsh .\sonar\export-sonar-issues-v2.ps1 -ProjectKey "JuergGood_angularai"
+pwsh .\sonar\export-sonar-issues-v2.ps1 -ProjectKey "JuergGood_goodone"
```
For blocker-only export:
```powershell
-pwsh .\sonar\export-sonar-issues-v2.ps1 -ProjectKey "JuergGood_angularai" -ImpactSeverities "BLOCKER"
+pwsh .\sonar\export-sonar-issues-v2.ps1 -ProjectKey "JuergGood_goodone" -ImpactSeverities "BLOCKER"
```
Generated output:
@@ -97,13 +97,13 @@ Fix the remaining SonarCloud issues using .sonar-export/sonar-issues-for-junie.j
This helper is intentionally semi-automatic. It runs analysis + export, then stops and tells you exactly what to hand to Junie.
```powershell
-pwsh .\sonar\sonar-junie-loop.ps1 -ProjectKey "JuergGood_angularai"
+pwsh .\sonar\sonar-junie-loop.ps1 -ProjectKey "JuergGood_goodone"
```
Blocker-only loop:
```powershell
-pwsh .\sonar\sonar-junie-loop.ps1 -ProjectKey "JuergGood_angularai" -ImpactSeverities "BLOCKER"
+pwsh .\sonar\sonar-junie-loop.ps1 -ProjectKey "JuergGood_goodone" -ImpactSeverities "BLOCKER"
```
Why semi-automatic:
@@ -149,8 +149,8 @@ That dramatically reduces ambiguity for AI tools.
Use this sequence for large cleanup waves:
```powershell
-pwsh .\sonar\export-sonar-issues-v2.ps1 -ProjectKey "JuergGood_angularai"
-pwsh .\sonar\sonar-junie-loop.ps1 -ProjectKey "JuergGood_angularai"
+pwsh .\sonar\export-sonar-issues-v2.ps1 -ProjectKey "JuergGood_goodone"
+pwsh .\sonar\sonar-junie-loop.ps1 -ProjectKey "JuergGood_goodone"
```
Then repeatedly:
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-TEST-23-sonar-frontend-coverage-and-threshold.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-TEST-23-sonar-frontend-coverage-and-threshold.md
index 86527713d..15d17df2a 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-TEST-23-sonar-frontend-coverage-and-threshold.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-TEST-23-sonar-frontend-coverage-and-threshold.md
@@ -10,7 +10,7 @@ iterations: 1
links:
pr: ''
commit: ''
- sonar_project: 'https://sonarcloud.io/project/overview?id=JuergGood_angularai'
+ sonar_project: 'https://sonarcloud.io/project/overview?id=JuergGood_goodone'
---
## Goal
@@ -66,7 +66,7 @@ links:
## Links
-- SonarCloud Project: [AngularAI](https://sonarcloud.io/project/overview?id=JuergGood_angularai)
+- SonarCloud Project: [GoodOne](https://sonarcloud.io/project/overview?id=JuergGood_goodone)
## Notes (optional)
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-27-Implement-Architecture-and-Features-Landing-Pages.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-27-Implement-Architecture-and-Features-Landing-Pages.md
index 2a2ab5174..8240c04fa 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-27-Implement-Architecture-and-Features-Landing-Pages.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-27-Implement-Architecture-and-Features-Landing-Pages.md
@@ -13,7 +13,7 @@ iterations: 1
## Goal
-Create two polished, high-value landing pages for the GoodOne / AngularAI website:
+Create two polished, high-value landing pages for the GoodOne / GoodOne website:
- `/architecture`
- `/features`
@@ -135,7 +135,7 @@ Headline example:
Supporting text example:
-`Understand how AngularAI is built: frontend, backend, AI flow, data model, and the reasoning behind the design.`
+`Understand how GoodOne is built: frontend, backend, AI flow, data model, and the reasoning behind the design.`
Primary CTA:
@@ -294,7 +294,7 @@ Headline example:
Supporting text example:
-`Explore the intelligent capabilities already implemented in AngularAI, from architecture reasoning to risk detection and retrospectives.`
+`Explore the intelligent capabilities already implemented in GoodOne, from architecture reasoning to risk detection and retrospectives.`
Primary CTA:
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-28-architecture-page-public-access-safeguard.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-28-architecture-page-public-access-safeguard.md
index 6a61f4eae..d008636d0 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-28-architecture-page-public-access-safeguard.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-28-architecture-page-public-access-safeguard.md
@@ -1,4 +1,4 @@
----
+---
key: AI-WEB-28
title: 'AI-WEB-28: Architecture page: disable public AI call, add release-safe notice, and align footer styling'
taskset: 9
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-29-reduce-architecture-hero-color.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-29-reduce-architecture-hero-color.md
index f5eae523c..b85e47e95 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-29-reduce-architecture-hero-color.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-29-reduce-architecture-hero-color.md
@@ -76,4 +76,4 @@ Alternative:
background:#f7f9fc;
border:1px solid #e6ebf2;
-Do not change layout or buttons.
\ No newline at end of file
+Do not change layout or buttons.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-30-card-hover-polish.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-30-card-hover-polish.md
index 9097ea6b4..fa018ea81 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-30-card-hover-polish.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-30-card-hover-polish.md
@@ -13,4 +13,4 @@ Example:
.arch-card:hover {
transform: translateY(-3px);
box-shadow:0 10px 24px rgba(0,0,0,0.08);
-}
\ No newline at end of file
+}
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-31-semantic-surface-tokens.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-31-semantic-surface-tokens.md
index 64f4c30c0..385d49733 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-31-semantic-surface-tokens.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-31-semantic-surface-tokens.md
@@ -84,4 +84,4 @@ Example:
--surface-subtle:#f5f8fb;
--border-subtle:#e6ebf2;
--hero-bg-technical:linear-gradient(135deg,#f5f8fb 0%,#eaf1f7 100%);
-}
\ No newline at end of file
+}
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-33-fix-retrospective-todate-overflow.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-33-fix-retrospective-todate-overflow.md
index ec5e74e3b..9bb7d82ca 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-33-fix-retrospective-todate-overflow.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-33-fix-retrospective-todate-overflow.md
@@ -25,7 +25,7 @@ Ensure the filter form on the Retrospective page always stays inside the contain
2. `To Date` never crosses the card border.
3. Layout works at widths: 1920px, 1440px, 1280px, 1024px.
4. Fields wrap gracefully on smaller screens.
-5. UI visually consistent with other AngularAI pages.
+5. UI visually consistent with other GoodOne pages.
## Junie Log
@@ -56,4 +56,4 @@ Ensure the filter form on the Retrospective page always stays inside the contain
## Notes
- Required Fix: Use a responsive flex layout with wrapping.
-- Do NOT: reduce card padding, hide the field, apply overflow:hidden hacks, or use fixed pixel widths.
\ No newline at end of file
+- Do NOT: reduce card padding, hide the field, apply overflow:hidden hacks, or use fixed pixel widths.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-34-global-responsive-form-layout-standard.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-34-global-responsive-form-layout-standard.md
index 1750c362e..4264813b7 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-34-global-responsive-form-layout-standard.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-34-global-responsive-form-layout-standard.md
@@ -2,7 +2,7 @@
## Context
-Several AngularAI pages contain filter forms and input rows that are manually styled.
+Several GoodOne pages contain filter forms and input rows that are manually styled.
Example pages:
@@ -92,7 +92,7 @@ Apply this layout pattern to:
# Styling Guidelines
-Maintain consistency with AngularAI design:
+Maintain consistency with GoodOne design:
- spacing: 16px
- rounded card layout
@@ -130,4 +130,4 @@ Maintain consistency with AngularAI design:
## Links
-AngularAI has a **standardized responsive form system** preventing UI layout regressions.
\ No newline at end of file
+GoodOne has a **standardized responsive form system** preventing UI layout regressions.
diff --git a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-35-shared-angular-form-row-component.md b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-35-shared-angular-form-row-component.md
index 57a28f4b4..525f0dae5 100644
--- a/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-35-shared-angular-form-row-component.md
+++ b/doc/knowledge/junie-tasks/taskset-9/p4/AI-WEB-35-shared-angular-form-row-component.md
@@ -2,7 +2,7 @@
## Context
-AngularAI currently uses repeated ad hoc layout code for filter rows and form sections across multiple pages.
+GoodOne currently uses repeated ad hoc layout code for filter rows and form sections across multiple pages.
Examples include:
@@ -132,7 +132,7 @@ Recommended additional migration:
### 5. Preserve visual consistency
-The component must align with the AngularAI UI style:
+The component must align with the GoodOne UI style:
- calm spacing
- clean card layout
@@ -200,7 +200,7 @@ The component must remain simple, reusable, and generic.
- Imported where needed
- Retrospective page migrated
- Overflow issue resolved through the shared component
-- UI remains consistent with AngularAI styling
+- UI remains consistent with GoodOne styling
- Code is cleaner than before and easier to reuse in future pages
---
@@ -213,4 +213,4 @@ The objective is to make future form implementations nearly foolproof:
- page authors should not need to remember flex details
- responsive behavior should be the default
-- layout bugs like the current retrospective overflow should become hard to introduce
\ No newline at end of file
+- layout bugs like the current retrospective overflow should become hard to introduce
diff --git a/doc/knowledge/junie-tasks/test-coverage-sonar.md b/doc/knowledge/junie-tasks/test-coverage-sonar.md
index 4927614ff..2808d4b6a 100644
--- a/doc/knowledge/junie-tasks/test-coverage-sonar.md
+++ b/doc/knowledge/junie-tasks/test-coverage-sonar.md
@@ -8,7 +8,7 @@ New code is code that was added in the last 9 days.
- All tests must pass
- Query latest Sonar results and issues using:
```powershell
- curl.exe -k -u "${env:SONAR_TOKEN}:" https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&ps=500 -o sonar-issues.json
+ curl.exe -k -u "${env:SONAR_TOKEN}:" https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&ps=500 -o sonar-issues.json
```
**Status: COMPLETED**
@@ -23,7 +23,7 @@ Date: 2026.02.13 10:15
Summary: Reached >82% "New Code" coverage (verified 82.11%) and fixed log format.
### Summary of Results
-- **Backend (aibackend):** 89.2% coverage (JaCoCo) - Increased from 86.4%
+- **Backend (goodone-backend):** 89.2% coverage (JaCoCo) - Increased from 86.4%
- **Frontend:** 85.1% coverage (Lines)
- **Test Client:** 84% coverage (JaCoCo)
- **Overall Coverage:** 82.5% (SonarCloud)
@@ -46,7 +46,7 @@ All tests are passing (205 backend tests). Coverage was significantly increased
The query used:
```powershell
-curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_angularai&statuses=OPEN,CONFIRMED&ps=500" -o sonar-issues.json
+curl.exe -k -u "${env:SONAR_TOKEN}:" "https://sonarcloud.io/api/issues/search?componentKeys=JuergGood_goodone&statuses=OPEN,CONFIRMED&ps=500" -o sonar-issues.json
```
All tests are passing. Coverage was significantly increased for "new code" (code added/modified in the last 9 days) by adding comprehensive unit tests for:
diff --git a/doc/knowledge/placeholder.md b/doc/knowledge/placeholder.md
index 4eeb2e349..12d0316b6 100644
--- a/doc/knowledge/placeholder.md
+++ b/doc/knowledge/placeholder.md
@@ -1 +1 @@
-Placeholder content for reindex test
+Placeholder content for reindex test
diff --git a/doc/knowledge/test-uploaded.md b/doc/knowledge/test-uploaded.md
index ad8ba4ce8..57b029b76 100644
--- a/doc/knowledge/test-uploaded.md
+++ b/doc/knowledge/test-uploaded.md
@@ -1,2 +1,2 @@
# Test Uploaded Document
-This is a test document uploaded via zip.
\ No newline at end of file
+This is a test document uploaded via zip.
diff --git a/doc/operations-guide.md b/doc/operations-guide.md
index 5997b5a34..b3b4ad28c 100644
--- a/doc/operations-guide.md
+++ b/doc/operations-guide.md
@@ -1,6 +1,6 @@
# Operations Guide - Monitoring & Maintenance
-This guide provides information on how to monitor and maintain the AngularAI application, especially when deployed on AWS Fargate.
+This guide provides information on how to monitor and maintain the GoodOne application, especially when deployed on AWS Fargate.
## 1. System Status Page
@@ -21,11 +21,10 @@ When deployed to AWS Fargate, you should use the following AWS services for moni
- **Task Status**: Check the "Tasks" tab in your ECS Service to ensure tasks are in the `RUNNING` state.
- **Task Health**: If a task is failing, check the "Stopped" tasks tab and look at the "Stopped reason" (e.g., Essential container in task exited).
-### CloudWatch Logs
-All application logs (STDOUT/STDERR) are automatically forwarded to CloudWatch.
-- **Log Group**: Usually `/ecs/angularai-app` or similar.
-- **Log Streams**: Each task execution has its own log stream.
-- **Search**: Use "CloudWatch Logs Insights" for complex queries across multiple log streams.
+### CloudWatch Logs (DISABLED)
+CloudWatch Logs have been disabled to reduce costs. Logs are no longer automatically forwarded to CloudWatch.
+- **Alternative**: Check container stdout/stderr via the AWS CLI or ECS Execute Command if troubleshooting is required.
+- **Manual Log Inspection**: If logs are needed temporarily, re-enable `logConfiguration` in the task definition.
### ALB Target Group Health Checks
The Application Load Balancer (ALB) performs regular health checks.
diff --git a/doc/operations-guide_de.md b/doc/operations-guide_de.md
index 552f552ec..c377b980b 100644
--- a/doc/operations-guide_de.md
+++ b/doc/operations-guide_de.md
@@ -1,6 +1,6 @@
# Betriebs-Handbuch - Überwachung & Wartung
-Dieses Handbuch enthält Informationen zur Überwachung und Wartung der AngularAI-Anwendung, insbesondere bei der Bereitstellung auf AWS Fargate.
+Dieses Handbuch enthält Informationen zur Überwachung und Wartung der GoodOne-Anwendung, insbesondere bei der Bereitstellung auf AWS Fargate.
## 1. Systemstatus-Seite
@@ -21,11 +21,10 @@ Bei der Bereitstellung auf AWS Fargate sollten Sie die folgenden AWS-Dienste zur
- **Task-Status**: Überprüfen Sie die Registerkarte "Tasks" in Ihrem ECS-Service, um sicherzustellen, dass sich die Tasks im Status `RUNNING` befinden.
- **Task-Zustand**: Wenn ein Task fehlschlägt, überprüfen Sie die Registerkarte "Stopped" Tasks und sehen Sie sich den "Stopped reason" an (z. B. Essential container in task exited).
-### CloudWatch Logs
-Alle Anwendungsprotokolle (STDOUT/STDERR) werden automatisch an CloudWatch weitergeleitet.
-- **Log-Gruppe**: In der Regel `/ecs/angularai-app` oder ähnlich.
-- **Log-Streams**: Jede Task-Ausführung hat ihren eigenen Log-Stream.
-- **Suche**: Verwenden Sie "CloudWatch Logs Insights" für komplexe Abfragen über mehrere Log-Streams hinweg.
+### CloudWatch Logs (DEAKTIVIERT)
+CloudWatch-Protokolle wurden deaktiviert, um Kosten zu sparen. Protokolle werden nicht mehr automatisch an CloudWatch weitergeleitet.
+- **Alternative**: Überprüfen Sie die Standardausgabe (stdout/stderr) der Container über die AWS-CLI oder den ECS-Execute-Befehl, falls eine Fehlersuche erforderlich ist.
+- **Manuelle Protokollinspektion**: Falls Protokolle vorübergehend benötigt werden, aktivieren Sie die `logConfiguration` in der Task-Definition wieder.
### ALB Target Group Health Checks
Der Application Load Balancer (ALB) führt regelmässige Zustandsprüfungen (Health Checks) durch.
diff --git a/doc/operations/RUNBOOK.md b/doc/operations/RUNBOOK.md
index c6fe59243..5f4647bc3 100644
--- a/doc/operations/RUNBOOK.md
+++ b/doc/operations/RUNBOOK.md
@@ -1,6 +1,6 @@
# Operations Runbook
-This runbook provides quick instructions for monitoring, troubleshooting, and recovering the AngularAI application.
+This runbook provides quick instructions for monitoring, troubleshooting, and recovering the GoodOne application.
## 1. Where to Find Logs and Metrics
@@ -17,8 +17,8 @@ This runbook provides quick instructions for monitoring, troubleshooting, and re
- **Backend Only**: `docker compose logs -f backend`
### AWS (Fargate)
-- **Logs**: AWS CloudWatch Logs under the log group defined in the task definition (typically `/ecs/angularai-backend` and `/ecs/angularai-frontend`).
-- **Metrics**: CloudWatch Metrics for the ECS Service (CPU, Memory, Request Count).
+- **Logs (DISABLED)**: CloudWatch Logs have been disabled to reduce costs. Use `aws ecs execute-command` to inspect logs directly on a running task if enabled, or check container stdout via the ECS console/CLI.
+- **Metrics**: Standard ECS Metrics (CPU, Memory) are still available in the ECS console. Custom application metrics (Prometheus) are available at `/actuator/prometheus`.
---
@@ -75,7 +75,7 @@ To bring the application back to a clean state:
The demo environment is designed to be ephemeral.
- **Restart Service**: Force a new deployment to reset the state.
```powershell
- aws ecs update-service --cluster angularai-cluster --service angularai-demo-service --force-new-deployment --no-cli-pager
+ aws ecs update-service --cluster goodone-cluster --service goodone-demo-service --force-new-deployment --no-cli-pager
```
---
diff --git a/doc/presentation/Iteration-2/generate-presentation.py b/doc/presentation/Iteration-2/generate-presentation.py
index 14ec97974..9347e2692 100644
--- a/doc/presentation/Iteration-2/generate-presentation.py
+++ b/doc/presentation/Iteration-2/generate-presentation.py
@@ -648,7 +648,7 @@ def add_footer_and_slide_number(self, slide, caption: str = "") -> None:
p.font.color.rgb = RGBColor.from_string(self.CORPORATE_BLUE)
# Footer / Caption
- footer_text = caption or "AngularAI - Softwareentwicklung mit AI"
+ footer_text = caption or "GoodOne - Softwareentwicklung mit AI"
# Look for footer placeholder
f_ph = _find_placeholder(slide, placeholder_type=PP_PLACEHOLDER_TYPE.FOOTER)
diff --git a/doc/presentation/Iteration-2/generate-slides.md b/doc/presentation/Iteration-2/generate-slides.md
index b8a746d76..6676510e9 100644
--- a/doc/presentation/Iteration-2/generate-slides.md
+++ b/doc/presentation/Iteration-2/generate-slides.md
@@ -30,7 +30,7 @@ pandoc Goodone_Iteration2_Pandoc_Ready.md -t beamer -o iteration2.pdf
pandoc Goodone_Iteration3_Lessons_Learned_Expanded.md -t revealjs -s -o iteration3.html --css goodone-reveal-theme.css --slide-level=1
```
```bash
-cd C:\doc\sw\ai\angularai\angularai\presentation\presentations\Iteration-2
+cd C:\doc\sw\ai\goodone\goodone\presentation\presentations\Iteration-2
```
## Empfohlene Struktur
presentation/
diff --git a/doc/presentation/Iteration-2/old/presentation-content-proposal.md b/doc/presentation/Iteration-2/old/presentation-content-proposal.md
index c9476fea2..f6b2c3b82 100644
--- a/doc/presentation/Iteration-2/old/presentation-content-proposal.md
+++ b/doc/presentation/Iteration-2/old/presentation-content-proposal.md
@@ -2,17 +2,17 @@
marp: true
theme: default
paginate: true
-header: 'AngularAI & Junie: AI-Driven Full-Stack'
-footer: '© 2026 AngularAI Project'
+header: 'GoodOne & Junie: AI-Driven Full-Stack'
+footer: '© 2026 GoodOne Project'
---
# Accelerating Full-Stack Development with Junie AI
-## A Case Study on the AngularAI Project Ecosystem
+## A Case Study on the GoodOne Project Ecosystem
---
# Application Overview
-### The "AngularAI" Ecosystem
+### The "GoodOne" Ecosystem
- **Unified Experience**: Seamless task management across Web and Mobile.
- **Web App**: Modern Angular dashboard using Material Design.
diff --git a/doc/presentation/Iteration-2/presentation-2-workbook.md b/doc/presentation/Iteration-2/presentation-2-workbook.md
index 684c26a30..af63e8bcc 100644
--- a/doc/presentation/Iteration-2/presentation-2-workbook.md
+++ b/doc/presentation/Iteration-2/presentation-2-workbook.md
@@ -8,7 +8,7 @@ Get-Content .env | ForEach-Object { if ($_ -match '^(?[^#\s=]+)=(?.
```bash
# Load environment variables from .env file
-cd C:\doc\sw\ai\angularai\angularai\deploy\prometheus
+cd C:\doc\sw\ai\goodone\goodone\deploy\prometheus
docker-compose up -build
-d
@@ -27,7 +27,7 @@ wsl bash -lc "./scripts/deployment-verification.sh https://goodone.ch"
http://localhost:3000/?orgId=1
-PS C:\doc\sw\ai\angularai\angularai\frontend>
+PS C:\doc\sw\ai\goodone\goodone\frontend>
npx playwright test e2e/ux-guardrails.spec.ts e2e/auth-flow.spec.ts e2e/tasks-ux.spec.ts --reporter=line
npx playwright show-report
@@ -116,4 +116,4 @@ Additionally, some tests (like the UX guardrails or manual verification tests) s
- **Location:** `frontend/e2e-screenshots/`
- **Location:** `frontend/screenshots/`
-If you are l
\ No newline at end of file
+If you are l
diff --git a/doc/presentation/Iteration-2/slides-2-executive.md b/doc/presentation/Iteration-2/slides-2-executive.md
index 4b1f3d424..f7e95d84d 100644
--- a/doc/presentation/Iteration-2/slides-2-executive.md
+++ b/doc/presentation/Iteration-2/slides-2-executive.md
@@ -174,6 +174,6 @@ Starkes Abschluss-Statement.
**Danke für die Aufmerksamkeit**
- Demo: https://www.goodone.ch
-- Repo: angularai
+- Repo: goodone
- Kontakt: Jürg Good
diff --git a/doc/presentation/Iteration-2/slides-2-non-tech.md b/doc/presentation/Iteration-2/slides-2-non-tech.md
index 252c01473..998bcc142 100644
--- a/doc/presentation/Iteration-2/slides-2-non-tech.md
+++ b/doc/presentation/Iteration-2/slides-2-non-tech.md
@@ -246,7 +246,7 @@ Hier bewusst langsamer sprechen.
**Danke für eure Aufmerksamkeit!**
- Live: https://www.goodone.ch
-- Repo: angularai
+- Repo: goodone
- Kontakt: Jürg Good
::: notes
diff --git a/doc/presentation/Iteration-2/slides-2-test.md b/doc/presentation/Iteration-2/slides-2-test.md
index dcb27e885..070ea8fae 100644
--- a/doc/presentation/Iteration-2/slides-2-test.md
+++ b/doc/presentation/Iteration-2/slides-2-test.md
@@ -268,7 +268,7 @@ Tasks durch Chat GPT erstellt und durch Junie Implementiert
- Demo:
- Repo:
-- Sonar:
+- Sonar:
- Präsentation Teil 1: [link]
diff --git a/doc/presentation/Iteration-2/slides-2.html b/doc/presentation/Iteration-2/slides-2.html
index b06c49983..24ee9aa75 100644
--- a/doc/presentation/Iteration-2/slides-2.html
+++ b/doc/presentation/Iteration-2/slides-2.html
@@ -453,7 +453,7 @@ Links
Repo: https://github.com/JuergGood/angularai.git
Sonar: https://sonarcloud.io/summary/overall?id=JuergGood_angularai
+href="https://sonarcloud.io/summary/overall?id=JuergGood_goodone"
+class="uri">https://sonarcloud.io/summary/overall?id=JuergGood_goodone
Präsentation Teil 1: [link]
diff --git a/doc/presentation/Iteration-2/slides-2.md b/doc/presentation/Iteration-2/slides-2.md
index 07a0f6104..9c52be7dc 100644
--- a/doc/presentation/Iteration-2/slides-2.md
+++ b/doc/presentation/Iteration-2/slides-2.md
@@ -423,7 +423,7 @@ Starkes Abschluss-Statement.
- Demo:
- Repo:
-- Sonar:
+- Sonar:
- Präsentation Teil 1: [link]
# "Hallen-Effekt" und "Aggressive Strategien"
diff --git a/doc/presentation/Iteration-2/template-2-junie.md b/doc/presentation/Iteration-2/template-2-junie.md
index d5875d7ff..b4428e54f 100644
--- a/doc/presentation/Iteration-2/template-2-junie.md
+++ b/doc/presentation/Iteration-2/template-2-junie.md
@@ -198,7 +198,7 @@ docker compose -f deploy/prometheus/docker-compose.yml up -d
**Vielen Dank für die Aufmerksamkeit!**
- Live Demo & Code: [www.goodone.ch](http://www.goodone.ch)
-- Repo: `angularai`
+- Repo: `goodone`
- Kontakt: Jürg Good
::: notes
diff --git a/doc/presentation/generation/pom.xml b/doc/presentation/generation/pom.xml
index 98d6bf1d0..52af368a0 100644
--- a/doc/presentation/generation/pom.xml
+++ b/doc/presentation/generation/pom.xml
@@ -3,8 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- ch.goodone.angularai
- angularai-parent
+ ch.goodone.goodone
+ goodone-parent
1.0.5
../pom.xml
diff --git a/doc/presentation/generation/presentation-workflow.md b/doc/presentation/generation/presentation-workflow.md
index 85dbabd1e..d09f5c3d4 100644
--- a/doc/presentation/generation/presentation-workflow.md
+++ b/doc/presentation/generation/presentation-workflow.md
@@ -43,7 +43,7 @@ The journey from a corporate template to a functional presentation follows these
To generate the presentation, run the following command from the `presentation/presentations` directory:
```bash
-cd C:\doc\sw\ai\angularai\angularai\presentation\presentations; python generate-presentation.py
+cd C:\doc\sw\ai\goodone\goodone\presentation\presentations; python generate-presentation.py
```
The output will be saved to `presentation/presentations/generated/SoftwareEntwicklungAI_Python.pptx`.
@@ -58,7 +58,7 @@ If the corporate branding changes:
### Troubleshooting
Use the `DetailedInspector` Java utility if the generated file reports corruption:
```bash
-mvn -f presentation/pom.xml compile exec:java "-Dexec.mainClass=ch.goodone.angularai.presentation.DetailedInspector" "-Dcheckstyle.skip"
+mvn -f presentation/pom.xml compile exec:java "-Dexec.mainClass=ch.goodone.goodone.presentation.DetailedInspector" "-Dcheckstyle.skip"
```
This tool will pinpoint duplicate shape IDs or invalid XML structures.
diff --git a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/CompanyStyleAligner.java b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/CompanyStyleAligner.java
similarity index 98%
rename from doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/CompanyStyleAligner.java
rename to doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/CompanyStyleAligner.java
index 774057dcd..5adc6486d 100644
--- a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/CompanyStyleAligner.java
+++ b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/CompanyStyleAligner.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.presentation;
+package ch.goodone.goodone.presentation;
import org.apache.poi.sl.usermodel.Placeholder;
import org.apache.poi.xslf.usermodel.*;
diff --git a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/DetailedInspector.java b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/DetailedInspector.java
similarity index 99%
rename from doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/DetailedInspector.java
rename to doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/DetailedInspector.java
index 75da06d43..3938e3e07 100644
--- a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/DetailedInspector.java
+++ b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/DetailedInspector.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.presentation;
+package ch.goodone.goodone.presentation;
import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
diff --git a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/FinalResultFixer.java b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/FinalResultFixer.java
similarity index 99%
rename from doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/FinalResultFixer.java
rename to doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/FinalResultFixer.java
index 4bd4daf60..b1b05f006 100644
--- a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/FinalResultFixer.java
+++ b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/FinalResultFixer.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.presentation;
+package ch.goodone.goodone.presentation;
import org.apache.poi.sl.usermodel.Placeholder;
import org.apache.poi.xslf.usermodel.*;
diff --git a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/FinalTemplateFixer.java b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/FinalTemplateFixer.java
similarity index 98%
rename from doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/FinalTemplateFixer.java
rename to doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/FinalTemplateFixer.java
index 66b655780..826859af9 100644
--- a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/FinalTemplateFixer.java
+++ b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/FinalTemplateFixer.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.presentation;
+package ch.goodone.goodone.presentation;
import org.apache.poi.sl.usermodel.Placeholder;
import org.apache.poi.xslf.usermodel.*;
diff --git a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/LayoutInspector.java b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/LayoutInspector.java
similarity index 98%
rename from doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/LayoutInspector.java
rename to doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/LayoutInspector.java
index ab779ea8c..0178e2d42 100644
--- a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/LayoutInspector.java
+++ b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/LayoutInspector.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.presentation;
+package ch.goodone.goodone.presentation;
import org.apache.poi.sl.usermodel.Placeholder;
import org.apache.poi.xslf.usermodel.*;
diff --git a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/TemplateCreator.java b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/TemplateCreator.java
similarity index 99%
rename from doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/TemplateCreator.java
rename to doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/TemplateCreator.java
index c2f557284..8061569ed 100644
--- a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/TemplateCreator.java
+++ b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/TemplateCreator.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.presentation;
+package ch.goodone.goodone.presentation;
import org.apache.poi.sl.usermodel.Placeholder;
import org.apache.poi.xslf.usermodel.*;
diff --git a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/TemplateFixerV2.java b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/TemplateFixerV2.java
similarity index 98%
rename from doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/TemplateFixerV2.java
rename to doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/TemplateFixerV2.java
index 822133082..69518bb88 100644
--- a/doc/presentation/generation/src/main/java/ch/goodone/angularai/presentation/TemplateFixerV2.java
+++ b/doc/presentation/generation/src/main/java/ch/goodone/goodone/presentation/TemplateFixerV2.java
@@ -1,4 +1,4 @@
-package ch.goodone.angularai.presentation;
+package ch.goodone.goodone.presentation;
import org.apache.poi.sl.usermodel.Placeholder;
import org.apache.poi.xslf.usermodel.*;
diff --git a/doc/presentation/interation-4/slides-4.md b/doc/presentation/interation-4/slides-4.md
new file mode 100644
index 000000000..bcbe27a15
--- /dev/null
+++ b/doc/presentation/interation-4/slides-4.md
@@ -0,0 +1,32 @@
+% Software-Entwicklung mit KI - Iteration 4
+% Von Prototyp zu Engineering-Booster dank KI
+% Jürg Good · xx.03.2026
+
+::: notes
+:::
+
+
+# Ideen
+
+Erstfall: Recovery von korruptem Git Repo
+Github Startseite
+UX Styling
+Autonome KI
+KI Testing
+
+# Ausblick
+
+Features in GoodOne.ch:
+
+
+
+# Danke.
+
+Ich freue mich auf eure Gedanken.
+
+::: notes
+Einladung zur Diskussion.
+:::
+
+# Anhang
+
diff --git a/doc/presentation/iteration-1/files/input/architecture_overview.old.drawio b/doc/presentation/iteration-1/files/input/architecture_overview.old.drawio
index 512c53657..ac32339d8 100644
--- a/doc/presentation/iteration-1/files/input/architecture_overview.old.drawio
+++ b/doc/presentation/iteration-1/files/input/architecture_overview.old.drawio
@@ -1,5 +1,5 @@
-
+
diff --git a/doc/presentation/iteration-1/generate_presentation.py b/doc/presentation/iteration-1/generate_presentation.py
index 14ec97974..9347e2692 100644
--- a/doc/presentation/iteration-1/generate_presentation.py
+++ b/doc/presentation/iteration-1/generate_presentation.py
@@ -648,7 +648,7 @@ def add_footer_and_slide_number(self, slide, caption: str = "") -> None:
p.font.color.rgb = RGBColor.from_string(self.CORPORATE_BLUE)
# Footer / Caption
- footer_text = caption or "AngularAI - Softwareentwicklung mit AI"
+ footer_text = caption or "GoodOne - Softwareentwicklung mit AI"
# Look for footer placeholder
f_ph = _find_placeholder(slide, placeholder_type=PP_PLACEHOLDER_TYPE.FOOTER)
diff --git a/doc/presentation/iteration-1/pptx_generation_plan.md b/doc/presentation/iteration-1/pptx_generation_plan.md
index accd785ff..5f5b47f22 100644
--- a/doc/presentation/iteration-1/pptx_generation_plan.md
+++ b/doc/presentation/iteration-1/pptx_generation_plan.md
@@ -34,10 +34,10 @@ Once your images are in the `files/` folder, simply run:
```bash
python doc\ai\presentation\generate_presentation.py
```
-This will produce **`doc\ai\presentation\AngularAI_Presentation.pptx`** with all your content and images perfectly positioned.
+This will produce **`doc\ai\presentation\GoodOne_Presentation.pptx`** with all your content and images perfectly positioned.
#### 5. Custom Design & Post-Processing
* **Design**: The script currently applies a clean 16:9 layout. You can apply any PowerPoint Design Theme in one click once the file is generated by going to the **Design** tab in PowerPoint.
* **Mermaid**: Use the Mermaid blocks in the `.md` file for quick previews; the Python script will use the high-quality `.png` exports from Draw.io for the final deck.
-The current "Draft" presentation has already been generated and is waiting for your images!
\ No newline at end of file
+The current "Draft" presentation has already been generated and is waiting for your images!
diff --git a/doc/presentation/iteration-1/slides-1.md b/doc/presentation/iteration-1/slides-1.md
index f153373d7..2790b6863 100644
--- a/doc/presentation/iteration-1/slides-1.md
+++ b/doc/presentation/iteration-1/slides-1.md
@@ -310,7 +310,7 @@ Offen für Diskussion: Where to start? Welche Policies? Welche Quick Wins?
-
-
--
+-
# Architektur – Logisch
diff --git a/doc/presentation/iteration-3/invitation-3.md b/doc/presentation/iteration-3/invitation-3.md
index a1797e8b2..80e863245 100644
--- a/doc/presentation/iteration-3/invitation-3.md
+++ b/doc/presentation/iteration-3/invitation-3.md
@@ -26,4 +26,4 @@ Dabei geht es weniger um Tools – sondern darum, wie sich Entwicklung anfühlt
Ich freue mich auf den Austausch mit euch.
Freundliche Grüsse
-Jürg Good
\ No newline at end of file
+Jürg Good
diff --git a/doc/presentation/iteration-3/slides-3.md b/doc/presentation/iteration-3/slides-3.md
index 34f792fc0..15987d9da 100644
--- a/doc/presentation/iteration-3/slides-3.md
+++ b/doc/presentation/iteration-3/slides-3.md
@@ -572,7 +572,7 @@ Einladung zur Diskussion.
- Demo: Aktuell Level 2 (ohne KI Runtime)
- Repo:
-- Sonar:
+- Sonar:
- KI-Präsentationen 1 und 2: [link]
# Task Set Iteration 2 und 3
@@ -662,4 +662,4 @@ Zeigt Reife.
:::
::: notes
Hier gut anschlussfähig für Management.
-:::
\ No newline at end of file
+:::
diff --git a/doc/readme-assets/architecture-overview-snippet.md b/doc/readme-assets/architecture-overview-snippet.md
index 202253295..0d05569f7 100644
--- a/doc/readme-assets/architecture-overview-snippet.md
+++ b/doc/readme-assets/architecture-overview-snippet.md
@@ -1,11 +1,11 @@
## 1‑Minute Architecture Overview
-
+
-AngularAI integrates AI directly into the runtime of the application.
+GoodOne integrates AI directly into the runtime of the application.
User interactions and project data are analyzed by an AI reasoning layer
that generates insights such as architecture explanations, development risk
detection, sprint retrospectives and ADR drift analysis.
-
\ No newline at end of file
+
diff --git a/doc/readme-assets/feature-overview-snippet.md b/doc/readme-assets/feature-overview-snippet.md
index bcae2faf2..9ad958e9d 100644
--- a/doc/readme-assets/feature-overview-snippet.md
+++ b/doc/readme-assets/feature-overview-snippet.md
@@ -1,4 +1,4 @@
## Platform Capabilities
-
+
diff --git a/doc/readme-assets/angularai-hero-banner.png b/doc/readme-assets/goodone-hero-banner.png
similarity index 100%
rename from doc/readme-assets/angularai-hero-banner.png
rename to doc/readme-assets/goodone-hero-banner.png
diff --git a/doc/readme-assets/angularai-social-card.png b/doc/readme-assets/goodone-social-card.png
similarity index 100%
rename from doc/readme-assets/angularai-social-card.png
rename to doc/readme-assets/goodone-social-card.png
diff --git a/doc/readme-assets/intelligence-map-snippet.md b/doc/readme-assets/intelligence-map-snippet.md
index f258db2e2..46acd5648 100644
--- a/doc/readme-assets/intelligence-map-snippet.md
+++ b/doc/readme-assets/intelligence-map-snippet.md
@@ -1,7 +1,7 @@
## Software Engineering Intelligence Map
-
+
The platform analyzes architecture documentation, development tasks and
architecture decisions using an AI reasoning engine to generate engineering insights.
diff --git a/doc/readme-assets/readme-hero-snippet.md b/doc/readme-assets/readme-hero-snippet.md
index bbc78fdb4..678b1682e 100644
--- a/doc/readme-assets/readme-hero-snippet.md
+++ b/doc/readme-assets/readme-hero-snippet.md
@@ -1,12 +1,12 @@
-
+




-**AngularAI** is an experimental platform exploring how **AI can analyze and improve software engineering workflows**.
+**GoodOne** is an experimental platform exploring how **AI can analyze and improve software engineering workflows**.
The system can:
diff --git a/doc/readme-assets/repo-description.txt b/doc/readme-assets/repo-description.txt
index 381688c53..58e1d7b60 100644
--- a/doc/readme-assets/repo-description.txt
+++ b/doc/readme-assets/repo-description.txt
@@ -1,5 +1,5 @@
-AngularAI is an experimental AI-powered software engineering platform.
+GoodOne is an experimental AI-powered software engineering platform.
The application integrates AI directly into the runtime to analyze architecture documentation,
development tasks, and engineering workflows.
diff --git a/doc/release/static-analysis-conflict-matrix.md b/doc/release/static-analysis-conflict-matrix.md
index a619af1be..54c56b708 100644
--- a/doc/release/static-analysis-conflict-matrix.md
+++ b/doc/release/static-analysis-conflict-matrix.md
@@ -1,6 +1,6 @@
# Static Analysis Conflict Matrix
-This document outlines the alignment between different static analysis tools used in the AngularAI project to reduce conflicts and focus each tool on its primary responsibility.
+This document outlines the alignment between different static analysis tools used in the GoodOne project to reduce conflicts and focus each tool on its primary responsibility.
## Tools Overview
diff --git a/doc/user-guide/faq.md b/doc/user-guide/faq.md
index c794e6231..4705824fb 100644
--- a/doc/user-guide/faq.md
+++ b/doc/user-guide/faq.md
@@ -1,8 +1,8 @@
# Frequently Asked Questions (FAQ)
## General
-### Q: What is AngularAI?
-A: AngularAI is a task management application featuring a modern Angular frontend, a Spring Boot backend, and an Android mobile app.
+### Q: What is GoodOne?
+A: GoodOne is a task management application featuring a modern Angular frontend, a Spring Boot backend, and an Android mobile app.
### Q: How do I get started?
A: Register for an account, log in, and start creating tasks on the Task Management page.
diff --git a/doc/user-guide/faq_de.md b/doc/user-guide/faq_de.md
index 5bd693b34..ad52931ac 100644
--- a/doc/user-guide/faq_de.md
+++ b/doc/user-guide/faq_de.md
@@ -1,6 +1,6 @@
# Häufig gestellte Fragen (FAQ)
-Finden Sie Antworten auf häufig gestellte Fragen zur AngularAI-Anwendung.
+Finden Sie Antworten auf häufig gestellte Fragen zur GoodOne-Anwendung.
## Inhaltsverzeichnis
1. [Konto und Anmeldung](#konto-und-anmeldung)
diff --git a/doc/user-guide/release-notes.md b/doc/user-guide/release-notes.md
index df3bc3a75..29561036d 100644
--- a/doc/user-guide/release-notes.md
+++ b/doc/user-guide/release-notes.md
@@ -10,7 +10,7 @@
- Implemented dynamic reindex toggle, connectivity checks, and deterministic truncation repair in `StructuredOutputService`.
- Added retrospective generator service with structured JSON output and architecture prompt handling.
* **Platform & Infrastructure**:
- - Integrated PostgreSQL as a data source for AngularAI and documented AI-ARCH-05 implementation.
+ - Integrated PostgreSQL as a data source for GoodOne and documented AI-ARCH-05 implementation.
- Added Mailpit to the development environment for easier email testing.
- Implemented a master switch for AI features with component-level handling.
- Added `i18nInterceptor` for automatic language header management in API calls.
@@ -249,7 +249,7 @@
* **Presentation Tools**: Added scripts and templates for generating high-quality architectural presentations directly from the codebase.
## Version 1.0.0 (2026-01-08)
-* **Initial Release**: Core functionality of the AngularAI prototype.
+* **Initial Release**: Core functionality of the GoodOne prototype.
* **Multi-Platform Support**: Unified experience across Web (Angular) and Android platforms.
* **Task Management**: Comprehensive task lifecycle including status tracking, filtering, and drag-and-drop reordering.
* **Real-time Monitoring**: Integrated Action Log and Log menu for system transparency.
@@ -260,6 +260,6 @@
## Pre-1.0.0 (2026-01-01)
* **Foundation**: Established the core project structure with Spring Boot backend and Angular standalone components.
* **Infrastructure**: Set up Docker-based deployment and Nginx reverse proxy configuration.
-* **Architecture**: Defined the "AngularAI" ecosystem diagrams and core design principles.
+* **Architecture**: Defined the "GoodOne" ecosystem diagrams and core design principles.
diff --git a/doc/user-guide/user-guide.md b/doc/user-guide/user-guide.md
index 7ea70cccb..d06a07c6e 100644
--- a/doc/user-guide/user-guide.md
+++ b/doc/user-guide/user-guide.md
@@ -1,6 +1,6 @@
# User Guide
-Welcome to the AngularAI User Guide. This document provides instructions on how to use the frontend application features.
+Welcome to the GoodOne User Guide. This document provides instructions on how to use the frontend application features.
## Table of Contents
1. [Getting Started](#getting-started)
diff --git a/doc/user-guide/user-guide_de.md b/doc/user-guide/user-guide_de.md
index 1e6ea461a..b93136591 100644
--- a/doc/user-guide/user-guide_de.md
+++ b/doc/user-guide/user-guide_de.md
@@ -1,6 +1,6 @@
# Benutzerhandbuch
-Willkommen beim AngularAI-Benutzerhandbuch. Dieses Dokument enthält Anweisungen zur Verwendung der Funktionen der Frontend-Anwendung.
+Willkommen beim GoodOne-Benutzerhandbuch. Dieses Dokument enthält Anweisungen zur Verwendung der Funktionen der Frontend-Anwendung.
## Inhaltsverzeichnis
1. [Erste Schritte](#erste-schritte)
diff --git a/doc/user-guide/workflows/navigation-guide.md b/doc/user-guide/workflows/navigation-guide.md
index 6b333b69e..a729debbd 100644
--- a/doc/user-guide/workflows/navigation-guide.md
+++ b/doc/user-guide/workflows/navigation-guide.md
@@ -1,6 +1,6 @@
# Navigation & Settings Guide
-This guide explains how to navigate the AngularAI application and access your profile and system settings.
+This guide explains how to navigate the GoodOne application and access your profile and system settings.
## 1. Top Navigation Bar
diff --git a/doc/user-guide/workflows/registration-ui-guide.md b/doc/user-guide/workflows/registration-ui-guide.md
index c508677a5..2dd04c1b1 100644
--- a/doc/user-guide/workflows/registration-ui-guide.md
+++ b/doc/user-guide/workflows/registration-ui-guide.md
@@ -1,6 +1,6 @@
# User Registration Guide
-This guide walks you through the process of creating a new account in the AngularAI system.
+This guide walks you through the process of creating a new account in the GoodOne system.
## Step 1: Accessing the Registration Page
diff --git a/doc/ux-review/Tasks/iteration3/task-3-1-2-border-spill.md b/doc/ux-review/Tasks/iteration3/task-3-1-2-border-spill.md
index c9a273a5c..9e28d7874 100644
--- a/doc/ux-review/Tasks/iteration3/task-3-1-2-border-spill.md
+++ b/doc/ux-review/Tasks/iteration3/task-3-1-2-border-spill.md
@@ -152,4 +152,4 @@ Extract .form-grid into a shared “FormLayout” utility
Reuse it for login, user-admin, profile edits
(so this class of bug never appears again)
-You’re doing this the right way — the guardrails are now forcing design-system thinking instead of CSS whack-a-mole.
\ No newline at end of file
+You’re doing this the right way — the guardrails are now forcing design-system thinking instead of CSS whack-a-mole.
diff --git a/doc/ux-review/Tasks/iteration5/task-5-2-1-chip-scroll.md b/doc/ux-review/Tasks/iteration5/task-5-2-1-chip-scroll.md
index 068a6d42f..e8a487431 100644
--- a/doc/ux-review/Tasks/iteration5/task-5-2-1-chip-scroll.md
+++ b/doc/ux-review/Tasks/iteration5/task-5-2-1-chip-scroll.md
@@ -80,4 +80,4 @@ overflow-x:auto must be on .task-filter-scroll (the wrapper)
width: max-content on the inner row ensures it becomes scrollable rather than squeezing
-min-width:0 prevents flex children from forcing overflow
\ No newline at end of file
+min-width:0 prevents flex children from forcing overflow
diff --git a/doc/ux-review/Tasks/iteration5/task-5-overview.md b/doc/ux-review/Tasks/iteration5/task-5-overview.md
index 7f82b3d25..c7ad08562 100644
--- a/doc/ux-review/Tasks/iteration5/task-5-overview.md
+++ b/doc/ux-review/Tasks/iteration5/task-5-overview.md
@@ -23,4 +23,4 @@ P2 — Quick-Add preview chips are okay but can be slightly calmer
They’re already improved (mostly 1 row), but on smaller devices they’ll still stack / push content down.
-✅ Optional: make them horizontal-scroll-only on mobile.
\ No newline at end of file
+✅ Optional: make them horizontal-scroll-only on mobile.
diff --git a/doc/ux-review/Tasks/mobile-task-list.md b/doc/ux-review/Tasks/mobile-task-list.md
index da8498128..f1baf7bbf 100644
--- a/doc/ux-review/Tasks/mobile-task-list.md
+++ b/doc/ux-review/Tasks/mobile-task-list.md
@@ -40,4 +40,4 @@ npm run test:ux:guardrails
cd frontend ;
-npx playwright test e2e/dashboard-dark-chips.spec.ts --reporter=line
\ No newline at end of file
+npx playwright test e2e/dashboard-dark-chips.spec.ts --reporter=line
diff --git a/doc/ux-review/ui-snapshots.md b/doc/ux-review/ui-snapshots.md
index c5767ca6f..36d0dab59 100644
--- a/doc/ux-review/ui-snapshots.md
+++ b/doc/ux-review/ui-snapshots.md
@@ -1,6 +1,6 @@
# UI Snapshot Documentation for UX Review
-This document serves as an index for the comprehensive set of UI snapshots for the AngularAI application. Snapshots are organized by workflow to facilitate targeted reviews.
+This document serves as an index for the comprehensive set of UI snapshots for the GoodOne application. Snapshots are organized by workflow to facilitate targeted reviews.
## Workflow Snapshots
diff --git a/frontend/.gitignore b/frontend/.gitignore
index 429c37bfe..6bfa99835 100644
--- a/frontend/.gitignore
+++ b/frontend/.gitignore
@@ -42,7 +42,7 @@ __screenshots__/
.DS_Store
Thumbs.db
/cypress/screenshots/
-/target/aifrontend-1.1.0.jar
+/target/goodone-frontend-1.1.1-SNAPSHOT.jar
/target/
/playwright-report/
/test-results/
diff --git a/frontend/.nyc_output/out.json b/frontend/.nyc_output/out.json
index 3d5d675bc..5cb670df3 100644
--- a/frontend/.nyc_output/out.json
+++ b/frontend/.nyc_output/out.json
@@ -1,6 +1,6 @@
{
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\auth.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\auth.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\auth.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\auth.service.ts",
"statementMap": {
"0": {
"start": {
@@ -1022,7 +1022,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\auth.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\auth.service.ts"
],
"sourcesContent": [
"import { Injectable, signal } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable, tap } from 'rxjs';\r\nimport { User } from '../models/user.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthService {\r\n private apiUrl = '/api/auth';\r\n currentUser = signal(null);\r\n isInitializing = signal(false);\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n init() {\r\n const auth = localStorage.getItem('auth');\r\n if (auth) {\r\n this.isInitializing.set(true);\r\n // Basic validation/restore session\r\n this.http.post(`${this.apiUrl}/login`, {}, {\r\n headers: new HttpHeaders({ 'Authorization': 'Basic ' + auth })\r\n }).subscribe({\r\n next: (user) => {\r\n this.currentUser.set(user);\r\n this.isInitializing.set(false);\r\n },\r\n error: () => {\r\n this.logout();\r\n this.isInitializing.set(false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n login(login: string, password: string): Observable {\r\n const authString = `${login}:${password}`;\r\n // Use a robust way to encode to Base64 that handles non-ASCII characters\r\n const encodedAuth = btoa(unescape(encodeURIComponent(authString)));\r\n\r\n const headers = new HttpHeaders({\r\n 'Authorization': 'Basic ' + encodedAuth\r\n });\r\n return this.http.post(`${this.apiUrl}/login`, {}, { headers }).pipe(\r\n tap(user => {\r\n this.currentUser.set(user);\r\n localStorage.setItem('auth', encodedAuth);\r\n })\r\n );\r\n }\r\n\r\n register(user: User): Observable {\r\n return this.http.post(`${this.apiUrl}/register`, user);\r\n }\r\n\r\n logout() {\r\n const auth = localStorage.getItem('auth');\r\n const headers = auth ? new HttpHeaders({ 'Authorization': 'Basic ' + auth }) : new HttpHeaders();\r\n\r\n this.http.post(`${this.apiUrl}/logout`, {}, { headers }).subscribe();\r\n this.currentUser.set(null);\r\n localStorage.removeItem('auth');\r\n }\r\n\r\n getAuthHeader(): string | null {\r\n return localStorage.getItem('auth');\r\n }\r\n\r\n isLoggedIn(): boolean {\r\n return this.currentUser() !== null;\r\n }\r\n\r\n isAdmin(): boolean {\r\n const role = this.currentUser()?.role;\r\n return role === 'ROLE_ADMIN' || role === 'ROLE_ADMIN_READ';\r\n }\r\n\r\n hasAdminWriteAccess(): boolean {\r\n return this.currentUser()?.role === 'ROLE_ADMIN';\r\n }\r\n}\r\n"
@@ -1033,8 +1033,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "eef5aa3bc9cde331d0af679dc09926d48a217740"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\login\\login.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\login\\login.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\login\\login.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\login\\login.component.ts",
"statementMap": {
"0": {
"start": {
@@ -2870,8 +2870,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\login\\login.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\login\\login.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\login\\login.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\login\\login.component.html"
],
"sourcesContent": [
"import { Component, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router, RouterLink } from '@angular/router';\r\nimport { AuthService } from '../../services/auth.service';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-login',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, RouterLink, MatCardModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, TranslateModule],\r\n templateUrl: './login.component.html',\r\n styles: [`\r\n .login-page {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height: 80vh;\r\n }\r\n .login-card {\r\n width: 400px;\r\n }\r\n mat-form-field {\r\n width: 100%;\r\n margin-bottom: 10px;\r\n }\r\n .actions {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n }\r\n .error {\r\n color: #f44336;\r\n margin-top: 10px;\r\n text-align: center;\r\n }\r\n `]\r\n})\r\nexport class LoginComponent {\r\n login = '';\r\n password = '';\r\n error = '';\r\n hidePassword = true;\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private router: Router,\r\n private cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n onSubmit() {\r\n this.authService.login(this.login, this.password).subscribe({\r\n next: (user) => {\r\n if (user.role === 'ROLE_ADMIN' || user.role === 'ROLE_ADMIN_READ') {\r\n this.router.navigate(['/dashboard']);\r\n } else {\r\n this.router.navigate(['/tasks']);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Login error:', err);\r\n this.error = 'COMMON.ERROR';\r\n this.cdr.detectChanges();\r\n }\r\n });\r\n }\r\n}\r\n",
@@ -2883,8 +2883,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "d2da9aa10af68fa9980df18319cc91a375510a15"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\register\\register.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\register\\register.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\register\\register.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\register\\register.component.ts",
"statementMap": {
"0": {
"start": {
@@ -9057,8 +9057,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\register\\register.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\register\\register.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\register\\register.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\register\\register.component.html"
],
"sourcesContent": [
"import { Component, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router, RouterLink } from '@angular/router';\r\nimport { AuthService } from '../../services/auth.service';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { provideNativeDateAdapter } from '@angular/material/core';\r\nimport { User } from '../../models/user.model';\r\n\r\n@Component({\r\n selector: 'app-register',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n RouterLink,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatDatepickerModule,\r\n TranslateModule\r\n ],\r\n providers: [provideNativeDateAdapter()],\r\n templateUrl: './register.component.html',\r\n styles: [`\r\n .register-page {\r\n display: flex;\r\n justify-content: center;\r\n padding: 20px;\r\n }\r\n .register-card {\r\n width: 100%;\r\n max-width: 500px;\r\n }\r\n mat-form-field {\r\n width: 100%;\r\n margin-bottom: 10px;\r\n }\r\n .actions {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-top: 10px;\r\n }\r\n .error { color: #f44336; margin-top: 10px; text-align: center; }\r\n .success { color: #4caf50; margin-top: 10px; text-align: center; }\r\n `]\r\n})\r\nexport class RegisterComponent {\r\n user: User = {\r\n firstName: '',\r\n lastName: '',\r\n login: '',\r\n password: '',\r\n email: '',\r\n birthDate: null,\r\n address: ''\r\n };\r\n confirmPassword = '';\r\n error = '';\r\n message = '';\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private router: Router,\r\n private cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n onSubmit() {\r\n if (this.user.password !== this.confirmPassword) {\r\n this.error = 'ADMIN.ERROR_PASSWORD_MATCH';\r\n return;\r\n }\r\n\r\n const userToRegister = { ...this.user };\r\n if (userToRegister.birthDate && (userToRegister.birthDate as any) instanceof Date) {\r\n const date = userToRegister.birthDate as unknown as Date;\r\n // Ensure local date is used to avoid timezone shift to previous day\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n (userToRegister as any).birthDate = `${year}-${month}-${day}`;\r\n }\r\n\r\n this.authService.register(userToRegister).subscribe({\r\n next: () => {\r\n this.message = 'COMMON.SUCCESS';\r\n this.error = '';\r\n this.cdr.detectChanges();\r\n setTimeout(() => this.router.navigate(['/login']), 2000);\r\n },\r\n error: (err) => {\r\n if (err.status === 400 && typeof err.error === 'string') {\r\n // Backend returns specific error messages as strings\r\n this.error = err.error;\r\n // If the backend error message matches a known key or is specific,\r\n // we might need to handle it. For now, we display what backend says if it's not a translation key.\r\n // But to be safe with i18n, we should probably map common ones.\r\n if (this.error === 'User already exists') {\r\n // We could add a translation key for this too\r\n this.error = 'ADMIN.ERROR_USER_EXISTS';\r\n }\r\n } else {\r\n this.error = 'COMMON.ERROR';\r\n }\r\n this.message = '';\r\n this.cdr.detectChanges();\r\n }\r\n });\r\n }\r\n}\r\n",
@@ -9070,8 +9070,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "920c7a179b1f4d24b52d6fc8648f642f2fd29670"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\user.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\user.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\user.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\user.service.ts",
"statementMap": {
"0": {
"start": {
@@ -9435,7 +9435,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\user.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\user.service.ts"
],
"sourcesContent": [
"import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { User } from '../models/user.model';\r\nimport { AuthService } from './auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserService {\r\n private apiUrl = '/api/users';\r\n\r\n constructor(private http: HttpClient, private authService: AuthService) {}\r\n\r\n private getHeaders(): HttpHeaders {\r\n const auth = this.authService.getAuthHeader();\r\n return new HttpHeaders({\r\n 'Authorization': 'Basic ' + auth,\r\n 'Content-Type': 'application/json'\r\n });\r\n }\r\n\r\n getCurrentUser(): Observable {\r\n return this.http.get(`${this.apiUrl}/me`, { headers: this.getHeaders() });\r\n }\r\n\r\n updateCurrentUser(user: User): Observable {\r\n return this.http.put(`${this.apiUrl}/me`, user, { headers: this.getHeaders() });\r\n }\r\n}\r\n"
@@ -9446,8 +9446,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "85cad8604636fae5974aa4811d5a09ae9b7c4fe4"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\profile\\profile.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\profile\\profile.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\profile\\profile.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\profile\\profile.component.ts",
"statementMap": {
"0": {
"start": {
@@ -12988,8 +12988,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\profile\\profile.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\profile\\profile.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\profile\\profile.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\profile\\profile.component.html"
],
"sourcesContent": [
"import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { User } from '../../models/user.model';\r\nimport { UserService } from '../../services/user.service';\r\nimport { AuthService } from '../../services/auth.service';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { provideNativeDateAdapter } from '@angular/material/core';\r\n\r\n@Component({\r\n selector: 'app-profile',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatDatepickerModule,\r\n TranslateModule\r\n ],\r\n providers: [provideNativeDateAdapter()],\r\n templateUrl: './profile.component.html',\r\n styles: [`\r\n .profile-page {\r\n display: flex;\r\n justify-content: center;\r\n padding: 20px;\r\n }\r\n .profile-card {\r\n width: 100%;\r\n max-width: 500px;\r\n }\r\n mat-form-field {\r\n width: 100%;\r\n margin-bottom: 10px;\r\n }\r\n .actions {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n }\r\n .success { color: #4caf50; margin-top: 10px; text-align: center; }\r\n .error { color: #f44336; margin-top: 10px; text-align: center; }\r\n `]\r\n})\r\nexport class ProfileComponent implements OnInit {\r\n user?: User;\r\n message = '';\r\n\r\n constructor(\r\n private userService: UserService,\r\n private authService: AuthService,\r\n private router: Router,\r\n private cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.userService.getCurrentUser().subscribe({\r\n next: (user) => {\r\n this.user = user;\r\n this.cdr.detectChanges();\r\n },\r\n error: (err) => {\r\n console.error('Error fetching user profile:', err);\r\n this.router.navigate(['/login']);\r\n }\r\n });\r\n }\r\n\r\n onSubmit() {\r\n if (this.user) {\r\n const userToSave = { ...this.user };\r\n if (userToSave.birthDate) {\r\n const d = new Date(userToSave.birthDate);\r\n if (!isNaN(d.getTime())) {\r\n // Format to YYYY-MM-DD\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n userToSave.birthDate = `${year}-${month}-${day}`;\r\n }\r\n }\r\n\r\n this.userService.updateCurrentUser(userToSave).subscribe({\r\n next: () => {\r\n this.message = 'COMMON.SUCCESS';\r\n this.cdr.detectChanges();\r\n },\r\n error: () => {\r\n this.message = 'COMMON.ERROR';\r\n this.cdr.detectChanges();\r\n }\r\n });\r\n }\r\n }\r\n\r\n onLogout() {\r\n this.authService.logout();\r\n this.router.navigate(['/login']);\r\n }\r\n}\r\n",
@@ -13001,8 +13001,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "0edf7588aae98228537ef548b89bffa1da0d07e0"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\models\\task.model.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\models\\task.model.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\models\\task.model.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\models\\task.model.ts",
"statementMap": {
"0": {
"start": {
@@ -13273,7 +13273,7 @@
"TaskStatus"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\models\\task.model.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\models\\task.model.ts"
],
"sourcesContent": [
"export enum Priority {\r\n LOW = 'LOW',\r\n MEDIUM = 'MEDIUM',\r\n HIGH = 'HIGH'\r\n}\r\n\r\nexport enum TaskStatus {\r\n OPEN = 'OPEN',\r\n IN_PROGRESS = 'IN_PROGRESS',\r\n DONE = 'DONE',\r\n ARCHIVED = 'ARCHIVED'\r\n}\r\n\r\nexport interface Task {\r\n id?: number;\r\n title: string;\r\n description: string;\r\n dueDate: string;\r\n priority: Priority;\r\n status: TaskStatus;\r\n position?: number;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n completedAt?: string;\r\n tags?: string[];\r\n}\r\n"
@@ -13284,8 +13284,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "16502407105087f19b9d5f512f1753b7baebc301"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.ts",
"statementMap": {
"0": {
"start": {
@@ -13740,8 +13740,8 @@
"encapsulation"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\confirm-dialog.component.html"
],
"sourcesContent": [
"import { Component } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n MatDialogActions,\r\n MatDialogClose,\r\n MatDialogContent,\r\n MatDialogTitle,\r\n} from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'app-confirm-dialog',\r\n standalone: true,\r\n imports: [MatButtonModule, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle],\r\n templateUrl: './confirm-dialog.component.html',\r\n})\r\nexport class ConfirmDialogComponent {}\r\n",
@@ -13753,8 +13753,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "109dfa19245bf6e51f16e03b74f8eccc8873d0bf"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\task.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\task.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\task.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\task.service.ts",
"statementMap": {
"0": {
"start": {
@@ -15503,7 +15503,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\task.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\task.service.ts"
],
"sourcesContent": [
"import { Injectable, signal } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Observable, tap } from 'rxjs';\r\nimport { Task, TaskStatus } from '../models/task.model';\r\nimport { AuthService } from './auth.service';\r\n\r\nexport type SmartFilter = 'ALL' | 'TODAY' | 'UPCOMING' | 'OVERDUE' | 'HIGH';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TaskService {\r\n private apiUrl = '/api/tasks';\r\n\r\n private tasksSignal = signal([]);\r\n readonly tasks = this.tasksSignal.asReadonly();\r\n\r\n constructor(private http: HttpClient, private authService: AuthService) {}\r\n\r\n private getHeaders(): HttpHeaders {\r\n const auth = this.authService.getAuthHeader();\r\n const headers: { [key: string]: string } = {\r\n 'Content-Type': 'application/json'\r\n };\r\n if (auth) {\r\n headers['Authorization'] = 'Basic ' + auth;\r\n }\r\n return new HttpHeaders(headers);\r\n }\r\n\r\n getTasks(params?: { status?: TaskStatus; smartFilter?: SmartFilter; sort?: string }): Observable {\r\n let httpParams = new HttpParams();\r\n if (params) {\r\n if (params.status) httpParams = httpParams.set('status', params.status);\r\n if (params.smartFilter) httpParams = httpParams.set('smartFilter', params.smartFilter);\r\n if (params.sort) httpParams = httpParams.set('sort', params.sort);\r\n }\r\n return this.http.get(this.apiUrl, { headers: this.getHeaders(), params: httpParams }).pipe(\r\n tap(tasks => this.tasksSignal.set(tasks))\r\n );\r\n }\r\n\r\n createTask(task: Task): Observable {\r\n return this.http.post(this.apiUrl, task, { headers: this.getHeaders() }).pipe(\r\n tap(newTask => this.tasksSignal.update(tasks => [newTask, ...tasks]))\r\n );\r\n }\r\n\r\n quickAdd(title: string): Observable {\r\n return this.http.post(this.apiUrl, { title }, { headers: this.getHeaders() }).pipe(\r\n tap(newTask => {\r\n // Use a new array reference to ensure signal consumers (like effects) are triggered\r\n this.tasksSignal.update(tasks => [newTask, ...tasks]);\r\n })\r\n );\r\n }\r\n\r\n updateTask(id: number, task: Task): Observable {\r\n return this.http.put(`${this.apiUrl}/${id}`, task, { headers: this.getHeaders() }).pipe(\r\n tap(updatedTask => this.tasksSignal.update(tasks => tasks.map(t => t.id === id ? updatedTask : t)))\r\n );\r\n }\r\n\r\n patchTask(id: number, patch: Partial): Observable {\r\n return this.http.patch(`${this.apiUrl}/${id}`, patch, { headers: this.getHeaders() }).pipe(\r\n tap(updatedTask => this.tasksSignal.update(tasks => tasks.map(t => t.id === id ? updatedTask : t)))\r\n );\r\n }\r\n\r\n deleteTask(id: number): Observable {\r\n return this.http.delete(`${this.apiUrl}/${id}`, { headers: this.getHeaders() }).pipe(\r\n tap(() => this.tasksSignal.update(tasks => tasks.filter(t => t.id !== id)))\r\n );\r\n }\r\n\r\n reorderTasks(taskIds: number[]): Observable {\r\n return this.http.put(`${this.apiUrl}/reorder`, taskIds, { headers: this.getHeaders() });\r\n }\r\n\r\n bulkPatchTasks(ids: number[], patch: Partial): Observable {\r\n return this.http.patch(`${this.apiUrl}/bulk`, { ids, patch }, { headers: this.getHeaders() }).pipe(\r\n tap(updatedTasks => {\r\n const updatedMap = new Map(updatedTasks.map(t => [t.id, t]));\r\n this.tasksSignal.update(tasks => tasks.map(t => updatedMap.get(t.id) ?? t));\r\n })\r\n );\r\n }\r\n}\r\n"
@@ -15514,8 +15514,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "a27022346d48bb36f7043d9f7f3b172bb9849b86"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\quick-add-task.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\quick-add-task.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\quick-add-task.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\quick-add-task.component.ts",
"statementMap": {
"0": {
"start": {
@@ -16225,7 +16225,7 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\quick-add-task.component.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\quick-add-task.component.ts"
],
"sourcesContent": [
"import { Component, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { TaskService } from '../../services/task.service';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-quick-add-task',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n TranslateModule\r\n ],\r\n template: `\r\n \r\n add \r\n {{ 'TASKS.QUICK_ADD_PLACEHOLDER' | translate }} \r\n \r\n \r\n `,\r\n styles: [`\r\n .quick-add-field {\r\n width: 100%;\r\n margin-bottom: 24px;\r\n }\r\n .quick-add-field ::ng-deep .mat-mdc-form-field-subscript-wrapper {\r\n display: none;\r\n }\r\n `]\r\n})\r\nexport class QuickAddTaskComponent {\r\n titleControl = new FormControl('', { nonNullable: true });\r\n\r\n constructor(private taskService: TaskService) {}\r\n\r\n submit() {\r\n const title = this.titleControl.value.trim();\r\n if (title) {\r\n this.taskService.quickAdd(title).subscribe({\r\n next: () => this.titleControl.reset()\r\n });\r\n }\r\n }\r\n}\r\n"
@@ -16236,8 +16236,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "a2656ed08ce2b3c2f12cb2efc75f268b121919cc"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\task-filter-chips.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\task-filter-chips.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\task-filter-chips.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\task-filter-chips.component.ts",
"statementMap": {
"0": {
"start": {
@@ -17054,7 +17054,7 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\task-filter-chips.component.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\task-filter-chips.component.ts"
],
"sourcesContent": [
"import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { SmartFilter } from '../../services/task.service';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-task-filter-chips',\r\n standalone: true,\r\n imports: [CommonModule, MatChipsModule, TranslateModule],\r\n template: `\r\n \r\n {{ 'TASKS.FILTERS.ALL' | translate }} \r\n {{ 'TASKS.FILTERS.TODAY' | translate }} \r\n {{ 'TASKS.FILTERS.UPCOMING' | translate }} \r\n {{ 'TASKS.FILTERS.OVERDUE' | translate }} \r\n {{ 'TASKS.FILTERS.HIGH_PRIORITY' | translate }} \r\n \r\n `,\r\n styles: [`\r\n mat-chip-listbox {\r\n margin-bottom: 16px;\r\n }\r\n `]\r\n})\r\nexport class TaskFilterChipsComponent {\r\n @Input() activeFilter: SmartFilter = 'ALL';\r\n @Output() filterChange = new EventEmitter();\r\n\r\n onFilterChange(value: SmartFilter) {\r\n if (value) {\r\n this.filterChange.emit(value);\r\n }\r\n }\r\n}\r\n"
@@ -17065,8 +17065,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "0d24a20d4d5e63a75d17ebbddcd51fc37db8bc68"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\completed-tasks-section.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\completed-tasks-section.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\completed-tasks-section.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\completed-tasks-section.component.ts",
"statementMap": {
"0": {
"start": {
@@ -18056,7 +18056,7 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\completed-tasks-section.component.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\completed-tasks-section.component.ts"
],
"sourcesContent": [
"import { Component, Input, Output, EventEmitter, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Task } from '../../models/task.model';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-completed-tasks-section',\r\n standalone: true,\r\n imports: [CommonModule, MatExpansionModule, MatListModule, MatIconModule, TranslateModule],\r\n template: `\r\n \r\n \r\n \r\n check_circle \r\n {{ 'TASKS.COMPLETED_RECENTLY' | translate }} ({{ tasks.length }}) \r\n \r\n \r\n\r\n \r\n \r\n task_alt \r\n {{ task.title }}
\r\n \r\n {{ 'TASKS.COMPLETED_AT' | translate }}: {{ task.completedAt | date:'short' }}\r\n
\r\n \r\n \r\n \r\n `,\r\n styles: [`\r\n .completed-panel {\r\n margin-top: 24px;\r\n border: 1px solid #e5e7eb;\r\n box-shadow: none !important;\r\n }\r\n mat-panel-title {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #6b7280;\r\n }\r\n `]\r\n})\r\nexport class CompletedTasksSectionComponent {\r\n @Input() tasks: Task[] = [];\r\n}\r\n"
@@ -18067,8 +18067,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "68a7cf4a4994406585f55982ed883a14129b9ac3"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\utils\\date-utils.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\utils\\date-utils.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\utils\\date-utils.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\utils\\date-utils.ts",
"statementMap": {
"0": {
"start": {
@@ -18615,7 +18615,7 @@
"abs"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\utils\\date-utils.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\utils\\date-utils.ts"
],
"sourcesContent": [
"export function isOverdue(dueDate: string | null | undefined): boolean {\r\n if (!dueDate) return false;\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n const due = new Date(dueDate);\r\n return due < today;\r\n}\r\n\r\nexport function formatRelativeDue(dueDate: string | null | undefined, translate: any): string {\r\n if (!dueDate) return translate.instant('TASKS.NO_DUE_DATE');\r\n\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n const due = new Date(dueDate);\r\n due.setHours(0, 0, 0, 0);\r\n\r\n const diffTime = due.getTime() - today.getTime();\r\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n if (diffDays === 0) return translate.instant('TASKS.DATES.TODAY');\r\n if (diffDays === 1) return translate.instant('TASKS.DATES.TOMORROW');\r\n if (diffDays === -1) return translate.instant('TASKS.DATES.YESTERDAY');\r\n\r\n if (diffDays > 0) {\r\n return translate.instant('TASKS.DATES.IN_DAYS', { days: diffDays });\r\n } else {\r\n return translate.instant('TASKS.DATES.OVERDUE_DAYS', { days: Math.abs(diffDays) });\r\n }\r\n}\r\n"
@@ -18626,8 +18626,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "ed0e70b0b7bb773f43cb2824c79c2866a61e67f1"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\tasks.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\tasks.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\tasks.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\tasks.component.ts",
"statementMap": {
"0": {
"start": {
@@ -29776,8 +29776,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\tasks.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\tasks\\tasks.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\tasks.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\tasks\\tasks.component.html"
],
"sourcesContent": [
"import { Component, OnInit, ChangeDetectorRef, effect, computed, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { provideNativeDateAdapter } from '@angular/material/core';\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { Task, Priority, TaskStatus } from '../../models/task.model';\r\nimport { TaskService, SmartFilter } from '../../services/task.service';\r\nimport { ConfirmDialogComponent } from './confirm-dialog.component';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { QuickAddTaskComponent } from './quick-add-task.component';\r\nimport { TaskFilterChipsComponent } from './task-filter-chips.component';\r\nimport { CompletedTasksSectionComponent } from './completed-tasks-section.component';\r\nimport { formatRelativeDue, isOverdue } from '../../utils/date-utils';\r\n\r\n@Component({\r\n selector: 'app-tasks',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatCardModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatChipsModule,\r\n MatDialogModule,\r\n MatMenuModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatListModule,\r\n DragDropModule,\r\n TranslateModule,\r\n QuickAddTaskComponent,\r\n TaskFilterChipsComponent,\r\n CompletedTasksSectionComponent\r\n ],\r\n providers: [provideNativeDateAdapter()],\r\n templateUrl: './tasks.component.html',\r\n styles: [`\r\n .tasks-container {\r\n max-width: 900px;\r\n margin: 0 auto;\r\n padding: 0;\r\n }\r\n .page-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 32px;\r\n gap: 16px;\r\n flex-wrap: wrap;\r\n }\r\n .page-toolbar .left,\r\n .page-toolbar .right {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n }\r\n .page-title {\r\n margin: 0;\r\n font-size: 24px;\r\n font-weight: 700;\r\n color: #1f2937;\r\n }\r\n .quick-add-container {\r\n width: 100%;\r\n }\r\n .bulk-actions-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n padding: 8px 16px;\r\n background: #f3f4f6;\r\n border-radius: 8px;\r\n margin-bottom: 16px;\r\n font-size: 14px;\r\n }\r\n .task-card {\r\n margin-bottom: 12px;\r\n border-radius: 8px;\r\n border: 1px solid #e5e7eb !important;\r\n box-shadow: none !important;\r\n transition: all 0.2s ease;\r\n }\r\n .task-card:hover {\r\n border-color: var(--primary) !important;\r\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1) !important;\r\n }\r\n .task-card.cdk-drag-placeholder {\r\n opacity: 0;\r\n }\r\n .task-card.cdk-drag-animating {\r\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n .task-row {\r\n display: flex;\r\n align-items: center;\r\n padding: 12px 16px;\r\n gap: 12px;\r\n }\r\n .task-row.compact {\r\n padding: 4px 16px;\r\n }\r\n .task-row.compact .task-title-text {\r\n font-size: 14px;\r\n }\r\n .task-row:hover {\r\n background: rgba(0,0,0,0.02);\r\n }\r\n .task-status-btn {\r\n color: #9ca3af;\r\n }\r\n .task-status-btn.done {\r\n color: #10b981;\r\n }\r\n .task-title-container {\r\n flex: 1;\r\n cursor: text;\r\n }\r\n .task-title-input {\r\n width: 100%;\r\n border: none;\r\n background: transparent;\r\n font-size: 16px;\r\n font-family: inherit;\r\n padding: 4px 0;\r\n border-bottom: 2px solid var(--primary);\r\n outline: none;\r\n }\r\n .task-title-text {\r\n font-size: 16px;\r\n color: #374151;\r\n }\r\n .task-title-text.done {\r\n text-decoration: line-through;\r\n color: #9ca3af;\r\n }\r\n .task-meta-info {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n font-size: 14px;\r\n color: #6b7280;\r\n }\r\n .due-date-info.overdue {\r\n color: #ef4444;\r\n font-weight: 500;\r\n }\r\n .priority-badge {\r\n padding: 2px 8px;\r\n border-radius: 12px;\r\n font-size: 12px;\r\n font-weight: 500;\r\n text-transform: uppercase;\r\n }\r\n .priority-high { background: #fee2e2; color: #ef4444; }\r\n .priority-medium { background: #fef3c7; color: #f59e0b; }\r\n .priority-low { background: #f3f4f6; color: #6b7280; }\r\n\r\n .status-pill {\r\n font-size: 12px;\r\n font-weight: 500;\r\n padding: 4px 10px;\r\n border-radius: 16px;\r\n cursor: pointer;\r\n user-select: none;\r\n }\r\n .status-open { background: #e0f2fe; color: #0284c7; }\r\n .status-in_progress { background: #fef9c3; color: #ca8a04; }\r\n .status-done { background: #dcfce7; color: #16a34a; }\r\n .status-archived { background: #f3f4f6; color: #4b5563; }\r\n\r\n .add-task-btn {\r\n border-radius: 10px;\r\n padding: 0 20px;\r\n height: 44px !important;\r\n box-shadow: 0 2px 6px rgba(0,0,0,.15);\r\n font-weight: 500;\r\n }\r\n .filter-select {\r\n width: 180px;\r\n }\r\n .reset-sort-btn {\r\n height: 44px !important;\r\n border-radius: 10px !important;\r\n border-color: #e5e7eb !important;\r\n color: #374151 !important;\r\n font-weight: 500;\r\n }\r\n .filter-select ::ng-deep .mat-mdc-form-field-subscript-wrapper {\r\n display: none;\r\n }\r\n .add-task-card {\r\n margin-bottom: 32px;\r\n border-radius: 12px;\r\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important;\r\n border: 1px solid var(--border) !important;\r\n overflow: hidden;\r\n background: var(--surface) !important;\r\n }\r\n .add-task-card mat-card-header {\r\n background-color: var(--surface-2) !important;\r\n padding: 16px 24px;\r\n border-bottom: 1px solid var(--border);\r\n }\r\n .add-task-card mat-card-content {\r\n padding: 24px !important;\r\n }\r\n .form-grid {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 16px;\r\n margin-top: 8px;\r\n }\r\n @media (max-width: 600px) {\r\n .form-grid {\r\n grid-template-columns: 1fr;\r\n }\r\n }\r\n .full-width {\r\n width: 100%;\r\n }\r\n .submit-btn {\r\n border-radius: 8px;\r\n padding: 0 24px;\r\n height: 44px !important;\r\n font-weight: 600;\r\n }\r\n .submit-btn:hover:not(:disabled) {\r\n transform: translateY(-1px);\r\n }\r\n .form-actions {\r\n display: flex;\r\n gap: 12px;\r\n margin-top: 24px;\r\n padding-top: 16px;\r\n border-top: 1px solid var(--border);\r\n justify-content: flex-end;\r\n }\r\n .tasks-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 20px;\r\n }\r\n .task-card {\r\n border-radius: 12px;\r\n padding: 20px;\r\n border: none;\r\n box-shadow:\r\n 0 1px 2px rgba(0,0,0,.06),\r\n 0 4px 12px rgba(0,0,0,.06);\r\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n cursor: pointer;\r\n position: relative;\r\n background: white;\r\n }\r\n .task-card:hover {\r\n box-shadow:\r\n 0 4px 12px rgba(0,0,0,.08),\r\n 0 12px 28px rgba(0,0,0,.08);\r\n transform: translateY(-2px);\r\n }\r\n .task-card-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n margin-bottom: 12px;\r\n }\r\n .task-main-info {\r\n display: flex;\r\n gap: 12px;\r\n align-items: flex-start;\r\n }\r\n .drag-handle {\r\n cursor: move;\r\n color: #9ca3af;\r\n margin-top: 2px;\r\n font-size: 20px;\r\n width: 20px;\r\n height: 20px;\r\n }\r\n .task-title {\r\n margin: 0 0 4px 0;\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: #111827;\r\n line-height: 1.4;\r\n }\r\n .task-meta {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n font-size: 13px;\r\n color: #6b7280; /* gray-500 */\r\n }\r\n .meta-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n }\r\n .meta-item mat-icon {\r\n font-size: 14px;\r\n width: 14px;\r\n height: 14px;\r\n }\r\n .task-description {\r\n margin: 0;\r\n font-size: 15px;\r\n color: #4b5563;\r\n line-height: 1.6;\r\n max-width: 720px;\r\n white-space: pre-wrap;\r\n }\r\n .task-actions {\r\n position: absolute;\r\n top: 16px;\r\n right: 16px;\r\n display: flex;\r\n gap: 4px;\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n background: rgba(255, 255, 255, 0.9);\r\n border-radius: 8px;\r\n padding: 2px;\r\n }\r\n .task-card:hover .task-actions {\r\n opacity: 1;\r\n }\r\n .task-actions button {\r\n width: 36px;\r\n height: 36px;\r\n line-height: 36px;\r\n }\r\n .task-actions mat-icon {\r\n font-size: 18px;\r\n width: 18px;\r\n height: 18px;\r\n }\r\n\r\n /* Chips */\r\n .priority-chip {\r\n padding: 2px 10px;\r\n border-radius: 12px;\r\n font-weight: 600;\r\n font-size: 11px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n }\r\n .priority-low { background: rgba(16, 185, 129, 0.1); color: #065f46; }\r\n .priority-medium { background: rgba(245, 158, 11, 0.12); color: #b45309; }\r\n .priority-high { background: rgba(239, 68, 68, 0.12); color: #b91c1c; }\r\n .priority-critical { background: rgba(124, 58, 237, 0.15); color: #5b21b6; }\r\n\r\n .status-chip {\r\n padding: 4px 12px;\r\n border-radius: 20px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n }\r\n .status-open {\r\n background: #f3f4f6;\r\n color: #374151;\r\n border: 1px solid #e5e7eb;\r\n }\r\n .status-in_progress {\r\n background: rgba(59, 130, 246, 0.1);\r\n color: #1d4ed8;\r\n border: 1px solid rgba(59, 130, 246, 0.2);\r\n }\r\n .status-closed {\r\n background: rgba(16, 185, 129, 0.1);\r\n color: #047857;\r\n border: 1px solid rgba(16, 185, 129, 0.2);\r\n }\r\n\r\n .empty-message {\r\n text-align: center;\r\n padding: 40px;\r\n color: #6b7280;\r\n font-style: italic;\r\n }\r\n\r\n /* Drag and Drop */\r\n .cdk-drag-preview {\r\n box-sizing: border-box;\r\n border-radius: 12px;\r\n box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),\r\n 0 8px 10px 1px rgba(0, 0, 0, 0.14),\r\n 0 3px 14px 2px rgba(0, 0, 0, 0.12);\r\n }\r\n .cdk-drag-placeholder {\r\n opacity: 0;\r\n }\r\n .cdk-drag-animating {\r\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n .tasks-list.cdk-drop-list-dragging .task-card:not(.cdk-drag-placeholder) {\r\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n `]\r\n})\r\nexport class TasksComponent implements OnInit {\r\n tasks: Task[] = [];\r\n filteredTasks: Task[] = [];\r\n priorities = Object.values(Priority);\r\n statuses = Object.values(TaskStatus);\r\n currentTask: Task = this.initNewTask();\r\n editingTask = false;\r\n showForm = false;\r\n\r\n editingTitleId: number | null = null;\r\n activeFilter: SmartFilter = 'ALL';\r\n isOverdue = isOverdue;\r\n viewMode: 'COMFORTABLE' | 'COMPACT' = 'COMFORTABLE';\r\n\r\n selectedTaskIds = signal>(new Set());\r\n\r\n completedRecently = computed(() =>\r\n this.taskService.tasks().filter(t => t.status === TaskStatus.DONE)\r\n .sort((a, b) => new Date(b.completedAt || 0).getTime() - new Date(a.completedAt || 0).getTime())\r\n .slice(0, 10)\r\n );\r\n\r\n filterStatus: string = 'ALL';\r\n\r\n constructor(\r\n public taskService: TaskService,\r\n private dialog: MatDialog,\r\n private cdr: ChangeDetectorRef,\r\n private translate: TranslateService\r\n ) {\r\n effect(() => {\r\n this.filteredTasks = this.taskService.tasks();\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.loadTasks();\r\n }\r\n\r\n loadTasks() {\r\n this.taskService.getTasks({ smartFilter: this.activeFilter }).subscribe();\r\n }\r\n\r\n newSet(): Set {\r\n return new Set();\r\n }\r\n\r\n onFilterChange(filter: SmartFilter): void {\r\n this.activeFilter = filter;\r\n this.selectedTaskIds.set(new Set());\r\n this.loadTasks();\r\n }\r\n\r\n toggleTaskSelection(taskId: number | undefined): void {\r\n if (taskId === undefined) return;\r\n this.selectedTaskIds.update((ids: Set) => {\r\n const newIds = new Set(ids);\r\n if (newIds.has(taskId)) {\r\n newIds.delete(taskId);\r\n } else {\r\n newIds.add(taskId);\r\n }\r\n return newIds;\r\n });\r\n }\r\n\r\n toggleViewMode(): void {\r\n this.viewMode = this.viewMode === 'COMFORTABLE' ? 'COMPACT' : 'COMFORTABLE';\r\n }\r\n\r\n isTaskSelected(taskId: number | undefined): boolean {\r\n return taskId !== undefined && this.selectedTaskIds().has(taskId);\r\n }\r\n\r\n bulkUpdateStatus(status: TaskStatus): void {\r\n const ids: number[] = Array.from(this.selectedTaskIds());\r\n if (ids.length === 0) return;\r\n this.taskService.bulkPatchTasks(ids, { status }).subscribe({\r\n next: () => this.selectedTaskIds.set(new Set())\r\n });\r\n }\r\n\r\n bulkUpdatePriority(priority: Priority): void {\r\n const ids: number[] = Array.from(this.selectedTaskIds());\r\n if (ids.length === 0) return;\r\n this.taskService.bulkPatchTasks(ids, { priority }).subscribe({\r\n next: () => this.selectedTaskIds.set(new Set())\r\n });\r\n }\r\n\r\n startEditTitle(task: Task): void {\r\n if (task.id) {\r\n this.editingTitleId = task.id;\r\n }\r\n }\r\n\r\n saveTitle(task: Task, newTitle: string): void {\r\n if (task.id && newTitle.trim() && newTitle !== task.title) {\r\n this.taskService.patchTask(task.id, { title: newTitle.trim() }).subscribe();\r\n }\r\n this.editingTitleId = null;\r\n }\r\n\r\n toggleTaskDone(task: Task): void {\r\n if (task.id) {\r\n const newStatus = task.status === TaskStatus.DONE ? TaskStatus.OPEN : TaskStatus.DONE;\r\n this.taskService.patchTask(task.id, { status: newStatus }).subscribe();\r\n }\r\n }\r\n\r\n cycleStatus(task: Task, event: MouseEvent): void {\r\n event.stopPropagation();\r\n if (task.id) {\r\n const statusCycle = [TaskStatus.OPEN, TaskStatus.IN_PROGRESS, TaskStatus.DONE, TaskStatus.ARCHIVED];\r\n const currentIndex = statusCycle.indexOf(task.status);\r\n const nextIndex = (currentIndex + 1) % statusCycle.length;\r\n this.taskService.patchTask(task.id, { status: statusCycle[nextIndex] }).subscribe();\r\n }\r\n }\r\n\r\n setPriority(task: Task, priority: Priority): void {\r\n if (task.id) {\r\n this.taskService.patchTask(task.id, { priority }).subscribe();\r\n }\r\n }\r\n\r\n formatDate(date: string | null | undefined): string {\r\n return formatRelativeDue(date, this.translate);\r\n }\r\n\r\n applyFilter() {\r\n this.loadTasks();\r\n }\r\n\r\n clearFilter() {\r\n this.filterStatus = 'ALL';\r\n this.applyFilter();\r\n }\r\n\r\n initNewTask(): Task {\r\n return {\r\n title: '',\r\n description: '',\r\n dueDate: '',\r\n priority: Priority.MEDIUM,\r\n status: TaskStatus.OPEN\r\n };\r\n }\r\n\r\n showAddTaskForm() {\r\n this.showForm = true;\r\n this.editingTask = false;\r\n this.currentTask = this.initNewTask();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n onSubmit() {\r\n const taskToSave = { ...this.currentTask };\r\n if (taskToSave.dueDate) {\r\n const d = new Date(taskToSave.dueDate);\r\n if (!isNaN(d.getTime())) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n taskToSave.dueDate = `${year}-${month}-${day}`;\r\n }\r\n }\r\n\r\n if (this.editingTask && taskToSave.id) {\r\n this.taskService.updateTask(taskToSave.id, taskToSave).subscribe(() => {\r\n this.loadTasks();\r\n this.cancelEdit();\r\n });\r\n } else {\r\n this.taskService.createTask(taskToSave).subscribe(() => {\r\n this.loadTasks();\r\n this.currentTask = this.initNewTask();\r\n this.showForm = false;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n }\r\n\r\n editTask(task: Task) {\r\n this.currentTask = { ...task };\r\n this.editingTask = true;\r\n this.showForm = true;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n cancelEdit() {\r\n this.currentTask = this.initNewTask();\r\n this.editingTask = false;\r\n this.showForm = false;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n deleteTask(task: Task) {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result && task.id) {\r\n this.taskService.deleteTask(task.id).subscribe(() => {\r\n this.loadTasks();\r\n });\r\n }\r\n });\r\n }\r\n\r\n drop(event: CdkDragDrop) {\r\n if (this.filterStatus !== 'ALL') {\r\n return; // Reordering only allowed when all tasks are shown\r\n }\r\n moveItemInArray(this.tasks, event.previousIndex, event.currentIndex);\r\n this.applyFilter();\r\n\r\n const taskIds = this.tasks.map(t => t.id).filter((id): id is number => id !== undefined);\r\n this.taskService.reorderTasks(taskIds).subscribe();\r\n }\r\n\r\n resetSorting() {\r\n const priorityMap: Record = {\r\n [Priority.HIGH]: 0,\r\n [Priority.MEDIUM]: 1,\r\n [Priority.LOW]: 2\r\n };\r\n\r\n this.tasks.sort((a, b) => {\r\n const pA = priorityMap[a.priority];\r\n const pB = priorityMap[b.priority];\r\n if (pA !== pB) {\r\n return pA - pB;\r\n }\r\n // Secondary sort by due date\r\n if (a.dueDate && b.dueDate) {\r\n return a.dueDate.localeCompare(b.dueDate);\r\n }\r\n return 0;\r\n });\r\n\r\n this.applyFilter();\r\n const taskIds = this.tasks.map(t => t.id).filter((id): id is number => id !== undefined);\r\n this.taskService.reorderTasks(taskIds).subscribe();\r\n }\r\n}\r\n",
@@ -29789,8 +29789,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "4c99776fa2ea053160da6f5890be52f93e48bd9e"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\admin.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\admin.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\admin.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\admin.service.ts",
"statementMap": {
"0": {
"start": {
@@ -30231,7 +30231,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\admin.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\admin.service.ts"
],
"sourcesContent": [
"import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { User } from '../models/user.model';\r\nimport { AuthService } from './auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdminService {\r\n private apiUrl = '/api/admin/users';\r\n\r\n constructor(private http: HttpClient, private authService: AuthService) {}\r\n\r\n private getHeaders(): HttpHeaders {\r\n const auth = this.authService.getAuthHeader();\r\n return new HttpHeaders({\r\n 'Authorization': 'Basic ' + auth,\r\n 'Content-Type': 'application/json'\r\n });\r\n }\r\n\r\n getUsers(): Observable {\r\n return this.http.get(this.apiUrl, { headers: this.getHeaders() });\r\n }\r\n\r\n createUser(user: User): Observable {\r\n return this.http.post(this.apiUrl, user, { headers: this.getHeaders() });\r\n }\r\n\r\n updateUser(id: number, user: User): Observable {\r\n return this.http.put(`${this.apiUrl}/${id}`, user, { headers: this.getHeaders() });\r\n }\r\n\r\n deleteUser(id: number): Observable {\r\n return this.http.delete(`${this.apiUrl}/${id}`, { headers: this.getHeaders() });\r\n }\r\n}\r\n"
@@ -30242,8 +30242,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "26d165b68dc9dc70707922a14511263d456e59cb"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\user-admin\\user-admin.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\user-admin\\user-admin.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\user-admin\\user-admin.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\user-admin\\user-admin.component.ts",
"statementMap": {
"0": {
"start": {
@@ -41306,8 +41306,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\user-admin\\user-admin.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\user-admin\\user-admin.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\user-admin\\user-admin.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\user-admin\\user-admin.component.html"
],
"sourcesContent": [
"import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { User } from '../../models/user.model';\r\nimport { AdminService } from '../../services/admin.service';\r\nimport { AuthService } from '../../services/auth.service';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { ConfirmDialogComponent } from '../tasks/confirm-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-user-admin',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatCardModule,\r\n MatTableModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDialogModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './user-admin.component.html',\r\n styles: [`\r\n .admin-container {\r\n max-width: 1000px;\r\n margin: 0 auto;\r\n padding: 0;\r\n }\r\n .page-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 32px;\r\n gap: 16px;\r\n flex-wrap: wrap;\r\n }\r\n .page-toolbar .left,\r\n .page-toolbar .right {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n }\r\n .page-title {\r\n margin: 0;\r\n font-size: 24px;\r\n font-weight: 700;\r\n color: #1f2937;\r\n }\r\n .add-user-btn {\r\n border-radius: 10px;\r\n padding: 0 20px;\r\n height: 44px !important;\r\n font-weight: 600;\r\n }\r\n .add-user-btn:hover:not(:disabled) {\r\n transform: translateY(-1px);\r\n }\r\n .main-card {\r\n border-radius: 12px;\r\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important;\r\n border: 1px solid var(--border) !important;\r\n overflow: hidden;\r\n background: var(--surface) !important;\r\n }\r\n table {\r\n width: 100%;\r\n }\r\n .mat-mdc-table {\r\n background: transparent;\r\n }\r\n .mat-mdc-header-row {\r\n background-color: var(--surface-2) !important;\r\n height: 56px;\r\n }\r\n .mat-mdc-header-cell {\r\n color: var(--text-muted) !important;\r\n font-weight: 600 !important;\r\n font-size: 11px !important;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n padding: 0 16px !important;\r\n font-family: inherit !important;\r\n }\r\n .mat-mdc-cell {\r\n padding: 16px !important;\r\n font-size: 14px;\r\n color: var(--text);\r\n }\r\n .action-buttons {\r\n display: flex;\r\n gap: 4px;\r\n }\r\n /* Zebra striping */\r\n .mat-mdc-row:nth-child(even) {\r\n background-color: color-mix(in srgb, var(--surface-2) 70%, transparent);\r\n }\r\n .mat-mdc-row:hover {\r\n background-color: var(--brand-weak) !important;\r\n }\r\n .user-login {\r\n font-weight: 600;\r\n color: var(--brand);\r\n }\r\n .role-chip {\r\n height: 22px;\r\n padding: 0 10px;\r\n border-radius: 12px;\r\n font-size: 0.75rem;\r\n font-weight: 600;\r\n display: inline-flex;\r\n align-items: center;\r\n border: 1px solid var(--border);\r\n }\r\n .role-admin {\r\n background: rgba(255, 152, 0, 0.16) !important;\r\n color: #e65100 !important;\r\n }\r\n .role-admin-read {\r\n background: rgba(63, 81, 181, 0.14) !important;\r\n color: var(--brand) !important;\r\n }\r\n .role-user {\r\n background: rgba(76, 175, 80, 0.16) !important;\r\n color: #2e7d32 !important;\r\n }\r\n .role-neutral {\r\n background: color-mix(in srgb, var(--surface-2) 70%, transparent) !important;\r\n color: var(--text-muted) !important;\r\n }\r\n .edit-card {\r\n margin-top: 32px;\r\n border-radius: 12px;\r\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important;\r\n border: 1px solid var(--border) !important;\r\n overflow: hidden;\r\n background: var(--surface) !important;\r\n }\r\n .edit-card mat-card-header {\r\n background-color: var(--surface-2) !important;\r\n padding: 16px 24px;\r\n border-bottom: 1px solid var(--border);\r\n }\r\n .edit-card mat-card-content {\r\n padding: 24px !important;\r\n }\r\n .form-grid {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 16px;\r\n margin-top: 8px;\r\n }\r\n @media (max-width: 600px) {\r\n .form-grid {\r\n grid-template-columns: 1fr;\r\n }\r\n }\r\n mat-form-field {\r\n width: 100%;\r\n }\r\n .submit-btn {\r\n border-radius: 8px;\r\n padding: 0 24px;\r\n height: 44px !important;\r\n font-weight: 600;\r\n }\r\n .submit-btn:hover:not(:disabled) {\r\n transform: translateY(-1px);\r\n }\r\n .form-actions {\r\n display: flex;\r\n gap: 12px;\r\n margin-top: 24px;\r\n padding-top: 16px;\r\n border-top: 1px solid var(--border);\r\n justify-content: flex-end;\r\n }\r\n .error {\r\n color: #dc2626;\r\n margin-top: 16px;\r\n font-size: 14px;\r\n }\r\n .user-mobile-card {\r\n margin-bottom: 16px;\r\n border-radius: 12px;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.05);\r\n }\r\n .action-buttons {\r\n display: flex;\r\n gap: 4px;\r\n }\r\n `]\r\n})\r\nexport class UserAdminComponent implements OnInit {\r\n users: User[] = [];\r\n displayedColumns: string[] = ['login', 'name', 'email', 'role', 'actions'];\r\n editingUser: User | null = null;\r\n error: string | null = null;\r\n isCreating = false;\r\n isMobile = false;\r\n\r\n constructor(\r\n public authService: AuthService,\r\n private adminService: AdminService,\r\n private dialog: MatDialog,\r\n private cdr: ChangeDetectorRef,\r\n private breakpointObserver: BreakpointObserver\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.breakpointObserver.observe([\r\n Breakpoints.HandsetPortrait\r\n ]).subscribe(result => {\r\n this.isMobile = result.matches;\r\n this.cdr.detectChanges();\r\n });\r\n\r\n if (this.authService.isAdmin()) {\r\n this.loadUsers();\r\n }\r\n }\r\n\r\n loadUsers() {\r\n this.adminService.getUsers().subscribe(users => {\r\n this.users = users;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n createNewUser() {\r\n this.editingUser = {\r\n firstName: '',\r\n lastName: '',\r\n login: '',\r\n password: '',\r\n email: '',\r\n role: 'ROLE_USER',\r\n birthDate: '',\r\n address: ''\r\n };\r\n this.isCreating = true;\r\n this.error = null;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n editUser(user: User) {\r\n this.editingUser = { ...user };\r\n this.isCreating = false;\r\n this.error = null;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n cancelEdit() {\r\n this.editingUser = null;\r\n this.isCreating = false;\r\n this.error = null;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n saveUser() {\r\n if (this.editingUser) {\r\n const operation = this.isCreating\r\n ? this.adminService.createUser(this.editingUser)\r\n : this.adminService.updateUser(this.editingUser.id!, this.editingUser);\r\n\r\n operation.subscribe({\r\n next: () => {\r\n this.loadUsers();\r\n this.editingUser = null;\r\n this.isCreating = false;\r\n },\r\n error: (err) => {\r\n this.error = err.error || 'Operation failed';\r\n this.cdr.detectChanges();\r\n }\r\n });\r\n }\r\n }\r\n\r\n deleteUser(user: User) {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result && user.id) {\r\n this.adminService.deleteUser(user.id).subscribe({\r\n next: () => this.loadUsers(),\r\n error: (err) => {\r\n alert(err.error || 'Failed to delete user');\r\n }\r\n });\r\n }\r\n });\r\n }\r\n}\r\n",
@@ -41319,8 +41319,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "381afb4e505045c81ea0e379a3221bb8865ede21"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\log.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\log.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\log.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\log.service.ts",
"statementMap": {
"0": {
"start": {
@@ -41912,7 +41912,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\log.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\log.service.ts"
],
"sourcesContent": [
"import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { ActionLogResponse } from '../models/action-log.model';\r\nimport { AuthService } from './auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LogService {\r\n private apiUrl = '/api/admin/logs';\r\n\r\n constructor(private http: HttpClient, private authService: AuthService) {}\r\n\r\n private getHeaders(): HttpHeaders {\r\n const auth = this.authService.getAuthHeader();\r\n return new HttpHeaders({\r\n 'Authorization': 'Basic ' + auth,\r\n 'Content-Type': 'application/json'\r\n });\r\n }\r\n\r\n getLogs(page: number, size: number, sort: string, type?: string, startDate?: string, endDate?: string): Observable {\r\n let params = new HttpParams()\r\n .set('page', page.toString())\r\n .set('size', size.toString())\r\n .set('sort', sort);\r\n\r\n if (type && type !== 'all') {\r\n params = params.set('type', type);\r\n }\r\n if (startDate) {\r\n params = params.set('startDate', startDate);\r\n }\r\n if (endDate) {\r\n params = params.set('endDate', endDate);\r\n }\r\n\r\n return this.http.get(this.apiUrl, {\r\n params,\r\n headers: this.getHeaders()\r\n });\r\n }\r\n\r\n clearLogs(): Observable {\r\n return this.http.delete(this.apiUrl, { headers: this.getHeaders() });\r\n }\r\n}\r\n"
@@ -41923,8 +41923,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "a2163773979eaabfdb00a639cfc5b109b6fab69b"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\log\\log.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\log\\log.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\log\\log.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\log\\log.component.ts",
"statementMap": {
"0": {
"start": {
@@ -47631,8 +47631,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\log\\log.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\log\\log.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\log\\log.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\log\\log.component.html"
],
"sourcesContent": [
"import { Component, OnInit, signal, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatSortModule, Sort } from '@angular/material/sort';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatNativeDateModule } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { LogService } from '../../services/log.service';\r\nimport { ActionLog } from '../../models/action-log.model';\r\nimport { ConfirmDialogComponent } from '../tasks/confirm-dialog.component';\r\nimport { AuthService } from '../../services/auth.service';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-log',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatCardModule,\r\n MatTableModule,\r\n MatPaginatorModule,\r\n MatSortModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './log.component.html',\r\n styleUrls: ['./log.component.css']\r\n})\r\nexport class LogComponent implements OnInit {\r\n logs = signal([]);\r\n totalElements = signal(0);\r\n pageSize = signal(10);\r\n currentPage = signal(0);\r\n sortField = 'timestamp';\r\n sortDirection = 'desc';\r\n\r\n filterType = 'all';\r\n startDate: Date | null = null;\r\n endDate: Date | null = null;\r\n\r\n displayedColumns: string[] = ['timestamp', 'login', 'action', 'details'];\r\n\r\n /**\r\n * Action presentation: semantic chip colors and labels.\r\n */\r\n private readonly actionLabelMap: Record = {\r\n USER_LOGIN: 'Login',\r\n USER_LOGOUT: 'Logout',\r\n TASK_CREATED: 'Task created',\r\n TASK_UPDATED: 'Task updated',\r\n TASK_COMPLETED: 'Task completed',\r\n USER_CREATED: 'User created',\r\n USER_UPDATED: 'User updated'\r\n };\r\n\r\n private readonly actionClassMap: Record = {\r\n USER_LOGIN: 'action-login',\r\n USER_LOGOUT: 'action-logout',\r\n TASK_CREATED: 'action-neutral',\r\n TASK_UPDATED: 'action-neutral',\r\n TASK_COMPLETED: 'action-neutral',\r\n USER_CREATED: 'action-neutral',\r\n USER_UPDATED: 'action-neutral'\r\n };\r\n\r\n getActionLabel(action: string | undefined | null): string {\r\n if (!action) return '';\r\n return this.actionLabelMap[action] ?? action.replaceAll('_', ' ').toLowerCase().replace(/^\\w/, c => c.toUpperCase());\r\n }\r\n\r\n getActionClass(action: string | undefined | null): string {\r\n if (!action) return 'action-neutral';\r\n return this.actionClassMap[action] ?? 'action-neutral';\r\n }\r\n\r\n constructor(\r\n private logService: LogService,\r\n private dialog: MatDialog,\r\n public authService: AuthService\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.loadLogs();\r\n }\r\n\r\n loadLogs() {\r\n const sort = `${this.sortField},${this.sortDirection}`;\r\n const startStr = this.startDate ? this.startDate.toISOString() : undefined;\r\n const endStr = this.endDate ? this.endDate.toISOString() : undefined;\r\n\r\n this.logService.getLogs(\r\n this.currentPage(),\r\n this.pageSize(),\r\n sort,\r\n this.filterType,\r\n startStr,\r\n endStr\r\n ).subscribe(response => {\r\n this.logs.set(response.content);\r\n this.totalElements.set(response.totalElements);\r\n });\r\n }\r\n\r\n onPageChange(event: PageEvent) {\r\n this.currentPage.set(event.pageIndex);\r\n this.pageSize.set(event.pageSize);\r\n this.loadLogs();\r\n }\r\n\r\n onSortChange(sort: Sort) {\r\n this.sortField = sort.active;\r\n this.sortDirection = sort.direction || 'desc';\r\n this.currentPage.set(0);\r\n this.loadLogs();\r\n }\r\n\r\n onFilterChange() {\r\n this.currentPage.set(0);\r\n this.loadLogs();\r\n }\r\n\r\n clearFilter() {\r\n this.filterType = 'all';\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.currentPage.set(0);\r\n this.loadLogs();\r\n }\r\n\r\n clearLog() {\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.logService.clearLogs().subscribe(() => {\r\n this.currentPage.set(0);\r\n this.loadLogs();\r\n });\r\n }\r\n });\r\n }\r\n}\r\n",
@@ -47644,8 +47644,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "4ba67bca6a91771181f14b7724b3ad37a3770b59"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\dashboard.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\dashboard.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\dashboard.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\dashboard.service.ts",
"statementMap": {
"0": {
"start": {
@@ -47970,7 +47970,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\dashboard.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\dashboard.service.ts"
],
"sourcesContent": [
"import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { AuthService } from './auth.service';\r\nimport { DashboardData } from '../models/dashboard.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DashboardService {\r\n private apiUrl = '/api/dashboard';\r\n\r\n constructor(private http: HttpClient, private authService: AuthService) {}\r\n\r\n private getHeaders(): HttpHeaders {\r\n const auth = this.authService.getAuthHeader();\r\n return new HttpHeaders({\r\n 'Authorization': 'Basic ' + auth,\r\n 'Content-Type': 'application/json'\r\n });\r\n }\r\n\r\n getDashboardData(): Observable {\r\n return this.http.get(this.apiUrl, { headers: this.getHeaders() });\r\n }\r\n}\r\n"
@@ -47981,8 +47981,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "2f422db4839825283c8e90c29a815c55fe72d086"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\dashboard\\dashboard.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\dashboard\\dashboard.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\dashboard\\dashboard.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\dashboard\\dashboard.component.ts",
"statementMap": {
"0": {
"start": {
@@ -59657,8 +59657,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\dashboard\\dashboard.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\dashboard\\dashboard.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\dashboard\\dashboard.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\dashboard\\dashboard.component.html"
],
"sourcesContent": [
"import { Component, OnInit, signal, ChangeDetectorRef, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { RouterLink } from '@angular/router';\nimport { DashboardService } from '../../services/dashboard.service';\nimport { DashboardData } from '../../models/dashboard.model';\nimport { AuthService } from '../../services/auth.service';\nimport { Task } from '../../models/task.model';\n\n@Component({\n selector: 'app-dashboard',\n standalone: true,\n imports: [\n CommonModule,\n MatCardModule,\n MatTableModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatChipsModule,\n MatFormFieldModule,\n MatInputModule,\n TranslateModule,\n RouterLink\n ],\n templateUrl: './dashboard.component.html',\n styleUrls: ['./dashboard.component.css']\n})\nexport class DashboardComponent implements OnInit {\n dashboardData = signal(null);\n isLoading = signal(false);\n activityFilter = signal('');\n recentActivityColumns: string[] = ['timestamp', 'login', 'action'];\n recentUsersColumns: string[] = ['login', 'email', 'role'];\n\n /**\n * Action presentation: semantic chip colors.\n */\n private readonly actionLabelMap: Record = {\n USER_LOGIN: 'Login',\n USER_LOGOUT: 'Logout',\n TASK_CREATED: 'Task created',\n TASK_UPDATED: 'Task updated',\n TASK_COMPLETED: 'Task completed',\n USER_CREATED: 'User created',\n USER_UPDATED: 'User updated'\n };\n\n private readonly actionClassMap: Record = {\n USER_LOGIN: 'action-login',\n USER_LOGOUT: 'action-logout',\n TASK_CREATED: 'action-neutral',\n TASK_UPDATED: 'action-neutral',\n TASK_COMPLETED: 'action-neutral',\n USER_CREATED: 'action-neutral',\n USER_UPDATED: 'action-neutral'\n };\n\n /**\n * Role presentation: short labels + semantic chip colors.\n */\n private readonly roleLabelMap: Record = {\n ROLE_ADMIN: 'Admin',\n ROLE_ADMIN_READ: 'Admin (read)',\n ROLE_USER: 'User'\n };\n\n private humanizeRole(role: string | undefined | null): string {\n if (!role) return '';\n return this.roleLabelMap[role] ?? role.replace(/^ROLE_/, '').replaceAll('_', ' ').toLowerCase();\n }\n\n private roleClass(role: string | undefined | null): 'role-admin' | 'role-admin-read' | 'role-user' | 'role-neutral' {\n if (!role) return 'role-neutral';\n if (role === 'ROLE_ADMIN') return 'role-admin';\n if (role === 'ROLE_ADMIN_READ') return 'role-admin-read';\n if (role === 'ROLE_USER') return 'role-user';\n return 'role-neutral';\n }\n\n humanizeAction(action: string): string {\n if (!action) return '';\n return this.actionLabelMap[action] ?? action.replaceAll('_', ' ').toLowerCase().replace(/^\\w/, c => c.toUpperCase());\n }\n\n private actionClass(action: string | undefined | null): 'action-login' | 'action-logout' | 'action-neutral' {\n if (!action) return 'action-neutral';\n if (action === 'USER_LOGIN') return 'action-login';\n if (action === 'USER_LOGOUT') return 'action-logout';\n return this.actionClassMap[action] as any ?? 'action-neutral';\n }\n\n\n /** View model helpers */\n readonly vm = computed(() => {\n const data = this.dashboardData();\n if (!data) return null;\n\n const q = (this.activityFilter() ?? '').trim().toLowerCase();\n\n // Enrich once, then reuse for different slices (filtered/sorted) to keep the template simple.\n const recentActivityEnriched = (data.recentActivity ?? []).map(l => ({\n ...l,\n timestampLabel: this.toRelativeTime(l.timestamp),\n actionLabel: this.humanizeAction(l.action),\n actionClass: this.actionClass(l.action),\n timestampMs: this.parseTimestampMs(l.timestamp)\n }));\n\n const recentActivityFiltered = recentActivityEnriched\n .filter(l => {\n if (!q) return true;\n return (\n (l.login ?? '').toLowerCase().includes(q) ||\n (l.actionLabel ?? '').toLowerCase().includes(q) ||\n (l.action ?? '').toLowerCase().includes(q)\n );\n })\n // Default: newest first\n .sort((a, b) => (b.timestampMs ?? 0) - (a.timestampMs ?? 0));\n\n return {\n ...data,\n recentActivity: recentActivityEnriched,\n recentActivityFiltered,\n recentUsers: (data.recentUsers ?? []).map(u => ({\n ...u,\n roleLabel: this.humanizeRole((u as any).role),\n roleClass: this.roleClass((u as any).role)\n })),\n priorityTasks: (data.priorityTasks ?? []).map(t => ({\n ...t,\n dueChip: this.getDueChip(t)\n }))\n };\n });\n\n /**\n * Small view-model helpers keep the template readable.\n */\n hasPriorityTasks = computed(() => (this.dashboardData()?.priorityTasks?.length ?? 0) > 0);\n\n constructor(\n private dashboardService: DashboardService,\n public authService: AuthService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.isLoading.set(true);\n this.dashboardService.getDashboardData().subscribe({\n next: (data) => {\n this.dashboardData.set(data);\n this.isLoading.set(false);\n this.cdr.detectChanges();\n },\n error: (err) => {\n console.error('Error fetching dashboard data', err);\n this.isLoading.set(false);\n this.cdr.detectChanges();\n }\n });\n }\n\n trackById = (_: number, item: { id?: number } | null) => item?.id ?? _;\n\n clearActivityFilter(): void {\n this.activityFilter.set('');\n }\n\n /**\n * Returns a small chip label + tone based on the task due date.\n * Works best with ISO dates like YYYY-MM-DD.\n */\n getDueChip(task: Task): { label: string; tone: 'danger' | 'warning' | 'neutral' } {\n const due = this.parseDateOnly(task.dueDate);\n if (!due) return { label: task.dueDate, tone: 'neutral' };\n\n const today = this.startOfDay(new Date());\n const diffDays = Math.round((due.getTime() - today.getTime()) / (24 * 60 * 60 * 1000));\n\n if (diffDays < 0) return { label: 'Overdue', tone: 'danger' };\n if (diffDays === 0) return { label: 'Today', tone: 'warning' };\n if (diffDays === 1) return { label: 'Tomorrow', tone: 'warning' };\n if (diffDays <= 7) return { label: `In ${diffDays} days`, tone: 'neutral' };\n return { label: task.dueDate, tone: 'neutral' };\n }\n\n private parseDateOnly(value: string | undefined | null): Date | null {\n if (!value) return null;\n // Supports \"YYYY-MM-DD\" and falls back to Date parsing.\n const m = /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n if (m) {\n const [y, mo, d] = value.split('-').map(v => Number(v));\n if (!Number.isFinite(y) || !Number.isFinite(mo) || !Number.isFinite(d)) return null;\n return new Date(y, mo - 1, d);\n }\n const parsed = new Date(value);\n return Number.isFinite(parsed.getTime()) ? parsed : null;\n }\n\n private startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n\n /**\n * Converts timestamps like \"2026-01-15 15:30:56\" into \"5m ago\".\n * Falls back to the raw value if parsing fails.\n */\n toRelativeTime(timestamp: string): string {\n try {\n const iso = timestamp.includes('T')\n ? timestamp\n : timestamp.replace(' ', 'T');\n const d = new Date(iso);\n const diffMs = Date.now() - d.getTime();\n if (!Number.isFinite(diffMs)) return timestamp;\n const diffSec = Math.floor(diffMs / 1000);\n if (diffSec < 60) return `${diffSec}s ago`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffH = Math.floor(diffMin / 60);\n if (diffH < 24) return `${diffH}h ago`;\n const diffD = Math.floor(diffH / 24);\n return `${diffD}d ago`;\n } catch {\n return timestamp;\n }\n }\n\n private parseTimestampMs(timestamp: string): number {\n try {\n const iso = timestamp.includes('T') ? timestamp : timestamp.replace(' ', 'T');\n const d = new Date(iso);\n const ms = d.getTime();\n return Number.isFinite(ms) ? ms : 0;\n } catch {\n return 0;\n }\n }\n\n getPieChartData(data: { open: number, inProgress: number, completed: number, total: number }) {\n if (data.total === 0) return [];\n\n const openP = (data.open / data.total) * 100;\n const inProgressP = (data.inProgress / data.total) * 100;\n const completedP = (data.completed / data.total) * 100;\n\n return [\n { color: '#3f51b5', value: openP, offset: 0 },\n { color: '#2196f3', value: inProgressP, offset: openP },\n { color: '#4caf50', value: completedP, offset: openP + inProgressP }\n ];\n }\n}\n",
@@ -59670,8 +59670,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "24b6f8463be418974bce9842989ccd8d53fad168"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\i18n.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\i18n.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\i18n.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\i18n.service.ts",
"statementMap": {
"0": {
"start": {
@@ -60188,7 +60188,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\i18n.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\i18n.service.ts"
],
"sourcesContent": [
"import { Injectable, signal, effect } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\nexport type Language = 'en' | 'de-ch';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class I18nService {\r\n currentLang = signal('en');\r\n\r\n constructor(private translate: TranslateService) {\r\n const savedLang = localStorage.getItem('lang') as Language;\r\n if (savedLang) {\r\n this.currentLang.set(savedLang);\r\n }\r\n\r\n this.translate.addLangs(['en', 'de-ch']);\r\n this.translate.setDefaultLang('en');\r\n this.translate.use(this.currentLang());\r\n\r\n effect(() => {\r\n const lang = this.currentLang();\r\n this.translate.use(lang);\r\n localStorage.setItem('lang', lang);\r\n });\r\n }\r\n\r\n setLanguage(lang: Language) {\r\n this.currentLang.set(lang);\r\n }\r\n\r\n getCurrentLanguage(): Language {\r\n return this.currentLang();\r\n }\r\n}\r\n"
@@ -60199,8 +60199,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "3f6509e08949153588c6680bc3a6bfa021e4a5cf"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\help\\help-content.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\help\\help-content.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\help\\help-content.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\help\\help-content.component.ts",
"statementMap": {
"0": {
"start": {
@@ -63020,8 +63020,8 @@
"styles"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\help\\help-content.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\help\\help-content.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\help\\help-content.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\help\\help-content.component.html"
],
"sourcesContent": [
"import { Component, OnInit, inject, signal, effect, ElementRef, AfterViewChecked } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { I18nService } from '../../services/i18n.service';\r\n\r\n@Component({\r\n selector: 'app-help-content',\r\n standalone: true,\r\n imports: [CommonModule, MatCardModule, TranslateModule],\r\n templateUrl: './help-content.component.html',\r\n styles: [`\r\n .help-container {\r\n padding: 24px;\r\n max-width: 900px;\r\n margin: 0 auto;\r\n }\r\n .help-card {\r\n padding: 16px;\r\n }\r\n ::ng-deep .help-content h1 { font-size: 2.2rem; margin-bottom: 1.5rem; border-bottom: 1px solid #eee; padding-bottom: 0.5rem; }\r\n ::ng-deep .help-content h2 { font-size: 1.8rem; margin-top: 2rem; margin-bottom: 1rem; border-bottom: 1px solid #f0f0f0; }\r\n ::ng-deep .help-content h3 { font-size: 1.4rem; margin-top: 1.5rem; }\r\n ::ng-deep .help-content p { line-height: 1.6; margin-bottom: 1rem; color: #333; }\r\n ::ng-deep .help-content ul, ::ng-deep .help-content ol { margin-bottom: 1rem; padding-left: 2rem; }\r\n ::ng-deep .help-content li { margin-bottom: 0.5rem; }\r\n ::ng-deep .help-content code { background-color: #f5f5f5; padding: 2px 4px; border-radius: 4px; font-family: monospace; }\r\n ::ng-deep .help-content pre { background-color: #f5f5f5; padding: 1rem; border-radius: 8px; overflow-x: auto; margin-bottom: 1rem; }\r\n ::ng-deep .help-content pre code { background-color: transparent; padding: 0; }\r\n ::ng-deep .help-content blockquote { border-left: 4px solid #ddd; padding-left: 1rem; margin-left: 0; color: #666; font-style: italic; }\r\n ::ng-deep .help-content a { color: #3f51b5; text-decoration: none; cursor: pointer; }\r\n ::ng-deep .help-content a:hover { text-decoration: underline; }\r\n `]\r\n})\r\nexport class HelpContentComponent implements OnInit, AfterViewChecked {\r\n private route = inject(ActivatedRoute);\r\n private router = inject(Router);\r\n private http = inject(HttpClient);\r\n private i18nService = inject(I18nService);\r\n private el = inject(ElementRef);\r\n\r\n htmlContent = signal('');\r\n loading = signal(true);\r\n private currentPageId = '';\r\n\r\n constructor() {\r\n effect(() => {\r\n // Reload content when language changes\r\n const lang = this.i18nService.currentLang();\r\n if (this.currentPageId) {\r\n this.loadHelpPage(this.currentPageId, lang);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.route.params.subscribe(params => {\r\n this.currentPageId = params['pageId'];\r\n this.loadHelpPage(this.currentPageId, this.i18nService.getCurrentLanguage());\r\n });\r\n }\r\n\r\n ngAfterViewChecked() {\r\n this.handleLinks();\r\n }\r\n\r\n loadHelpPage(pageId: string, lang: string) {\r\n this.loading.set(true);\r\n this.http.get<{ [key: string]: string }>(`./assets/help/help-data-${lang}.json`).subscribe({\r\n next: (data) => {\r\n this.htmlContent.set(data[pageId] || `Page not found (${lang}).
`);\r\n this.loading.set(false);\r\n },\r\n error: () => {\r\n this.htmlContent.set('Error loading help content.
');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private handleLinks() {\r\n const links = this.el.nativeElement.querySelectorAll('.help-content a');\r\n links.forEach((link: HTMLAnchorElement) => {\r\n if (!link.onclick) {\r\n link.onclick = (event: MouseEvent) => {\r\n const href = link.getAttribute('href');\r\n if (href) {\r\n if (href.startsWith('#')) {\r\n event.preventDefault();\r\n const element = this.el.nativeElement.querySelector(href);\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth' });\r\n }\r\n } else if (href.startsWith('doc/') || href === 'README.md' || href === 'README_de.md' || href.startsWith('scripts/')) {\r\n event.preventDefault();\r\n let pageId = '';\r\n if (href.includes('user-guide')) pageId = 'user-guide';\r\n else if (href.includes('admin-guide')) pageId = 'admin-guide';\r\n else if (href.includes('faq')) pageId = 'faq';\r\n else if (href.includes('README')) pageId = 'readme';\r\n else if (href.includes('android-build-instructions')) pageId = 'android-build-instructions';\r\n else if (href.includes('aws_setup')) pageId = 'aws-setup';\r\n else if (href.includes('postgres_setup')) pageId = 'postgres-setup';\r\n else if (href.includes('aws_fargate_config')) pageId = 'aws-fargate-config';\r\n else if (href.includes('aws_create_target_group')) pageId = 'aws-create-target-group';\r\n else if (href.includes('aws_alb_troubleshooting')) pageId = 'aws-alb-troubleshooting';\r\n else if (href.includes('aws_ecs_push_instructions')) pageId = 'aws-ecs-push-instructions';\r\n else if (href.includes('md_to_confluence')) pageId = 'md-to-confluence';\r\n else if (href.includes('confluence')) pageId = 'md-to-confluence';\r\n\r\n if (pageId) {\r\n this.router.navigate(['/help', pageId]);\r\n }\r\n } else if (!href.startsWith('http') && !href.startsWith('mailto')) {\r\n // Handle other local relative links that might not be explicitly mapped\r\n event.preventDefault();\r\n console.log('Intercepted unmapped relative link:', href);\r\n }\r\n }\r\n };\r\n }\r\n });\r\n }\r\n}\r\n",
@@ -63033,8 +63033,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "37cd4330f0bdb60d5b5cdc9f1e06d69d4fcebf3a"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\guards\\auth.guard.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\guards\\auth.guard.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\guards\\auth.guard.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\guards\\auth.guard.ts",
"statementMap": {
"0": {
"start": {
@@ -63185,7 +63185,7 @@
"parseUrl"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\guards\\auth.guard.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\guards\\auth.guard.ts"
],
"sourcesContent": [
"import { inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AuthService } from '../services/auth.service';\r\n\r\nexport const authGuard = () => {\r\n const authService = inject(AuthService);\r\n const router = inject(Router);\r\n\r\n if (authService.isLoggedIn()) {\r\n return true;\r\n }\r\n\r\n return router.parseUrl('/login');\r\n};\r\n"
@@ -63196,8 +63196,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "5ef3aae2031682ed9400ec2f9a57805ae9d94198"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\guards\\admin.guard.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\guards\\admin.guard.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\guards\\admin.guard.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\guards\\admin.guard.ts",
"statementMap": {
"0": {
"start": {
@@ -63348,7 +63348,7 @@
"parseUrl"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\guards\\admin.guard.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\guards\\admin.guard.ts"
],
"sourcesContent": [
"import { inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AuthService } from '../services/auth.service';\r\n\r\nexport const adminGuard = () => {\r\n const authService = inject(AuthService);\r\n const router = inject(Router);\r\n\r\n if (authService.isAdmin()) {\r\n return true;\r\n }\r\n\r\n return router.parseUrl('/profile');\r\n};\r\n"
@@ -63359,8 +63359,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "a691f9f996c46b43c352523ae27b8b629840daaf"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.routes.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.routes.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.routes.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.routes.ts",
"statementMap": {
"0": {
"start": {
@@ -63401,7 +63401,7 @@
"pathMatch"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.routes.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.routes.ts"
],
"sourcesContent": [
"import { Routes } from '@angular/router';\r\nimport { LoginComponent } from './components/login/login.component';\r\nimport { RegisterComponent } from './components/register/register.component';\r\nimport { ProfileComponent } from './components/profile/profile.component';\r\nimport { TasksComponent } from './components/tasks/tasks.component';\r\nimport { UserAdminComponent } from './components/user-admin/user-admin.component';\r\nimport { LogComponent } from './components/log/log.component';\r\nimport { DashboardComponent } from './components/dashboard/dashboard.component';\r\nimport { HelpContentComponent } from './components/help/help-content.component';\r\nimport { authGuard } from './guards/auth.guard';\r\nimport { adminGuard } from './guards/admin.guard';\r\n\r\nexport const routes: Routes = [\r\n { path: 'login', component: LoginComponent },\r\n { path: 'register', component: RegisterComponent },\r\n { path: 'dashboard', component: DashboardComponent, canActivate: [authGuard] },\r\n { path: 'profile', component: ProfileComponent, canActivate: [authGuard] },\r\n { path: 'tasks', component: TasksComponent, canActivate: [authGuard] },\r\n { path: 'user-admin', component: UserAdminComponent, canActivate: [authGuard, adminGuard] },\r\n { path: 'logs', component: LogComponent, canActivate: [authGuard, adminGuard] },\r\n { path: 'help/:pageId', component: HelpContentComponent, canActivate: [authGuard] },\r\n { path: '', redirectTo: '/login', pathMatch: 'full' }\r\n];\r\n"
@@ -63412,8 +63412,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "f47022d98ed80370de13c45299e3e9c397cb11cc"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.config.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.config.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.config.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.config.ts",
"statementMap": {
"0": {
"start": {
@@ -63457,7 +63457,7 @@
"useClass"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.config.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.config.ts"
],
"sourcesContent": [
"import { ApplicationConfig, provideBrowserGlobalErrorListeners, importProvidersFrom } from '@angular/core';\r\nimport { provideRouter } from '@angular/router';\r\nimport { provideHttpClient, withFetch, HttpClient } from '@angular/common/http';\r\nimport { provideAnimations } from '@angular/platform-browser/animations';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport { TranslateHttpLoader, provideTranslateHttpLoader } from '@ngx-translate/http-loader';\r\n\r\nimport { routes } from './app.routes';\r\n\r\nexport const appConfig: ApplicationConfig = {\r\n providers: [\r\n provideBrowserGlobalErrorListeners(),\r\n provideRouter(routes),\r\n provideHttpClient(withFetch()),\r\n provideAnimations(),\r\n provideTranslateHttpLoader({\r\n prefix: '/assets/i18n/',\r\n suffix: '.json'\r\n }),\r\n importProvidersFrom(\r\n TranslateModule.forRoot({\r\n loader: {\r\n provide: TranslateLoader,\r\n useClass: TranslateHttpLoader\r\n }\r\n })\r\n )\r\n ]\r\n};\r\n"
@@ -63468,8 +63468,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "18f3dca63224b9548175f81792108135596da046"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\theme.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\theme.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\theme.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\theme.service.ts",
"statementMap": {
"0": {
"start": {
@@ -64196,7 +64196,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\theme.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\theme.service.ts"
],
"sourcesContent": [
"import { Injectable, signal } from '@angular/core';\n\n/**\n * Token-based theme toggling.\n *\n * We keep Angular Material's prebuilt theme, and only switch app-level surfaces/text\n * via CSS variables (see src/styles.css). This keeps the change small and low-risk.\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly storageKey = 'goodone.theme';\n readonly isDark = signal(false);\n\n constructor() {\n const saved = this.safeGet();\n const prefersDark =\n typeof window !== 'undefined' &&\n !!window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n const dark = saved ? saved === 'dark' : prefersDark;\n this.setDark(dark, false);\n }\n\n toggle(): void {\n this.setDark(!this.isDark());\n }\n\n setDark(dark: boolean, persist = true): void {\n this.isDark.set(dark);\n document.body.classList.toggle('theme-dark', dark);\n if (persist) this.safeSet(dark ? 'dark' : 'light');\n }\n\n private safeGet(): string | null {\n try {\n return localStorage.getItem(this.storageKey);\n } catch {\n return null;\n }\n }\n\n private safeSet(value: string): void {\n try {\n localStorage.setItem(this.storageKey, value);\n } catch {\n // ignore (private browsing / storage blocked)\n }\n }\n}\n"
@@ -64207,8 +64207,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "12d7ed1466c25af32eea3d0d2c6144406d8e1a54"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\system.service.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\system.service.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\system.service.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\system.service.ts",
"statementMap": {
"0": {
"start": {
@@ -64467,7 +64467,7 @@
"providedIn"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\services\\system.service.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\services\\system.service.ts"
],
"sourcesContent": [
"import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface SystemInfo {\r\n backendVersion: string;\r\n frontendVersion: string;\r\n mode: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SystemService {\r\n private apiUrl = '/api/system';\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n getSystemInfo(): Observable {\r\n return this.http.get(`${this.apiUrl}/info`);\r\n }\r\n}\r\n"
@@ -64478,8 +64478,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "649e698724fa1ccbb4f1c43d56379714a7448c73"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\layout\\sidenav.component.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\layout\\sidenav.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\layout\\sidenav.component.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\layout\\sidenav.component.ts",
"statementMap": {
"0": {
"start": {
@@ -72507,8 +72507,8 @@
"encapsulation"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\layout\\sidenav.component.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\components\\layout\\sidenav.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\layout\\sidenav.component.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\components\\layout\\sidenav.component.html"
],
"sourcesContent": [
"import { Component, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, Router } from '@angular/router';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatListModule } from '@angular/material/list';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { AuthService } from '../../services/auth.service';\nimport { SystemService, SystemInfo } from '../../services/system.service';\nimport { I18nService, Language } from '../../services/i18n.service';\nimport { ThemeService } from '../../services/theme.service';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'app-sidenav',\n standalone: true,\n imports: [\n CommonModule,\n RouterLink,\n RouterLinkActive,\n MatSidenavModule,\n MatListModule,\n MatToolbarModule,\n MatIconModule,\n MatButtonModule,\n MatMenuModule,\n MatTooltipModule,\n MatSnackBarModule,\n MatDialogModule,\n MatDividerModule,\n TranslateModule\n ],\n templateUrl: './sidenav.component.html',\n styles: [`\n .sidenav-container {\n height: 100vh;\n }\n .sidenav {\n width: 260px;\n border-right: 1px solid var(--border);\n background-color: var(--surface);\n color: var(--text);\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .sidenav-collapsed {\n width: 76px;\n }\n .logo-container {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n height: 64px;\n box-sizing: border-box;\n }\n .sidenav-logo {\n margin-bottom: 8px;\n }\n .header-logo {\n padding: 0;\n margin-right: 24px;\n }\n .brand-box {\n width: 40px;\n height: 40px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-weight: 800;\n font-size: 20px;\n box-shadow: 0 4px 8px rgba(102, 126, 234, 0.25);\n flex-shrink: 0;\n letter-spacing: -1px;\n transition: transform 0.2s ease;\n }\n .brand-box:hover {\n transform: scale(1.05);\n }\n .brand-g {\n margin-right: -1px;\n }\n .brand-1 {\n font-size: 16px;\n margin-top: 4px;\n opacity: 0.9;\n }\n .logo-text {\n font-size: 22px;\n font-weight: 600;\n letter-spacing: -0.5px;\n font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n color: var(--text);\n }\n .header-logo-text {\n color: white;\n }\n @media (max-width: 480px) {\n .header-logo-text {\n display: none;\n }\n }\n .header-toolbar {\n background: linear-gradient(90deg, #4b6cb7 0%, #182848 100%) !important;\n color: white;\n height: 64px;\n padding: 0 24px;\n display: flex;\n align-items: center;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n }\n .header-spacer {\n flex: 1 1 auto;\n }\n .user-info-group {\n display: flex;\n align-items: center;\n gap: 12px;\n background: rgba(255, 255, 255, 0.1);\n padding: 4px 4px 4px 12px;\n border-radius: 32px;\n border: 1px solid rgba(255, 255, 255, 0.2);\n }\n .user-profile-button {\n display: flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n padding: 4px;\n border-radius: 24px;\n transition: background 0.2s;\n }\n .user-profile-button:hover {\n background: rgba(255, 255, 255, 0.1);\n }\n .user-avatar {\n width: 32px;\n height: 32px;\n background: #764ba2;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid rgba(255,255,255,0.8);\n }\n .user-avatar mat-icon {\n font-size: 20px;\n width: 20px;\n height: 20px;\n }\n .dropdown-icon {\n font-size: 20px;\n width: 20px;\n height: 20px;\n opacity: 0.7;\n }\n .user-menu-header {\n padding: 16px;\n display: flex;\n flex-direction: column;\n pointer-events: none;\n background: var(--brand-weak);\n border-bottom: 1px solid var(--border);\n margin-bottom: 8px;\n }\n .user-menu-name {\n font-weight: 700;\n font-size: 16px;\n color: var(--brand);\n margin-bottom: 2px;\n }\n .user-menu-role {\n font-size: 12px;\n font-weight: 500;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .info-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n opacity: 0.8;\n cursor: default;\n }\n .info-item mat-icon {\n color: var(--text-muted);\n font-size: 20px;\n width: 20px;\n height: 20px;\n }\n .info-label {\n font-size: 11px;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: block;\n line-height: 1;\n margin-bottom: 2px;\n }\n .info-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--text);\n display: block;\n }\n .settings-button {\n background: rgba(255, 255, 255, 0.15) !important;\n color: white !important;\n }\n .theme-toggle-button {\n background: rgba(255, 255, 255, 0.15) !important;\n color: white !important;\n }\n .theme-toggle-button:hover {\n background: rgba(255, 255, 255, 0.22) !important;\n }\n .mat-sidenav-content {\n background-color: var(--bg);\n }\n main {\n padding: 32px;\n min-height: calc(100vh - 64px);\n }\n .active-link {\n background: linear-gradient(90deg, var(--brand-weak) 0%, rgba(255, 255, 255, 0) 100%) !important;\n color: var(--brand) !important;\n border-left: 4px solid var(--brand);\n font-weight: 600;\n }\n .active-link mat-icon {\n color: var(--brand) !important;\n }\n mat-nav-list a {\n margin: 4px 12px;\n border-radius: 0 8px 8px 0;\n height: 48px !important;\n color: var(--text-muted) !important;\n transition: all 0.3s ease;\n position: relative;\n }\n mat-nav-list a:hover {\n background-color: rgba(63, 81, 181, 0.06) !important;\n color: var(--brand) !important;\n }\n mat-nav-list a mat-icon {\n color: var(--text-muted) !important;\n margin-right: 16px;\n transition: color 0.3s ease;\n }\n mat-nav-list a [matListItemTitle] {\n font-weight: 500;\n font-size: 14px;\n }\n `]\n})\nexport class SidenavComponent {\n isMobile = signal(false);\n isHandheld = signal(false);\n systemInfo = signal(null);\n\n isCollapsed = computed(() => this.isHandheld() && !this.isMobile());\n\n constructor(\n public authService: AuthService,\n public i18nService: I18nService,\n public theme: ThemeService,\n private systemService: SystemService,\n private router: Router,\n private snackBar: MatSnackBar,\n private dialog: MatDialog,\n private breakpointObserver: BreakpointObserver\n ) {\n this.systemService.getSystemInfo().subscribe(info => this.systemInfo.set(info));\n this.breakpointObserver.observe([\n Breakpoints.Handset,\n Breakpoints.Tablet\n ]).subscribe(result => {\n this.isHandheld.set(result.matches);\n this.isMobile.set(this.breakpointObserver.isMatched(Breakpoints.HandsetPortrait));\n });\n }\n\n onLogout() {\n this.authService.logout();\n this.snackBar.open('Logout successful', 'Close', { duration: 3000 });\n this.router.navigate(['/login']);\n }\n\n setLanguage(lang: string) {\n this.i18nService.setLanguage(lang as Language);\n }\n\n showHelp() {\n this.dialog.open(HelpDialogComponent);\n }\n}\n\n@Component({\n selector: 'app-help-dialog',\n standalone: true,\n imports: [MatDialogModule, MatButtonModule],\n template: `\n Application Help \n \n This application allows you to manage tasks and user profiles.
\n \n Tasks: Create, edit, and delete your tasks. \n Profile: Manage your personal information. \n Admin: Users with admin role can manage all users. \n \n Note: This is a test application for AI code generation.
\n \n \n Close \n \n `\n})\nclass HelpDialogComponent {}\n",
@@ -72520,8 +72520,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "68e6329a737bbc94ddab2746af47cbdfc77cd602"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.ts",
"statementMap": {
"0": {
"start": {
@@ -72936,8 +72936,8 @@
"encapsulation"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.ts",
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\app\\app.component.html"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\app\\app.component.html"
],
"sourcesContent": [
"import { Component, signal, OnInit } from '@angular/core';\r\nimport { RouterOutlet } from '@angular/router';\r\nimport { SidenavComponent } from './components/layout/sidenav.component';\r\nimport { AuthService } from './services/auth.service';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n standalone: true,\r\n imports: [\r\n RouterOutlet,\r\n SidenavComponent\r\n ],\r\n templateUrl: './app.component.html',\r\n styles: []\r\n})\r\nexport class App implements OnInit {\r\n constructor(private authService: AuthService) {}\r\n\r\n ngOnInit() {\r\n this.authService.init();\r\n }\r\n\r\n protected readonly title = signal('frontend');\r\n}\r\n",
@@ -72949,8 +72949,8 @@
"_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9",
"hash": "2b5c73ccb34c1c69752b726242c57b30f8800e1b"
},
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\main.ts": {
- "path": "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\main.ts",
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\main.ts": {
+ "path": "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\main.ts",
"statementMap": {
"0": {
"start": {
@@ -73020,7 +73020,7 @@
"error"
],
"sources": [
- "C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\src\\main.ts"
+ "C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\src\\main.ts"
],
"sourcesContent": [
"import { bootstrapApplication } from '@angular/platform-browser';\r\nimport { appConfig } from './app/app.config';\r\nimport { App } from './app/app';\r\n\r\nbootstrapApplication(App, appConfig)\r\n .catch((err) => console.error(err));\r\n"
diff --git a/frontend/.nyc_output/processinfo/index.json b/frontend/.nyc_output/processinfo/index.json
index d52cc5ffe..0817a1120 100644
--- a/frontend/.nyc_output/processinfo/index.json
+++ b/frontend/.nyc_output/processinfo/index.json
@@ -1 +1 @@
-{"processes":{"4a2fd9b4-7838-4a7a-8396-921cb525c730":{"parent":null,"children":["aa441490-e906-4321-83a5-b2bb844593ff"]},"69c261ad-7304-4cf1-9035-cbcf2fbb9989":{"parent":"aa441490-e906-4321-83a5-b2bb844593ff","children":[]},"6e15bf2e-fd34-4e81-9910-06f596438f68":{"parent":"aa441490-e906-4321-83a5-b2bb844593ff","children":["d9ee0f8b-60c7-49d8-ad53-13a248df3ffb"]},"aa441490-e906-4321-83a5-b2bb844593ff":{"parent":"4a2fd9b4-7838-4a7a-8396-921cb525c730","children":["69c261ad-7304-4cf1-9035-cbcf2fbb9989","6e15bf2e-fd34-4e81-9910-06f596438f68"]},"d9ee0f8b-60c7-49d8-ad53-13a248df3ffb":{"parent":"6e15bf2e-fd34-4e81-9910-06f596438f68","children":[]}},"files":{"C:\\doc\\sw\\ai\\angularai\\angularai\\frontend\\cypress.config.js":["aa441490-e906-4321-83a5-b2bb844593ff"]},"externalIds":{}}
\ No newline at end of file
+{"processes":{"4a2fd9b4-7838-4a7a-8396-921cb525c730":{"parent":null,"children":["aa441490-e906-4321-83a5-b2bb844593ff"]},"69c261ad-7304-4cf1-9035-cbcf2fbb9989":{"parent":"aa441490-e906-4321-83a5-b2bb844593ff","children":[]},"6e15bf2e-fd34-4e81-9910-06f596438f68":{"parent":"aa441490-e906-4321-83a5-b2bb844593ff","children":["d9ee0f8b-60c7-49d8-ad53-13a248df3ffb"]},"aa441490-e906-4321-83a5-b2bb844593ff":{"parent":"4a2fd9b4-7838-4a7a-8396-921cb525c730","children":["69c261ad-7304-4cf1-9035-cbcf2fbb9989","6e15bf2e-fd34-4e81-9910-06f596438f68"]},"d9ee0f8b-60c7-49d8-ad53-13a248df3ffb":{"parent":"6e15bf2e-fd34-4e81-9910-06f596438f68","children":[]}},"files":{"C:\\doc\\sw\\ai\\goodone\\goodone\\frontend\\cypress.config.js":["aa441490-e906-4321-83a5-b2bb844593ff"]},"externalIds":{}}
\ No newline at end of file
diff --git a/frontend/data/dependency-check/jsrepository.json.properties b/frontend/data/dependency-check/jsrepository.json.properties
index a84f28f39..13028ec35 100644
--- a/frontend/data/dependency-check/jsrepository.json.properties
+++ b/frontend/data/dependency-check/jsrepository.json.properties
@@ -1,2 +1,2 @@
-#Mon Mar 09 22:04:38 CET 2026
-LAST_UPDATED=1773090278
+#Fri Mar 13 09:16:13 CET 2026
+LAST_UPDATED=1773389773
diff --git a/frontend/e2e-screenshots/architecture-dark-mode.png b/frontend/e2e-screenshots/architecture-dark-mode.png
new file mode 100644
index 000000000..5bc140df8
Binary files /dev/null and b/frontend/e2e-screenshots/architecture-dark-mode.png differ
diff --git a/frontend/e2e/github-cta.spec.ts b/frontend/e2e/github-cta.spec.ts
index aab20ab3b..80b7426f3 100644
--- a/frontend/e2e/github-cta.spec.ts
+++ b/frontend/e2e/github-cta.spec.ts
@@ -17,6 +17,12 @@ test.describe('GitHub Footer Link', () => {
await expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer');
});
+ test('should have the deep link in the login page CTA', async ({ page }) => {
+ const githubCta = page.getByTestId('github-cta-button');
+ await expect(githubCta).toBeVisible();
+ await expect(githubCta).toHaveAttribute('href', 'https://github.com/JuergGood/angularai?tab=readme-ov-file#readme');
+ });
+
test('should be visible and not break layout on mobile', async ({ page }) => {
await page.setViewportSize({ width: 360, height: 640 });
diff --git a/frontend/e2e/landing-message.spec.ts b/frontend/e2e/landing-message.spec.ts
index c035a3454..a1e5d6ac3 100644
--- a/frontend/e2e/landing-message.spec.ts
+++ b/frontend/e2e/landing-message.spec.ts
@@ -54,12 +54,12 @@ test.describe('Landing Message Feature', () => {
test('should display landing message in English and German', async ({ page }) => {
// 1. English screenshot
- await forceBannerVisibility(page, 'Welcome to AngularAI');
+ await forceBannerVisibility(page, 'Welcome to GoodOne');
await expect(page.locator('.landing-info-banner')).toBeVisible();
await page.screenshot({ path: 'e2e-screenshots/landing-message-en.png' });
// 2. German screenshot (Mocking translation change)
- await forceBannerVisibility(page, 'Willkommen bei AngularAI');
+ await forceBannerVisibility(page, 'Willkommen bei GoodOne');
await page.screenshot({ path: 'e2e-screenshots/landing-message-de-ch.png' });
});
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index a47e4566c..3b24416ff 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
- "name": "frontend",
- "version": "1.1.0",
+ "name": "goodone-frontend",
+ "version": "1.1.1-SNAPSHOT",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "frontend",
- "version": "1.1.0",
+ "name": "goodone-frontend",
+ "version": "1.1.1-SNAPSHOT",
"dependencies": {
"@angular/animations": "21.2.1",
"@angular/cdk": "21.2.1",
diff --git a/frontend/package.json b/frontend/package.json
index 13e315196..6ad6dab77 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
- "name": "frontend",
- "version": "1.1.0",
+ "name": "goodone-frontend",
+ "version": "1.1.1-SNAPSHOT",
"scripts": {
"ng": "ng",
"start": "ng serve",
diff --git a/frontend/playwright/.auth/user.json b/frontend/playwright/.auth/user.json
index fe285e246..a5d10c5b2 100644
--- a/frontend/playwright/.auth/user.json
+++ b/frontend/playwright/.auth/user.json
@@ -2,7 +2,7 @@
"cookies": [
{
"name": "JSESSIONID",
- "value": "96CE6CACF9AD75E39757E38D9BFF6CB3",
+ "value": "7A615BDE44EBF690460D09F74A503F59",
"domain": "localhost",
"path": "/",
"expires": -1,
@@ -12,7 +12,7 @@
},
{
"name": "XSRF-TOKEN",
- "value": "fe39a04e-cd7e-4e53-92ab-2926c2f13a25",
+ "value": "41d64620-97d2-4f4c-8faf-bd8c10441a58",
"domain": "localhost",
"path": "/",
"expires": -1,
diff --git a/frontend/pom.xml b/frontend/pom.xml
index 0bbf933ae..f0013af20 100644
--- a/frontend/pom.xml
+++ b/frontend/pom.xml
@@ -3,13 +3,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- ch.goodone.angularai
- angularai-parent
+ ch.goodone
+ goodone-parent
1.1.1-SNAPSHOT
- aifrontend
- aifrontend
- Frontend for AngularAI
+ goodone-frontend
+ goodone-frontend
+ Frontend for GoodOne
src
@@ -60,3 +60,4 @@
+
diff --git a/frontend/public/assets/demo/goodone-demo.gif b/frontend/public/assets/demo/goodone-demo.gif
new file mode 100644
index 000000000..f38d06b60
Binary files /dev/null and b/frontend/public/assets/demo/goodone-demo.gif differ
diff --git a/frontend/public/assets/goodone-social-card.png b/frontend/public/assets/goodone-social-card.png
new file mode 100644
index 000000000..27a7e85f1
Binary files /dev/null and b/frontend/public/assets/goodone-social-card.png differ
diff --git a/frontend/public/assets/help/help-data-de-ch.json b/frontend/public/assets/help/help-data-de-ch.json
index 008bae6a6..e1aa34b14 100644
--- a/frontend/public/assets/help/help-data-de-ch.json
+++ b/frontend/public/assets/help/help-data-de-ch.json
@@ -1,7 +1,7 @@
{
- "readme": "AngularAI-Anwendung \nDies ist eine Full-Stack-Anwendung mit einem Spring Boot-Backend und einem Angular-Frontend.
\nVoraussetzungen \n\nAusführen mit Docker \nUm die gesamte Anwendung mit Docker Compose auszuführen, navigieren Sie zum Stammverzeichnis. Erstellen Sie zunächst eine .env-Datei im Stammverzeichnis (Sie können .env.example als Vorlage kopieren):
\ncp .env.example .env\n \nFühren Sie dann den folgenden Befehl aus:
\ndocker compose -f deploy/dev/docker-compose.yml up --build\n \nDie Anwendung ist verfügbar unter:\n- Frontend: http://localhost \n- Backend API: http://localhost:8080/api \n- H2-Konsole: http://localhost:8080/h2-console (JDBC URL: jdbc:h2:mem:testdb)\n- Mailpit (Lokale E-Mail): http://localhost:8025
\nH2 Connection Details \nPlease try connecting with the absolute path used inside the Docker container:
\n\n\nTry this JDBC URL first :\n jdbc:h2:file:/app/data/angularai;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE
\n \n\nAlternative (if the above fails) :\n jdbc:h2:file:/data/angularai;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE
\n \n \nVerification \nIf you are connected to the correct database, you should see more than just INFORMATION_SCHEMA and Users in the left sidebar. You should specifically see:\n* ACTION_LOG\n* USERS\n* TASKS\n* FLYWAY_SCHEMA_HISTORY
\nIf the sidebar still only shows INFORMATION_SCHEMA, it means H2 has just created a brand new, empty database file at that location because it couldn't find the existing one.
\nSummary of Connection Details for Docker: \n\nDriver Class : org.h2.Driver \nJDBC URL : jdbc:h2:file:/app/data/angularai;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE \nUser Name : sa \nPassword : (leave empty) \n \nOnce connected to the correct database, you can run:
\nSELECT * FROM ACTION_LOG;\n \n(H2 usually defaults to uppercase for table names in the UI, so ACTION_LOG should work there).
\nDeployment-Skripte \nSkripte für gängige Deployment-Aufgaben finden Sie im Ordner scripts/ (PowerShell und Windows CMD). Hinweis: PowerShell-Skripte laden Variablen automatisch aus Ihrer lokalen .env-Datei.
\n\nLokales Docker-Deployment : .\\scripts\\deploy-local.ps1 oder .\\scripts\\deploy-local.bat \nFührt docker compose -f deploy/dev/docker-compose.yml up --build -d aus, um die Anwendung lokal im Hintergrund zu starten. \nDocker-Fehlerbehebung : .\\scripts\\debug-docker.ps1 oder .\\scripts\\debug-docker.bat \nEin Diagnosetool zur Überprüfung des Docker Desktop-Dienstes, der Verbindung und des Kontexts. Verwenden Sie dies, wenn deploy-local.ps1 oder deploy-local.bat mit Verbindungsfehlern fehlschlägt. \nAWS-Deployment : .\\scripts\\deploy-aws.ps1 oder .\\scripts\\deploy-aws.bat \nAuthentifiziert sich bei AWS ECR, erstellt, taggt und pusht Frontend- und Backend-Images und erzwingt ein neues Deployment auf ECS-Services. \nUmgebung laden : Das Skript load-env.ps1 wird von anderen PowerShell-Skripten verwendet, um sicherzustellen, dass sensible Schlüssel (wie IPSTACK_API_KEY) in der Sitzung verfügbar sind. \n \nProjektstruktur \n\nbackend/: Spring Boot-Anwendung. \nfrontend/: Angular-Anwendung. \nandroid/: Android Jetpack Compose-Anwendung. \ndeploy/dev/docker-compose.yml: Orchestrierung für beide Services. \ndeploy/dev/Dockerfile: Multi-Stage-Build für die Anwendung. \n \nEntwicklung \nIntelliJ IDEA Setup \nUm das Backend von IntelliJ auszuführen, müssen Sie sicherstellen, dass die erforderlichen Umgebungsvariablen (wie IPSTACK_API_KEY) verfügbar sind.\n- Sie können diese manuell zu Ihren Run-Konfigurationen hinzufügen.\n- Alternativ können Sie ein Plugin wie EnvFile verwenden, um die .env-Datei automatisch in Ihre Run-Konfigurationen zu laden. Übergeben (commit) Sie diese Schlüssel niemals an Git.
\nFrontend (Web) \nNavigieren Sie zu frontend/ und führen Sie npm install und dann npm start aus.\nDer Angular-Entwicklungsserver ist so konfiguriert, dass er /api-Anfragen an http://localhost:8080 weiterleitet. Stellen Sie sicher, dass das Backend läuft.
\nStatische Analyse & Linting \nBevor Sie Code committen, stellen Sie sicher, dass er alle statischen Analyseprüfungen besteht.
\nBackend (Java):
\nmvn checkstyle:check\nmvn pmd:check\n \nFrontend (Web):
\ncd frontend\nnpm run lint\n \nDokumentation \nDie Projektdokumentation ist im Ordner doc/ organisiert. Für einen umfassenden Überblick beginnen Sie mit dem Architektur-Index (Englisch).
\nZentrale Leitfäden \n\nArchitektur & Technik \n\nDeployment & Betrieb \n\nRelease-Prozess \nUm ein neues Release zu erstellen (z. B. Version 1.0.3):
\n\nVorbereitung : Stellen Sie sicher, dass alle Änderungen committet und getestet wurden. \nRelease-Skript ausführen : Führen Sie den folgenden Befehl in PowerShell aus:\n bash\n .\\scripts\\release.ps1 -NewVersion \"1.0.3\"\n Dieses Skript wird:\nDie Version in der pom.xml aktualisieren. \nDie Version über alle Projektdateien hinweg synchronisieren (package.json, build.gradle usw.). \nEinen Header für die neue Version in der release-notes.md hinzufügen. \nDie JSON-Dateien der Hilfe-Daten neu generieren. \nEinen Git-Commit und ein Git-Tag erstellen (z. B. v1.0.3). \n \n \nManueller Schritt : Bearbeiten Sie doc/userguide/release-notes.md, um aussagekräftige Details für das Release hinzuzufügen. \nPush : Pushen Sie die Änderungen und Tags in das Repository:\n bash\n git push origin main --tags \nNächste Version : Um mit der Entwicklung der nächsten Version (z. B. 1.0.4) zu beginnen, führen Sie das Skript einfach erneut mit der neuen Versionsnummer aus, wenn Sie bereit sind, diese zu veröffentlichen. Während der Entwicklung können Sie die Version in der pom.xml bei Bedarf manuell aktualisieren und .\\scripts\\sync-version.ps1 ausführen. \n ",
- "user-guide": "Benutzerhandbuch \nWillkommen beim AngularAI-Benutzerhandbuch. Dieses Dokument enthält Anweisungen zur Verwendung der Funktionen der Frontend-Anwendung.
\nInhaltsverzeichnis \n\nErste Schritte \nDashboard \nAufgabenverwaltung \nBenutzerprofil \nAbmelden \n \nErste Schritte \nUm auf die Anwendung zuzugreifen, navigieren Sie zur Frontend-URL (normalerweise http://localhost). Sie werden aufgefordert, sich anzumelden. Wenn Sie noch kein Konto haben, können Sie ein neues registrieren.
\nAnmeldung \nGeben Sie Ihren Benutzernamen und Ihr Passwort ein, um auf Ihr Konto zuzugreifen.
\nRegistrierung \nWenn Sie ein neuer Benutzer sind, klicken Sie auf den Link \"Registrieren\". Geben Sie Ihren Vornamen, Nachnamen, den gewünschten Login, Ihre E-Mail-Adresse und Ihr Passwort an.
\nDashboard \nDas Dashboard bietet einen Überblick über Ihre Aktivitäten und den Systemstatus:\n- Zusammenfassungskarten : Schnelle Statistiken zu offenen Aufgaben, aktiven Benutzern, abgeschlossenen Aufgaben und den heutigen Logsn.\n- Aufgabenübersicht : Eine visuelle Verteilung der Aufgaben nach Status (Offen, In Bearbeitung, Abgeschlossen).\n- Letzte Aktivitäten : Eine Liste der zuletzt im System durchgeführten Aktionen.\n- Prioritätsaufgaben : Eine Liste der Aufgaben mit hoher Priorität, die Ihre Aufmerksamkeit erfordern.
\nAufgabenverwaltung \nDie Seite Aufgabenverwaltung ermöglicht es Ihnen, Ihre Arbeit zu organisieren:\n- Aufgabe hinzufügen : Klicken Sie auf die Schaltfläche \"Aufgabe hinzufügen\", um eine neue Aufgabe zu erstellen. Sie können Titel, Beschreibung, Fälligkeitsdatum, Priorität und Status angeben.\n- Filtern und Sortieren : Filtern Sie Aufgaben nach Status (Offen, In Bearbeitung, Abgeschlossen) oder setzen Sie die Sortierung zurück, um sie nach Priorität anzuzeigen.\n- Aufgabe bearbeiten : Klicken Sie auf das Bearbeitungssymbol auf einer Aufgabenkarte, um deren Details zu ändern.\n- Aufgabe löschen : Klicken Sie auf das Löschsymbol, um eine Aufgabe zu entfernen.\n- Drag & Drop : Sie können Aufgaben neu anordnen, indem Sie sie am Griff ziehen (verfügbar, wenn nicht gefiltert wird).
\nBenutzerprofil \nIm Bereich Profil können Sie Ihre persönlichen Daten einsehen, einschliesslich Name, E-Mail und zugewiesener Rolle.
\nAbmelden \nUm die Anwendung sicher zu verlassen, klicken Sie auf die Schaltfläche \"Abmelden\" im seitlichen Navigationsmenü.
",
- "faq": "Häufig gestellte Fragen (FAQ) \nFinden Sie Antworten auf häufig gestellte Fragen zur AngularAI-Anwendung.
\nInhaltsverzeichnis \n\nKonto und Anmeldung \nAufgabenverwaltung \nFehlerbehebung \n \nKonto und Anmeldung \nWie registriere ich mich? \nKlicken Sie auf der Anmeldeseite auf den Link \"Registrieren\", fuellen Sie das Formular aus und klicken Sie auf \"Registrieren\".
\nIch habe mein Passwort vergessen. Was soll ich tun? \nSie koennen den Link \"Passwort vergessen\" auf der Anmeldeseite verwenden. Geben Sie Ihre E-Mail-Adresse ein, und Sie erhalten einen Link zum Zuruecksetzen Ihres Passworts. Wenn Sie Probleme haben, wenden Sie sich bitte an Ihren Systemadministrator.
\nKann ich meine E-Mail-Adresse aendern? \nJa, Sie koennen Ihre E-Mail-Adresse in Ihrem Profilbereich aktualisieren.
\nKann ich meine Rolle aendern? \nBenutzerrollen (ROLE_USER, ROLE_ADMIN, ROLE_ADMIN_READ) koennen nur von einem Administrator ueber die Benutzerverwaltung geaendert werden.
\nWas ist die ROLE_ADMIN_READ-Rolle? \nDiese Rolle ermoeglicht es einem Benutzer, Verwaltungsdaten wie Benutzerlisten und System-Logs einzusehen, ohne die Moeglichkeit, Informationen zu aendern oder zu loeschen.
\nAufgabenverwaltung \nWie aendere ich die Prioritaet einer Aufgabe? \nBearbeiten Sie die Aufgabe, indem Sie auf das Stiftsymbol klicken, und waehlen Sie eine neue Prioritaet (Niedrig, Mittel, Hoch) aus dem Dropdown-Menue aus.
\nWas passiert, wenn ich eine Aufgabe loesche? \nDas Loeschen einer Aufgabe ist dauerhaft und kann nicht rueckgaengig gemacht werden.
\nKann ich Aufgaben anderen Benutzern zuweisen? \nIn der aktuellen Version sind Aufgaben persoenlich und dem Benutzer zugeordnet, der sie erstellt hat.
\nFehlerbehebung \nDie Anwendung reagiert nicht. Was soll ich tun? \nVersuchen Sie, die Seite in Ihrem Browser zu aktualisieren. Wenn das Problem weiterhin besteht, melden Sie sich ab und wieder an.
\nIch sehe keine Daten auf dem Dashboard. \nStellen Sie sicher, dass Sie ueber eine aktive Internetverbindung verfuegen und dass der Backend-Server ausgefuehrt wird. Wenn Sie ein neuer Benutzer sind, muessen Sie moeglicherweise zuerst einige Aufgaben erstellen.
\nWarum kann ich nicht auf die Benutzerverwaltung zugreifen? \nDie Benutzerverwaltung und die Logs sind nur fuer Benutzer mit der Rolle ADMIN oder ADMIN_READ zugaenglich.
",
- "admin-guide": "Administrator-Handbuch \nDieses Handbuch ist für Benutzer mit der Rolle ADMIN bestimmt. Es deckt die Verwaltungsfunktionen der AngularAI-Anwendung ab.
\nInhaltsverzeichnis \n\nBenutzerverwaltung \nLogs \nRollen und Berechtigungen \n \nBenutzerverwaltung \nAdministratoren können alle Benutzer im System verwalten:\n- Benutzerliste : Zeigen Sie eine Tabelle aller registrierten Benutzer an.\n- Benutzer bearbeiten : Aktualisieren Sie Benutzerdetails wie Name, E-Mail und Rolle.\n- Benutzer löschen : Entfernen Sie Benutzer aus dem System (Vorsicht: Dies ist dauerhaft).\n- Passwort zurücksetzen : Administratoren können bei Bedarf Passwörter für Benutzer aktualisieren.
\nLogs \nAuf der Seite Logs können Administratoren die Systemaktivitäten überwachen:\n- Echtzeit-Updates : Logs werden automatisch aktualisiert, wenn neue Aktionen auftreten.\n- Filterung : Filtern Sie Logs nach Benutzer, Aktion oder Zeitstempel, um bestimmte Ereignisse zu untersuchen.\n- Fehlerverfolgung : Überwachen Sie fehlgeschlagene Anmeldeversuche oder Systemfehler.
\nRollen und Berechtigungen \nDas System verwendet eine rollenbasierte Zugriffskontrolle (RBAC):\n- USER : Kann Aufgaben verwalten, das Dashboard und das eigene Profil einsehen.\n- ADMIN : Hat vollen Zugriff auf alle Funktionen, einschliesslich Benutzerverwaltung und Logs.
\nZuweisen von Rollen \nRollen können während der Benutzerbearbeitung in der Benutzerverwaltungskonsole zugewiesen werden. Änderungen werden wirksam, wenn sich der Benutzer das nächste Mal anmeldet oder seine Sitzung aktualisiert.
",
+ "readme": "GoodOne-Anwendung \nDies ist eine Full-Stack-Anwendung mit einem Spring Boot-Backend und einem Angular-Frontend.
\nVoraussetzungen \n\nAusführen mit Docker \nUm die gesamte Anwendung mit Docker Compose auszuführen, navigieren Sie zum Stammverzeichnis. Erstellen Sie zunächst eine .env-Datei im Stammverzeichnis (Sie können .env.example als Vorlage kopieren):
\ncp .env.example .env\n \nFühren Sie dann den folgenden Befehl aus:
\ndocker compose -f deploy/dev/docker-compose.yml up --build\n \nDie Anwendung ist verfügbar unter:\n- Frontend: http://localhost \n- Backend API: http://localhost:8080/api \n- H2-Konsole: http://localhost:8080/h2-console (JDBC URL: jdbc:h2:mem:testdb)\n- Mailpit (Lokale E-Mail): http://localhost:8025
\nH2 Connection Details \nPlease try connecting with the absolute path used inside the Docker container:
\n\n\nTry this JDBC URL first :\n jdbc:h2:file:/app/data/goodone;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE
\n \n\nAlternative (if the above fails) :\n jdbc:h2:file:/data/goodone;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE
\n \n \nVerification \nIf you are connected to the correct database, you should see more than just INFORMATION_SCHEMA and Users in the left sidebar. You should specifically see:\n* ACTION_LOG\n* USERS\n* TASKS\n* FLYWAY_SCHEMA_HISTORY
\nIf the sidebar still only shows INFORMATION_SCHEMA, it means H2 has just created a brand new, empty database file at that location because it couldn't find the existing one.
\nSummary of Connection Details for Docker: \n\nDriver Class : org.h2.Driver \nJDBC URL : jdbc:h2:file:/app/data/goodone;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE \nUser Name : sa \nPassword : (leave empty) \n \nOnce connected to the correct database, you can run:
\nSELECT * FROM ACTION_LOG;\n \n(H2 usually defaults to uppercase for table names in the UI, so ACTION_LOG should work there).
\nDeployment-Skripte \nSkripte für gängige Deployment-Aufgaben finden Sie im Ordner scripts/ (PowerShell und Windows CMD). Hinweis: PowerShell-Skripte laden Variablen automatisch aus Ihrer lokalen .env-Datei.
\n\nLokales Docker-Deployment : .\\scripts\\deploy-local.ps1 oder .\\scripts\\deploy-local.bat \nFührt docker compose -f deploy/dev/docker-compose.yml up --build -d aus, um die Anwendung lokal im Hintergrund zu starten. \nDocker-Fehlerbehebung : .\\scripts\\debug-docker.ps1 oder .\\scripts\\debug-docker.bat \nEin Diagnosetool zur Überprüfung des Docker Desktop-Dienstes, der Verbindung und des Kontexts. Verwenden Sie dies, wenn deploy-local.ps1 oder deploy-local.bat mit Verbindungsfehlern fehlschlägt. \nAWS-Deployment : .\\scripts\\deploy-aws.ps1 oder .\\scripts\\deploy-aws.bat \nAuthentifiziert sich bei AWS ECR, erstellt, taggt und pusht Frontend- und Backend-Images und erzwingt ein neues Deployment auf ECS-Services. \nUmgebung laden : Das Skript load-env.ps1 wird von anderen PowerShell-Skripten verwendet, um sicherzustellen, dass sensible Schlüssel (wie IPSTACK_API_KEY) in der Sitzung verfügbar sind. \n \nProjektstruktur \n\nbackend/: Spring Boot-Anwendung. \nfrontend/: Angular-Anwendung. \nandroid/: Android Jetpack Compose-Anwendung. \ndeploy/dev/docker-compose.yml: Orchestrierung für beide Services. \ndeploy/dev/Dockerfile: Multi-Stage-Build für die Anwendung. \n \nEntwicklung \nIntelliJ IDEA Setup \nUm das Backend von IntelliJ auszuführen, müssen Sie sicherstellen, dass die erforderlichen Umgebungsvariablen (wie IPSTACK_API_KEY) verfügbar sind.\n- Sie können diese manuell zu Ihren Run-Konfigurationen hinzufügen.\n- Alternativ können Sie ein Plugin wie EnvFile verwenden, um die .env-Datei automatisch in Ihre Run-Konfigurationen zu laden. Übergeben (commit) Sie diese Schlüssel niemals an Git.
\nFrontend (Web) \nNavigieren Sie zu frontend/ und führen Sie npm install und dann npm start aus.\nDer Angular-Entwicklungsserver ist so konfiguriert, dass er /api-Anfragen an http://localhost:8080 weiterleitet. Stellen Sie sicher, dass das Backend läuft.
\nStatische Analyse & Linting \nBevor Sie Code committen, stellen Sie sicher, dass er alle statischen Analyseprüfungen besteht.
\nBackend (Java):
\nmvn checkstyle:check\nmvn pmd:check\n \nFrontend (Web):
\ncd frontend\nnpm run lint\n \nDokumentation \nDie Projektdokumentation ist im Ordner doc/ organisiert. Für einen umfassenden Überblick beginnen Sie mit dem Architektur-Index (Englisch).
\nZentrale Leitfäden \n\nArchitektur & Technik \n\nDeployment & Betrieb \n\nRelease-Prozess \nUm ein neues Release zu erstellen (z. B. Version 1.0.3):
\n\nVorbereitung : Stellen Sie sicher, dass alle Änderungen committet und getestet wurden. \nRelease-Skript ausführen : Führen Sie den folgenden Befehl in PowerShell aus:\n bash\n .\\scripts\\release.ps1 -NewVersion \"1.0.3\"\n Dieses Skript wird:\nDie Version in der pom.xml aktualisieren. \nDie Version über alle Projektdateien hinweg synchronisieren (package.json, build.gradle usw.). \nEinen Header für die neue Version in der release-notes.md hinzufügen. \nDie JSON-Dateien der Hilfe-Daten neu generieren. \nEinen Git-Commit und ein Git-Tag erstellen (z. B. v1.0.3). \n \n \nManueller Schritt : Bearbeiten Sie doc/userguide/release-notes.md, um aussagekräftige Details für das Release hinzuzufügen. \nPush : Pushen Sie die Änderungen und Tags in das Repository:\n bash\n git push origin main --tags \nNächste Version : Um mit der Entwicklung der nächsten Version (z. B. 1.0.4) zu beginnen, führen Sie das Skript einfach erneut mit der neuen Versionsnummer aus, wenn Sie bereit sind, diese zu veröffentlichen. Während der Entwicklung können Sie die Version in der pom.xml bei Bedarf manuell aktualisieren und .\\scripts\\sync-version.ps1 ausführen. \n ",
+ "user-guide": "Benutzerhandbuch \nWillkommen beim GoodOne-Benutzerhandbuch. Dieses Dokument enthält Anweisungen zur Verwendung der Funktionen der Frontend-Anwendung.
\nInhaltsverzeichnis \n\nErste Schritte \nDashboard \nAufgabenverwaltung \nBenutzerprofil \nAbmelden \n \nErste Schritte \nUm auf die Anwendung zuzugreifen, navigieren Sie zur Frontend-URL (normalerweise http://localhost). Sie werden aufgefordert, sich anzumelden. Wenn Sie noch kein Konto haben, können Sie ein neues registrieren.
\nAnmeldung \nGeben Sie Ihren Benutzernamen und Ihr Passwort ein, um auf Ihr Konto zuzugreifen.
\nRegistrierung \nWenn Sie ein neuer Benutzer sind, klicken Sie auf den Link \"Registrieren\". Geben Sie Ihren Vornamen, Nachnamen, den gewünschten Login, Ihre E-Mail-Adresse und Ihr Passwort an.
\nDashboard \nDas Dashboard bietet einen Überblick über Ihre Aktivitäten und den Systemstatus:\n- Zusammenfassungskarten : Schnelle Statistiken zu offenen Aufgaben, aktiven Benutzern, abgeschlossenen Aufgaben und den heutigen Logsn.\n- Aufgabenübersicht : Eine visuelle Verteilung der Aufgaben nach Status (Offen, In Bearbeitung, Abgeschlossen).\n- Letzte Aktivitäten : Eine Liste der zuletzt im System durchgeführten Aktionen.\n- Prioritätsaufgaben : Eine Liste der Aufgaben mit hoher Priorität, die Ihre Aufmerksamkeit erfordern.
\nAufgabenverwaltung \nDie Seite Aufgabenverwaltung ermöglicht es Ihnen, Ihre Arbeit zu organisieren:\n- Aufgabe hinzufügen : Klicken Sie auf die Schaltfläche \"Aufgabe hinzufügen\", um eine neue Aufgabe zu erstellen. Sie können Titel, Beschreibung, Fälligkeitsdatum, Priorität und Status angeben.\n- Filtern und Sortieren : Filtern Sie Aufgaben nach Status (Offen, In Bearbeitung, Abgeschlossen) oder setzen Sie die Sortierung zurück, um sie nach Priorität anzuzeigen.\n- Aufgabe bearbeiten : Klicken Sie auf das Bearbeitungssymbol auf einer Aufgabenkarte, um deren Details zu ändern.\n- Aufgabe löschen : Klicken Sie auf das Löschsymbol, um eine Aufgabe zu entfernen.\n- Drag & Drop : Sie können Aufgaben neu anordnen, indem Sie sie am Griff ziehen (verfügbar, wenn nicht gefiltert wird).
\nBenutzerprofil \nIm Bereich Profil können Sie Ihre persönlichen Daten einsehen, einschliesslich Name, E-Mail und zugewiesener Rolle.
\nAbmelden \nUm die Anwendung sicher zu verlassen, klicken Sie auf die Schaltfläche \"Abmelden\" im seitlichen Navigationsmenü.
",
+ "faq": "Häufig gestellte Fragen (FAQ) \nFinden Sie Antworten auf häufig gestellte Fragen zur GoodOne-Anwendung.
\nInhaltsverzeichnis \n\nKonto und Anmeldung \nAufgabenverwaltung \nFehlerbehebung \n \nKonto und Anmeldung \nWie registriere ich mich? \nKlicken Sie auf der Anmeldeseite auf den Link \"Registrieren\", fuellen Sie das Formular aus und klicken Sie auf \"Registrieren\".
\nIch habe mein Passwort vergessen. Was soll ich tun? \nSie koennen den Link \"Passwort vergessen\" auf der Anmeldeseite verwenden. Geben Sie Ihre E-Mail-Adresse ein, und Sie erhalten einen Link zum Zuruecksetzen Ihres Passworts. Wenn Sie Probleme haben, wenden Sie sich bitte an Ihren Systemadministrator.
\nKann ich meine E-Mail-Adresse aendern? \nJa, Sie koennen Ihre E-Mail-Adresse in Ihrem Profilbereich aktualisieren.
\nKann ich meine Rolle aendern? \nBenutzerrollen (ROLE_USER, ROLE_ADMIN, ROLE_ADMIN_READ) koennen nur von einem Administrator ueber die Benutzerverwaltung geaendert werden.
\nWas ist die ROLE_ADMIN_READ-Rolle? \nDiese Rolle ermoeglicht es einem Benutzer, Verwaltungsdaten wie Benutzerlisten und System-Logs einzusehen, ohne die Moeglichkeit, Informationen zu aendern oder zu loeschen.
\nAufgabenverwaltung \nWie aendere ich die Prioritaet einer Aufgabe? \nBearbeiten Sie die Aufgabe, indem Sie auf das Stiftsymbol klicken, und waehlen Sie eine neue Prioritaet (Niedrig, Mittel, Hoch) aus dem Dropdown-Menue aus.
\nWas passiert, wenn ich eine Aufgabe loesche? \nDas Loeschen einer Aufgabe ist dauerhaft und kann nicht rueckgaengig gemacht werden.
\nKann ich Aufgaben anderen Benutzern zuweisen? \nIn der aktuellen Version sind Aufgaben persoenlich und dem Benutzer zugeordnet, der sie erstellt hat.
\nFehlerbehebung \nDie Anwendung reagiert nicht. Was soll ich tun? \nVersuchen Sie, die Seite in Ihrem Browser zu aktualisieren. Wenn das Problem weiterhin besteht, melden Sie sich ab und wieder an.
\nIch sehe keine Daten auf dem Dashboard. \nStellen Sie sicher, dass Sie ueber eine aktive Internetverbindung verfuegen und dass der Backend-Server ausgefuehrt wird. Wenn Sie ein neuer Benutzer sind, muessen Sie moeglicherweise zuerst einige Aufgaben erstellen.
\nWarum kann ich nicht auf die Benutzerverwaltung zugreifen? \nDie Benutzerverwaltung und die Logs sind nur fuer Benutzer mit der Rolle ADMIN oder ADMIN_READ zugaenglich.
",
+ "admin-guide": "Administrator-Handbuch \nDieses Handbuch ist für Benutzer mit der Rolle ADMIN bestimmt. Es deckt die Verwaltungsfunktionen der GoodOne-Anwendung ab.
\nInhaltsverzeichnis \n\nBenutzerverwaltung \nLogs \nRollen und Berechtigungen \n \nBenutzerverwaltung \nAdministratoren können alle Benutzer im System verwalten:\n- Benutzerliste : Zeigen Sie eine Tabelle aller registrierten Benutzer an.\n- Benutzer bearbeiten : Aktualisieren Sie Benutzerdetails wie Name, E-Mail und Rolle.\n- Benutzer löschen : Entfernen Sie Benutzer aus dem System (Vorsicht: Dies ist dauerhaft).\n- Passwort zurücksetzen : Administratoren können bei Bedarf Passwörter für Benutzer aktualisieren.
\nLogs \nAuf der Seite Logs können Administratoren die Systemaktivitäten überwachen:\n- Echtzeit-Updates : Logs werden automatisch aktualisiert, wenn neue Aktionen auftreten.\n- Filterung : Filtern Sie Logs nach Benutzer, Aktion oder Zeitstempel, um bestimmte Ereignisse zu untersuchen.\n- Fehlerverfolgung : Überwachen Sie fehlgeschlagene Anmeldeversuche oder Systemfehler.
\nRollen und Berechtigungen \nDas System verwendet eine rollenbasierte Zugriffskontrolle (RBAC):\n- USER : Kann Aufgaben verwalten, das Dashboard und das eigene Profil einsehen.\n- ADMIN : Hat vollen Zugriff auf alle Funktionen, einschliesslich Benutzerverwaltung und Logs.
\nZuweisen von Rollen \nRollen können während der Benutzerbearbeitung in der Benutzerverwaltungskonsole zugewiesen werden. Änderungen werden wirksam, wenn sich der Benutzer das nächste Mal anmeldet oder seine Sitzung aktualisiert.
",
"md-to-confluence": "import markdown\nimport requests\nimport json\nimport os\n\n# Configuration\nCONFLUENCE_URL = "https://your-domain.atlassian.net/wiki/rest/api/content"\nUSERNAME = "your-email@example.com"\nAPI_TOKEN = "your-api-token"\nSPACE_KEY = "DOC"\nPARENT_PAGE_ID = "12345" # Optional: ID of the parent page\n\ndef md_to_confluence_storage(md_file_path):\n """\n Converts a Markdown file to HTML which is compatible with Confluence Storage Format.\n Note: Standard HTML is often accepted by Confluence API, but some macros might need special tags.\n """\n with open(md_file_path, 'r', encoding='utf-8') as f:\n md_content = f.read()\n\n # Convert Markdown to HTML\n html_content = markdown.markdown(md_content, extensions=['extra', 'toc'])\n return html_content\n\ndef post_to_confluence(title, html_content, page_id=None):\n """\n Posts content to Confluence. If page_id is provided, it updates the page.\n """\n headers = {\n "Accept": "application/json",\n "Content-Type": "application/json"\n }\n\n auth = (USERNAME, API_TOKEN)\n\n data = {\n "type": "page",\n "title": title,\n "space": {"key": SPACE_KEY},\n "body": {\n "storage": {\n "value": html_content,\n "representation": "storage"\n }\n }\n }\n\n if PARENT_PAGE_ID:\n data["ancestors"] = [{"id": PARENT_PAGE_ID}]\n\n if page_id:\n # Update existing page (needs version increment)\n # First, get current version\n resp = requests.get(f"{CONFLUENCE_URL}/{page_id}?expand=version", auth=auth)\n version = resp.json()['version']['number'] + 1\n data["version"] = {"number": version}\n url = f"{CONFLUENCE_URL}/{page_id}"\n response = requests.put(url, data=json.dumps(data), headers=headers, auth=auth)\n else:\n # Create new page\n url = CONFLUENCE_URL\n response = requests.post(url, data=json.dumps(data), headers=headers, auth=auth)\n\n return response.status_code, response.text\n\nif __name__ == "__main__":\n docs = [\n ("User Guide", "doc/userguide/user-guide.md"),\n ("Admin Guide", "doc/userguide/admin-guide.md"),\n ("FAQ", "doc/userguide/faq.md")\n ]\n\n print("This script is a proposal. Please configure your Confluence credentials before running.")\n # for title, path in docs:\n # if os.path.exists(path):\n # print(f"Converting {path}...")\n # storage_format = md_to_confluence_storage(path)\n # # status, text = post_to_confluence(title, storage_format)\n # # print(f"Status: {status}")\n\n "
}
\ No newline at end of file
diff --git a/frontend/public/assets/help/help-data-en.json b/frontend/public/assets/help/help-data-en.json
index 70ef9c6c4..87a6a73e7 100644
--- a/frontend/public/assets/help/help-data-en.json
+++ b/frontend/public/assets/help/help-data-en.json
@@ -1,14 +1,14 @@
{
- "readme": "
\n \n \n \n
\nAngularAI \nAI‑Powered Software Engineering Platform
\nAngularAI explores a new idea: AI analyzing software engineering itself. \nInstead of only helping developers write code, the system can analyze architecture,\ntasks, and project documentation to generate insights about a software system.
\nLive demo: \nhttps://goodone.ch
\n \n🚀 What Makes This Project Interesting \nMost AI projects focus on:
\n• chatbots \n• prompt frameworks \n• API wrappers
\nAngularAI explores something different:
\n\nWhat if AI becomes part of the runtime of the application and continuously\nanalyzes the engineering process itself?
\n \nThe platform can:
\n• explain system architecture \n• detect development risks \n• generate sprint retrospectives \n• identify architectural drift
\n \n✨ AI Features \nArchitecture Q&A \nAsk natural‑language questions about the system architecture.
\nExample:
\n• Which components interact with the database? \n• How does authentication work? \n• How is reCAPTCHA verified?
\nThe AI answers using internal architecture documentation.
\n \nAI Risk Radar \nAutomatically detect recurring engineering risks.
\nExamples:
\n• tasks marked DONE but still containing open items \n• missing verification sections \n• documentation inconsistencies
\nHelps teams detect systematic quality problems early.
\n \nAI Sprint Retrospective \nGenerate AI‑assisted sprint retrospectives based on development tasks.
\nThe system analyzes:
\n• task completion patterns \n• recurring blockers \n• documentation quality
\nThis helps teams continuously improve their process.
\n \nADR Drift Detection \nArchitecture Decision Records (ADR) define architectural intent.
\nAngularAI monitors implementation and detects when systems drift away from\nthose decisions.
\nThis helps maintain long‑term architectural integrity .
\n \n🧠 Architecture \nSee the System Overview for details.
\nArchitecture layers:
\nFrontend \nAngular UI for interacting with AI features
\nBackend \nSpring Boot API exposing architecture and task data
\nAI Layer \nLLM‑powered analysis of architecture and development data
\nData Sources \nTasks, documentation, ADRs, architecture knowledge
\n \n🎬 Demo \n
\nExplore the live platform:
\nhttps://goodone.ch
\n \n⚡ Quick Start \nClone the repository:
\ngit clone https://github.com/JuergGood/angularai\n \nStart the stack:
\ncp .env.example .env\ndocker compose -f deploy/dev/docker-compose.yml up --build\n \nApplication endpoints:
\nFrontend \nhttp://localhost
\nBackend API \nhttp://localhost:8080/api
\nH2 Console \nhttp://localhost:8080/h2-console
\nMailpit \nhttp://localhost:8025
\n \n📚 Documentation \nDocumentation is located in the doc directory.
\nKey entry points:
\nArchitecture \nPlease refer to the Architecture Index for more details.
\nUser Guide \ndoc/user-guide/user-guide.md
\nAdmin Guide \ndoc/admin-guide/admin-guide.md
\nDeployment \ndoc/infrastructure/Deployment.md
\n \n🎯 Vision \nAngularAI explores how AI can augment software engineering workflows .
\nInstead of AI replacing developers, the platform focuses on helping teams:
\n• understand complex architectures \n• detect engineering risks \n• analyze development processes \n• preserve architectural intent
\n \n⭐ Support \nIf you find this project interesting, please consider starring the repository.
\nIt helps others discover the project and encourages further development.
",
- "user-guide": "User Guide \nWelcome to the AngularAI User Guide. This document provides instructions on how to use the frontend application features.
\nTable of Contents \n\nGetting Started \nDashboard \nTask Management \nUser Profile \nLogout \n \nGetting Started \nTo access the application, navigate to the frontend URL (typically http://localhost). You will be prompted to log in. If you don't have an account, you can register a new one.
\nLogin \nEnter your username and password to access your account.
\nRegistration \nIf you are a new user, click on the \"Register\" link. Provide your first name, last name, desired login, email address, and password.
\nDashboard \nThe Dashboard provides an overview of your activities and the system status:\n- Summary Cards : Quick stats on Open Tasks, Active Users, Completed Tasks, and Today's Logs.\n- Task Overview : A visual distribution of tasks by status (Open, In Progress, Completed).\n- Recent Activity : A list of the latest actions performed in the system.\n- Priority Tasks : A list of high-priority tasks that need your attention.
\nTask Management \nThe Task Management page allows you to organize your work:\n- Add Task : Click the \"Add Task\" button to create a new task. You can specify a title, description, due date, priority, and status.\n- Filter and Sort : Filter tasks by status (Open, In Progress, Completed) or reset sorting to view them by priority.\n- Edit Task : Click the edit icon on a task card to modify its details.\n- Delete Task : Click the delete icon to remove a task.\n- Drag and Drop : You can reorder tasks by dragging them using the handle (available when not filtering).
\nUser Profile \nIn the Profile section, you can view your personal details, including your name, email, and assigned role.
\nLogout \nTo securely leave the application, click the \"Logout\" button in the side navigation menu.
",
- "faq": "Frequently Asked Questions (FAQ) \nGeneral \nQ: What is AngularAI? \nA: AngularAI is a task management application featuring a modern Angular frontend, a Spring Boot backend, and an Android mobile app.
\nQ: How do I get started? \nA: Register for an account, log in, and start creating tasks on the Task Management page.
\nAccounts and Security \nQ: I forgot my password. How can I reset it? \nA: You can use the \"Forgot Password\" link on the login page. Enter your email address, and you will receive a link to reset your password. If you encounter any issues, please contact your system administrator.
\nQ: Can I change my role? \nA: User roles (ROLE_USER, ROLE_ADMIN, ROLE_ADMIN_READ) can only be changed by an administrator via the User Administration panel.
\nQ: What is the ROLE_ADMIN_READ role? \nA: This role allows a user to view administrative data like user lists and system logs without the ability to modify or delete any information.
\nTask Management \nQ: Can I reorder my tasks? \nA: Yes, you can use the drag handle on the left side of each task card to reorder them manually. Note that manual reordering is disabled when a status filter is active.
\nQ: What do the different task priorities mean? \nA:\n- High : Urgent tasks that should be addressed immediately.\n- Medium : Important tasks that should be completed soon.\n- Low : Non-urgent tasks.
\nTroubleshooting \nQ: The application is not loading. What should I do? \nA: Ensure that both the backend and frontend services are running. If you are using Docker, run docker compose up to start all services.
\nQ: Why can't I access the User Administration? \nA: User Administration and System Logs are only accessible to users with the ROLE_ADMIN or ROLE_ADMIN_READ roles.
",
- "release-notes": "Release Notes \nVersion 1.1.0 (2026-03-10) \nFeatures \n\nAI Core & RAG Enhancements :\nImplemented semantic document retrieval and embedding generation with support for OpenAI and Ollama. \nAdded ADR Drift Detector with backend detection logic and dedicated frontend UI components. \nEnhanced embedding model filtering and support for diverse vector dimensions. \nImplemented dynamic reindex toggle, connectivity checks, and deterministic truncation repair in StructuredOutputService. \nAdded retrospective generator service with structured JSON output and architecture prompt handling. \n \n \nPlatform & Infrastructure :\nIntegrated PostgreSQL as a data source for AngularAI and documented AI-ARCH-05 implementation. \nAdded Mailpit to the development environment for easier email testing. \nImplemented a master switch for AI features with component-level handling. \nAdded i18nInterceptor for automatic language header management in API calls. \nIntroduced landing message mode configuration and tests. \n \n \nUI/UX Improvements :\nIntegrated birth date field in User Admin with date picker support. \nImplemented AuthAiIntroComponent for enhanced Login and Register pages. \nAdded loading spinners to Risk Radar and improved sidenav responsiveness. \nSynchronized Tasksets dropdown in Risk Radar with tooltips and improved styling. \nImplemented anonymization for non-admin users in specific views. \n \n \nDocumentation & Task Management :\nAdded comprehensive documentation for Tasksets 4-7, 12, and various AI-UX/AI-ARCH tasks. \nEstablished clear indicators for deprecated architecture content and updated README links. \nIntroduced Junie task validation, template generation, and task normalization scripts. \nImproved accessibility of documentation with titled sections and consistent naming conventions. \n \n \n \nFixes \n\nSecurity & Stability :\nFixed reindexing date filter in AI Risk Radar for accurate task filtering. \nEnhanced Ollama healthchecks and development startup scripts. \nResolved various Sonar issues and improved exception handling across the backend. \nFixed Prometheus endpoint exposure issues and updated configuration. \n \n \n \nSecurity Scan Summary \n\nNo recent automated security scan results found. \n \nUX Highlights \n\nKnown Issues \n\nMobile Viewport (360px) : Some tables in the User Administration panel might require horizontal scrolling on very narrow screens. \nEmail Delivery : Emails sent from the demo environment might be flagged as spam by some providers due to missing SPF/DKIM records on the demo domain. \nSession Timeout : Users are not automatically redirected to the login page immediately upon JWT expiration; this happens only on the next API call. \n \nVersion 1.0.9 (2026-03-01) \nFeatures \n\nSecurity & Observability :\nImplemented hardened CSP reporting with rate limiting and strict payload validation. \nAdded DatabaseMigrationTest and negative path E2E tests for enhanced reliability. \nIntroduced global error handling with an ErrorBoundary component. \nImplemented user activation handling and CSRF exemption tests for web configuration. \n \n \nPlatform Enhancements :\nIntegrated Grafana for monitoring with comprehensive configuration and troubleshooting guides. \nAdded monitoring-server module and improved sidenav responsiveness. \nEnforced centralized versioning and commit standards across the project. \nImplemented StartupLogger service for detailed application startup diagnostics. \n \n \n \nSecurity \n\nVulnerability Management :\nIntegrated Trivy and Snyk for container and dependency scanning with SARIF upload to GitHub Code Scanning. \nHardened CI/CD workflows by pinning GitHub Action versions and improving backend logging. \nEnhanced role-based security checks and reCAPTCHA configuration for Fargate deployments. \nAdded documentation for task sets V4 to V7 covering reliability, testing, security, and release engineering. \n \n \n \n\n\nTesting & Stability :\nExpanded E2E tests with a \"golden path\" user journey covering CRUD operations and AI-triggered functionality. \nImproved E2E test reliability with optimized wait strategies and better session management. \nResolved numerous Sonar issues and enhanced input validation across services. \nValidated database migrations and H2 database locking behavior on Fargate. \n \n \n \nRefactoring & UI \n\nTheming & Maintenance :\nRefactored CSS variables for consistent dark mode support and high contrast readability. \nImproved reCAPTCHA handling with enhanced type safety across registration and contact forms. \nCleaned up presentation modules and updated slides for architectural clarity. \nIntroduced configuration validation and automated documentation snapshots. \nRemoved obsolete Grafana dashboards and unused Cypress support files. \n \n \n \nSecurity Scan Summary \n\nTotal Issues : 3 \nCritical Issues : 0 \nMajor Issues : 3 \nFull report available in CI artifacts. \n \nUX Highlights \n\nKnown Issues \n\nMobile Viewport (360px) : Some tables in the User Administration panel might require horizontal scrolling on very narrow screens. \nEmail Delivery : Emails sent from the demo environment might be flagged as spam by some providers due to missing SPF/DKIM records on the demo domain. \nSession Timeout : Users are not automatically redirected to the login page immediately upon JWT expiration; this happens only on the next API call. \n \nVersion 1.0.8 (2026-02-15) \nFeatures \n\nContact Form : Implemented contact form with reCAPTCHA integration and backend storage. \nAnalytics : Integrated Google Analytics and Microsoft Clarity with environment-aware conditional loading. \nObservability : Implemented end-to-end Correlation ID propagation and enhanced logging with forensic context. \n \nImprovements & Refactoring \n\nUser Management : Refactored user creation and admin readiness checks for improved reliability. \nData Initialization : Enhanced DataInitializerService with improved transactional logic and error management. \nSystem Integrity : Improved system status error handling and resilience across backend and frontend. \nMobile UX : Optimized task list layout and accessibility for 360px mobile viewports. \n \nSecurity & Hardening \n\nCSP & Rate Limiting : Hardened Content Security Policy reporting and implemented strict rate limiting for sensitive endpoints. \nDependency Management : Upgraded several core dependencies and pinned GitHub Actions to specific hashes for enhanced security. \nSecret Management : Added scripts for AWS secret management and pre-commit secret leak checks. \n \nCI/CD & DevOps \n\nDeployment : Automated release notes generation and improved GitHub Actions for Continuous Deployment to AWS Fargate. \nDocker : Optimized Dockerfile build process by streamlining dependency checks and reducing startup delays. \nWorkflow Efficiency : Added concurrency control to GitHub workflows to optimize CI resource usage. \n \nTesting & Quality \n\nE2E Stability : Significantly improved Playwright test reliability with better waiting strategies and dual-click interactions. \nVisual Regression : Expanded E2E coverage with baseline screenshot tests for key demo screens and themes. \nCode Quality : Resolved numerous Sonar issues and enhanced backend service input validation and exception handling. \nSchema Validation : Integrated OpenAPI contract testing and database migration validation. \n \nDocumentation \n\nRelease Management : Implemented centralized versioning and enforced commit standards. \nTechnical Reference : Added comprehensive AWS security roadmap, Operations Runbook, and forensic logging documentation. \n \nSecurity Scan Summary \n\nTotal Issues : 3 \nCritical Issues : 0 \nMajor Issues : 3 \nFull report available in CI artifacts. \n \nUX Highlights \n\nKnown Issues \n\nMobile Viewport (360px) : Some tables in the User Administration panel might require horizontal scrolling on very narrow screens. \nEmail Delivery : Emails sent from the demo environment might be flagged as spam by some providers due to missing SPF/DKIM records on the demo domain. \nSession Timeout : Users are not automatically redirected to the login page immediately upon JWT expiration; this happens only on the next API call. \n \nVersion 1.0.7 (2026-02-08) \nFeatures \n\nDemo Data Reset : Implemented frontend and backend functionality to reliably restore demo environment state. \nSystem Status : Added environment details, last deployment time, and role-based visibility to system status dashboard. \nTraceability : Implemented trace ID propagation from backend to frontend for improved debugging. \n \nImprovements & Refactoring \n\nUX Responsiveness : Optimized mobile layout for task preview, filter chips, and dashboard components. \nValidation Service : Centralized email and user validation logic into a dedicated service. \nAsset Caching : Optimized Nginx configuration for better performance via efficient asset caching. \n \nSecurity & Hardening \n\nAuthentication : Switched to JWT-based authentication and disabled HTTP Basic for improved security. \nreCAPTCHA : Added support for dummy reCAPTCHA mode for development and testing. \nAudit Logging : Integrated Hibernate Envers for comprehensive entity auditing. \nCSRF Protection : Enhanced CSRF protection and CORS configurations for all environments. \n \nCI/CD & DevOps \n\nAutomation : Introduced GitHub Actions for automated build, linting, and multi-platform testing. \nAWS Deployment : Added structured PowerShell scripts for demo and production deployments to AWS ECS/Fargate. \nHealth Checks : Enabled and secured Spring Boot Actuator health, liveness, and readiness endpoints. \n \nTesting & Quality \n\nVisual Guardrails : Introduced Playwright E2E baseline screenshot tests for key screens across themes. \nAccessibility : Integrated axe-core for automated accessibility auditing and Lighthouse analysis. \nCoverage : Significantly increased unit and integration test coverage for controllers and services. \n \nDocumentation \n\nArchitecture : Restructured documentation for clarity, adding ER diagrams and technical references for AWS deployment. \nAI Guidelines : Introduced guidelines for AI usage and logging standards within the project. \n \nVersion 1.0.6 (2026-01-31) \nFeatures \n\nLanding Message : Added configurable landing message feature across all platforms. \nAccount Deletion : Implemented user account deletion with full cleanup logic. \nPassword Recovery : Introduced secure password recovery flow with email integration. \n \nImprovements & Refactoring \n\nPersistence : Added support for persistent file-based H2 storage on AWS Fargate via EFS. \nPresentation : Added a dedicated module for generating architectural presentations from code. \nUser Protection : Implemented safeguards to prevent deletion of critical system users. \n \nSecurity & Hardening \n\nVulnerability Scanning : Integrated Trivy and Snyk scans into the CI/CD pipeline for code, containers, and IaC. \nNon-Root Execution : Hardened Docker and Kubernetes configurations to run services as non-root users. \nAPI Security : Implemented API rate limiting and hardened Content Security Policy (CSP). \n \nCI/CD & DevOps \n\nWorkflow Hardening : Pinning GitHub Actions to specific hashes and optimizing dependency caching. \nBuild Efficiency : Optimized Docker build process with multi-stage builds and .dockerignore. \n \nTesting & Quality \n\nAutomation : Automated UI screenshot updates for documentation using Playwright. \nStatic Analysis : Integrated Checkstyle and PMD into the build process to enforce coding standards. \n \nDocumentation \n\nStandardization : Added comprehensive development standards and backend architecture documentation. \nInternationalization : Improved German FAQ and localized key system components. \n \nVersion 1.0.5 (2026-01-25) \n\nInfrastructure : Update environment variables configuration \nSecurity : Add resend verification feature and enhance email verification UX \nUI : Refine register component UI and functionality \nAuth : Enhance registration form validation and error handling \nUX : Enhance registration form UX with hints and improved error handling \nAuth : Refactor registration form to enforce full name validation, enhance error handling, and update tests \nTesting : Refactor registration and implement extensive validation tests \nDocs : Add UI Architecture Documentation and Enhance Auth Flow Tests \nTesting : Refactor e2e tests for improved session handling and login logic \nTesting : Add Playwright e2e tests for Tasks and Auth Flow, update routing, and document UX strategy \nQuality : Remove H2 configuration, enhance system info tests with i18n checks, add user registration and verification schema. Update i18n files for password strength and registration messages. \nSecurity : Integrate Google reCAPTCHA for enhanced user verification, update registration logic to include token verification, and enhance user data initializer and error handling. \n \nVersion 1.0.4 (2026-01-23) \n\nSecurity (reCAPTCHA) : Implemented Google reCAPTCHA v2 on the registration page to ensure only real persons can register. Includes backend verification and configurable site/secret keys. \nGeolocation Service : Integrated IP-based location lookup, including a system setting to toggle the feature and automatic local/loopback address skipping. \nEnhanced Environment Management : Added .env.example template and improved environment loading logic for better local development setup. \nAdvanced Task Parsing : Implemented comprehensive task parsing logic with a dedicated test suite to improve natural language task entry. \nUI/UX Improvements : Fixed dark mode issues and refined the task management interface. \nDocumentation Refinement : Streamlined AWS deployment documentation, removing obsolete ALB and ECR instructions. \n \nVersion 1.0.2 (2026-01-17) \n\nVersion Display Fixes : Resolved issues where the version number was not correctly displayed in the UI. \nQuality Assurance : Integrated Qodana for static code analysis and addressed multiple SonarLint issues to improve code quality. \nTest Coverage : Significantly increased test coverage across the project, including backend JUnit tests and frontend Cypress integration tests. \nCI/CD Stability : Fixed various GitHub Actions CI build issues to ensure reliable automated testing. \n \nVersion 1.0.1 (2026-01-14) \n\nDashboard Visuals : Enhanced the dashboard with improved visuals and responsive layout across frontend, backend, and Android. \nInternationalization : Added German translations (de-ch) and improved the translation infrastructure. \nSecurity Enhancements : Introduced ROLE_ADMIN_READ for granular access control and read-only administrative access. \nPresentation Tools : Added scripts and templates for generating high-quality architectural presentations directly from the codebase. \n \nVersion 1.0.0 (2026-01-08) \n\nInitial Release : Core functionality of the AngularAI prototype. \nMulti-Platform Support : Unified experience across Web (Angular) and Android platforms. \nTask Management : Comprehensive task lifecycle including status tracking, filtering, and drag-and-drop reordering. \nReal-time Monitoring : Integrated Action Log and Log menu for system transparency. \nAPI Documentation : Integrated Swagger UI for easy exploration of the backend REST API. \nDatabase Migrations : Initialized Flyway integration for reliable schema management. \nTest Client : Added a CLI tool for data management and direct API interaction. \n \nPre-1.0.0 (2026-01-01) \n\nFoundation : Established the core project structure with Spring Boot backend and Angular standalone components. \nInfrastructure : Set up Docker-based deployment and Nginx reverse proxy configuration. \nArchitecture : Defined the \"AngularAI\" ecosystem diagrams and core design principles. \n ",
- "docker-optimization": "Docker Build Optimization \nThis document explains the strategies used to optimize Docker build times and ensure reliable dependency management in the AngularAI project.
\nDependency Caching Strategy \nThe primary optimization involves leveraging Docker Layer Caching to avoid re-downloading Maven and NPM packages on every build.
\n1. The Problem: Cache Invalidation \nDocker builds images in layers. Each instruction in a Dockerfile creates a new layer. Docker caches these layers; however, if the files copied in a COPY instruction change, that layer and all subsequent layers are invalidated and must be rebuilt.
\nPreviously, the Dockerfile copied the entire backend/ directory (including source code) before running the Maven build. Consequently:\n* Any change to a Java file invalidated the cache.\n* Maven was forced to download all dependencies again because the downloading step followed the invalidated COPY step.
\n2. The Solution: Selective Copying, Dependency Pre-fetching & Cache Mounts \nThe optimized Dockerfile separates dependency resolution from source code compilation and utilizes Docker BuildKit cache mounts for persistent local repositories.
\nBackend (Maven) Optimization \nWe copy only the pom.xml files first to create a layer that represents the project's dependencies. We use --mount=type=cache,target=/root/.m2 to ensure the Maven local repository is persisted across builds, even when layers are invalidated.
\n# Step 1: Copy ONLY pom.xml files (The "Blueprint")\nCOPY pom.xml .\nCOPY backend/pom.xml backend/\nCOPY test-client/pom.xml test-client/\n\n# Step 2: Resolve and Cache Dependencies\n# BuildKit cache mounts persist the .m2 folder across builds.\n# We also resolve plugins to ensure they are cached before source code is copied.\nRUN --mount=type=cache,target=/root/.m2 \\\n mvn dependency:go-offline dependency:resolve-plugins -B || true\nRUN --mount=type=cache,target=/root/.m2 \\\n mvn -f backend/pom.xml dependency:go-offline dependency:resolve-plugins -B || true\n\n# Step 3: Copy volatile assets and source code\nCOPY --from=frontend-build /app/frontend/dist /app/frontend/dist\nCOPY backend/src backend/src\n\n# Final package step also uses the cache mount\nRUN --mount=type=cache,target=/root/.m2 \\\n mvn -f backend/pom.xml clean package -DskipTests -Dcheckstyle.skip\n \nFrontend (NPM) Optimization \nSimilarly, for the Angular frontend, we use cache mounts for the NPM cache.
\nWORKDIR /app/frontend\nCOPY frontend/package*.json ./\nRUN --mount=type=cache,target=/root/.npm \\\n npm ci\n \n3. Key Improvements \n\nCache Mounts (BuildKit) : Persists ~/.m2 and ~/.npm across builds, preventing re-downloads even if pom.xml or package.json changes or previous layers are invalidated. \nSelective File Copying : By copying only configuration files first, we create layers that change infrequently. \nPre-fetching : Using mvn dependency:go-offline and dependency:resolve-plugins ensures most artifacts and plugins are available before the source code is copied. \nDelayed Configuration Copying : Secondary files like dependency-check-suppressions.xml are copied after the dependencies are cached. \nMulti-Module Support : The root pom.xml is copied to ensure Maven understands the project structure during the go-offline phase. \n \nComparative Analysis \n\n\n\nFeature \nUnoptimized Build \nOptimized Build \n \n \n\n\nSource code change \nRe-downloads all packages (~5-10 mins) \nRe-uses cached packages (~1-2 mins) \n \n\nDependency change \nRe-downloads all packages \nRe-downloads (expected) \n \n\nBuild Reliability \nVulnerable to network glitches \nDependencies are safely pre-fetched \n \n \n
\nBest Practices \n\nAlways use .dockerignore : Ensure large or unnecessary files (like local node_modules, target, or .git folders) are excluded from the Docker context. \nOrder matters : Place instructions that change frequently (like COPY src/) as late as possible in the Dockerfile. \nClean up in the same layer : If you install system packages (e.g., apk add), clean up caches in the same RUN command to keep image sizes small. \n ",
- "admin-guide": "Admin Guide \nThis guide is intended for system administrators of the AngularAI application. Administrators have access to additional features for user management and system monitoring.
\nTable of Contents \n\nUser Administration \nSystem Logs \nRoles and Permissions \n \nUser Administration \nThe User Administration page allows you to manage all users in the system:\n- List Users : View a list of all registered users, including their login name, full name, email, and role.\n- Add User : Create a new user account manually by providing their personal details and assigning a role.\n- Edit User : Modify the details of an existing user. Note that you cannot change the login name once a user is created.\n- Delete User : Remove a user from the system. You cannot delete your own account.\n- View User (Read-only) : Users with the ROLE_ADMIN_READ role can view user details but cannot make changes.
\nSystem Logs \nThe System Logs page provides an audit trail of actions performed within the application:\n- Audit Trail : View logs including timestamp, user login, action performed, and additional details.\n- Filtering : Filter logs by action type (Login, Tasks, User Admin) and date range.\n- Sorting : Sort logs by timestamp.\n- Paging : Navigate through large sets of logs using the paginator.\n- Clear Logs : Administrators with full write access can clear all logs using the \"Clear All Logs\" button.
\nRoles and Permissions \nThe application uses the following roles to control access:\n- ROLE_USER : Standard user access. Can manage their own tasks and view their profile.\n- ROLE_ADMIN : Full administrative access. Can manage users, view all logs, and perform system-wide actions.\n- ROLE_ADMIN_READ : Read-only administrative access. Can view user lists and logs but cannot perform modifications or deletions.
",
- "android-build": "To build the Android module locally, you have two primary options: using Android Studio (recommended) or the Command Line .
\n1. Using Android Studio (Recommended) \n\nOpen Android Studio . \nSelect Open and navigate to the android/ directory in the project root. \nWait for the IDE to sync with Gradle (this will automatically generate the missing Gradle wrapper files). \nGo to Build > Make Project . \nTo run the app, select an emulator or physical device and click the Run icon. \n \n2. Using the Command Line \nIf you have Gradle installed on your system:\n1. Open your terminal and navigate to the android/ directory.\n2. Run the following command:\n bash\n gradle assembleDebug\n3. The generated APK will be available at:\n android/app/build/outputs/apk/debug/app-debug.apk
\nImportant: Connecting to the Backend \n\nEmulator : The app is pre-configured to use http://10.0.2.2:8080/ to connect to a backend running on your host's localhost:8080. \nPhysical Device : You will need to update the baseUrl in android/app/src/main/java/ch/goodone/angularai/android/di/NetworkModule.kt to your computer's local IP address (e.g., http://192.168.1.15:8080/). \n \nDetailed instructions, including prerequisites and troubleshooting, can be found in Android Development .
\nThe main README.md has also been updated to include these instructions.
",
- "backend-dev": "Backend Development \nThe backend is a robust Spring Boot application built with Java 21 and Spring Boot 4.
\nCore Technologies \n\nSpring Boot 4 : Framework for rapid application development. \nJava 21 : Utilizing the latest LTS features. \nSpring Data JPA : Persistent data storage with Hibernate. \nSpring Security : Role-based access control and secure endpoints. \nFlyway : Database migrations for version-controlled schema changes. \nMaven : Dependency management and build automation. \n \nDevelopment Setup \nTo run the backend locally:
\n\nPrerequisites : Ensure you have Java 21 and Maven installed. \nConfiguration : Create a .env file in the root directory (use .env.example as a template). \nRun with IntelliJ :\nOpen the project in IntelliJ IDEA. \nUse the EnvFile plugin to load the .env file. \nRun AngularAiBackendApplication. \n \n \nRun with Maven :\n bash\n mvn clean install\n cd backend\n mvn spring-boot:run \n \nDatabase \nH2 Database (Local Development) \nThe application uses H2 as the default database for local development and testing.
\n\nConsole URL : http://localhost:8080/h2-console \n\nSettings :
\n\nDriver Class : org.h2.Driver \nJDBC URL (Memory) : jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 (Default for local IDE runs) \nJDBC URL (File/Docker) : jdbc:h2:file:./data/angularai-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE (When using Docker or h2-file profile) \nUser Name : sa \nPassword : (leave empty) \n \nImportant : When accessing the H2 console, ensure the JDBC URL starts with jdbc:h2:. For example:\njdbc:h2:file:./data/angularai-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE (default for Docker if using ./data)\nor\njdbc:h2:file:./backend/data/angularai-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE (default for local IDE/Maven runs)
\n \n \nResetting the Database \nIf the database file becomes corrupted (e.g., due to improper shutdown or concurrent access), you can reset it by deleting the corrupted files.
\nUsing PowerShell:
\n.\\scripts\\reset-db.ps1\n \nManual Reset: \nSimply delete the following files in the project root:\n- backend\\data\\angularai-v2.mv.db\n- backend\\data\\angularai-v2.trace.db (if present)
\nThe application will automatically recreate the schema and default data using Flyway on the next start.
\nNote : To access the console in a Docker environment, ensure you use the 8080 port directly.
\nSELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'PUBLIC'
\nSELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'PUBLIC'
\ndocker compose logs app | Select-String "jdbc:h2"\n \nDatabase JDBC URL [jdbc:h2:file:./data/testdb]
\njdbc:h2:file:./data/testdb;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE
\nSELECT * FROM ACTION_LOG;\n \nPostgreSQL \nSupported for production-like environments. See PostgreSQL Setup for details.
\nEmail Testing (Mailpit) \nThe application uses Mailpit for local email testing. This allows you to inspect outgoing emails (like verification or password recovery) without needing a real SMTP server.
\n\nWhen running with Docker Compose, the mailpit service is automatically started. To view sent emails, simply navigate to http://localhost:8025 in your browser.
\nLocal Development (IntelliJ/Maven) \nIf you are running the backend outside of Docker, you can still use the Mailpit container for SMTP. Ensure your environment variables or application.properties are configured as follows:
\nSPRING_MAIL_HOST=localhost\nSPRING_MAIL_PORT=1025\nSPRING_MAIL_AUTH=false\nSPRING_MAIL_STARTTLS=false\n \nAPI Documentation \n\nOpenAPI/Swagger : Explore the API endpoints at http://localhost:8080/swagger-ui.html (when enabled). \nREST Principles : The backend follows standard RESTful principles using DTOs for data transfer. \n \nTesting \n\nJUnit 5 & MockMvc : For controller and service layer testing. \nHigh Coverage : We aim for >80% test coverage. \n \nRun tests:
\nmvn test\n ",
- "postgres-setup": "I have added the PostgreSQL configuration to the project. This includes the necessary driver dependency and a dedicated properties file.
\n1. New Configuration File \nAn additional configuration file has been created at:\nbackend/src/main/resources/application-postgres.properties
\nThis file is configured to connect to a local PostgreSQL instance:\n* URL : jdbc:postgresql://localhost:5432/angularai\n* Username/Password : postgres / postgres (Default)\n* DDL Auto : update (Automatically manages the schema)
\nTo use this configuration when starting the application, you can set the active profile:\n* Via IntelliJ : Add -Dspring.profiles.active=postgres to the VM options.\n* Via CLI : java -jar app.jar --spring.profiles.active=postgres
\n2. PostgreSQL Setup Instructions \nFollow these steps to prepare your local PostgreSQL database:
\nStep A: Install PostgreSQL \nEnsure PostgreSQL is installed and running on your system. You can download it from postgresql.org .
\nStep B: Create the Database \nOpen your terminal or a tool like pgAdmin or psql and execute the following commands:
\n-- Connect as the default postgres user\n-- Create the database used in the properties file\nCREATE DATABASE angularai;\n \nStep C: Database Schema Initialization \nYou do not need to manually create tables or the schema. \nThe application is configured with spring.jpa.hibernate.ddl-auto=update. When you start the Spring Boot application with the postgres profile active:\n1. Hibernate will connect to the angularai database.\n2. It will automatically detect the entities (User, Task) defined in the code.\n3. It will create the corresponding tables (users, tasks) and constraints (unique emails, etc.) if they do not exist.
\n3. Project Updates \n\nUpdated backend/pom.xml to include the org.postgresql:postgresql runtime dependency. \nThe DataInitializer remains active and will populate your local PostgreSQL database with sample admin and user accounts upon the first successful startup. \n ",
+ "readme": "
\n \n \n \n
\nGoodOne \nAI‑Powered Software Engineering Platform
\nGoodOne explores a new idea: AI analyzing software engineering itself. \nInstead of only helping developers write code, the system can analyze architecture,\ntasks, and project documentation to generate insights about a software system.
\nLive demo: \nhttps://goodone.ch
\n \n🚀 What Makes This Project Interesting \nMost AI projects focus on:
\n• chatbots \n• prompt frameworks \n• API wrappers
\nGoodOne explores something different:
\n\nWhat if AI becomes part of the runtime of the application and continuously\nanalyzes the engineering process itself?
\n \nThe platform can:
\n• explain system architecture \n• detect development risks \n• generate sprint retrospectives \n• identify architectural drift
\n \n✨ AI Features \nArchitecture Q&A \nAsk natural‑language questions about the system architecture.
\nExample:
\n• Which components interact with the database? \n• How does authentication work? \n• How is reCAPTCHA verified?
\nThe AI answers using internal architecture documentation.
\n \nAI Risk Radar \nAutomatically detect recurring engineering risks.
\nExamples:
\n• tasks marked DONE but still containing open items \n• missing verification sections \n• documentation inconsistencies
\nHelps teams detect systematic quality problems early.
\n \nAI Sprint Retrospective \nGenerate AI‑assisted sprint retrospectives based on development tasks.
\nThe system analyzes:
\n• task completion patterns \n• recurring blockers \n• documentation quality
\nThis helps teams continuously improve their process.
\n \nADR Drift Detection \nArchitecture Decision Records (ADR) define architectural intent.
\nGoodOne monitors implementation and detects when systems drift away from\nthose decisions.
\nThis helps maintain long‑term architectural integrity .
\n \n🧠 Architecture \nSee the System Overview for details.
\nArchitecture layers:
\nFrontend \nAngular UI for interacting with AI features
\nBackend \nSpring Boot API exposing architecture and task data
\nAI Layer \nLLM‑powered analysis of architecture and development data
\nData Sources \nTasks, documentation, ADRs, architecture knowledge
\n \n🎬 Demo \n
\nExplore the live platform:
\nhttps://goodone.ch
\n \n⚡ Quick Start \nClone the repository:
\ngit clone https://github.com/JuergGood/angularai\n \nStart the stack:
\ncp .env.example .env\ndocker compose -f deploy/dev/docker-compose.yml up --build\n \nApplication endpoints:
\nFrontend \nhttp://localhost
\nBackend API \nhttp://localhost:8080/api
\nH2 Console \nhttp://localhost:8080/h2-console
\nMailpit \nhttp://localhost:8025
\n \n📚 Documentation \nDocumentation is located in the doc directory.
\nKey entry points:
\nArchitecture \nPlease refer to the Architecture Index for more details.
\nUser Guide \ndoc/user-guide/user-guide.md
\nAdmin Guide \ndoc/admin-guide/admin-guide.md
\nDeployment \ndoc/infrastructure/Deployment.md
\n \n🎯 Vision \nGoodOne explores how AI can augment software engineering workflows .
\nInstead of AI replacing developers, the platform focuses on helping teams:
\n• understand complex architectures \n• detect engineering risks \n• analyze development processes \n• preserve architectural intent
\n \n⭐ Support \nIf you find this project interesting, please consider starring the repository.
\nIt helps others discover the project and encourages further development.
",
+ "user-guide": "User Guide \nWelcome to the GoodOne User Guide. This document provides instructions on how to use the frontend application features.
\nTable of Contents \n\nGetting Started \nDashboard \nTask Management \nUser Profile \nLogout \n \nGetting Started \nTo access the application, navigate to the frontend URL (typically http://localhost). You will be prompted to log in. If you don't have an account, you can register a new one.
\nLogin \nEnter your username and password to access your account.
\nRegistration \nIf you are a new user, click on the \"Register\" link. Provide your first name, last name, desired login, email address, and password.
\nDashboard \nThe Dashboard provides an overview of your activities and the system status:\n- Summary Cards : Quick stats on Open Tasks, Active Users, Completed Tasks, and Today's Logs.\n- Task Overview : A visual distribution of tasks by status (Open, In Progress, Completed).\n- Recent Activity : A list of the latest actions performed in the system.\n- Priority Tasks : A list of high-priority tasks that need your attention.
\nTask Management \nThe Task Management page allows you to organize your work:\n- Add Task : Click the \"Add Task\" button to create a new task. You can specify a title, description, due date, priority, and status.\n- Filter and Sort : Filter tasks by status (Open, In Progress, Completed) or reset sorting to view them by priority.\n- Edit Task : Click the edit icon on a task card to modify its details.\n- Delete Task : Click the delete icon to remove a task.\n- Drag and Drop : You can reorder tasks by dragging them using the handle (available when not filtering).
\nUser Profile \nIn the Profile section, you can view your personal details, including your name, email, and assigned role.
\nLogout \nTo securely leave the application, click the \"Logout\" button in the side navigation menu.
",
+ "faq": "Frequently Asked Questions (FAQ) \nGeneral \nQ: What is GoodOne? \nA: GoodOne is a task management application featuring a modern Angular frontend, a Spring Boot backend, and an Android mobile app.
\nQ: How do I get started? \nA: Register for an account, log in, and start creating tasks on the Task Management page.
\nAccounts and Security \nQ: I forgot my password. How can I reset it? \nA: You can use the \"Forgot Password\" link on the login page. Enter your email address, and you will receive a link to reset your password. If you encounter any issues, please contact your system administrator.
\nQ: Can I change my role? \nA: User roles (ROLE_USER, ROLE_ADMIN, ROLE_ADMIN_READ) can only be changed by an administrator via the User Administration panel.
\nQ: What is the ROLE_ADMIN_READ role? \nA: This role allows a user to view administrative data like user lists and system logs without the ability to modify or delete any information.
\nTask Management \nQ: Can I reorder my tasks? \nA: Yes, you can use the drag handle on the left side of each task card to reorder them manually. Note that manual reordering is disabled when a status filter is active.
\nQ: What do the different task priorities mean? \nA:\n- High : Urgent tasks that should be addressed immediately.\n- Medium : Important tasks that should be completed soon.\n- Low : Non-urgent tasks.
\nTroubleshooting \nQ: The application is not loading. What should I do? \nA: Ensure that both the backend and frontend services are running. If you are using Docker, run docker compose up to start all services.
\nQ: Why can't I access the User Administration? \nA: User Administration and System Logs are only accessible to users with the ROLE_ADMIN or ROLE_ADMIN_READ roles.
",
+ "release-notes": "Release Notes \nVersion 1.1.0 (2026-03-10) \nFeatures \n\nAI Core & RAG Enhancements :\nImplemented semantic document retrieval and embedding generation with support for OpenAI and Ollama. \nAdded ADR Drift Detector with backend detection logic and dedicated frontend UI components. \nEnhanced embedding model filtering and support for diverse vector dimensions. \nImplemented dynamic reindex toggle, connectivity checks, and deterministic truncation repair in StructuredOutputService. \nAdded retrospective generator service with structured JSON output and architecture prompt handling. \n \n \nPlatform & Infrastructure :\nIntegrated PostgreSQL as a data source for GoodOne and documented AI-ARCH-05 implementation. \nAdded Mailpit to the development environment for easier email testing. \nImplemented a master switch for AI features with component-level handling. \nAdded i18nInterceptor for automatic language header management in API calls. \nIntroduced landing message mode configuration and tests. \n \n \nUI/UX Improvements :\nIntegrated birth date field in User Admin with date picker support. \nImplemented AuthAiIntroComponent for enhanced Login and Register pages. \nAdded loading spinners to Risk Radar and improved sidenav responsiveness. \nSynchronized Tasksets dropdown in Risk Radar with tooltips and improved styling. \nImplemented anonymization for non-admin users in specific views. \n \n \nDocumentation & Task Management :\nAdded comprehensive documentation for Tasksets 4-7, 12, and various AI-UX/AI-ARCH tasks. \nEstablished clear indicators for deprecated architecture content and updated README links. \nIntroduced Junie task validation, template generation, and task normalization scripts. \nImproved accessibility of documentation with titled sections and consistent naming conventions. \n \n \n \nFixes \n\nSecurity & Stability :\nFixed reindexing date filter in AI Risk Radar for accurate task filtering. \nEnhanced Ollama healthchecks and development startup scripts. \nResolved various Sonar issues and improved exception handling across the backend. \nFixed Prometheus endpoint exposure issues and updated configuration. \n \n \n \nSecurity Scan Summary \n\nNo recent automated security scan results found. \n \nUX Highlights \n\nKnown Issues \n\nMobile Viewport (360px) : Some tables in the User Administration panel might require horizontal scrolling on very narrow screens. \nEmail Delivery : Emails sent from the demo environment might be flagged as spam by some providers due to missing SPF/DKIM records on the demo domain. \nSession Timeout : Users are not automatically redirected to the login page immediately upon JWT expiration; this happens only on the next API call. \n \nVersion 1.0.9 (2026-03-01) \nFeatures \n\nSecurity & Observability :\nImplemented hardened CSP reporting with rate limiting and strict payload validation. \nAdded DatabaseMigrationTest and negative path E2E tests for enhanced reliability. \nIntroduced global error handling with an ErrorBoundary component. \nImplemented user activation handling and CSRF exemption tests for web configuration. \n \n \nPlatform Enhancements :\nIntegrated Grafana for monitoring with comprehensive configuration and troubleshooting guides. \nAdded monitoring-server module and improved sidenav responsiveness. \nEnforced centralized versioning and commit standards across the project. \nImplemented StartupLogger service for detailed application startup diagnostics. \n \n \n \nSecurity \n\nVulnerability Management :\nIntegrated Trivy and Snyk for container and dependency scanning with SARIF upload to GitHub Code Scanning. \nHardened CI/CD workflows by pinning GitHub Action versions and improving backend logging. \nEnhanced role-based security checks and reCAPTCHA configuration for Fargate deployments. \nAdded documentation for task sets V4 to V7 covering reliability, testing, security, and release engineering. \n \n \n \n\n\nTesting & Stability :\nExpanded E2E tests with a \"golden path\" user journey covering CRUD operations and AI-triggered functionality. \nImproved E2E test reliability with optimized wait strategies and better session management. \nResolved numerous Sonar issues and enhanced input validation across services. \nValidated database migrations and H2 database locking behavior on Fargate. \n \n \n \nRefactoring & UI \n\nTheming & Maintenance :\nRefactored CSS variables for consistent dark mode support and high contrast readability. \nImproved reCAPTCHA handling with enhanced type safety across registration and contact forms. \nCleaned up presentation modules and updated slides for architectural clarity. \nIntroduced configuration validation and automated documentation snapshots. \nRemoved obsolete Grafana dashboards and unused Cypress support files. \n \n \n \nSecurity Scan Summary \n\nTotal Issues : 3 \nCritical Issues : 0 \nMajor Issues : 3 \nFull report available in CI artifacts. \n \nUX Highlights \n\nKnown Issues \n\nMobile Viewport (360px) : Some tables in the User Administration panel might require horizontal scrolling on very narrow screens. \nEmail Delivery : Emails sent from the demo environment might be flagged as spam by some providers due to missing SPF/DKIM records on the demo domain. \nSession Timeout : Users are not automatically redirected to the login page immediately upon JWT expiration; this happens only on the next API call. \n \nVersion 1.0.8 (2026-02-15) \nFeatures \n\nContact Form : Implemented contact form with reCAPTCHA integration and backend storage. \nAnalytics : Integrated Google Analytics and Microsoft Clarity with environment-aware conditional loading. \nObservability : Implemented end-to-end Correlation ID propagation and enhanced logging with forensic context. \n \nImprovements & Refactoring \n\nUser Management : Refactored user creation and admin readiness checks for improved reliability. \nData Initialization : Enhanced DataInitializerService with improved transactional logic and error management. \nSystem Integrity : Improved system status error handling and resilience across backend and frontend. \nMobile UX : Optimized task list layout and accessibility for 360px mobile viewports. \n \nSecurity & Hardening \n\nCSP & Rate Limiting : Hardened Content Security Policy reporting and implemented strict rate limiting for sensitive endpoints. \nDependency Management : Upgraded several core dependencies and pinned GitHub Actions to specific hashes for enhanced security. \nSecret Management : Added scripts for AWS secret management and pre-commit secret leak checks. \n \nCI/CD & DevOps \n\nDeployment : Automated release notes generation and improved GitHub Actions for Continuous Deployment to AWS Fargate. \nDocker : Optimized Dockerfile build process by streamlining dependency checks and reducing startup delays. \nWorkflow Efficiency : Added concurrency control to GitHub workflows to optimize CI resource usage. \n \nTesting & Quality \n\nE2E Stability : Significantly improved Playwright test reliability with better waiting strategies and dual-click interactions. \nVisual Regression : Expanded E2E coverage with baseline screenshot tests for key demo screens and themes. \nCode Quality : Resolved numerous Sonar issues and enhanced backend service input validation and exception handling. \nSchema Validation : Integrated OpenAPI contract testing and database migration validation. \n \nDocumentation \n\nRelease Management : Implemented centralized versioning and enforced commit standards. \nTechnical Reference : Added comprehensive AWS security roadmap, Operations Runbook, and forensic logging documentation. \n \nSecurity Scan Summary \n\nTotal Issues : 3 \nCritical Issues : 0 \nMajor Issues : 3 \nFull report available in CI artifacts. \n \nUX Highlights \n\nKnown Issues \n\nMobile Viewport (360px) : Some tables in the User Administration panel might require horizontal scrolling on very narrow screens. \nEmail Delivery : Emails sent from the demo environment might be flagged as spam by some providers due to missing SPF/DKIM records on the demo domain. \nSession Timeout : Users are not automatically redirected to the login page immediately upon JWT expiration; this happens only on the next API call. \n \nVersion 1.0.7 (2026-02-08) \nFeatures \n\nDemo Data Reset : Implemented frontend and backend functionality to reliably restore demo environment state. \nSystem Status : Added environment details, last deployment time, and role-based visibility to system status dashboard. \nTraceability : Implemented trace ID propagation from backend to frontend for improved debugging. \n \nImprovements & Refactoring \n\nUX Responsiveness : Optimized mobile layout for task preview, filter chips, and dashboard components. \nValidation Service : Centralized email and user validation logic into a dedicated service. \nAsset Caching : Optimized Nginx configuration for better performance via efficient asset caching. \n \nSecurity & Hardening \n\nAuthentication : Switched to JWT-based authentication and disabled HTTP Basic for improved security. \nreCAPTCHA : Added support for dummy reCAPTCHA mode for development and testing. \nAudit Logging : Integrated Hibernate Envers for comprehensive entity auditing. \nCSRF Protection : Enhanced CSRF protection and CORS configurations for all environments. \n \nCI/CD & DevOps \n\nAutomation : Introduced GitHub Actions for automated build, linting, and multi-platform testing. \nAWS Deployment : Added structured PowerShell scripts for demo and production deployments to AWS ECS/Fargate. \nHealth Checks : Enabled and secured Spring Boot Actuator health, liveness, and readiness endpoints. \n \nTesting & Quality \n\nVisual Guardrails : Introduced Playwright E2E baseline screenshot tests for key screens across themes. \nAccessibility : Integrated axe-core for automated accessibility auditing and Lighthouse analysis. \nCoverage : Significantly increased unit and integration test coverage for controllers and services. \n \nDocumentation \n\nArchitecture : Restructured documentation for clarity, adding ER diagrams and technical references for AWS deployment. \nAI Guidelines : Introduced guidelines for AI usage and logging standards within the project. \n \nVersion 1.0.6 (2026-01-31) \nFeatures \n\nLanding Message : Added configurable landing message feature across all platforms. \nAccount Deletion : Implemented user account deletion with full cleanup logic. \nPassword Recovery : Introduced secure password recovery flow with email integration. \n \nImprovements & Refactoring \n\nPersistence : Added support for persistent file-based H2 storage on AWS Fargate via EFS. \nPresentation : Added a dedicated module for generating architectural presentations from code. \nUser Protection : Implemented safeguards to prevent deletion of critical system users. \n \nSecurity & Hardening \n\nVulnerability Scanning : Integrated Trivy and Snyk scans into the CI/CD pipeline for code, containers, and IaC. \nNon-Root Execution : Hardened Docker and Kubernetes configurations to run services as non-root users. \nAPI Security : Implemented API rate limiting and hardened Content Security Policy (CSP). \n \nCI/CD & DevOps \n\nWorkflow Hardening : Pinning GitHub Actions to specific hashes and optimizing dependency caching. \nBuild Efficiency : Optimized Docker build process with multi-stage builds and .dockerignore. \n \nTesting & Quality \n\nAutomation : Automated UI screenshot updates for documentation using Playwright. \nStatic Analysis : Integrated Checkstyle and PMD into the build process to enforce coding standards. \n \nDocumentation \n\nStandardization : Added comprehensive development standards and backend architecture documentation. \nInternationalization : Improved German FAQ and localized key system components. \n \nVersion 1.0.5 (2026-01-25) \n\nInfrastructure : Update environment variables configuration \nSecurity : Add resend verification feature and enhance email verification UX \nUI : Refine register component UI and functionality \nAuth : Enhance registration form validation and error handling \nUX : Enhance registration form UX with hints and improved error handling \nAuth : Refactor registration form to enforce full name validation, enhance error handling, and update tests \nTesting : Refactor registration and implement extensive validation tests \nDocs : Add UI Architecture Documentation and Enhance Auth Flow Tests \nTesting : Refactor e2e tests for improved session handling and login logic \nTesting : Add Playwright e2e tests for Tasks and Auth Flow, update routing, and document UX strategy \nQuality : Remove H2 configuration, enhance system info tests with i18n checks, add user registration and verification schema. Update i18n files for password strength and registration messages. \nSecurity : Integrate Google reCAPTCHA for enhanced user verification, update registration logic to include token verification, and enhance user data initializer and error handling. \n \nVersion 1.0.4 (2026-01-23) \n\nSecurity (reCAPTCHA) : Implemented Google reCAPTCHA v2 on the registration page to ensure only real persons can register. Includes backend verification and configurable site/secret keys. \nGeolocation Service : Integrated IP-based location lookup, including a system setting to toggle the feature and automatic local/loopback address skipping. \nEnhanced Environment Management : Added .env.example template and improved environment loading logic for better local development setup. \nAdvanced Task Parsing : Implemented comprehensive task parsing logic with a dedicated test suite to improve natural language task entry. \nUI/UX Improvements : Fixed dark mode issues and refined the task management interface. \nDocumentation Refinement : Streamlined AWS deployment documentation, removing obsolete ALB and ECR instructions. \n \nVersion 1.0.2 (2026-01-17) \n\nVersion Display Fixes : Resolved issues where the version number was not correctly displayed in the UI. \nQuality Assurance : Integrated Qodana for static code analysis and addressed multiple SonarLint issues to improve code quality. \nTest Coverage : Significantly increased test coverage across the project, including backend JUnit tests and frontend Cypress integration tests. \nCI/CD Stability : Fixed various GitHub Actions CI build issues to ensure reliable automated testing. \n \nVersion 1.0.1 (2026-01-14) \n\nDashboard Visuals : Enhanced the dashboard with improved visuals and responsive layout across frontend, backend, and Android. \nInternationalization : Added German translations (de-ch) and improved the translation infrastructure. \nSecurity Enhancements : Introduced ROLE_ADMIN_READ for granular access control and read-only administrative access. \nPresentation Tools : Added scripts and templates for generating high-quality architectural presentations directly from the codebase. \n \nVersion 1.0.0 (2026-01-08) \n\nInitial Release : Core functionality of the GoodOne prototype. \nMulti-Platform Support : Unified experience across Web (Angular) and Android platforms. \nTask Management : Comprehensive task lifecycle including status tracking, filtering, and drag-and-drop reordering. \nReal-time Monitoring : Integrated Action Log and Log menu for system transparency. \nAPI Documentation : Integrated Swagger UI for easy exploration of the backend REST API. \nDatabase Migrations : Initialized Flyway integration for reliable schema management. \nTest Client : Added a CLI tool for data management and direct API interaction. \n \nPre-1.0.0 (2026-01-01) \n\nFoundation : Established the core project structure with Spring Boot backend and Angular standalone components. \nInfrastructure : Set up Docker-based deployment and Nginx reverse proxy configuration. \nArchitecture : Defined the \"GoodOne\" ecosystem diagrams and core design principles. \n ",
+ "docker-optimization": "Docker Build Optimization \nThis document explains the strategies used to optimize Docker build times and ensure reliable dependency management in the GoodOne project.
\nDependency Caching Strategy \nThe primary optimization involves leveraging Docker Layer Caching to avoid re-downloading Maven and NPM packages on every build.
\n1. The Problem: Cache Invalidation \nDocker builds images in layers. Each instruction in a Dockerfile creates a new layer. Docker caches these layers; however, if the files copied in a COPY instruction change, that layer and all subsequent layers are invalidated and must be rebuilt.
\nPreviously, the Dockerfile copied the entire backend/ directory (including source code) before running the Maven build. Consequently:\n* Any change to a Java file invalidated the cache.\n* Maven was forced to download all dependencies again because the downloading step followed the invalidated COPY step.
\n2. The Solution: Selective Copying, Dependency Pre-fetching & Cache Mounts \nThe optimized Dockerfile separates dependency resolution from source code compilation and utilizes Docker BuildKit cache mounts for persistent local repositories.
\nBackend (Maven) Optimization \nWe copy only the pom.xml files first to create a layer that represents the project's dependencies. We use --mount=type=cache,target=/root/.m2 to ensure the Maven local repository is persisted across builds, even when layers are invalidated.
\n# Step 1: Copy ONLY pom.xml files (The "Blueprint")\nCOPY pom.xml .\nCOPY backend/pom.xml backend/\nCOPY test-client/pom.xml test-client/\n\n# Step 2: Resolve and Cache Dependencies\n# BuildKit cache mounts persist the .m2 folder across builds.\n# We also resolve plugins to ensure they are cached before source code is copied.\nRUN --mount=type=cache,target=/root/.m2 \\\n mvn dependency:go-offline dependency:resolve-plugins -B || true\nRUN --mount=type=cache,target=/root/.m2 \\\n mvn -f backend/pom.xml dependency:go-offline dependency:resolve-plugins -B || true\n\n# Step 3: Copy volatile assets and source code\nCOPY --from=frontend-build /app/frontend/dist /app/frontend/dist\nCOPY backend/src backend/src\n\n# Final package step also uses the cache mount\nRUN --mount=type=cache,target=/root/.m2 \\\n mvn -f backend/pom.xml clean package -DskipTests -Dcheckstyle.skip\n \nFrontend (NPM) Optimization \nSimilarly, for the Angular frontend, we use cache mounts for the NPM cache.
\nWORKDIR /app/frontend\nCOPY frontend/package*.json ./\nRUN --mount=type=cache,target=/root/.npm \\\n npm ci\n \n3. Key Improvements \n\nCache Mounts (BuildKit) : Persists ~/.m2 and ~/.npm across builds, preventing re-downloads even if pom.xml or package.json changes or previous layers are invalidated. \nSelective File Copying : By copying only configuration files first, we create layers that change infrequently. \nPre-fetching : Using mvn dependency:go-offline and dependency:resolve-plugins ensures most artifacts and plugins are available before the source code is copied. \nDelayed Configuration Copying : Secondary files like dependency-check-suppressions.xml are copied after the dependencies are cached. \nMulti-Module Support : The root pom.xml is copied to ensure Maven understands the project structure during the go-offline phase. \n \nComparative Analysis \n\n\n\nFeature \nUnoptimized Build \nOptimized Build \n \n \n\n\nSource code change \nRe-downloads all packages (~5-10 mins) \nRe-uses cached packages (~1-2 mins) \n \n\nDependency change \nRe-downloads all packages \nRe-downloads (expected) \n \n\nBuild Reliability \nVulnerable to network glitches \nDependencies are safely pre-fetched \n \n \n
\nBest Practices \n\nAlways use .dockerignore : Ensure large or unnecessary files (like local node_modules, target, or .git folders) are excluded from the Docker context. \nOrder matters : Place instructions that change frequently (like COPY src/) as late as possible in the Dockerfile. \nClean up in the same layer : If you install system packages (e.g., apk add), clean up caches in the same RUN command to keep image sizes small. \n ",
+ "admin-guide": "Admin Guide \nThis guide is intended for system administrators of the GoodOne application. Administrators have access to additional features for user management and system monitoring.
\nTable of Contents \n\nUser Administration \nSystem Logs \nRoles and Permissions \n \nUser Administration \nThe User Administration page allows you to manage all users in the system:\n- List Users : View a list of all registered users, including their login name, full name, email, and role.\n- Add User : Create a new user account manually by providing their personal details and assigning a role.\n- Edit User : Modify the details of an existing user. Note that you cannot change the login name once a user is created.\n- Delete User : Remove a user from the system. You cannot delete your own account.\n- View User (Read-only) : Users with the ROLE_ADMIN_READ role can view user details but cannot make changes.
\nSystem Logs \nThe System Logs page provides an audit trail of actions performed within the application:\n- Audit Trail : View logs including timestamp, user login, action performed, and additional details.\n- Filtering : Filter logs by action type (Login, Tasks, User Admin) and date range.\n- Sorting : Sort logs by timestamp.\n- Paging : Navigate through large sets of logs using the paginator.\n- Clear Logs : Administrators with full write access can clear all logs using the \"Clear All Logs\" button.
\nRoles and Permissions \nThe application uses the following roles to control access:\n- ROLE_USER : Standard user access. Can manage their own tasks and view their profile.\n- ROLE_ADMIN : Full administrative access. Can manage users, view all logs, and perform system-wide actions.\n- ROLE_ADMIN_READ : Read-only administrative access. Can view user lists and logs but cannot perform modifications or deletions.
",
+ "android-build": "To build the Android module locally, you have two primary options: using Android Studio (recommended) or the Command Line .
\n1. Using Android Studio (Recommended) \n\nOpen Android Studio . \nSelect Open and navigate to the android/ directory in the project root. \nWait for the IDE to sync with Gradle (this will automatically generate the missing Gradle wrapper files). \nGo to Build > Make Project . \nTo run the app, select an emulator or physical device and click the Run icon. \n \n2. Using the Command Line \nIf you have Gradle installed on your system:\n1. Open your terminal and navigate to the android/ directory.\n2. Run the following command:\n bash\n gradle assembleDebug\n3. The generated APK will be available at:\n android/app/build/outputs/apk/debug/app-debug.apk
\nImportant: Connecting to the Backend \n\nEmulator : The app is pre-configured to use http://10.0.2.2:8080/ to connect to a backend running on your host's localhost:8080. \nPhysical Device : You will need to update the baseUrl in android/app/src/main/java/ch/goodone/goodone/android/di/NetworkModule.kt to your computer's local IP address (e.g., http://192.168.1.15:8080/). \n \nDetailed instructions, including prerequisites and troubleshooting, can be found in Android Development .
\nThe main README.md has also been updated to include these instructions.
",
+ "backend-dev": "Backend Development \nThe backend is a robust Spring Boot application built with Java 21 and Spring Boot 4.
\nCore Technologies \n\nSpring Boot 4 : Framework for rapid application development. \nJava 21 : Utilizing the latest LTS features. \nSpring Data JPA : Persistent data storage with Hibernate. \nSpring Security : Role-based access control and secure endpoints. \nFlyway : Database migrations for version-controlled schema changes. \nMaven : Dependency management and build automation. \n \nDevelopment Setup \nTo run the backend locally:
\n\nPrerequisites : Ensure you have Java 21 and Maven installed. \nConfiguration : Create a .env file in the root directory (use .env.example as a template). \nRun with IntelliJ :\nOpen the project in IntelliJ IDEA. \nUse the EnvFile plugin to load the .env file. \nRun GoodoneBackendApplication. \n \n \nRun with Maven :\n bash\n mvn clean install\n cd backend\n mvn spring-boot:run \n \nDatabase \nH2 Database (Local Development) \nThe application uses H2 as the default database for local development and testing.
\n\nConsole URL : http://localhost:8080/h2-console \n\nSettings :
\n\nDriver Class : org.h2.Driver \nJDBC URL (Memory) : jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 (Default for local IDE runs) \nJDBC URL (File/Docker) : jdbc:h2:file:./data/goodone-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE (When using Docker or h2-file profile) \nUser Name : sa \nPassword : (leave empty) \n \nImportant : When accessing the H2 console, ensure the JDBC URL starts with jdbc:h2:. For example:\njdbc:h2:file:./data/goodone-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE (default for Docker if using ./data)\nor\njdbc:h2:file:./backend/data/goodone-v2;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE (default for local IDE/Maven runs)
\n \n \nResetting the Database \nIf the database file becomes corrupted (e.g., due to improper shutdown or concurrent access), you can reset it by deleting the corrupted files.
\nUsing PowerShell:
\n.\\scripts\\reset-db.ps1\n \nManual Reset: \nSimply delete the following files in the project root:\n- backend\\data\\goodone-v2.mv.db\n- backend\\data\\goodone-v2.trace.db (if present)
\nThe application will automatically recreate the schema and default data using Flyway on the next start.
\nNote : To access the console in a Docker environment, ensure you use the 8080 port directly.
\nSELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'PUBLIC'
\nSELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'PUBLIC'
\ndocker compose logs app | Select-String "jdbc:h2"\n \nDatabase JDBC URL [jdbc:h2:file:./data/testdb]
\njdbc:h2:file:./data/testdb;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE
\nSELECT * FROM ACTION_LOG;\n \nPostgreSQL \nSupported for production-like environments. See PostgreSQL Setup for details.
\nEmail Testing (Mailpit) \nThe application uses Mailpit for local email testing. This allows you to inspect outgoing emails (like verification or password recovery) without needing a real SMTP server.
\n\nWhen running with Docker Compose, the mailpit service is automatically started. To view sent emails, simply navigate to http://localhost:8025 in your browser.
\nLocal Development (IntelliJ/Maven) \nIf you are running the backend outside of Docker, you can still use the Mailpit container for SMTP. Ensure your environment variables or application.properties are configured as follows:
\nSPRING_MAIL_HOST=localhost\nSPRING_MAIL_PORT=1025\nSPRING_MAIL_AUTH=false\nSPRING_MAIL_STARTTLS=false\n \nAPI Documentation \n\nOpenAPI/Swagger : Explore the API endpoints at http://localhost:8080/swagger-ui.html (when enabled). \nREST Principles : The backend follows standard RESTful principles using DTOs for data transfer. \n \nTesting \n\nJUnit 5 & MockMvc : For controller and service layer testing. \nHigh Coverage : We aim for >80% test coverage. \n \nRun tests:
\nmvn test\n ",
+ "postgres-setup": "I have added the PostgreSQL configuration to the project. This includes the necessary driver dependency and a dedicated properties file.
\n1. New Configuration File \nAn additional configuration file has been created at:\nbackend/src/main/resources/application-postgres.properties
\nThis file is configured to connect to a local PostgreSQL instance:\n* URL : jdbc:postgresql://localhost:5432/goodone\n* Username/Password : postgres / postgres (Default)\n* DDL Auto : update (Automatically manages the schema)
\nTo use this configuration when starting the application, you can set the active profile:\n* Via IntelliJ : Add -Dspring.profiles.active=postgres to the VM options.\n* Via CLI : java -jar app.jar --spring.profiles.active=postgres
\n2. PostgreSQL Setup Instructions \nFollow these steps to prepare your local PostgreSQL database:
\nStep A: Install PostgreSQL \nEnsure PostgreSQL is installed and running on your system. You can download it from postgresql.org .
\nStep B: Create the Database \nOpen your terminal or a tool like pgAdmin or psql and execute the following commands:
\n-- Connect as the default postgres user\n-- Create the database used in the properties file\nCREATE DATABASE goodone;\n \nStep C: Database Schema Initialization \nYou do not need to manually create tables or the schema. \nThe application is configured with spring.jpa.hibernate.ddl-auto=update. When you start the Spring Boot application with the postgres profile active:\n1. Hibernate will connect to the goodone database.\n2. It will automatically detect the entities (User, Task) defined in the code.\n3. It will create the corresponding tables (users, tasks) and constraints (unique emails, etc.) if they do not exist.
\n3. Project Updates \n\nUpdated backend/pom.xml to include the org.postgresql:postgresql runtime dependency. \nThe DataInitializer remains active and will populate your local PostgreSQL database with sample admin and user accounts upon the first successful startup. \n ",
"frontend-dev": "Frontend Development \nThe frontend is a modern Angular application built with Angular 21.
\nKey Technologies \n\nStandalone Components : Modular and reusable component architecture. \nSignals : Reactive state management using Angular Signals. \nAngular Material : UI components following Material Design principles. \nModern Control Flow : Using @if, @for, and @empty. \n \nDevelopment Setup \nTo run the frontend locally:\n1. Navigate to the frontend/ directory.\n2. Run npm install.\n3. Run npm start.\n4. The application will be available at http://localhost:4200 (or http://localhost if using the proxy).
\nTesting \n\nUnit Tests : Vitest for component and service testing. \nE2E Tests : Playwright for comprehensive end-to-end testing and documentation screenshot automation. \n \nRun unit tests:
\nnpm test\n \nRun Playwright tests:
\nnpx playwright test\n \nDocumentation Screenshots \nThe documentation screenshots in doc/user-guide/workflows/assets are automatically generated using Playwright. This ensures they stay up-to-date with the latest UI.
\nTo regenerate the screenshots:\n1. Ensure the application is running (or the Playwright webServer is configured).\n2. Run the following command in the frontend/ directory:
\nnpx playwright test registration-docs forgot-password-docs --project=no-auth\n \nFor more details, see Updating Documentation Screenshots .
\nRun lint:
\nnpm run lint\n ",
- "deployment": "Deployment & Infrastructure \nAngularAI is designed to be easily deployable using containerization and cloud services.
\nDocker \nThe application is containerized using a single multi-stage Dockerfile. For details on how we optimized build times, see Docker Build Optimization .
\nThe docker-compose.yml file in the root directory orchestrates the services:\n- app : The unified Spring Boot + Angular application.\n- mailpit : A local email testing server.
\nLocal Deployment \nTo start the stack locally:
\ndocker compose up --build\n \nThe application will be available at:\n- Frontend/API : http://localhost or http://localhost:8080\n- Mailpit Web UI : http://localhost:8025\n- H2 Console : http://localhost:8080/h2-console
\nAWS Deployment \nThe project includes scripts and documentation for deploying to AWS using ECS Fargate.
\nPrerequisites \n\nAWS CLI configured with appropriate permissions. \nDocker installed and running. \nAn ECR repository created for the application image. \n \nDeployment Process \n\nBuild and Push : Use the provided scripts in scripts/ to build and push images to ECR. \n.\\scripts\\deploy-aws.ps1 \nECS Service Update : The script also triggers a new deployment on the ECS services. \n \nFor detailed AWS setup and Fargate configuration, refer to AWS Fargate Deployment .
\nCI/CD \nContinuous Integration and Deployment are handled via GitHub Actions.\n- Build & Test : Triggered on every push and pull request.\n- SonarCloud : Static analysis and quality gate checks.\n- Automated Deployment : Configurable to deploy to AWS on successful master branch builds.
",
+ "deployment": "Deployment & Infrastructure \nGoodOne is designed to be easily deployable using containerization and cloud services.
\nDocker \nThe application is containerized using a single multi-stage Dockerfile. For details on how we optimized build times, see Docker Build Optimization .
\nThe docker-compose.yml file in the root directory orchestrates the services:\n- app : The unified Spring Boot + Angular application.\n- mailpit : A local email testing server.
\nLocal Deployment \nTo start the stack locally:
\ndocker compose up --build\n \nThe application will be available at:\n- Frontend/API : http://localhost or http://localhost:8080\n- Mailpit Web UI : http://localhost:8025\n- H2 Console : http://localhost:8080/h2-console
\nAWS Deployment \nThe project includes scripts and documentation for deploying to AWS using ECS Fargate.
\nPrerequisites \n\nAWS CLI configured with appropriate permissions. \nDocker installed and running. \nAn ECR repository created for the application image. \n \nDeployment Process \n\nBuild and Push : Use the provided scripts in scripts/ to build and push images to ECR. \n.\\scripts\\deploy-aws.ps1 \nECS Service Update : The script also triggers a new deployment on the ECS services. \n \nFor detailed AWS setup and Fargate configuration, refer to AWS Fargate Deployment .
\nCI/CD \nContinuous Integration and Deployment are handled via GitHub Actions.\n- Build & Test : Triggered on every push and pull request.\n- SonarCloud : Static analysis and quality gate checks.\n- Automated Deployment : Configurable to deploy to AWS on successful master branch builds.
",
"md-to-confluence": "import markdown\nimport requests\nimport json\nimport os\n\n# Configuration\nCONFLUENCE_URL = "https://your-domain.atlassian.net/wiki/rest/api/content"\nUSERNAME = "your-email@example.com"\nAPI_TOKEN = "your-api-token"\nSPACE_KEY = "DOC"\nPARENT_PAGE_ID = "12345" # Optional: ID of the parent page\n\ndef md_to_confluence_storage(md_file_path):\n """\n Converts a Markdown file to HTML which is compatible with Confluence Storage Format.\n Note: Standard HTML is often accepted by Confluence API, but some macros might need special tags.\n """\n with open(md_file_path, 'r', encoding='utf-8') as f:\n md_content = f.read()\n\n # Convert Markdown to HTML\n html_content = markdown.markdown(md_content, extensions=['extra', 'toc'])\n return html_content\n\ndef post_to_confluence(title, html_content, page_id=None):\n """\n Posts content to Confluence. If page_id is provided, it updates the page.\n """\n headers = {\n "Accept": "application/json",\n "Content-Type": "application/json"\n }\n\n auth = (USERNAME, API_TOKEN)\n\n data = {\n "type": "page",\n "title": title,\n "space": {"key": SPACE_KEY},\n "body": {\n "storage": {\n "value": html_content,\n "representation": "storage"\n }\n }\n }\n\n if PARENT_PAGE_ID:\n data["ancestors"] = [{"id": PARENT_PAGE_ID}]\n\n if page_id:\n # Update existing page (needs version increment)\n # First, get current version\n resp = requests.get(f"{CONFLUENCE_URL}/{page_id}?expand=version", auth=auth)\n version = resp.json()['version']['number'] + 1\n data["version"] = {"number": version}\n url = f"{CONFLUENCE_URL}/{page_id}"\n response = requests.put(url, data=json.dumps(data), headers=headers, auth=auth)\n else:\n # Create new page\n url = CONFLUENCE_URL\n response = requests.post(url, data=json.dumps(data), headers=headers, auth=auth)\n\n return response.status_code, response.text\n\nif __name__ == "__main__":\n docs = [\n ("User Guide", "doc/userguide/user-guide.md"),\n ("Admin Guide", "doc/userguide/admin-guide.md"),\n ("FAQ", "doc/userguide/faq.md")\n ]\n\n print("This script is a proposal. Please configure your Confluence credentials before running.")\n # for title, path in docs:\n # if os.path.exists(path):\n # print(f"Converting {path}...")\n # storage_format = md_to_confluence_storage(path)\n # # status, text = post_to_confluence(title, storage_format)\n # # print(f"Status: {status}")\n\n "
-}
\ No newline at end of file
+}
diff --git a/frontend/public/assets/help/help-data.json b/frontend/public/assets/help/help-data.json
index 31751138a..742cde252 100644
--- a/frontend/public/assets/help/help-data.json
+++ b/frontend/public/assets/help/help-data.json
@@ -1,6 +1,6 @@
{
- "readme": "AngularAI Application \nThis is a full-stack application with a Spring Boot backend and an Angular frontend.
\nPrerequisites \n\nRunning with Docker \nTo run the entire application using Docker Compose, navigate to the root directory and run:
\ndocker compose up --build\n \nThe application will be available at:\n- Frontend: http://localhost \n- Backend API: http://localhost:8080/api \n- H2 Console: http://localhost:8080/h2-console (JDBC URL: jdbc:h2:mem:testdb)
\nDeployment Scripts \nScripts are available in the scripts/ folder for common deployment tasks (PowerShell and Windows CMD):
\n\nLocal Docker Deployment : .\\scripts\\deploy-local.ps1 or .\\scripts\\deploy-local.bat \nRuns docker compose up --build -d to start the application locally in the background. \nAWS Deployment : .\\scripts\\deploy-aws.ps1 or .\\scripts\\deploy-aws.bat \nAuthenticates with AWS ECR, builds, tags, and pushes frontend and backend images, and forces a new deployment on ECS services. \n \nProject Structure \n\nbackend/: Spring Boot application. \nfrontend/: Angular application. \nandroid/: Android Jetpack Compose application. \ndocker-compose.yml: Orchestration for both services. \n \nDevelopment \nBackend \nNavigate to backend/ and run ./mvnw spring-boot:run.
\nFrontend (Web) \nNavigate to frontend/ and run npm install and then npm start.\nThe Angular development server is configured to proxy /api requests to http://localhost:8080. Ensure the backend is running.
\nDocumentation \n",
- "user-guide": "User Guide \nWelcome to the AngularAI User Guide. This document provides instructions on how to use the frontend application features.
\nTable of Contents \n\nGetting Started \nDashboard \nTask Management \nUser Profile \nLogout \n \nGetting Started \nTo access the application, navigate to the frontend URL (typically http://localhost). You will be prompted to log in. If you don't have an account, you can register a new one.
\nLogin \nEnter your username and password to access your account.
\nRegistration \nIf you are a new user, click on the \"Register\" link. Provide your first name, last name, desired login, email address, and password.
\nDashboard \nThe Dashboard provides an overview of your activities and the system status:\n- Summary Cards : Quick stats on Open Tasks, Active Users, Completed Tasks, and Today's Logs.\n- Task Overview : A visual distribution of tasks by status (Open, In Progress, Completed).\n- Recent Activity : A list of the latest actions performed in the system.\n- Priority Tasks : A list of high-priority tasks that need your attention.
\nTask Management \nThe Task Management page allows you to organize your work:\n- Add Task : Click the \"Add Task\" button to create a new task. You can specify a title, description, due date, priority, and status.\n- Filter and Sort : Filter tasks by status (Open, In Progress, Completed) or reset sorting to view them by priority.\n- Edit Task : Click the edit icon on a task card to modify its details.\n- Delete Task : Click the delete icon to remove a task.\n- Drag and Drop : You can reorder tasks by dragging them using the handle (available when not filtering).
\nUser Profile \nIn the Profile section, you can view your personal details, including your name, email, and assigned role.
\nLogout \nTo securely leave the application, click the \"Logout\" button in the side navigation menu.
",
- "admin-guide": "Admin Guide \nThis guide is intended for system administrators of the AngularAI application. Administrators have access to additional features for user management and system monitoring.
\nTable of Contents \n\nUser Administration \nSystem Logs \nRoles and Permissions \n \nUser Administration \nThe User Administration page allows you to manage all users in the system:\n- List Users : View a list of all registered users, including their login name, full name, email, and role.\n- Add User : Create a new user account manually by providing their personal details and assigning a role.\n- Edit User : Modify the details of an existing user. Note that you cannot change the login name once a user is created.\n- Delete User : Remove a user from the system. You cannot delete your own account.\n- View User (Read-only) : Users with the ROLE_ADMIN_READ role can view user details but cannot make changes.
\nSystem Logs \nThe System Logs page provides an audit trail of actions performed within the application:\n- Audit Trail : View logs including timestamp, user login, action performed, and additional details.\n- Filtering : Filter logs by action type (Login, Tasks, User Admin) and date range.\n- Sorting : Sort logs by timestamp.\n- Paging : Navigate through large sets of logs using the paginator.\n- Clear Logs : Administrators with full write access can clear all logs using the \"Clear All Logs\" button.
\nRoles and Permissions \nThe application uses the following roles to control access:\n- ROLE_USER : Standard user access. Can manage their own tasks and view their profile.\n- ROLE_ADMIN : Full administrative access. Can manage users, view all logs, and perform system-wide actions.\n- ROLE_ADMIN_READ : Read-only administrative access. Can view user lists and logs but cannot perform modifications or deletions.
",
- "faq": "Frequently Asked Questions (FAQ) \nGeneral \nQ: What is AngularAI? \nA: AngularAI is a task management application featuring a modern Angular frontend, a Spring Boot backend, and an Android mobile app.
\nQ: How do I get started? \nA: Register for an account, log in, and start creating tasks on the Task Management page.
\nAccounts and Security \nQ: I forgot my password. How can I reset it? \nA: Currently, password reset must be handled by an administrator. Please contact your system administrator.
\nQ: Can I change my role? \nA: User roles can only be changed by an administrator via the User Administration panel.
\nTask Management \nQ: Can I reorder my tasks? \nA: Yes, you can use the drag handle on the left side of each task card to reorder them manually. Note that manual reordering is disabled when a status filter is active.
\nQ: What do the different task priorities mean? \nA:\n- High : Urgent tasks that should be addressed immediately.\n- Medium : Important tasks that should be completed soon.\n- Low : Non-urgent tasks.
\nTroubleshooting \nQ: The application is not loading. What should I do? \nA: Ensure that both the backend and frontend services are running. If you are using Docker, run docker compose up to start all services.
\nQ: I am getting an \"Access Denied\" error. \nA: This error occurs if you try to access a page for which you do not have the required permissions (e.g., trying to access User Administration as a regular user).
"
+ "readme": "GoodOne Application \nThis is a full-stack application with a Spring Boot backend and an Angular frontend.
\nPrerequisites \n\nRunning with Docker \nTo run the entire application using Docker Compose, navigate to the root directory and run:
\ndocker compose up --build\n \nThe application will be available at:\n- Frontend: http://localhost \n- Backend API: http://localhost:8080/api \n- H2 Console: http://localhost:8080/h2-console (JDBC URL: jdbc:h2:mem:testdb)
\nDeployment Scripts \nScripts are available in the scripts/ folder for common deployment tasks (PowerShell and Windows CMD):
\n\nLocal Docker Deployment : .\\scripts\\deploy-local.ps1 or .\\scripts\\deploy-local.bat \nRuns docker compose up --build -d to start the application locally in the background. \nAWS Deployment : .\\scripts\\deploy-aws.ps1 or .\\scripts\\deploy-aws.bat \nAuthenticates with AWS ECR, builds, tags, and pushes frontend and backend images, and forces a new deployment on ECS services. \n \nProject Structure \n\nbackend/: Spring Boot application. \nfrontend/: Angular application. \nandroid/: Android Jetpack Compose application. \ndocker-compose.yml: Orchestration for both services. \n \nDevelopment \nBackend \nNavigate to backend/ and run ./mvnw spring-boot:run.
\nFrontend (Web) \nNavigate to frontend/ and run npm install and then npm start.\nThe Angular development server is configured to proxy /api requests to http://localhost:8080. Ensure the backend is running.
\nDocumentation \n",
+ "user-guide": "User Guide \nWelcome to the GoodOne User Guide. This document provides instructions on how to use the frontend application features.
\nTable of Contents \n\nGetting Started \nDashboard \nTask Management \nUser Profile \nLogout \n \nGetting Started \nTo access the application, navigate to the frontend URL (typically http://localhost). You will be prompted to log in. If you don't have an account, you can register a new one.
\nLogin \nEnter your username and password to access your account.
\nRegistration \nIf you are a new user, click on the \"Register\" link. Provide your first name, last name, desired login, email address, and password.
\nDashboard \nThe Dashboard provides an overview of your activities and the system status:\n- Summary Cards : Quick stats on Open Tasks, Active Users, Completed Tasks, and Today's Logs.\n- Task Overview : A visual distribution of tasks by status (Open, In Progress, Completed).\n- Recent Activity : A list of the latest actions performed in the system.\n- Priority Tasks : A list of high-priority tasks that need your attention.
\nTask Management \nThe Task Management page allows you to organize your work:\n- Add Task : Click the \"Add Task\" button to create a new task. You can specify a title, description, due date, priority, and status.\n- Filter and Sort : Filter tasks by status (Open, In Progress, Completed) or reset sorting to view them by priority.\n- Edit Task : Click the edit icon on a task card to modify its details.\n- Delete Task : Click the delete icon to remove a task.\n- Drag and Drop : You can reorder tasks by dragging them using the handle (available when not filtering).
\nUser Profile \nIn the Profile section, you can view your personal details, including your name, email, and assigned role.
\nLogout \nTo securely leave the application, click the \"Logout\" button in the side navigation menu.
",
+ "admin-guide": "Admin Guide \nThis guide is intended for system administrators of the GoodOne application. Administrators have access to additional features for user management and system monitoring.
\nTable of Contents \n\nUser Administration \nSystem Logs \nRoles and Permissions \n \nUser Administration \nThe User Administration page allows you to manage all users in the system:\n- List Users : View a list of all registered users, including their login name, full name, email, and role.\n- Add User : Create a new user account manually by providing their personal details and assigning a role.\n- Edit User : Modify the details of an existing user. Note that you cannot change the login name once a user is created.\n- Delete User : Remove a user from the system. You cannot delete your own account.\n- View User (Read-only) : Users with the ROLE_ADMIN_READ role can view user details but cannot make changes.
\nSystem Logs \nThe System Logs page provides an audit trail of actions performed within the application:\n- Audit Trail : View logs including timestamp, user login, action performed, and additional details.\n- Filtering : Filter logs by action type (Login, Tasks, User Admin) and date range.\n- Sorting : Sort logs by timestamp.\n- Paging : Navigate through large sets of logs using the paginator.\n- Clear Logs : Administrators with full write access can clear all logs using the \"Clear All Logs\" button.
\nRoles and Permissions \nThe application uses the following roles to control access:\n- ROLE_USER : Standard user access. Can manage their own tasks and view their profile.\n- ROLE_ADMIN : Full administrative access. Can manage users, view all logs, and perform system-wide actions.\n- ROLE_ADMIN_READ : Read-only administrative access. Can view user lists and logs but cannot perform modifications or deletions.
",
+ "faq": "Frequently Asked Questions (FAQ) \nGeneral \nQ: What is GoodOne? \nA: GoodOne is a task management application featuring a modern Angular frontend, a Spring Boot backend, and an Android mobile app.
\nQ: How do I get started? \nA: Register for an account, log in, and start creating tasks on the Task Management page.
\nAccounts and Security \nQ: I forgot my password. How can I reset it? \nA: Currently, password reset must be handled by an administrator. Please contact your system administrator.
\nQ: Can I change my role? \nA: User roles can only be changed by an administrator via the User Administration panel.
\nTask Management \nQ: Can I reorder my tasks? \nA: Yes, you can use the drag handle on the left side of each task card to reorder them manually. Note that manual reordering is disabled when a status filter is active.
\nQ: What do the different task priorities mean? \nA:\n- High : Urgent tasks that should be addressed immediately.\n- Medium : Important tasks that should be completed soon.\n- Low : Non-urgent tasks.
\nTroubleshooting \nQ: The application is not loading. What should I do? \nA: Ensure that both the backend and frontend services are running. If you are using Docker, run docker compose up to start all services.
\nQ: I am getting an \"Access Denied\" error. \nA: This error occurs if you try to access a page for which you do not have the required permissions (e.g., trying to access User Administration as a regular user).
"
}
\ No newline at end of file
diff --git a/frontend/public/assets/i18n/de-ch.json b/frontend/public/assets/i18n/de-ch.json
index 8f14903f7..5fefe520a 100644
--- a/frontend/public/assets/i18n/de-ch.json
+++ b/frontend/public/assets/i18n/de-ch.json
@@ -90,7 +90,17 @@
"AI_COST": "KI-Kosten-Dashboard"
}
},
+ "FOOTER": {
+ "COPYRIGHT": "© 2026 GoodOne – KI-gestützte Softwareentwicklungs-Demo",
+ "SOURCE": "Quellcode auf GitHub"
+ },
"RECAPTCHA_LOCAL_FALLBACK": "Das reCAPTCHA-Skript konnte auf localhost nicht geladen werden. Um die Entwicklung zu erleichtern, verwendet das System einen Dummy-Fallback. Wenn Sie echtes reCAPTCHA testen möchten, überprüfen Sie Ihren Ad-Blocker oder die CSP-Einstellungen.",
+ "LANDING": {
+ "HERO_TITLE": "GoodOne",
+ "HERO_SUBTITLE": "KI-gestützte Engineering Intelligence",
+ "HERO_DESCRIPTION": "KI-gestützte Plattform zur Analyse von Architektur, Entwicklungs-Workflows und Engineering-Risiken. Vollständig mit KI erstellt.",
+ "GITHUB_EXPLORE_CTA": "⭐ Code auf GitHub erkunden"
+ },
"PROMO": {
"TITLE": "Erkunden Sie die KI-Demo-Plattform",
"SUBTITLE": "Entdecken Sie die Live-Demo, überprüfen Sie die Architektur und inspizieren Sie den Quellcode hinter der KI-gesteuerten Plattform.",
@@ -117,7 +127,7 @@
"LOGIN_EXPLORE": "Melden Sie sich an, um KI-Funktionen live zu erkunden.",
"REGISTER_EXPLORE": "Erstellen Sie ein Konto, um KI-Funktionen live zu erkunden.",
"VALUE_STRIP": "Live-KI-Funktionen • Architektur-bewusst • Demo-bereit",
- "TAGLINE": "KI-gestützte Aufgaben-Intelligenz",
+ "TAGLINE": "KI-gestützte Engineering Intelligence",
"FEATURES_ENABLED": "KI-Features aktiviert"
},
"RISK_RADAR": {
@@ -579,8 +589,8 @@
"LEGAL": {
"TITLE": "Impressum & Datenschutz",
"IMPRINT_TITLE": "Impressum",
- "IMPRINT_CONTENT": "AngularAI Testprojekt\nInhaber: Jürg Good\n\nDiese Website dient ausschliesslich Test- und Demonstrationszwecken.",
- "IMPRINT_CONTENT_FULL": "AngularAI Testprojekt\nInhaber: Jürg Good\nAdresse: [Ihre Adresse, Schweiz]\n\nDiese Website dient ausschliesslich Test- und Demonstrationszwecken.",
+ "IMPRINT_CONTENT": "GoodOne – Plattform für KI-gestützte Softwareentwicklung\nInhaber: Jürg Good\nSchweiz\n\nGoodOne ist eine experimentelle Demonstrationsplattform für KI-unterstützte Softwareentwicklungsprozesse.",
+ "IMPRINT_CONTENT_FULL": "GoodOne – Plattform für KI-gestützte Softwareentwicklung\nInhaber: Jürg Good\nSchweiz\nWebsite: https://goodone.ch\n\nGoodOne ist eine öffentliche Demonstrations- und Forschungsplattform für KI-gestützte Softwareentwicklungsprozesse.\n\nDie Anwendung demonstriert Konzepte wie AI-gestütztes Task-Parsing, Architektur-Analyse, Dokumentationsintelligenz sowie Automatisierung von Entwicklungsprozessen.\n\nDie Plattform dient hauptsächlich Demonstrations-, Experimentier- und Ausbildungszwecken.\n\nÜber diese Website werden keine kommerziellen Dienstleistungen angeboten.\n\nEine Haftung für Schäden aus der Nutzung dieser Website wird im gesetzlich zulässigen Rahmen nach Schweizer Recht ausgeschlossen.",
"PRIVACY_TITLE": "Datenschutzerklärung",
"PRIVACY_CONTENT": "Diese Anwendung erhebt personenbezogene Daten (Name, E-Mail) für die Kontoverwaltung. Wir verwenden Google Analytics und Microsoft Clarity zur Nutzungsanalyse. Die Datenverarbeitung erfolgt gemäss Schweizer DSG und EU-DSGVO. Sie haben das Recht auf Auskunft, Berichtigung oder Löschung Ihrer Daten über Ihr Profil.",
"TERMS_TITLE": "Nutzungsbedingungen",
@@ -667,7 +677,7 @@
},
"ARCHITECTURE_PAGE": {
"HERO_TITLE": "Architektur-Übersicht",
- "HERO_SUBTITLE": "Verstehen Sie, wie AngularAI aufgebaut ist: Frontend, Backend, KI-Flow, Datenmodell und die Überlegungen hinter dem Design.",
+ "HERO_SUBTITLE": "Verstehen Sie, wie GoodOne aufgebaut ist: Frontend, Backend, KI-Flow, Datenmodell und die Überlegungen hinter dem Design.",
"CTA_ASK": "Architektur-Q&A fragen",
"CTA_DOCS": "Technische Dokumentation durchsuchen",
"SUMMARY_TITLE": "Architektur-Zusammenfassung",
@@ -702,7 +712,7 @@
},
"FEATURES_PAGE": {
"HERO_TITLE": "KI-Funktionen",
- "HERO_SUBTITLE": "Entdecken Sie die intelligenten Funktionen, die bereits in AngularAI implementiert sind, von Architektur-Argumentation bis hin zu Risikoerkennung und Retrospektiven.",
+ "HERO_SUBTITLE": "Entdecken Sie die intelligenten Funktionen, die bereits in GoodOne implementiert sind, von Architektur-Argumentation bis hin zu Risikoerkennung und Retrospektiven.",
"CTA_DEMO": "Demo ausprobieren",
"CTA_GITHUB": "Quellcode ansehen",
"GRID_TITLE": "KI-Kernfunktionen",
diff --git a/frontend/public/assets/i18n/en.json b/frontend/public/assets/i18n/en.json
index cada8c85b..08f0617f6 100644
--- a/frontend/public/assets/i18n/en.json
+++ b/frontend/public/assets/i18n/en.json
@@ -90,7 +90,17 @@
"AI_COST": "AI Cost Dashboard"
}
},
+ "FOOTER": {
+ "COPYRIGHT": "© 2026 GoodOne – AI Software Engineering Demo",
+ "SOURCE": "Source on GitHub"
+ },
"RECAPTCHA_LOCAL_FALLBACK": "reCAPTCHA script failed to load on localhost. To avoid development friction, the system is using a dummy fallback. If you need to test real reCAPTCHA, check your ad-blocker or CSP settings.",
+ "LANDING": {
+ "HERO_TITLE": "GoodOne",
+ "HERO_SUBTITLE": "AI-powered engineering intelligence",
+ "HERO_DESCRIPTION": "AI-powered platform analyzing architecture, development workflows and engineering risks. Built entirely with AI.",
+ "GITHUB_EXPLORE_CTA": "⭐ Explore the Code on GitHub"
+ },
"PROMO": {
"TITLE": "Explore the AI Demo Platform",
"SUBTITLE": "Discover the live demo, review the architecture, and inspect the source code behind the AI-powered platform.",
@@ -117,7 +127,7 @@
"LOGIN_EXPLORE": "Sign in to explore AI features live.",
"REGISTER_EXPLORE": "Create an account to explore AI features live.",
"VALUE_STRIP": "Live AI features • Architecture-aware • Demo-ready",
- "TAGLINE": "AI-powered task intelligence",
+ "TAGLINE": "AI-powered engineering intelligence",
"FEATURES_ENABLED": "AI features enabled"
},
"RISK_RADAR": {
@@ -579,8 +589,8 @@
"LEGAL": {
"TITLE": "Legal Notice & Privacy Policy",
"IMPRINT_TITLE": "Imprint (Impressum)",
- "IMPRINT_CONTENT": "AngularAI Test Project\nOwner: Jürg Good\n\nThis website is for testing and demonstration purposes only.",
- "IMPRINT_CONTENT_FULL": "AngularAI Test Project\nOwner: [Your Name/Organization]\nAddress: [Your Address, Switzerland]\n\nThis website is for testing and demonstration purposes only.",
+ "IMPRINT_CONTENT": "GoodOne – AI Software Engineering Demo Platform\nOwner: Jürg Good\nSwitzerland\n\nGoodOne is an experimental demonstration platform for AI-assisted software engineering workflows.",
+ "IMPRINT_CONTENT_FULL": "GoodOne – AI Software Engineering Demo Platform\nOwner: Jürg Good\nSwitzerland\nWebsite: https://goodone.ch\n\nGoodOne is a public demonstration and research platform exploring AI-assisted software engineering workflows.\n\nThe application showcases concepts such as AI-assisted task parsing, architecture analysis, documentation intelligence, and engineering workflow automation.\n\nThis platform is provided primarily for demonstration, experimentation, and educational purposes.\n\nNo commercial services are offered through this site.\n\nLiability for damages resulting from the use of this website is excluded to the extent permitted by Swiss law.",
"PRIVACY_TITLE": "Privacy Policy",
"PRIVACY_CONTENT": "This application collects personal data (name, email) for account management. We use Google Analytics and Microsoft Clarity for usage analysis. Data is handled in accordance with Swiss nFADP and EU GDPR. You have the right to access, correct, or delete your data via your profile.",
"TERMS_TITLE": "Terms of Use",
@@ -667,7 +677,7 @@
},
"ARCHITECTURE_PAGE": {
"HERO_TITLE": "Architecture Overview",
- "HERO_SUBTITLE": "Understand how AngularAI is built: frontend, backend, AI flow, data model, and the reasoning behind the design.",
+ "HERO_SUBTITLE": "Understand how GoodOne is built: frontend, backend, AI flow, data model, and the reasoning behind the design.",
"CTA_ASK": "Ask Architecture Q&A",
"CTA_DOCS": "Browse Technical Docs",
"SUMMARY_TITLE": "Architecture Summary",
@@ -702,7 +712,7 @@
},
"FEATURES_PAGE": {
"HERO_TITLE": "AI Features",
- "HERO_SUBTITLE": "Explore the intelligent capabilities already implemented in AngularAI, from architecture reasoning to risk detection and retrospectives.",
+ "HERO_SUBTITLE": "Explore the intelligent capabilities already implemented in GoodOne, from architecture reasoning to risk detection and retrospectives.",
"CTA_DEMO": "Try the Demo",
"CTA_GITHUB": "View Source Code",
"GRID_TITLE": "Core AI Capabilities",
diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html
index 3a2f91d2a..599a9ad12 100644
--- a/frontend/src/app/app.component.html
+++ b/frontend/src/app/app.component.html
@@ -1,5 +1,6 @@
+
diff --git a/frontend/src/app/app.config.ts b/frontend/src/app/app.config.ts
index 746577379..55ca52165 100644
--- a/frontend/src/app/app.config.ts
+++ b/frontend/src/app/app.config.ts
@@ -31,7 +31,7 @@ export const appConfig: ApplicationConfig = {
),
provideAnimations(),
provideTranslateService({
- defaultLanguage: 'en'
+ fallbackLang: 'en'
}),
provideTranslateHttpLoader({
prefix: './assets/i18n/',
diff --git a/frontend/src/app/app.ts b/frontend/src/app/app.ts
index 67046a17b..76ecd14b5 100644
--- a/frontend/src/app/app.ts
+++ b/frontend/src/app/app.ts
@@ -1,6 +1,7 @@
import { Component, signal, effect, inject } from '@angular/core';
import { RouterOutlet, Router, NavigationEnd } from '@angular/router';
import { SidenavComponent } from './components/layout/sidenav.component';
+import { FooterComponent } from './components/layout/footer.component';
import { ErrorBoundaryComponent } from './components/error-boundary/error-boundary.component';
import { AuthService } from './services/auth.service';
import { filter } from 'rxjs';
@@ -15,6 +16,7 @@ declare const clarity: { (command: string, ...args: unknown[]): void; q?: unknow
imports: [
RouterOutlet,
SidenavComponent,
+ FooterComponent,
ErrorBoundaryComponent
],
templateUrl: './app.component.html',
@@ -44,7 +46,7 @@ export class App {
// Identify user in Microsoft Clarity
if (this.shouldTrack() && typeof clarity === 'function') {
if (user) {
- clarity('identify', user.login, user.firstName + ' ' + user.lastName, 'AngularAI', user.email);
+ clarity('identify', user.login, user.firstName + ' ' + user.lastName, 'GoodOne', user.email);
clarity('set', 'user_role', user.role || 'ROLE_USER');
} else {
// No direct "un-identify" in Clarity, but we can set a guest status
@@ -99,7 +101,7 @@ export class App {
if (path.startsWith('/reset-password')) return this.translate.instant('NAV.PAGE_TITLE.RESET_PASSWORD');
if (path.startsWith('/verify')) return this.translate.instant('NAV.PAGE_TITLE.VERIFY');
- return 'AngularAI';
+ return 'GoodOne';
}
protected readonly title = signal('frontend');
diff --git a/frontend/src/app/components/ai-credit-request/ai-credit-request-list.component.html b/frontend/src/app/components/ai-credit-request/ai-credit-request-list.component.html
index 92c445ce6..6c02bdf55 100644
--- a/frontend/src/app/components/ai-credit-request/ai-credit-request-list.component.html
+++ b/frontend/src/app/components/ai-credit-request/ai-credit-request-list.component.html
@@ -32,7 +32,7 @@ {{ 'ADMIN_AI.REQUESTS.TITLE' | translate }}
{{ 'ADMIN_AI.REQUESTS.STATUS' | translate }}
-
+
{{ 'ADMIN_AI.REQUESTS.' + request.status | translate }}
diff --git a/frontend/src/app/components/dashboard/dashboard.component.html b/frontend/src/app/components/dashboard/dashboard.component.html
index 872d8c4f5..1da187a16 100644
--- a/frontend/src/app/components/dashboard/dashboard.component.html
+++ b/frontend/src/app/components/dashboard/dashboard.component.html
@@ -1,5 +1,6 @@
@if (isLoading() && !vm()) {
+
@for (i of [1,2,3,4]; track i) {
@@ -51,6 +52,7 @@
} @else if (vm(); as data) {
+
@if (systemInfo() && !systemInfo()?.aiEnabled) {
diff --git a/frontend/src/app/components/dashboard/dashboard.component.ts b/frontend/src/app/components/dashboard/dashboard.component.ts
index 74af00501..cd9066130 100644
--- a/frontend/src/app/components/dashboard/dashboard.component.ts
+++ b/frontend/src/app/components/dashboard/dashboard.component.ts
@@ -19,6 +19,7 @@ import { SystemService, SystemInfo } from '../../services/system.service';
import { Task } from '../../models/task.model';
import { DashboardMetricComponent } from '../shared/dashboard-metric/dashboard-metric.component';
import { SkeletonComponent } from '../shared/skeleton/skeleton.component';
+import { PageHeaderComponent } from '../shared/page-header/page-header.component';
@Component({
selector: 'app-dashboard',
@@ -38,7 +39,8 @@ import { SkeletonComponent } from '../shared/skeleton/skeleton.component';
TranslateModule,
RouterLink,
DashboardMetricComponent,
- SkeletonComponent
+ SkeletonComponent,
+ PageHeaderComponent
],
templateUrl: './dashboard.component.html',
styleUrl: './dashboard.component.css'
diff --git a/frontend/src/app/components/layout/footer.component.css b/frontend/src/app/components/layout/footer.component.css
new file mode 100644
index 000000000..ff62e0083
--- /dev/null
+++ b/frontend/src/app/components/layout/footer.component.css
@@ -0,0 +1,23 @@
+.app-footer {
+ margin-top: 48px;
+ padding: 18px 0;
+ border-top: 1px solid var(--border);
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+
+.footer-inner {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 14px;
+}
+
+.footer-link {
+ color: var(--text-muted);
+ text-decoration: none;
+}
+
+.footer-link:hover {
+ text-decoration: underline;
+}
diff --git a/frontend/src/app/components/layout/footer.component.html b/frontend/src/app/components/layout/footer.component.html
new file mode 100644
index 000000000..6526bd54b
--- /dev/null
+++ b/frontend/src/app/components/layout/footer.component.html
@@ -0,0 +1,19 @@
+
diff --git a/frontend/src/app/components/layout/footer.component.ts b/frontend/src/app/components/layout/footer.component.ts
new file mode 100644
index 000000000..a0339298c
--- /dev/null
+++ b/frontend/src/app/components/layout/footer.component.ts
@@ -0,0 +1,12 @@
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+
+@Component({
+ selector: 'app-footer',
+ standalone: true,
+ imports: [CommonModule, TranslateModule],
+ templateUrl: './footer.component.html',
+ styleUrl: './footer.component.css'
+})
+export class FooterComponent {}
diff --git a/frontend/src/app/components/layout/sidenav.component.css b/frontend/src/app/components/layout/sidenav.component.css
index ab665c7c5..1316ab46e 100644
--- a/frontend/src/app/components/layout/sidenav.component.css
+++ b/frontend/src/app/components/layout/sidenav.component.css
@@ -101,7 +101,6 @@
color: var(--text-muted);
letter-spacing: 1.5px;
padding: 16px 24px 8px 24px;
- opacity: 0.7;
}
.sidenav-collapsed .nav-category {
@@ -198,6 +197,8 @@ body.theme-dark .header-toolbar {
cursor: pointer;
transition: all 0.2s ease;
user-select: none;
+ font-family: inherit;
+ color: inherit;
}
.ai-credits-container:hover {
diff --git a/frontend/src/app/components/layout/sidenav.component.html b/frontend/src/app/components/layout/sidenav.component.html
index af56ecc2a..49c5e0070 100644
--- a/frontend/src/app/components/layout/sidenav.component.html
+++ b/frontend/src/app/components/layout/sidenav.component.html
@@ -28,12 +28,13 @@
[routerLinkActiveOptions]="{ exact: true }"
[matTooltip]="isCollapsed() ? ('NAV.DASHBOARD_SHORT' | translate) : ''"
matTooltipPosition="right"
+ aria-label="{{ 'NAV.DASHBOARD' | translate }}"
data-testid="nav-dashboard"
(click)="onNavItemClick()">
dashboard
{{ 'NAV.DASHBOARD' | translate }}
-
+
list_alt
{{ 'NAV.TASKS' | translate }}
@@ -42,25 +43,25 @@
@if (systemInfo()?.aiEnabled) {
{{ (isCollapsed() ? 'AI' : ('NAV.CATEGORY_AI' | translate)) }}
-
+
auto_awesome
{{ 'NAV.CATEGORY_AI' | translate }}
-
+
psychology
{{ 'NAV.ARCHITECTURE' | translate }}
-
+
psychology_alt
{{ 'NAV.RETROSPECTIVE' | translate }}
-
+
radar
{{ 'NAV.RISK_RADAR' | translate }}
-
+
compare
{{ 'NAV.ADR_DRIFT' | translate }}
@@ -70,6 +71,7 @@
rel="noopener noreferrer"
[matTooltip]="'NAV.GITHUB_TOOLTIP' | translate"
matTooltipPosition="right"
+ aria-label="{{ 'NAV.GITHUB' | translate }}"
data-testid="nav-github"
(click)="onNavItemClick()">
code
@@ -81,18 +83,18 @@
@if (systemInfo()?.aiEnabled) {
{{ (isCollapsed() ? 'Stats' : ('NAV.CATEGORY_ANALYTICS' | translate)) }}
-
+
assessment
{{ (authService.hasAdminWriteAccess() ? 'NAV.AI_USAGE' : 'AI_CREDITS.MY_USAGE') | translate }}
-
+
request_quote
{{ (authService.hasAdminWriteAccess() ? 'ADMIN_AI.CREDIT_REQUESTS' : 'AI_CREDITS.MY_REQUESTS') | translate }}
@if (authService.hasAdminWriteAccess()) {
-
+
monetization_on
{{ 'NAV.AI_COST' | translate }}
@@ -103,23 +105,23 @@
@if (authService.hasAdminWriteAccess()) {
{{ (isCollapsed() ? 'Admin' : ('NAV.CATEGORY_ADMIN' | translate)) }}
-
+
supervisor_account
{{ 'NAV.USER_ADMIN' | translate }}
-
+
description
{{ 'NAV.ADMIN_DOCS' | translate }}
-
+
settings_applications
{{ 'NAV.AI_SETTINGS' | translate }}
-
+
monitor_heart
{{ 'NAV.SYSTEM_STATUS' | translate }}
-
+
history
{{ 'NAV.LOGS' | translate }}
@@ -149,7 +151,7 @@
@if (authService.isLoggedIn() && systemInfo()?.aiEnabled) {
-
+
psychology
@@ -167,7 +169,7 @@
[color]="aiUsagePercent > 80 ? 'warn' : 'primary'">
}
-
+
} @else {
-
+
login
{{ 'ADMIN.LOGIN' | translate }}
diff --git a/frontend/src/app/components/layout/sidenav.component.spec.ts b/frontend/src/app/components/layout/sidenav.component.spec.ts
index 50340761a..3e3f453eb 100644
--- a/frontend/src/app/components/layout/sidenav.component.spec.ts
+++ b/frontend/src/app/components/layout/sidenav.component.spec.ts
@@ -38,8 +38,8 @@ describe('SidenavComponent', () => {
systemServiceSpy = {
getSystemInfo: vi.fn().mockReturnValue(of({
- backendVersion: '1.1.0',
- frontendVersion: '1.1.0',
+ backendVersion: '1.1.1-SNAPSHOT',
+ frontendVersion: '1.1.1-SNAPSHOT',
mode: 'test',
landingMessage: 'Test Message',
landingMessageMode: 'STARTUP',
@@ -118,8 +118,8 @@ describe('SidenavComponent', () => {
it('should not show close icon when landingMessageMode is ON', () => {
systemServiceSpy.getSystemInfo.mockReturnValue(of({
- backendVersion: '1.1.0',
- frontendVersion: '1.1.0',
+ backendVersion: '1.1.1-SNAPSHOT',
+ frontendVersion: '1.1.1-SNAPSHOT',
mode: 'test',
landingMessage: 'Test Message',
landingMessageMode: 'ON'
@@ -138,8 +138,8 @@ describe('SidenavComponent', () => {
it('should show close icon when landingMessageMode is STARTUP', () => {
systemServiceSpy.getSystemInfo.mockReturnValue(of({
- backendVersion: '1.1.0',
- frontendVersion: '1.1.0',
+ backendVersion: '1.1.1-SNAPSHOT',
+ frontendVersion: '1.1.1-SNAPSHOT',
mode: 'test',
landingMessage: 'Test Message',
landingMessageMode: 'STARTUP'
@@ -157,8 +157,8 @@ describe('SidenavComponent', () => {
it('should show banner on non-landing pages when mode is ON', () => {
systemServiceSpy.getSystemInfo.mockReturnValue(of({
- backendVersion: '1.1.0',
- frontendVersion: '1.1.0',
+ backendVersion: '1.1.1-SNAPSHOT',
+ frontendVersion: '1.1.1-SNAPSHOT',
mode: 'test',
landingMessage: 'Test Message',
landingMessageMode: 'ON'
@@ -175,8 +175,8 @@ describe('SidenavComponent', () => {
it('should not show banner on non-landing pages when mode is STARTUP', () => {
systemServiceSpy.getSystemInfo.mockReturnValue(of({
- backendVersion: '1.1.0',
- frontendVersion: '1.1.0',
+ backendVersion: '1.1.1-SNAPSHOT',
+ frontendVersion: '1.1.1-SNAPSHOT',
mode: 'test',
landingMessage: 'Test Message',
landingMessageMode: 'STARTUP'
diff --git a/frontend/src/app/components/login/login.component.css b/frontend/src/app/components/login/login.component.css
index fc1fe2b4b..81eeea190 100644
--- a/frontend/src/app/components/login/login.component.css
+++ b/frontend/src/app/components/login/login.component.css
@@ -10,9 +10,10 @@
.login-card {
width: 100%;
max-width: 440px;
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.05);
+ background: var(--surface);
+ box-shadow: var(--shadow-2);
border-radius: 12px;
- margin: var(--spacing-12) 0 var(--spacing-48);
+ margin: 0;
}
.login-card mat-card-content {
@@ -115,54 +116,105 @@ mat-form-field {
.recaptcha-status {
font-size: 0.8em;
- color: var(--text-secondary);
+ color: var(--text-muted);
margin-top: 8px;
text-align: center;
}
-.github-footer {
- margin-top: 24px;
- margin-bottom: 48px;
+.github-cta-container {
+ margin-top: var(--spacing-48);
+ margin-bottom: var(--spacing-64);
display: flex;
- flex-direction: column;
- align-items: center;
- gap: 24px;
- width: 100%;
- max-width: 400px;
-}
-
-.footer-divider {
+ justify-content: center;
width: 100%;
- height: 1px;
- background: var(--border);
- opacity: 0.5;
}
-.github-link {
- color: var(--mdc-theme-primary);
+.github-link-subtle {
+ color: var(--text-muted) !important;
+ font-size: 0.9rem;
text-decoration: none;
- font-size: 15px;
- font-weight: 500;
display: inline-flex;
align-items: center;
gap: 8px;
+ padding: 8px 16px;
+ border-radius: 20px;
+ border: 1px solid var(--border);
transition: all 0.2s ease;
- padding: 8px 12px;
- border-radius: 4px;
+ background: var(--surface-muted);
}
-.github-link:hover {
- background: rgba(var(--mdc-theme-primary-rgb, 63, 81, 181), 0.04);
+.github-link-subtle:hover {
+ color: var(--mdc-theme-primary) !important;
+ border-color: var(--mdc-theme-primary);
+ background: rgba(255, 255, 255, 0.1);
+ transform: translateY(-1px);
}
.github-icon {
- width: 20px;
- height: 20px;
+ width: 18px;
+ height: 18px;
+ fill: currentColor;
+}
+
+.hero-container {
+ width: 100%;
+ max-width: 1280px;
+ margin: 0 auto;
+}
+
+.hero-section {
+ text-align: center;
+ margin-bottom: 24px;
+ width: 100%;
+}
+
+.hero-main {
+ display: grid;
+ grid-template-columns: minmax(0, 1.8fr) minmax(320px, 440px);
+ gap: 48px;
+ align-items: start;
+ margin-bottom: var(--spacing-64);
+}
+
+@media (max-width: 1100px) {
+ .hero-main {
+ gap: 32px;
+ }
+}
+
+@media (max-width: 980px) {
+ .hero-main {
+ grid-template-columns: 1fr;
+ gap: 32px;
+ justify-items: center;
+ }
}
-.external-icon {
- font-size: 14px !important;
- width: 14px !important;
- height: 14px !important;
- opacity: 0.6;
+.hero-description {
+ font-size: 1.1rem;
+ color: var(--text-muted);
+ max-width: 700px;
+ margin: 0 auto 8px;
+ line-height: 1.5;
+}
+
+.demo-preview {
+ margin: 0;
+ display: flex;
+ justify-content: center;
+ width: 100%;
+}
+
+.demo-preview img {
+ width: 100%;
+ max-width: 900px;
+ border-radius: 12px;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
+ border: 1px solid var(--border);
+}
+
+@media (max-width: 768px) {
+ .hero-description {
+ font-size: 1.1rem;
+ }
}
diff --git a/frontend/src/app/components/login/login.component.html b/frontend/src/app/components/login/login.component.html
index eb996b5a0..ed39863c4 100644
--- a/frontend/src/app/components/login/login.component.html
+++ b/frontend/src/app/components/login/login.component.html
@@ -1,61 +1,74 @@
-
-
-
- {{ 'NAV.WELCOME_BACK' | translate }}
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'NAV.WELCOME_BACK' | translate }}
+
+
+
+
+
+
+
+
-
diff --git a/frontend/src/app/components/login/login.component.spec.ts b/frontend/src/app/components/login/login.component.spec.ts
index 01bd01c3e..9b87fa1aa 100644
--- a/frontend/src/app/components/login/login.component.spec.ts
+++ b/frontend/src/app/components/login/login.component.spec.ts
@@ -7,6 +7,8 @@ import { FormsModule } from '@angular/forms';
import { of, throwError } from 'rxjs';
import { provideNoopAnimations } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
+import { provideHttpClient } from '@angular/common/http';
+import { provideHttpClientTesting } from '@angular/common/http/testing';
import { describe, it, expect, beforeEach, vi } from 'vitest';
import { signal, NO_ERRORS_SCHEMA } from '@angular/core';
diff --git a/frontend/src/app/components/retrospective/retrospective.component.ts b/frontend/src/app/components/retrospective/retrospective.component.ts
index 2e4ccfd28..851aea881 100644
--- a/frontend/src/app/components/retrospective/retrospective.component.ts
+++ b/frontend/src/app/components/retrospective/retrospective.component.ts
@@ -72,16 +72,16 @@ export class RetrospectiveComponent extends BaseAiComponent implements OnInit {
let text = `SUMMARY: ${res.summary}\n\n`;
text += `HIGHLIGHTS:\n`;
- res.highlights.forEach((h: string) => text += `- ${h}\n`);
+ (res.highlights || []).forEach((h: string) => text += `- ${h}\n`);
text += `\nPROBLEMS:\n`;
- res.problems.forEach((p: string) => text += `- ${p}\n`);
+ (res.problems || []).forEach((p: string) => text += `- ${p}\n`);
text += `\nSUGGESTIONS:\n`;
- res.suggestions.forEach((s: string) => text += `- ${s}\n`);
+ (res.suggestions || []).forEach((s: string) => text += `- ${s}\n`);
text += `\nACTION ITEMS:\n`;
- res.actionItems.forEach((a: string) => text += `- ${a}\n`);
+ (res.actionItems || []).forEach((a: string) => text += `- ${a}\n`);
return text;
});
diff --git a/frontend/src/app/components/shared/promo-section/promo-section.component.css b/frontend/src/app/components/shared/promo-section/promo-section.component.css
index ffe42d77a..e8529142c 100644
--- a/frontend/src/app/components/shared/promo-section/promo-section.component.css
+++ b/frontend/src/app/components/shared/promo-section/promo-section.component.css
@@ -42,22 +42,23 @@
display: flex;
flex-direction: column;
transition: all 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
+ box-shadow: var(--shadow-1);
border-radius: 12px;
overflow: hidden;
border: 1px solid var(--border);
+ background: var(--surface);
}
.promo-card:hover {
transform: translateY(-6px);
- box-shadow: 0 12px 28px rgba(0, 0, 0, 0.12);
+ box-shadow: var(--shadow-2);
}
.promo-icon {
display: flex;
align-items: center;
justify-content: center;
- background-color: rgba(0, 0, 0, 0.03);
+ background-color: var(--brand-weak);
border-radius: 50%;
}
@@ -69,7 +70,7 @@ mat-card-content {
mat-card-content p {
margin: 0;
line-height: 1.5;
- color: rgba(0, 0, 0, 0.87);
+ color: var(--text-muted);
}
mat-card-actions {
diff --git a/frontend/src/app/components/tasks/quick-add-task.component.ts b/frontend/src/app/components/tasks/quick-add-task.component.ts
index b9dd7ef18..826accb02 100644
--- a/frontend/src/app/components/tasks/quick-add-task.component.ts
+++ b/frontend/src/app/components/tasks/quick-add-task.component.ts
@@ -12,7 +12,7 @@ import { TaskService } from '../../services/task.service';
import { AuthService } from '../../services/auth.service';
import { GoogleRecaptchaService } from '../../services/google-recaptcha.service';
import { TranslateModule } from '@ngx-translate/core';
-import { debounceTime, distinctUntilChanged, Subject, takeUntil, map } from 'rxjs';
+import { debounceTime, distinctUntilChanged, Subject, takeUntil, map, switchMap, from, of, catchError, tap, filter } from 'rxjs';
import { Task, TaskStatus, QuickAddParseResult, Priority } from '../../models/task.model';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { TextFieldModule } from '@angular/cdk/text-field';
@@ -63,11 +63,51 @@ export class QuickAddTaskComponent implements OnInit, OnDestroy {
ngOnInit() {
this.titleControl.valueChanges.pipe(
- debounceTime(300),
+ debounceTime(2000),
distinctUntilChanged(),
+ map(value => value.trim()),
+ filter(trimmed => !!trimmed),
+ tap(() => this.isAnalyzing.set(true)),
+ switchMap(trimmed => {
+ if (!this.authService.isAiAvailable()) {
+ return of({
+ title: trimmed,
+ description: '',
+ category: null,
+ confidence: 1,
+ tags: [],
+ assumptions: ['No AI available'],
+ dueDate: null,
+ dueTime: null,
+ priority: 'MEDIUM',
+ status: 'OPEN',
+ aiUsed: false
+ } as QuickAddParseResult);
+ }
+
+ return from(this.recaptchaService.execute('task_quick_add')).pipe(
+ switchMap(token => this.taskService.analyzeTask(trimmed, token)),
+ catchError(() => of(null))
+ );
+ }),
takeUntil(this.destroy$)
- ).subscribe(value => {
- this.analyze(value);
+ ).subscribe(result => {
+ this.isAnalyzing.set(false);
+ if (result) {
+ this.parsedTask.set(result);
+ } else {
+ this.parsedTask.set(null);
+ }
+ });
+
+ // Handle empty input separately to clear preview instantly
+ this.titleControl.valueChanges.pipe(
+ map(value => value.trim()),
+ filter(trimmed => !trimmed),
+ takeUntil(this.destroy$)
+ ).subscribe(() => {
+ this.isAnalyzing.set(false);
+ this.parsedTask.set(null);
});
}
@@ -76,45 +116,6 @@ export class QuickAddTaskComponent implements OnInit, OnDestroy {
this.destroy$.complete();
}
- private analyze(value: string) {
- const trimmed = value.trim();
- if (!trimmed) {
- this.parsedTask.set(null);
- this.isAnalyzing.set(false);
- return;
- }
-
- if (!this.authService.isAiAvailable()) {
- this.parsedTask.set({
- title: trimmed,
- description: '',
- category: null,
- confidence: 1,
- tags: [],
- assumptions: ['No AI available'],
- dueDate: null,
- dueTime: null,
- priority: 'MEDIUM',
- status: 'OPEN',
- aiUsed: false
- });
- return;
- }
-
- this.isAnalyzing.set(true);
- this.recaptchaService.execute('task_quick_add').then(token => {
- this.taskService.analyzeTask(trimmed, token).subscribe({
- next: (result) => {
- this.parsedTask.set(result);
- this.isAnalyzing.set(false);
- },
- error: () => {
- this.parsedTask.set(null);
- this.isAnalyzing.set(false);
- }
- });
- });
- }
confirm() {
this.submit();
diff --git a/frontend/src/app/components/tasks/quick-add-task.debounce.spec.ts b/frontend/src/app/components/tasks/quick-add-task.debounce.spec.ts
new file mode 100644
index 000000000..4365a653a
--- /dev/null
+++ b/frontend/src/app/components/tasks/quick-add-task.debounce.spec.ts
@@ -0,0 +1,98 @@
+import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';
+import { QuickAddTaskComponent } from './quick-add-task.component';
+import { TaskService } from '../../services/task.service';
+import { AuthService } from '../../services/auth.service';
+import { of, delay } from 'rxjs';
+import { provideNoopAnimations } from '@angular/platform-browser/animations';
+import { TranslateModule } from '@ngx-translate/core';
+import { describe, it, expect, beforeEach, vi } from 'vitest';
+import { GoogleRecaptchaService } from '../../services/google-recaptcha.service';
+
+describe('QuickAddTaskComponent Debounce', () => {
+ let component: QuickAddTaskComponent;
+ let fixture: ComponentFixture;
+ let taskServiceSpy: any;
+ let authServiceSpy: any;
+ let recaptchaServiceSpy: any;
+
+ beforeEach(async () => {
+ taskServiceSpy = {
+ analyzeTask: vi.fn().mockReturnValue(of({
+ title: 'Analyzed Task',
+ description: '',
+ confidence: 1,
+ tags: [],
+ assumptions: [],
+ priority: 'MEDIUM',
+ status: 'OPEN',
+ aiUsed: true
+ }))
+ };
+
+ authServiceSpy = {
+ isAiAvailable: vi.fn().mockReturnValue(true)
+ };
+
+ recaptchaServiceSpy = {
+ execute: vi.fn().mockResolvedValue('test-token')
+ };
+
+ await TestBed.configureTestingModule({
+ imports: [QuickAddTaskComponent, TranslateModule.forRoot()],
+ providers: [
+ provideNoopAnimations(),
+ { provide: TaskService, useValue: taskServiceSpy },
+ { provide: AuthService, useValue: authServiceSpy },
+ { provide: GoogleRecaptchaService, useValue: recaptchaServiceSpy }
+ ]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(QuickAddTaskComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should debounce AI analysis', fakeAsync(() => {
+ component.titleControl.setValue('Buy mil');
+ tick(500);
+ component.titleControl.setValue('Buy milk');
+ tick(1900);
+
+ expect(taskServiceSpy.analyzeTask).not.toHaveBeenCalled();
+
+ tick(200); // Now at 2100ms total since last change. Should have triggered.
+ expect(taskServiceSpy.analyzeTask).toHaveBeenCalledTimes(1);
+ expect(taskServiceSpy.analyzeTask).toHaveBeenCalledWith('Buy milk', 'test-token');
+ }));
+
+ it('should not trigger analysis if typing continues', fakeAsync(() => {
+ for (let i = 0; i < 20; i++) {
+ component.titleControl.setValue('Task ' + i);
+ tick(500);
+ }
+ // Total time 10000ms, but intervals are only 500ms.
+ expect(taskServiceSpy.analyzeTask).not.toHaveBeenCalled();
+
+ tick(2000); // Wait for current 2000ms debounce
+ expect(taskServiceSpy.analyzeTask).toHaveBeenCalledTimes(1);
+ }));
+
+ it('should ignore results from stale requests', fakeAsync(() => {
+ // Setup analyzeTask to take some time
+ taskServiceSpy.analyzeTask.mockReturnValue(of({ title: 'Slow result' }).pipe(delay(1000)));
+
+ component.titleControl.setValue('First');
+ tick(300); // Trigger first
+ expect(taskServiceSpy.analyzeTask).toHaveBeenCalledTimes(1);
+
+ component.titleControl.setValue('Second');
+ tick(300); // Trigger second
+ expect(taskServiceSpy.analyzeTask).toHaveBeenCalledTimes(2);
+
+ tick(700); // First one completes
+ // Even if it completes, we want to make sure it doesn't overwrite if it's stale.
+ // The current implementation uses simple subscription which might have race conditions.
+
+ tick(1000); // Second one completes
+ }));
+});
diff --git a/frontend/src/app/components/tasks/task-filter-chips.component.html b/frontend/src/app/components/tasks/task-filter-chips.component.html
index dade2a92f..eab6781e0 100644
--- a/frontend/src/app/components/tasks/task-filter-chips.component.html
+++ b/frontend/src/app/components/tasks/task-filter-chips.component.html
@@ -1,6 +1,6 @@