@the-bearded-bear/claude-craft 7.19.0 → 7.21.0-next.07db57b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dev/i18n/de/Angular/agents/angular-reviewer.md +497 -142
- package/Dev/i18n/de/CSharp/agents/csharp-reviewer.md +457 -119
- package/Dev/i18n/de/Common/commands/setup-rtk.md +78 -0
- package/Dev/i18n/de/Flutter/agents/flutter-reviewer.md +529 -463
- package/Dev/i18n/de/Laravel/agents/laravel-reviewer.md +703 -149
- package/Dev/i18n/de/PHP/agents/php-reviewer.md +554 -0
- package/Dev/i18n/de/Python/agents/python-reviewer.md +598 -98
- package/Dev/i18n/de/React/agents/react-reviewer.md +411 -297
- package/Dev/i18n/de/ReactNative/agents/reactnative-reviewer.md +488 -354
- package/Dev/i18n/de/Symfony/agents/symfony-reviewer.md +505 -376
- package/Dev/i18n/de/VueJS/agents/vuejs-reviewer.md +629 -148
- package/Dev/i18n/en/Angular/agents/angular-reviewer.md +500 -157
- package/Dev/i18n/en/CSharp/agents/csharp-reviewer.md +460 -134
- package/Dev/i18n/en/Common/commands/setup-rtk.md +99 -0
- package/Dev/i18n/en/Flutter/agents/flutter-reviewer.md +532 -478
- package/Dev/i18n/en/Laravel/agents/laravel-reviewer.md +706 -164
- package/Dev/i18n/en/PHP/agents/php-reviewer.md +554 -0
- package/Dev/i18n/en/Python/agents/python-reviewer.md +600 -112
- package/Dev/i18n/en/React/agents/react-reviewer.md +407 -305
- package/Dev/i18n/en/ReactNative/agents/reactnative-reviewer.md +487 -365
- package/Dev/i18n/en/Symfony/agents/symfony-reviewer.md +503 -384
- package/Dev/i18n/en/VueJS/agents/vuejs-reviewer.md +628 -147
- package/Dev/i18n/es/Angular/agents/angular-reviewer.md +497 -142
- package/Dev/i18n/es/CSharp/agents/csharp-reviewer.md +457 -119
- package/Dev/i18n/es/Common/commands/setup-rtk.md +78 -0
- package/Dev/i18n/es/Flutter/agents/flutter-reviewer.md +529 -463
- package/Dev/i18n/es/Laravel/agents/laravel-reviewer.md +703 -149
- package/Dev/i18n/es/PHP/agents/php-reviewer.md +554 -0
- package/Dev/i18n/es/Python/agents/python-reviewer.md +598 -98
- package/Dev/i18n/es/React/agents/react-reviewer.md +416 -302
- package/Dev/i18n/es/ReactNative/agents/reactnative-reviewer.md +490 -356
- package/Dev/i18n/es/Symfony/agents/symfony-reviewer.md +509 -378
- package/Dev/i18n/es/VueJS/agents/vuejs-reviewer.md +629 -148
- package/Dev/i18n/fr/Angular/agents/angular-reviewer.md +497 -142
- package/Dev/i18n/fr/CSharp/agents/csharp-reviewer.md +457 -119
- package/Dev/i18n/fr/Common/commands/setup-rtk.md +94 -0
- package/Dev/i18n/fr/Flutter/agents/flutter-reviewer.md +529 -463
- package/Dev/i18n/fr/Laravel/agents/laravel-reviewer.md +702 -148
- package/Dev/i18n/fr/PHP/agents/php-reviewer.md +554 -0
- package/Dev/i18n/fr/Python/agents/python-reviewer.md +554 -332
- package/Dev/i18n/fr/React/agents/react-reviewer.md +404 -290
- package/Dev/i18n/fr/ReactNative/agents/reactnative-reviewer.md +490 -356
- package/Dev/i18n/fr/Symfony/agents/symfony-reviewer.md +509 -378
- package/Dev/i18n/fr/VueJS/agents/vuejs-reviewer.md +628 -147
- package/Dev/i18n/pt/Angular/agents/angular-reviewer.md +497 -142
- package/Dev/i18n/pt/CSharp/agents/csharp-reviewer.md +457 -119
- package/Dev/i18n/pt/Common/commands/setup-rtk.md +78 -0
- package/Dev/i18n/pt/Flutter/agents/flutter-reviewer.md +529 -463
- package/Dev/i18n/pt/Laravel/agents/laravel-reviewer.md +703 -149
- package/Dev/i18n/pt/PHP/agents/php-reviewer.md +554 -0
- package/Dev/i18n/pt/Python/agents/python-reviewer.md +598 -98
- package/Dev/i18n/pt/React/agents/react-reviewer.md +414 -240
- package/Dev/i18n/pt/ReactNative/agents/reactnative-reviewer.md +503 -156
- package/Dev/i18n/pt/Symfony/agents/symfony-reviewer.md +512 -381
- package/Dev/i18n/pt/VueJS/agents/vuejs-reviewer.md +629 -148
- package/Dev/scripts/install-from-config.sh +33 -6
- package/Infra/i18n/de/Ansible/agents/ansible-architect.md +302 -0
- package/Infra/i18n/de/Ansible/agents/ansible-debug.md +308 -0
- package/Infra/i18n/de/Ansible/agents/ansible-deployment.md +292 -0
- package/Infra/i18n/de/Ansible/agents/ansible-quality.md +307 -0
- package/Infra/i18n/de/Ansible/agents/ansible-security.md +290 -0
- package/Infra/i18n/de/Ansible/commands/architecture.md +175 -0
- package/Infra/i18n/de/Ansible/commands/debug.md +152 -0
- package/Infra/i18n/de/Ansible/commands/deploy-setup.md +162 -0
- package/Infra/i18n/de/Ansible/commands/optimize.md +165 -0
- package/Infra/i18n/de/Ansible/commands/security-audit.md +178 -0
- package/Infra/i18n/de/FrankenPHP/agents/frankenphp-architect.md +342 -0
- package/Infra/i18n/de/FrankenPHP/agents/frankenphp-debug.md +277 -0
- package/Infra/i18n/de/FrankenPHP/agents/frankenphp-deployment.md +337 -0
- package/Infra/i18n/de/FrankenPHP/agents/frankenphp-performance.md +300 -0
- package/Infra/i18n/de/FrankenPHP/agents/frankenphp-security.md +289 -0
- package/Infra/i18n/de/FrankenPHP/commands/architecture.md +137 -0
- package/Infra/i18n/de/FrankenPHP/commands/debug.md +139 -0
- package/Infra/i18n/de/FrankenPHP/commands/deploy-setup.md +117 -0
- package/Infra/i18n/de/FrankenPHP/commands/optimize.md +156 -0
- package/Infra/i18n/de/FrankenPHP/commands/security-audit.md +171 -0
- package/Infra/i18n/de/Hcloud/agents/hcloud-architect.md +288 -0
- package/Infra/i18n/de/Hcloud/agents/hcloud-cost.md +242 -0
- package/Infra/i18n/de/Hcloud/agents/hcloud-debug.md +309 -0
- package/Infra/i18n/de/Hcloud/agents/hcloud-deployment.md +334 -0
- package/Infra/i18n/de/Hcloud/agents/hcloud-security.md +294 -0
- package/Infra/i18n/de/Hcloud/commands/architecture.md +158 -0
- package/Infra/i18n/de/Hcloud/commands/debug.md +157 -0
- package/Infra/i18n/de/Hcloud/commands/deploy-setup.md +139 -0
- package/Infra/i18n/de/Hcloud/commands/optimize.md +149 -0
- package/Infra/i18n/de/Hcloud/commands/security-audit.md +169 -0
- package/Infra/i18n/de/Kubernetes/agents/kubernetes-architect.md +303 -0
- package/Infra/i18n/de/Kubernetes/agents/kubernetes-debug.md +229 -0
- package/Infra/i18n/de/Kubernetes/agents/kubernetes-deployment.md +214 -0
- package/Infra/i18n/de/Kubernetes/agents/kubernetes-monitoring.md +272 -0
- package/Infra/i18n/de/Kubernetes/agents/kubernetes-security.md +306 -0
- package/Infra/i18n/de/Kubernetes/commands/architecture.md +180 -0
- package/Infra/i18n/de/Kubernetes/commands/debug.md +119 -0
- package/Infra/i18n/de/Kubernetes/commands/deploy-setup.md +115 -0
- package/Infra/i18n/de/Kubernetes/commands/optimize.md +166 -0
- package/Infra/i18n/de/Kubernetes/commands/security-audit.md +156 -0
- package/Infra/i18n/de/OpenTofu/agents/opentofu-architect.md +328 -0
- package/Infra/i18n/de/OpenTofu/agents/opentofu-cost.md +241 -0
- package/Infra/i18n/de/OpenTofu/agents/opentofu-debug.md +248 -0
- package/Infra/i18n/de/OpenTofu/agents/opentofu-deployment.md +237 -0
- package/Infra/i18n/de/OpenTofu/agents/opentofu-security.md +271 -0
- package/Infra/i18n/de/OpenTofu/commands/architecture.md +186 -0
- package/Infra/i18n/de/OpenTofu/commands/debug.md +115 -0
- package/Infra/i18n/de/OpenTofu/commands/deploy-setup.md +121 -0
- package/Infra/i18n/de/OpenTofu/commands/optimize.md +135 -0
- package/Infra/i18n/de/OpenTofu/commands/security-audit.md +139 -0
- package/Infra/i18n/de/PgBouncer/agents/pgbouncer-architect.md +311 -0
- package/Infra/i18n/de/PgBouncer/agents/pgbouncer-debug.md +302 -0
- package/Infra/i18n/de/PgBouncer/agents/pgbouncer-deployment.md +339 -0
- package/Infra/i18n/de/PgBouncer/agents/pgbouncer-monitoring.md +298 -0
- package/Infra/i18n/de/PgBouncer/agents/pgbouncer-security.md +265 -0
- package/Infra/i18n/de/PgBouncer/commands/architecture.md +138 -0
- package/Infra/i18n/de/PgBouncer/commands/debug.md +147 -0
- package/Infra/i18n/de/PgBouncer/commands/deploy-setup.md +118 -0
- package/Infra/i18n/de/PgBouncer/commands/optimize.md +155 -0
- package/Infra/i18n/de/PgBouncer/commands/security-audit.md +167 -0
- package/Infra/i18n/en/Ansible/agents/ansible-architect.md +302 -0
- package/Infra/i18n/en/Ansible/agents/ansible-debug.md +308 -0
- package/Infra/i18n/en/Ansible/agents/ansible-deployment.md +292 -0
- package/Infra/i18n/en/Ansible/agents/ansible-quality.md +307 -0
- package/Infra/i18n/en/Ansible/agents/ansible-security.md +290 -0
- package/Infra/i18n/en/Ansible/commands/architecture.md +175 -0
- package/Infra/i18n/en/Ansible/commands/debug.md +152 -0
- package/Infra/i18n/en/Ansible/commands/deploy-setup.md +162 -0
- package/Infra/i18n/en/Ansible/commands/optimize.md +165 -0
- package/Infra/i18n/en/Ansible/commands/security-audit.md +178 -0
- package/Infra/i18n/en/FrankenPHP/agents/frankenphp-architect.md +342 -0
- package/Infra/i18n/en/FrankenPHP/agents/frankenphp-debug.md +277 -0
- package/Infra/i18n/en/FrankenPHP/agents/frankenphp-deployment.md +337 -0
- package/Infra/i18n/en/FrankenPHP/agents/frankenphp-performance.md +300 -0
- package/Infra/i18n/en/FrankenPHP/agents/frankenphp-security.md +289 -0
- package/Infra/i18n/en/FrankenPHP/commands/architecture.md +137 -0
- package/Infra/i18n/en/FrankenPHP/commands/debug.md +139 -0
- package/Infra/i18n/en/FrankenPHP/commands/deploy-setup.md +117 -0
- package/Infra/i18n/en/FrankenPHP/commands/optimize.md +156 -0
- package/Infra/i18n/en/FrankenPHP/commands/security-audit.md +171 -0
- package/Infra/i18n/en/Hcloud/agents/hcloud-architect.md +288 -0
- package/Infra/i18n/en/Hcloud/agents/hcloud-cost.md +242 -0
- package/Infra/i18n/en/Hcloud/agents/hcloud-debug.md +309 -0
- package/Infra/i18n/en/Hcloud/agents/hcloud-deployment.md +334 -0
- package/Infra/i18n/en/Hcloud/agents/hcloud-security.md +294 -0
- package/Infra/i18n/en/Hcloud/commands/architecture.md +158 -0
- package/Infra/i18n/en/Hcloud/commands/debug.md +157 -0
- package/Infra/i18n/en/Hcloud/commands/deploy-setup.md +139 -0
- package/Infra/i18n/en/Hcloud/commands/optimize.md +149 -0
- package/Infra/i18n/en/Hcloud/commands/security-audit.md +169 -0
- package/Infra/i18n/en/Kubernetes/agents/kubernetes-architect.md +303 -0
- package/Infra/i18n/en/Kubernetes/agents/kubernetes-debug.md +229 -0
- package/Infra/i18n/en/Kubernetes/agents/kubernetes-deployment.md +214 -0
- package/Infra/i18n/en/Kubernetes/agents/kubernetes-monitoring.md +272 -0
- package/Infra/i18n/en/Kubernetes/agents/kubernetes-security.md +306 -0
- package/Infra/i18n/en/Kubernetes/commands/architecture.md +180 -0
- package/Infra/i18n/en/Kubernetes/commands/debug.md +119 -0
- package/Infra/i18n/en/Kubernetes/commands/deploy-setup.md +115 -0
- package/Infra/i18n/en/Kubernetes/commands/optimize.md +166 -0
- package/Infra/i18n/en/Kubernetes/commands/security-audit.md +156 -0
- package/Infra/i18n/en/OpenTofu/agents/opentofu-architect.md +328 -0
- package/Infra/i18n/en/OpenTofu/agents/opentofu-cost.md +241 -0
- package/Infra/i18n/en/OpenTofu/agents/opentofu-debug.md +248 -0
- package/Infra/i18n/en/OpenTofu/agents/opentofu-deployment.md +237 -0
- package/Infra/i18n/en/OpenTofu/agents/opentofu-security.md +271 -0
- package/Infra/i18n/en/OpenTofu/commands/architecture.md +186 -0
- package/Infra/i18n/en/OpenTofu/commands/debug.md +115 -0
- package/Infra/i18n/en/OpenTofu/commands/deploy-setup.md +121 -0
- package/Infra/i18n/en/OpenTofu/commands/optimize.md +135 -0
- package/Infra/i18n/en/OpenTofu/commands/security-audit.md +139 -0
- package/Infra/i18n/en/PgBouncer/agents/pgbouncer-architect.md +311 -0
- package/Infra/i18n/en/PgBouncer/agents/pgbouncer-debug.md +302 -0
- package/Infra/i18n/en/PgBouncer/agents/pgbouncer-deployment.md +339 -0
- package/Infra/i18n/en/PgBouncer/agents/pgbouncer-monitoring.md +298 -0
- package/Infra/i18n/en/PgBouncer/agents/pgbouncer-security.md +265 -0
- package/Infra/i18n/en/PgBouncer/commands/architecture.md +138 -0
- package/Infra/i18n/en/PgBouncer/commands/debug.md +147 -0
- package/Infra/i18n/en/PgBouncer/commands/deploy-setup.md +118 -0
- package/Infra/i18n/en/PgBouncer/commands/optimize.md +155 -0
- package/Infra/i18n/en/PgBouncer/commands/security-audit.md +167 -0
- package/Infra/i18n/es/Ansible/agents/ansible-architect.md +302 -0
- package/Infra/i18n/es/Ansible/agents/ansible-debug.md +308 -0
- package/Infra/i18n/es/Ansible/agents/ansible-deployment.md +292 -0
- package/Infra/i18n/es/Ansible/agents/ansible-quality.md +307 -0
- package/Infra/i18n/es/Ansible/agents/ansible-security.md +290 -0
- package/Infra/i18n/es/Ansible/commands/architecture.md +175 -0
- package/Infra/i18n/es/Ansible/commands/debug.md +152 -0
- package/Infra/i18n/es/Ansible/commands/deploy-setup.md +162 -0
- package/Infra/i18n/es/Ansible/commands/optimize.md +165 -0
- package/Infra/i18n/es/Ansible/commands/security-audit.md +178 -0
- package/Infra/i18n/es/FrankenPHP/agents/frankenphp-architect.md +342 -0
- package/Infra/i18n/es/FrankenPHP/agents/frankenphp-debug.md +277 -0
- package/Infra/i18n/es/FrankenPHP/agents/frankenphp-deployment.md +337 -0
- package/Infra/i18n/es/FrankenPHP/agents/frankenphp-performance.md +300 -0
- package/Infra/i18n/es/FrankenPHP/agents/frankenphp-security.md +289 -0
- package/Infra/i18n/es/FrankenPHP/commands/architecture.md +137 -0
- package/Infra/i18n/es/FrankenPHP/commands/debug.md +139 -0
- package/Infra/i18n/es/FrankenPHP/commands/deploy-setup.md +117 -0
- package/Infra/i18n/es/FrankenPHP/commands/optimize.md +156 -0
- package/Infra/i18n/es/FrankenPHP/commands/security-audit.md +171 -0
- package/Infra/i18n/es/Hcloud/agents/hcloud-architect.md +288 -0
- package/Infra/i18n/es/Hcloud/agents/hcloud-cost.md +242 -0
- package/Infra/i18n/es/Hcloud/agents/hcloud-debug.md +309 -0
- package/Infra/i18n/es/Hcloud/agents/hcloud-deployment.md +334 -0
- package/Infra/i18n/es/Hcloud/agents/hcloud-security.md +294 -0
- package/Infra/i18n/es/Hcloud/commands/architecture.md +158 -0
- package/Infra/i18n/es/Hcloud/commands/debug.md +157 -0
- package/Infra/i18n/es/Hcloud/commands/deploy-setup.md +139 -0
- package/Infra/i18n/es/Hcloud/commands/optimize.md +149 -0
- package/Infra/i18n/es/Hcloud/commands/security-audit.md +169 -0
- package/Infra/i18n/es/Kubernetes/agents/kubernetes-architect.md +303 -0
- package/Infra/i18n/es/Kubernetes/agents/kubernetes-debug.md +229 -0
- package/Infra/i18n/es/Kubernetes/agents/kubernetes-deployment.md +214 -0
- package/Infra/i18n/es/Kubernetes/agents/kubernetes-monitoring.md +272 -0
- package/Infra/i18n/es/Kubernetes/agents/kubernetes-security.md +306 -0
- package/Infra/i18n/es/Kubernetes/commands/architecture.md +180 -0
- package/Infra/i18n/es/Kubernetes/commands/debug.md +119 -0
- package/Infra/i18n/es/Kubernetes/commands/deploy-setup.md +115 -0
- package/Infra/i18n/es/Kubernetes/commands/optimize.md +166 -0
- package/Infra/i18n/es/Kubernetes/commands/security-audit.md +156 -0
- package/Infra/i18n/es/OpenTofu/agents/opentofu-architect.md +328 -0
- package/Infra/i18n/es/OpenTofu/agents/opentofu-cost.md +241 -0
- package/Infra/i18n/es/OpenTofu/agents/opentofu-debug.md +248 -0
- package/Infra/i18n/es/OpenTofu/agents/opentofu-deployment.md +237 -0
- package/Infra/i18n/es/OpenTofu/agents/opentofu-security.md +271 -0
- package/Infra/i18n/es/OpenTofu/commands/architecture.md +186 -0
- package/Infra/i18n/es/OpenTofu/commands/debug.md +115 -0
- package/Infra/i18n/es/OpenTofu/commands/deploy-setup.md +121 -0
- package/Infra/i18n/es/OpenTofu/commands/optimize.md +135 -0
- package/Infra/i18n/es/OpenTofu/commands/security-audit.md +139 -0
- package/Infra/i18n/es/PgBouncer/agents/pgbouncer-architect.md +311 -0
- package/Infra/i18n/es/PgBouncer/agents/pgbouncer-debug.md +302 -0
- package/Infra/i18n/es/PgBouncer/agents/pgbouncer-deployment.md +339 -0
- package/Infra/i18n/es/PgBouncer/agents/pgbouncer-monitoring.md +298 -0
- package/Infra/i18n/es/PgBouncer/agents/pgbouncer-security.md +265 -0
- package/Infra/i18n/es/PgBouncer/commands/architecture.md +138 -0
- package/Infra/i18n/es/PgBouncer/commands/debug.md +147 -0
- package/Infra/i18n/es/PgBouncer/commands/deploy-setup.md +118 -0
- package/Infra/i18n/es/PgBouncer/commands/optimize.md +155 -0
- package/Infra/i18n/es/PgBouncer/commands/security-audit.md +167 -0
- package/Infra/i18n/fr/Ansible/agents/ansible-architect.md +302 -0
- package/Infra/i18n/fr/Ansible/agents/ansible-debug.md +308 -0
- package/Infra/i18n/fr/Ansible/agents/ansible-deployment.md +292 -0
- package/Infra/i18n/fr/Ansible/agents/ansible-quality.md +307 -0
- package/Infra/i18n/fr/Ansible/agents/ansible-security.md +290 -0
- package/Infra/i18n/fr/Ansible/commands/architecture.md +175 -0
- package/Infra/i18n/fr/Ansible/commands/debug.md +152 -0
- package/Infra/i18n/fr/Ansible/commands/deploy-setup.md +162 -0
- package/Infra/i18n/fr/Ansible/commands/optimize.md +165 -0
- package/Infra/i18n/fr/Ansible/commands/security-audit.md +178 -0
- package/Infra/i18n/fr/FrankenPHP/agents/frankenphp-architect.md +342 -0
- package/Infra/i18n/fr/FrankenPHP/agents/frankenphp-debug.md +277 -0
- package/Infra/i18n/fr/FrankenPHP/agents/frankenphp-deployment.md +337 -0
- package/Infra/i18n/fr/FrankenPHP/agents/frankenphp-performance.md +300 -0
- package/Infra/i18n/fr/FrankenPHP/agents/frankenphp-security.md +289 -0
- package/Infra/i18n/fr/FrankenPHP/commands/architecture.md +137 -0
- package/Infra/i18n/fr/FrankenPHP/commands/debug.md +139 -0
- package/Infra/i18n/fr/FrankenPHP/commands/deploy-setup.md +117 -0
- package/Infra/i18n/fr/FrankenPHP/commands/optimize.md +156 -0
- package/Infra/i18n/fr/FrankenPHP/commands/security-audit.md +171 -0
- package/Infra/i18n/fr/Hcloud/agents/hcloud-architect.md +288 -0
- package/Infra/i18n/fr/Hcloud/agents/hcloud-cost.md +242 -0
- package/Infra/i18n/fr/Hcloud/agents/hcloud-debug.md +309 -0
- package/Infra/i18n/fr/Hcloud/agents/hcloud-deployment.md +334 -0
- package/Infra/i18n/fr/Hcloud/agents/hcloud-security.md +294 -0
- package/Infra/i18n/fr/Hcloud/commands/architecture.md +158 -0
- package/Infra/i18n/fr/Hcloud/commands/debug.md +157 -0
- package/Infra/i18n/fr/Hcloud/commands/deploy-setup.md +139 -0
- package/Infra/i18n/fr/Hcloud/commands/optimize.md +149 -0
- package/Infra/i18n/fr/Hcloud/commands/security-audit.md +169 -0
- package/Infra/i18n/fr/Kubernetes/agents/kubernetes-architect.md +303 -0
- package/Infra/i18n/fr/Kubernetes/agents/kubernetes-debug.md +229 -0
- package/Infra/i18n/fr/Kubernetes/agents/kubernetes-deployment.md +214 -0
- package/Infra/i18n/fr/Kubernetes/agents/kubernetes-monitoring.md +272 -0
- package/Infra/i18n/fr/Kubernetes/agents/kubernetes-security.md +306 -0
- package/Infra/i18n/fr/Kubernetes/commands/architecture.md +180 -0
- package/Infra/i18n/fr/Kubernetes/commands/debug.md +119 -0
- package/Infra/i18n/fr/Kubernetes/commands/deploy-setup.md +115 -0
- package/Infra/i18n/fr/Kubernetes/commands/optimize.md +166 -0
- package/Infra/i18n/fr/Kubernetes/commands/security-audit.md +156 -0
- package/Infra/i18n/fr/OpenTofu/agents/opentofu-architect.md +328 -0
- package/Infra/i18n/fr/OpenTofu/agents/opentofu-cost.md +241 -0
- package/Infra/i18n/fr/OpenTofu/agents/opentofu-debug.md +248 -0
- package/Infra/i18n/fr/OpenTofu/agents/opentofu-deployment.md +237 -0
- package/Infra/i18n/fr/OpenTofu/agents/opentofu-security.md +271 -0
- package/Infra/i18n/fr/OpenTofu/commands/architecture.md +186 -0
- package/Infra/i18n/fr/OpenTofu/commands/debug.md +115 -0
- package/Infra/i18n/fr/OpenTofu/commands/deploy-setup.md +121 -0
- package/Infra/i18n/fr/OpenTofu/commands/optimize.md +135 -0
- package/Infra/i18n/fr/OpenTofu/commands/security-audit.md +139 -0
- package/Infra/i18n/fr/PgBouncer/agents/pgbouncer-architect.md +311 -0
- package/Infra/i18n/fr/PgBouncer/agents/pgbouncer-debug.md +302 -0
- package/Infra/i18n/fr/PgBouncer/agents/pgbouncer-deployment.md +339 -0
- package/Infra/i18n/fr/PgBouncer/agents/pgbouncer-monitoring.md +298 -0
- package/Infra/i18n/fr/PgBouncer/agents/pgbouncer-security.md +265 -0
- package/Infra/i18n/fr/PgBouncer/commands/architecture.md +138 -0
- package/Infra/i18n/fr/PgBouncer/commands/debug.md +147 -0
- package/Infra/i18n/fr/PgBouncer/commands/deploy-setup.md +118 -0
- package/Infra/i18n/fr/PgBouncer/commands/optimize.md +155 -0
- package/Infra/i18n/fr/PgBouncer/commands/security-audit.md +167 -0
- package/Infra/i18n/pt/Ansible/agents/ansible-architect.md +302 -0
- package/Infra/i18n/pt/Ansible/agents/ansible-debug.md +308 -0
- package/Infra/i18n/pt/Ansible/agents/ansible-deployment.md +292 -0
- package/Infra/i18n/pt/Ansible/agents/ansible-quality.md +307 -0
- package/Infra/i18n/pt/Ansible/agents/ansible-security.md +290 -0
- package/Infra/i18n/pt/Ansible/commands/architecture.md +175 -0
- package/Infra/i18n/pt/Ansible/commands/debug.md +152 -0
- package/Infra/i18n/pt/Ansible/commands/deploy-setup.md +162 -0
- package/Infra/i18n/pt/Ansible/commands/optimize.md +165 -0
- package/Infra/i18n/pt/Ansible/commands/security-audit.md +178 -0
- package/Infra/i18n/pt/FrankenPHP/agents/frankenphp-architect.md +342 -0
- package/Infra/i18n/pt/FrankenPHP/agents/frankenphp-debug.md +277 -0
- package/Infra/i18n/pt/FrankenPHP/agents/frankenphp-deployment.md +337 -0
- package/Infra/i18n/pt/FrankenPHP/agents/frankenphp-performance.md +300 -0
- package/Infra/i18n/pt/FrankenPHP/agents/frankenphp-security.md +289 -0
- package/Infra/i18n/pt/FrankenPHP/commands/architecture.md +137 -0
- package/Infra/i18n/pt/FrankenPHP/commands/debug.md +139 -0
- package/Infra/i18n/pt/FrankenPHP/commands/deploy-setup.md +117 -0
- package/Infra/i18n/pt/FrankenPHP/commands/optimize.md +156 -0
- package/Infra/i18n/pt/FrankenPHP/commands/security-audit.md +171 -0
- package/Infra/i18n/pt/Hcloud/agents/hcloud-architect.md +288 -0
- package/Infra/i18n/pt/Hcloud/agents/hcloud-cost.md +242 -0
- package/Infra/i18n/pt/Hcloud/agents/hcloud-debug.md +309 -0
- package/Infra/i18n/pt/Hcloud/agents/hcloud-deployment.md +334 -0
- package/Infra/i18n/pt/Hcloud/agents/hcloud-security.md +294 -0
- package/Infra/i18n/pt/Hcloud/commands/architecture.md +158 -0
- package/Infra/i18n/pt/Hcloud/commands/debug.md +157 -0
- package/Infra/i18n/pt/Hcloud/commands/deploy-setup.md +139 -0
- package/Infra/i18n/pt/Hcloud/commands/optimize.md +149 -0
- package/Infra/i18n/pt/Hcloud/commands/security-audit.md +169 -0
- package/Infra/i18n/pt/Kubernetes/agents/kubernetes-architect.md +303 -0
- package/Infra/i18n/pt/Kubernetes/agents/kubernetes-debug.md +229 -0
- package/Infra/i18n/pt/Kubernetes/agents/kubernetes-deployment.md +214 -0
- package/Infra/i18n/pt/Kubernetes/agents/kubernetes-monitoring.md +272 -0
- package/Infra/i18n/pt/Kubernetes/agents/kubernetes-security.md +306 -0
- package/Infra/i18n/pt/Kubernetes/commands/architecture.md +180 -0
- package/Infra/i18n/pt/Kubernetes/commands/debug.md +119 -0
- package/Infra/i18n/pt/Kubernetes/commands/deploy-setup.md +115 -0
- package/Infra/i18n/pt/Kubernetes/commands/optimize.md +166 -0
- package/Infra/i18n/pt/Kubernetes/commands/security-audit.md +156 -0
- package/Infra/i18n/pt/OpenTofu/agents/opentofu-architect.md +328 -0
- package/Infra/i18n/pt/OpenTofu/agents/opentofu-cost.md +241 -0
- package/Infra/i18n/pt/OpenTofu/agents/opentofu-debug.md +248 -0
- package/Infra/i18n/pt/OpenTofu/agents/opentofu-deployment.md +237 -0
- package/Infra/i18n/pt/OpenTofu/agents/opentofu-security.md +271 -0
- package/Infra/i18n/pt/OpenTofu/commands/architecture.md +186 -0
- package/Infra/i18n/pt/OpenTofu/commands/debug.md +115 -0
- package/Infra/i18n/pt/OpenTofu/commands/deploy-setup.md +121 -0
- package/Infra/i18n/pt/OpenTofu/commands/optimize.md +135 -0
- package/Infra/i18n/pt/OpenTofu/commands/security-audit.md +139 -0
- package/Infra/i18n/pt/PgBouncer/agents/pgbouncer-architect.md +311 -0
- package/Infra/i18n/pt/PgBouncer/agents/pgbouncer-debug.md +302 -0
- package/Infra/i18n/pt/PgBouncer/agents/pgbouncer-deployment.md +339 -0
- package/Infra/i18n/pt/PgBouncer/agents/pgbouncer-monitoring.md +298 -0
- package/Infra/i18n/pt/PgBouncer/agents/pgbouncer-security.md +265 -0
- package/Infra/i18n/pt/PgBouncer/commands/architecture.md +138 -0
- package/Infra/i18n/pt/PgBouncer/commands/debug.md +147 -0
- package/Infra/i18n/pt/PgBouncer/commands/deploy-setup.md +118 -0
- package/Infra/i18n/pt/PgBouncer/commands/optimize.md +155 -0
- package/Infra/i18n/pt/PgBouncer/commands/security-audit.md +167 -0
- package/Infra/install-ansible-rules.sh +410 -0
- package/Infra/{install-infra-rules.sh → install-docker-rules.sh} +7 -7
- package/Infra/install-frankenphp-rules.sh +410 -0
- package/Infra/install-hcloud-rules.sh +410 -0
- package/Infra/install-kubernetes-rules.sh +410 -0
- package/Infra/install-opentofu-rules.sh +410 -0
- package/Infra/install-pgbouncer-rules.sh +410 -0
- package/Project/i18n/de/Gate/commands/validate-alignment.md +123 -0
- package/Project/i18n/de/Sprint/commands/next-story.md +12 -3
- package/Project/i18n/de/commands/burndown.md +124 -0
- package/Project/i18n/de/commands/checkpoint.md +243 -0
- package/Project/i18n/de/commands/coverage-map.md +221 -0
- package/Project/i18n/de/commands/critical-path.md +127 -0
- package/Project/i18n/de/commands/dependencies.md +143 -0
- package/Project/i18n/de/commands/gap-analysis.md +294 -0
- package/Project/i18n/de/commands/generate-constitution.md +227 -0
- package/Project/i18n/de/commands/metrics.md +227 -0
- package/Project/i18n/de/commands/reverse-prd.md +288 -0
- package/Project/i18n/de/commands/reverse-stories.md +305 -0
- package/Project/i18n/de/commands/scan.md +271 -0
- package/Project/i18n/de/commands/trace.md +269 -0
- package/Project/i18n/de/templates/constitution.md +115 -0
- package/Project/i18n/de/templates/prd.md +31 -7
- package/Project/i18n/de/templates/tech-spec.md +9 -0
- package/Project/i18n/de/templates/user-story.md +5 -0
- package/Project/i18n/en/Gate/commands/validate-alignment.md +123 -0
- package/Project/i18n/en/Sprint/commands/next-story.md +12 -3
- package/Project/i18n/en/commands/burndown.md +124 -0
- package/Project/i18n/en/commands/checkpoint.md +243 -0
- package/Project/i18n/en/commands/coverage-map.md +221 -0
- package/Project/i18n/en/commands/critical-path.md +127 -0
- package/Project/i18n/en/commands/dependencies.md +143 -0
- package/Project/i18n/en/commands/gap-analysis.md +294 -0
- package/Project/i18n/en/commands/generate-constitution.md +227 -0
- package/Project/i18n/en/commands/metrics.md +227 -0
- package/Project/i18n/en/commands/reverse-prd.md +288 -0
- package/Project/i18n/en/commands/reverse-stories.md +305 -0
- package/Project/i18n/en/commands/scan.md +271 -0
- package/Project/i18n/en/commands/trace.md +269 -0
- package/Project/i18n/en/templates/constitution.md +115 -0
- package/Project/i18n/en/templates/prd.md +31 -7
- package/Project/i18n/en/templates/tech-spec.md +9 -0
- package/Project/i18n/en/templates/user-story.md +5 -0
- package/Project/i18n/es/Gate/commands/validate-alignment.md +123 -0
- package/Project/i18n/es/Sprint/commands/next-story.md +12 -3
- package/Project/i18n/es/commands/burndown.md +124 -0
- package/Project/i18n/es/commands/checkpoint.md +243 -0
- package/Project/i18n/es/commands/coverage-map.md +221 -0
- package/Project/i18n/es/commands/critical-path.md +127 -0
- package/Project/i18n/es/commands/dependencies.md +143 -0
- package/Project/i18n/es/commands/gap-analysis.md +294 -0
- package/Project/i18n/es/commands/generate-constitution.md +227 -0
- package/Project/i18n/es/commands/metrics.md +227 -0
- package/Project/i18n/es/commands/reverse-prd.md +288 -0
- package/Project/i18n/es/commands/reverse-stories.md +305 -0
- package/Project/i18n/es/commands/scan.md +271 -0
- package/Project/i18n/es/commands/trace.md +269 -0
- package/Project/i18n/es/templates/constitution.md +115 -0
- package/Project/i18n/es/templates/prd.md +31 -7
- package/Project/i18n/es/templates/tech-spec.md +9 -0
- package/Project/i18n/es/templates/user-story.md +5 -0
- package/Project/i18n/fr/Gate/commands/validate-alignment.md +125 -0
- package/Project/i18n/fr/Sprint/commands/next-story.md +12 -3
- package/Project/i18n/fr/commands/burndown.md +124 -0
- package/Project/i18n/fr/commands/checkpoint.md +243 -0
- package/Project/i18n/fr/commands/coverage-map.md +221 -0
- package/Project/i18n/fr/commands/critical-path.md +127 -0
- package/Project/i18n/fr/commands/dependencies.md +143 -0
- package/Project/i18n/fr/commands/gap-analysis.md +294 -0
- package/Project/i18n/fr/commands/generate-constitution.md +227 -0
- package/Project/i18n/fr/commands/metrics.md +227 -0
- package/Project/i18n/fr/commands/reverse-prd.md +288 -0
- package/Project/i18n/fr/commands/reverse-stories.md +305 -0
- package/Project/i18n/fr/commands/scan.md +271 -0
- package/Project/i18n/fr/commands/trace.md +269 -0
- package/Project/i18n/fr/templates/constitution.md +115 -0
- package/Project/i18n/fr/templates/prd.md +31 -7
- package/Project/i18n/fr/templates/tech-spec.md +9 -0
- package/Project/i18n/fr/templates/user-story.md +5 -0
- package/Project/i18n/pt/Gate/commands/validate-alignment.md +124 -0
- package/Project/i18n/pt/Sprint/commands/next-story.md +12 -3
- package/Project/i18n/pt/commands/burndown.md +124 -0
- package/Project/i18n/pt/commands/checkpoint.md +243 -0
- package/Project/i18n/pt/commands/coverage-map.md +221 -0
- package/Project/i18n/pt/commands/critical-path.md +127 -0
- package/Project/i18n/pt/commands/dependencies.md +143 -0
- package/Project/i18n/pt/commands/gap-analysis.md +294 -0
- package/Project/i18n/pt/commands/generate-constitution.md +227 -0
- package/Project/i18n/pt/commands/metrics.md +227 -0
- package/Project/i18n/pt/commands/reverse-prd.md +288 -0
- package/Project/i18n/pt/commands/reverse-stories.md +305 -0
- package/Project/i18n/pt/commands/scan.md +271 -0
- package/Project/i18n/pt/commands/trace.md +269 -0
- package/Project/i18n/pt/templates/constitution.md +115 -0
- package/Project/i18n/pt/templates/prd.md +31 -7
- package/Project/i18n/pt/templates/tech-spec.md +9 -0
- package/Project/i18n/pt/templates/user-story.md +5 -0
- package/README.md +21 -12
- package/Tools/ProjectConfig/claude-projects.sh +1 -1
- package/Tools/RTK/README.md +99 -0
- package/Tools/RTK/install-rtk.sh +410 -0
- package/Tools/RTK/tests/install-rtk.bats +347 -0
- package/Tools/i18n/rtk/de.sh +62 -0
- package/Tools/i18n/rtk/en.sh +62 -0
- package/Tools/i18n/rtk/es.sh +62 -0
- package/Tools/i18n/rtk/fr.sh +62 -0
- package/Tools/i18n/rtk/pt.sh +62 -0
- package/cli/lib/installer.js +18 -3
- package/cli/lib/tech-registry.js +1 -1
- package/package.json +1 -1
- package/Dev/i18n/base/PHP/agents/php-reviewer.md +0 -350
|
@@ -1,223 +1,578 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: angular-reviewer
|
|
3
|
-
description: Angular
|
|
4
|
-
model:
|
|
3
|
+
description: Spezialist für Angular 19 und TypeScript Code-Reviews — Signals, Standalone-Komponenten, RxJS, Performance, Zoneless Change Detection
|
|
4
|
+
model: sonnet
|
|
5
5
|
tools: [Read, Glob, Grep, WebFetch, WebSearch]
|
|
6
6
|
disallowedTools: [Write, Edit, Bash, NotebookEdit]
|
|
7
7
|
permissionMode: default
|
|
8
8
|
skills: [solid-principles, testing, security]
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
# Angular
|
|
11
|
+
# Audit-Agent Angular 19 / TypeScript
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
## Identität
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Ich bin ein Spezialist für Code-Reviews von Angular 19 und TypeScript. Mein Ansatz konzentriert sich auf die spezifischen Probleme des modernen Angular: die Signals-basierte Architektur, Standalone-Komponenten, den neuen Control Flow (@if/@for/@switch), @defer für Lazy Loading, inject() für Dependency Injection und die Trennung von Signals/RxJS. Ich führe kein generisches Audit durch -- ich erkenne, was eine Angular 19-Anwendung zum Abstürzen bringt, verlangsamt oder unnötig verkompliziert.
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
- Code quality and maintainability
|
|
19
|
-
- Angular best practices compliance
|
|
20
|
-
- Performance optimization
|
|
21
|
-
- Security vulnerabilities
|
|
22
|
-
- Testing coverage
|
|
17
|
+
## Bewertungssystem (100 Punkte)
|
|
23
18
|
|
|
24
|
-
|
|
19
|
+
| Kategorie | Punkte | Fokus |
|
|
20
|
+
|-----------|--------|-------|
|
|
21
|
+
| Signals und Architektur | 30 | Angular Signals, Standalone, @defer, inject() |
|
|
22
|
+
| TypeScript und Qualität | 20 | Strict Mode, Typed Forms, Typed Routes |
|
|
23
|
+
| Tests | 25 | TestBed, ComponentFixture, Spectator, Cypress |
|
|
24
|
+
| Performance und Rendering | 25 | OnPush, @defer, SSR, Hydration, Bundle-Größe |
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 1. Signals und Architektur (30 Punkte)
|
|
29
|
+
|
|
30
|
+
### Entscheidungsbaum: Signal vs BehaviorSubject
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Ist der Zustand synchron und wird für das Rendering verwendet?
|
|
34
|
+
JA --> signal() oder computed()
|
|
35
|
+
NEIN --> Stammt der Zustand aus einem komplexen asynchronen Datenfluss?
|
|
36
|
+
JA --> RxJS (debounce, websocket, Orchestrierung)
|
|
37
|
+
--> Für das Template via toSignal() in Signal konvertieren
|
|
38
|
+
NEIN --> Ist der Zustand von anderen Signals abgeleitet?
|
|
39
|
+
JA --> computed()
|
|
40
|
+
NEIN --> signal() mit update/set
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Entscheidungsbaum: Standalone vs NgModule
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
Ist die Komponente in einem neuen Angular 19-Projekt?
|
|
47
|
+
JA --> KRITISCH wenn nicht standalone (Standard seit v19)
|
|
48
|
+
NEIN --> Ist die Komponente in einem NgModule?
|
|
49
|
+
JA --> Kann sie zu standalone migriert werden?
|
|
50
|
+
JA --> GERINGFÜGIG: Migration planen
|
|
51
|
+
NEIN --> Ist die Begründung dokumentiert? (Legacy-Bibliothek)
|
|
52
|
+
NEIN --> SCHWERWIEGEND: Migration empfohlen
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Entscheidungsbaum: Analyse einer Komponente
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
Verwendet die Komponente Signals?
|
|
59
|
+
NEIN --> Verwendet sie BehaviorSubject für lokalen Zustand?
|
|
60
|
+
JA --> SCHWERWIEGEND: zu signal() migrieren
|
|
61
|
+
NEIN --> Verwendet sie einfache Properties?
|
|
62
|
+
JA --> SCHWERWIEGEND: zu signal() migrieren für Reaktivität
|
|
63
|
+
JA --> Verwenden die Ableitungen computed()?
|
|
64
|
+
NEIN --> GERINGFÜGIG: computed() statt Neuberechnung verwenden
|
|
65
|
+
JA --> Werden effects() korrekt verwendet?
|
|
66
|
+
--> Modifizieren sie andere Signals? --> SCHWERWIEGEND: Schleifengefahr
|
|
67
|
+
|
|
68
|
+
Verwendet die Komponente inject()?
|
|
69
|
+
NEIN --> Verwendet sie den Konstruktor für Injection?
|
|
70
|
+
JA --> GERINGFÜGIG: inject() für Kürze bevorzugen
|
|
71
|
+
JA --> OK
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Kritische Verstöße
|
|
75
|
+
|
|
76
|
+
**Signals vs BehaviorSubject:**
|
|
77
|
+
```typescript
|
|
78
|
+
// VERBOTEN: BehaviorSubject für lokalen Zustand
|
|
79
|
+
@Component({ /* ... */ })
|
|
80
|
+
export class CounterComponent {
|
|
81
|
+
private count$ = new BehaviorSubject(0);
|
|
82
|
+
count = this.count$.asObservable();
|
|
83
|
+
|
|
84
|
+
increment() {
|
|
85
|
+
this.count$.next(this.count$.value + 1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// KORREKT: signal() für synchronen lokalen Zustand
|
|
90
|
+
@Component({ /* ... */ })
|
|
91
|
+
export class CounterComponent {
|
|
92
|
+
count = signal(0);
|
|
93
|
+
doubleCount = computed(() => this.count() * 2);
|
|
27
94
|
|
|
95
|
+
increment() {
|
|
96
|
+
this.count.update(v => v + 1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Standalone und neuer Control Flow:**
|
|
28
102
|
```typescript
|
|
29
|
-
//
|
|
103
|
+
// VERBOTEN: NgModule und Legacy *ngIf/*ngFor
|
|
30
104
|
@Component({
|
|
31
|
-
selector: 'app-user-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
105
|
+
selector: 'app-user-list',
|
|
106
|
+
template: `
|
|
107
|
+
<div *ngIf="loading">Laden...</div>
|
|
108
|
+
<div *ngFor="let user of users">{{ user.name }}</div>
|
|
109
|
+
`
|
|
35
110
|
})
|
|
36
111
|
|
|
37
|
-
//
|
|
112
|
+
// KORREKT: standalone + @if/@for Control Flow
|
|
38
113
|
@Component({
|
|
39
|
-
selector: 'app-user-
|
|
114
|
+
selector: 'app-user-list',
|
|
115
|
+
standalone: true,
|
|
116
|
+
template: `
|
|
117
|
+
@if (loading()) {
|
|
118
|
+
<spinner />
|
|
119
|
+
}
|
|
120
|
+
@for (user of users(); track user.id) {
|
|
121
|
+
<user-card [user]="user" />
|
|
122
|
+
} @empty {
|
|
123
|
+
<p>Keine Benutzer</p>
|
|
124
|
+
}
|
|
125
|
+
`,
|
|
126
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
40
127
|
})
|
|
41
128
|
```
|
|
42
129
|
|
|
43
|
-
|
|
44
|
-
|
|
130
|
+
**inject() vs Konstruktor:**
|
|
45
131
|
```typescript
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
132
|
+
// AKZEPTABEL aber ausführlich
|
|
133
|
+
constructor(
|
|
134
|
+
private readonly userService: UserService,
|
|
135
|
+
private readonly router: Router,
|
|
136
|
+
private readonly destroyRef: DestroyRef,
|
|
137
|
+
) {}
|
|
138
|
+
|
|
139
|
+
// BEVORZUGT: inject() auf Top-Level
|
|
140
|
+
private readonly userService = inject(UserService);
|
|
141
|
+
private readonly router = inject(Router);
|
|
142
|
+
private readonly destroyRef = inject(DestroyRef);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Zu überprüfende Architektur-Patterns
|
|
146
|
+
|
|
147
|
+
| Pattern | Erwartet | Anti-Pattern |
|
|
148
|
+
|---------|----------|-------------|
|
|
149
|
+
| Signals für lokalen Zustand | signal(), computed(), effect() | BehaviorSubject für synchronen Zustand |
|
|
150
|
+
| RxJS für komplexe Datenflüsse | debounce, switchMap, websockets | RxJS für einen einfachen Boolean |
|
|
151
|
+
| Standalone-Komponenten | standalone: true, lokale Imports | NgModule für neue Komponenten |
|
|
152
|
+
| Smart/Dumb Pattern | Container verwaltet Logik, Presentational zeigt an | Geschäftslogik in Templates |
|
|
153
|
+
| inject() | Injection auf Klassenebene | Überladener Konstruktor |
|
|
154
|
+
|
|
155
|
+
### Bewertung
|
|
156
|
+
|
|
157
|
+
| Kriterium | Punkte |
|
|
158
|
+
|-----------|--------|
|
|
159
|
+
| Signals für synchronen Zustand verwendet (kein lokaler BehaviorSubject) | 8 |
|
|
160
|
+
| Standalone-Komponenten mit expliziten Imports | 7 |
|
|
161
|
+
| Neuer Control Flow (@if/@for/@switch, kein *ngIf/*ngFor) | 8 |
|
|
162
|
+
| inject() verwendet, Smart/Dumb-Architektur eingehalten | 7 |
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 2. TypeScript und Qualität (20 Punkte)
|
|
167
|
+
|
|
168
|
+
### Entscheidungsbaum: Qualität der Typisierung
|
|
49
169
|
|
|
50
|
-
|
|
51
|
-
|
|
170
|
+
```
|
|
171
|
+
strict: true in tsconfig.json?
|
|
172
|
+
NEIN --> KRITISCH: Strict Mode aktivieren
|
|
173
|
+
JA --> Gibt es explizite `any`?
|
|
174
|
+
JA --> Sind sie durch einen Kommentar begründet?
|
|
175
|
+
NEIN --> SCHWERWIEGEND: unbegründetes any
|
|
176
|
+
NEIN --> Sind die Formulare typisiert?
|
|
177
|
+
NEIN --> SCHWERWIEGEND: FormGroup<T> / FormControl<T> verwenden
|
|
178
|
+
JA --> Sind die Routen typisiert?
|
|
179
|
+
NEIN --> GERINGFÜGIG: withComponentInputBinding verwenden
|
|
52
180
|
```
|
|
53
181
|
|
|
54
|
-
###
|
|
182
|
+
### Angular/TypeScript-spezifische Verstöße
|
|
55
183
|
|
|
56
184
|
```typescript
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
185
|
+
// SCHLECHT: Nicht typisiertes Formular
|
|
186
|
+
form = new FormGroup({
|
|
187
|
+
name: new FormControl(''),
|
|
188
|
+
email: new FormControl(''),
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// GUT: Streng typisiertes Formular
|
|
192
|
+
interface UserForm {
|
|
193
|
+
name: FormControl<string>;
|
|
194
|
+
email: FormControl<string>;
|
|
195
|
+
age: FormControl<number | null>;
|
|
63
196
|
}
|
|
64
197
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
198
|
+
form = new FormGroup<UserForm>({
|
|
199
|
+
name: new FormControl('', { nonNullable: true }),
|
|
200
|
+
email: new FormControl('', { nonNullable: true }),
|
|
201
|
+
age: new FormControl(null),
|
|
202
|
+
});
|
|
68
203
|
```
|
|
69
204
|
|
|
70
|
-
### 4. Dependency Injection
|
|
71
|
-
|
|
72
205
|
```typescript
|
|
73
|
-
//
|
|
74
|
-
|
|
206
|
+
// SCHLECHT: any bei Observables
|
|
207
|
+
loadData(): Observable<any> {
|
|
208
|
+
return this.http.get('/api/users');
|
|
209
|
+
}
|
|
75
210
|
|
|
76
|
-
//
|
|
77
|
-
|
|
211
|
+
// GUT: Explizite Typisierung
|
|
212
|
+
loadData(): Observable<User[]> {
|
|
213
|
+
return this.http.get<User[]>('/api/users');
|
|
214
|
+
}
|
|
78
215
|
```
|
|
79
216
|
|
|
80
|
-
### 5. Subscription Management
|
|
81
|
-
|
|
82
217
|
```typescript
|
|
83
|
-
//
|
|
218
|
+
// SCHLECHT: Subscription ohne Cleanup
|
|
219
|
+
ngOnInit() {
|
|
220
|
+
this.data$.subscribe(data => this.data = data);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// GUT: takeUntilDestroyed für automatisches Cleanup
|
|
84
224
|
private destroyRef = inject(DestroyRef);
|
|
85
225
|
|
|
86
226
|
ngOnInit() {
|
|
87
227
|
this.data$.pipe(
|
|
88
228
|
takeUntilDestroyed(this.destroyRef)
|
|
89
|
-
).subscribe();
|
|
229
|
+
).subscribe(data => this.data.set(data));
|
|
90
230
|
}
|
|
231
|
+
```
|
|
91
232
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
233
|
+
### Bewertung
|
|
234
|
+
|
|
235
|
+
| Kriterium | Punkte |
|
|
236
|
+
|-----------|--------|
|
|
237
|
+
| strict: true aktiv, noUncheckedIndexedAccess | 6 |
|
|
238
|
+
| Kein unbegründetes `any`, kein `@ts-ignore` ohne Grund | 5 |
|
|
239
|
+
| Typisierte Formulare (FormGroup<T>), typisierte Routen | 5 |
|
|
240
|
+
| Subscriptions bereinigt (takeUntilDestroyed, toSignal) | 4 |
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 3. Tests (25 Punkte)
|
|
245
|
+
|
|
246
|
+
### Entscheidungsbaum: Teststrategie
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
Hat die Komponente Tests?
|
|
250
|
+
NEIN --> KRITISCH bei Geschäftskomponente, SCHWERWIEGEND bei einfacher UI-Komponente
|
|
251
|
+
JA --> Prüfen die Tests das Verhalten (nicht die Implementierung)?
|
|
252
|
+
NEIN --> SCHWERWIEGEND: fragile Tests
|
|
253
|
+
JA --> Werden Signals korrekt getestet?
|
|
254
|
+
NEIN --> GERINGFÜGIG: fixture.detectChanges() nach signal.set() verwenden
|
|
255
|
+
JA --> Werden Benutzerinteraktionen getestet?
|
|
256
|
+
NEIN --> GERINGFÜGIG: Interaktionstests hinzufügen
|
|
96
257
|
```
|
|
97
258
|
|
|
98
|
-
###
|
|
259
|
+
### Testprinzipien Angular 19
|
|
99
260
|
|
|
261
|
+
**Tests mit Signals:**
|
|
100
262
|
```typescript
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
next: data => this.data.set(data),
|
|
106
|
-
error: err => this.error.set(err.message),
|
|
107
|
-
complete: () => this.loading.set(false)
|
|
108
|
-
});
|
|
109
|
-
}
|
|
263
|
+
// GUT: Komponente mit Signals testen
|
|
264
|
+
it('should display updated count', () => {
|
|
265
|
+
const fixture = TestBed.createComponent(CounterComponent);
|
|
266
|
+
const component = fixture.componentInstance;
|
|
110
267
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
this.api.getData().subscribe(data => this.data = data);
|
|
114
|
-
}
|
|
115
|
-
```
|
|
268
|
+
component.count.set(42);
|
|
269
|
+
fixture.detectChanges();
|
|
116
270
|
|
|
117
|
-
|
|
271
|
+
const el = fixture.nativeElement.querySelector('[data-testid="count"]');
|
|
272
|
+
expect(el.textContent).toContain('42');
|
|
273
|
+
});
|
|
274
|
+
```
|
|
118
275
|
|
|
276
|
+
**Tests mit Spectator (empfohlen):**
|
|
119
277
|
```typescript
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
278
|
+
// GUT: Spectator vereinfacht das Setup
|
|
279
|
+
const createComponent = createComponentFactory({
|
|
280
|
+
component: UserListComponent,
|
|
281
|
+
mocks: [UserService],
|
|
282
|
+
});
|
|
125
283
|
|
|
126
|
-
|
|
284
|
+
it('should load users on init', () => {
|
|
285
|
+
const spectator = createComponent();
|
|
286
|
+
const userService = spectator.inject(UserService);
|
|
287
|
+
userService.getUsers.and.returnValue(of([mockUser]));
|
|
127
288
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
email: new FormControl('')
|
|
289
|
+
spectator.detectChanges();
|
|
290
|
+
|
|
291
|
+
expect(spectator.queryAll('app-user-card')).toHaveLength(1);
|
|
132
292
|
});
|
|
133
293
|
```
|
|
134
294
|
|
|
135
|
-
|
|
295
|
+
**Test-Anti-Patterns:**
|
|
296
|
+
- Implementierungsdetails testen (interne Service-Aufrufe)
|
|
297
|
+
- `fixture.detectChanges()` nach Signal-Änderung vergessen
|
|
298
|
+
- HTTP-Services in Unit-Tests nicht mocken
|
|
299
|
+
- Snapshot-Tests als einzige Abdeckung
|
|
136
300
|
|
|
137
|
-
|
|
138
|
-
|
|
301
|
+
### Erwartete Abdeckung
|
|
302
|
+
|
|
303
|
+
| Code-Typ | Mindestabdeckung |
|
|
304
|
+
|----------|-----------------|
|
|
305
|
+
| Geschäftsservices | 90% |
|
|
306
|
+
| Komponenten mit Logik | 80% |
|
|
307
|
+
| Guards und Interceptors | 85% |
|
|
308
|
+
| Benutzerdefinierte Pipes | 90% |
|
|
309
|
+
| Seiten / Routen | 70% (Integrationstests) |
|
|
139
310
|
|
|
140
|
-
###
|
|
141
|
-
Brief overview of the code quality and main findings.
|
|
311
|
+
### Bewertung
|
|
142
312
|
|
|
143
|
-
|
|
313
|
+
| Kriterium | Punkte |
|
|
314
|
+
|-----------|--------|
|
|
315
|
+
| Abdeckung >= 80% bei kritischen Komponenten | 7 |
|
|
316
|
+
| Verhaltenstests (keine Implementierung) | 6 |
|
|
317
|
+
| Signals korrekt getestet (detectChanges nach set) | 5 |
|
|
318
|
+
| Fehlerfälle, Ladezustände, Grenzfälle abgedeckt | 4 |
|
|
319
|
+
| E2E-Tests für kritische Abläufe (Cypress/Playwright) | 3 |
|
|
144
320
|
|
|
145
|
-
|
|
146
|
-
- ✅ Point 1
|
|
147
|
-
- ✅ Point 2
|
|
321
|
+
---
|
|
148
322
|
|
|
149
|
-
|
|
323
|
+
## 4. Performance und Rendering (25 Punkte)
|
|
150
324
|
|
|
151
|
-
|
|
152
|
-
- 🔴 Issue description
|
|
153
|
-
- File: `path/to/file.ts:line`
|
|
154
|
-
- Suggested fix: ...
|
|
325
|
+
### Entscheidungsbaum: OnPush
|
|
155
326
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
327
|
+
```
|
|
328
|
+
Verwendet die Komponente OnPush?
|
|
329
|
+
NEIN --> Ist die Komponente eine Presentational-Komponente?
|
|
330
|
+
JA --> SCHWERWIEGEND: OnPush aktivieren
|
|
331
|
+
NEIN --> Kann die Komponente mit OnPush funktionieren?
|
|
332
|
+
JA --> GERINGFÜGIG: OnPush empfehlen
|
|
333
|
+
NEIN --> Ist die Begründung dokumentiert?
|
|
334
|
+
NEIN --> SCHWERWIEGEND: Grund dokumentieren
|
|
335
|
+
```
|
|
160
336
|
|
|
161
|
-
|
|
162
|
-
- 🟡 Issue description
|
|
163
|
-
- File: `path/to/file.ts:line`
|
|
164
|
-
- Suggested fix: ...
|
|
337
|
+
### Entscheidungsbaum: @defer
|
|
165
338
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
339
|
+
```
|
|
340
|
+
Ist die Komponente beim initialen Laden sichtbar?
|
|
341
|
+
NEIN --> Ist die Komponente standalone?
|
|
342
|
+
JA --> @defer verwendbar
|
|
343
|
+
--> Ist sie below the fold? --> @defer (on viewport)
|
|
344
|
+
--> Wird sie durch Interaktion aktiviert? --> @defer (on interaction)
|
|
345
|
+
--> Ist sie sekundär? --> @defer (on idle)
|
|
346
|
+
NEIN --> GERINGFÜGIG: zu standalone migrieren, um @defer zu ermöglichen
|
|
347
|
+
JA --> Kein @defer notwendig
|
|
348
|
+
```
|
|
169
349
|
|
|
170
|
-
###
|
|
350
|
+
### @defer Patterns
|
|
171
351
|
|
|
172
352
|
```typescript
|
|
173
|
-
//
|
|
174
|
-
{
|
|
353
|
+
// GUT: @defer mit Triggern und Platzhalter
|
|
354
|
+
@defer (on viewport) {
|
|
355
|
+
<heavy-chart-component [data]="chartData()" />
|
|
356
|
+
} @placeholder {
|
|
357
|
+
<div class="chart-skeleton">Diagramm wird geladen...</div>
|
|
358
|
+
} @loading (minimum 200ms) {
|
|
359
|
+
<spinner />
|
|
360
|
+
} @error {
|
|
361
|
+
<p>Fehler beim Laden der Komponente</p>
|
|
362
|
+
}
|
|
175
363
|
|
|
176
|
-
//
|
|
177
|
-
{
|
|
364
|
+
// GUT: @defer bei Interaktion
|
|
365
|
+
@defer (on interaction(loadBtn)) {
|
|
366
|
+
<admin-panel />
|
|
367
|
+
} @placeholder {
|
|
368
|
+
<button #loadBtn>Admin-Panel öffnen</button>
|
|
369
|
+
}
|
|
178
370
|
```
|
|
371
|
+
|
|
372
|
+
### SSR und Hydration
|
|
373
|
+
|
|
374
|
+
```
|
|
375
|
+
Verwendet die Anwendung SSR?
|
|
376
|
+
JA --> Ist Hydration aktiviert?
|
|
377
|
+
NEIN --> KRITISCH: provideClientHydration() aktivieren
|
|
378
|
+
JA --> Werden interaktive Komponenten korrekt hydriert?
|
|
379
|
+
--> afterNextRender() für Browser-only Code verwendet?
|
|
380
|
+
NEIN --> Benötigt die Anwendung SEO?
|
|
381
|
+
JA --> SCHWERWIEGEND: SSR mit Angular Universal in Betracht ziehen
|
|
179
382
|
```
|
|
180
383
|
|
|
181
|
-
|
|
384
|
+
### Zoneless und Change Detection
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
Verwendet die Anwendung Zoneless Change Detection?
|
|
388
|
+
JA --> Verwenden alle Zustände Signals?
|
|
389
|
+
NEIN --> KRITISCH: Komponenten werden nicht aktualisiert
|
|
390
|
+
JA --> Lösen Event-Listener die CD korrekt aus?
|
|
391
|
+
NEIN --> Wird Zone.js verwendet?
|
|
392
|
+
JA --> Akzeptabel, aber Migration zu Zoneless in Betracht ziehen
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Bundle-Analyse
|
|
396
|
+
|
|
397
|
+
| Kriterium | Schwellenwert | Schweregrad bei Überschreitung |
|
|
398
|
+
|-----------|--------------|-------------------------------|
|
|
399
|
+
| Initiales Bundle (gzipped) | < 200KB | KRITISCH wenn > 500KB, SCHWERWIEGEND wenn > 300KB |
|
|
400
|
+
| Größter Lazy Chunk | < 100KB | SCHWERWIEGEND |
|
|
401
|
+
| Nicht tree-geshakte RxJS-Operatoren | 0 | SCHWERWIEGEND bei globalem import 'rxjs' |
|
|
402
|
+
| Zone.js unnötig inkludiert (bei Zoneless) | 0 | GERINGFÜGIG |
|
|
403
|
+
|
|
404
|
+
**Zu markierende Imports:**
|
|
405
|
+
```typescript
|
|
406
|
+
// SCHLECHT: Globaler RxJS-Import
|
|
407
|
+
import * as rxjs from 'rxjs';
|
|
408
|
+
import 'rxjs/add/operator/map';
|
|
409
|
+
|
|
410
|
+
// GUT: Spezifische Imports
|
|
411
|
+
import { map, switchMap, takeUntilDestroyed } from 'rxjs';
|
|
412
|
+
import { signal, computed } from '@angular/core';
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Bewertung
|
|
416
|
+
|
|
417
|
+
| Kriterium | Punkte |
|
|
418
|
+
|-----------|--------|
|
|
419
|
+
| OnPush auf allen Presentational-Komponenten | 7 |
|
|
420
|
+
| @defer für Below-the-fold-Inhalte verwendet | 6 |
|
|
421
|
+
| Lazy Loading der Routen, effektives Code Splitting | 5 |
|
|
422
|
+
| Bundle < 200KB initial, keine globalen RxJS-Imports | 4 |
|
|
423
|
+
| SSR/Hydration korrekt konfiguriert (falls zutreffend) | 3 |
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## Audit-Methodik
|
|
428
|
+
|
|
429
|
+
### Phase 1: Struktur und Architektur (10 Min.)
|
|
430
|
+
|
|
431
|
+
1. Organisation prüfen (Domain-driven oder Feature-based)
|
|
432
|
+
2. State-Management-Strategie identifizieren (Signals vs RxJS vs NgRx)
|
|
433
|
+
3. Trennung Smart/Dumb-Komponenten überprüfen
|
|
434
|
+
4. tsconfig.json prüfen (strict: true)
|
|
435
|
+
5. angular.json und package.json prüfen (aktuelle Deps, keine unnötigen Deps)
|
|
436
|
+
|
|
437
|
+
### Phase 2: Signals und Komponenten (15 Min.)
|
|
438
|
+
|
|
439
|
+
1. BehaviorSubjects scannen, die für lokalen synchronen Zustand verwendet werden
|
|
440
|
+
2. Verwendung von Standalone-Komponenten prüfen
|
|
441
|
+
3. Neuen Control Flow evaluieren (@if/@for vs *ngIf/*ngFor)
|
|
442
|
+
4. inject() vs Konstruktor-Injection prüfen
|
|
443
|
+
5. Problematische effects() erkennen (Schleifen, Seiteneffekte)
|
|
444
|
+
|
|
445
|
+
### Phase 3: TypeScript (10 Min.)
|
|
446
|
+
|
|
447
|
+
1. Strict Mode und Konfiguration prüfen
|
|
448
|
+
2. Nach `any` und `@ts-ignore` scannen
|
|
449
|
+
3. Typisierung der Formulare prüfen (FormGroup<T>)
|
|
450
|
+
4. Cleanup von Subscriptions evaluieren (takeUntilDestroyed)
|
|
451
|
+
|
|
452
|
+
### Phase 4: Tests (10 Min.)
|
|
453
|
+
|
|
454
|
+
1. Abdeckung prüfen (> 80% kritische Komponenten)
|
|
455
|
+
2. Qualität der Tests evaluieren (Verhalten vs Implementierung)
|
|
456
|
+
3. Signal-Tests prüfen (detectChanges nach set)
|
|
457
|
+
4. Integrations- und E2E-Tests untersuchen
|
|
458
|
+
|
|
459
|
+
### Phase 5: Performance und Bundle (15 Min.)
|
|
460
|
+
|
|
461
|
+
1. OnPush auf Presentational-Komponenten prüfen
|
|
462
|
+
2. Verwendung von @defer evaluieren
|
|
463
|
+
3. Schwere Imports und RxJS Tree-Shaking analysieren
|
|
464
|
+
4. Lazy Loading der Routen prüfen
|
|
465
|
+
5. SSR/Hydration evaluieren, falls zutreffend
|
|
182
466
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
-
|
|
186
|
-
|
|
187
|
-
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## Audit-Berichtsformat
|
|
470
|
+
|
|
471
|
+
```markdown
|
|
472
|
+
# Audit-Bericht Angular 19 / TypeScript
|
|
473
|
+
|
|
474
|
+
## Projekt: [Projektname]
|
|
475
|
+
**Datum:** [Datum]
|
|
476
|
+
**Prüfer:** Agent Angular Reviewer
|
|
477
|
+
**Analysierte Dateien:** [Anzahl]
|
|
188
478
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## Gesamtbewertung: [X]/100
|
|
482
|
+
|
|
483
|
+
| Kategorie | Bewertung | Max |
|
|
484
|
+
|-----------|-----------|-----|
|
|
485
|
+
| Signals und Architektur | [X] | 30 |
|
|
486
|
+
| TypeScript und Qualität | [X] | 20 |
|
|
487
|
+
| Tests | [X] | 25 |
|
|
488
|
+
| Performance und Rendering | [X] | 25 |
|
|
194
489
|
|
|
195
|
-
|
|
196
|
-
-
|
|
197
|
-
-
|
|
198
|
-
-
|
|
199
|
-
-
|
|
490
|
+
**Urteil:**
|
|
491
|
+
- 90-100: Exzellent, produktionsreif
|
|
492
|
+
- 75-89: Sehr gut, geringfügige Korrekturen
|
|
493
|
+
- 60-74: Akzeptabel, Verbesserungen notwendig
|
|
494
|
+
- < 60: Umfangreiches Refactoring erforderlich
|
|
495
|
+
|
|
496
|
+
---
|
|
200
497
|
|
|
201
|
-
###
|
|
202
|
-
|
|
203
|
-
- [
|
|
204
|
-
- [ ] No sensitive data exposure
|
|
498
|
+
### 1. Signals und Architektur: [X]/30
|
|
499
|
+
**Beobachtungen:**
|
|
500
|
+
- [Positiver oder negativer Punkt mit datei:zeile]
|
|
205
501
|
|
|
206
|
-
|
|
207
|
-
- [ ]
|
|
208
|
-
- [ ] Tests follow AAA pattern
|
|
209
|
-
- [ ] Edge cases covered
|
|
502
|
+
**Empfehlungen:**
|
|
503
|
+
- [Konkrete Maßnahme]
|
|
210
504
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
### 2. TypeScript und Qualität: [X]/20
|
|
508
|
+
**Beobachtungen:**
|
|
509
|
+
- [Positiver oder negativer Punkt mit datei:zeile]
|
|
510
|
+
|
|
511
|
+
**Empfehlungen:**
|
|
512
|
+
- [Konkrete Maßnahme]
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
### 3. Tests: [X]/25
|
|
517
|
+
**Beobachtungen:**
|
|
518
|
+
- [Positiver oder negativer Punkt mit datei:zeile]
|
|
519
|
+
|
|
520
|
+
**Empfehlungen:**
|
|
521
|
+
- [Konkrete Maßnahme]
|
|
522
|
+
|
|
523
|
+
---
|
|
215
524
|
|
|
216
|
-
|
|
525
|
+
### 4. Performance und Rendering: [X]/25
|
|
526
|
+
**Beobachtungen:**
|
|
527
|
+
- [Positiver oder negativer Punkt mit datei:zeile]
|
|
528
|
+
|
|
529
|
+
**Empfehlungen:**
|
|
530
|
+
- [Konkrete Maßnahme]
|
|
531
|
+
|
|
532
|
+
---
|
|
533
|
+
|
|
534
|
+
## Kritische Verstöße
|
|
535
|
+
- [Verstoß 1: datei:zeile -- Beschreibung]
|
|
536
|
+
|
|
537
|
+
## Stärken
|
|
538
|
+
- [Stärke 1]
|
|
539
|
+
|
|
540
|
+
## Priorisierter Maßnahmenplan
|
|
541
|
+
1. **Sofort**: [Kritische Maßnahmen]
|
|
542
|
+
2. **Kurzfristig**: [Schwerwiegende Verbesserungen]
|
|
543
|
+
3. **Mittelfristig**: [Optimierungen]
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
## Fazit
|
|
548
|
+
[Zusammenfassung und abschließende Empfehlung]
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
## Empfohlene Werkzeuge
|
|
552
|
+
|
|
553
|
+
| Werkzeug | Verwendung |
|
|
554
|
+
|----------|------------|
|
|
555
|
+
| **ESLint** + `@angular-eslint` | Überprüfung der Angular-Regeln |
|
|
556
|
+
| **typescript-eslint** strict config | TypeScript-Qualität |
|
|
557
|
+
| **Karma/Jest** + **Spectator** | Unit- und Komponententests |
|
|
558
|
+
| **Cypress** / **Playwright** | E2E-Tests |
|
|
559
|
+
| **Angular DevTools** | Inspektion des Component Tree und Signals |
|
|
560
|
+
| **Source Map Explorer** | Analyse der Bundle-Größe |
|
|
561
|
+
| **Lighthouse** | Globales Performance-Audit |
|
|
562
|
+
| **webpack-bundle-analyzer** | Erkennung schwerer Abhängigkeiten |
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
## Leitprinzipien
|
|
567
|
+
|
|
568
|
+
- **Signals-first**: signal()/computed() für synchronen Zustand verwenden, RxJS für komplexe Datenflüsse
|
|
569
|
+
- **Standalone als Standard**: alle neuen Komponenten müssen standalone sein
|
|
570
|
+
- **Neuer Control Flow**: @if/@for/@switch ersetzen *ngIf/*ngFor/*ngSwitch
|
|
571
|
+
- **inject() bevorzugt**: Funktionale Injection statt überladener Konstruktor
|
|
572
|
+
- **OnPush obligatorisch**: Optimierte Change Detection auf allen Presentational-Komponenten
|
|
573
|
+
- **@defer strategisch**: Granulares Lazy Loading für sekundäre Inhalte
|
|
574
|
+
|
|
575
|
+
---
|
|
217
576
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
| Critical | Security vulnerabilities, memory leaks, breaking bugs |
|
|
221
|
-
| Major | Best practice violations, performance issues |
|
|
222
|
-
| Minor | Style issues, documentation gaps |
|
|
223
|
-
| Info | Suggestions for improvement |
|
|
577
|
+
**Version:** 2.0
|
|
578
|
+
**Letzte Aktualisierung:** 2026-02
|